LibreCAD portado a WebAssembly y ejecutable desde el navegador

Fuentes: LibreCAD compiled to WebAssembly and running in the browser

Un desarrollador ha conseguido compilar LibreCAD, una aplicación de CAD 2D libre y de código abierto escrita en C++ sobre Qt, a WebAssembly para que funcione directamente en el navegador sin instalación ni inicio de sesión. El proyecto, bautizado como LibreCAD-Web, aprovecha la compatibilidad oficial de Qt 6.9 con Wasm y Emscripten: el binario final se sirve comprimido con Brotli (~18 MB) y se almacena en caché en el navegador tras la primera carga.

El autor señala que la operación fue posible gracias a la madurez del ecosistema Wasm y al soporte serio que el equipo de Qt está invirtiendo en esta plataforma. El trabajo se realizó de forma asistida por el modelo GLM-5.2 dentro del entorno OpenCode, lo que permitió automatizar gran parte del port. Aun así, la depuración requirió intervención manual en los puntos más delicados.

El reto técnico principal fue sustituir el clásico bucle de eventos bloqueante de las aplicaciones de escritorio por un mecanismo compatible con la web. Asyncify de Emscripten solo permite suspender un nivel de ejecución, lo que rompe los cuadros de diálogo anidados (combo-box, selectores de color, submenús). La solución pasó por habilitar JSPI (WebAssembly JavaScript Promise Integration) en Qt 6.9, junto con excepciones nativas de Wasm, y reconstruir el toolchain desde código fuente. Esto obligó a tres cambios coordinados: usar emscripten::async() en cada evento, reescribir main() para que devuelva el control al navegador y evitar el truco del bucle infinito, incompatible con -fwasm-exceptions.

El rendimiento inicial era de 4-5 fps; el cuello de botella estaba en blend_untransformed_generic_rgb64, ya que el backing store Wasm de Qt usaba un formato RGBA8888 sin ruta rápida. Cambiar a ARGB32 premultiplicado triplicó la tasa de frames.

El proyecto integra además un shim en JavaScript para abrir y guardar archivos (DXF/DWG) usando MEMFS e IndexedDB, exporta PDF mediante QPdfWriter y empaqueta fuentes y patrones de sombreado como un blob de 30 MB. Requiere navegadores Chromium 137+ (Chrome o Edge) por su dependencia de JSPI, aún no implementado en Firefox ni Safari.