← На главную

2D-САПР LibreCAD портировали в WebAssembly — работает в браузере

02.07.2026 01:00 · hackernews

Разработчик по имени magik6k взял и скомпилировал LibreCAD — десктопную 2D-САПР на C++ и Qt — в WebAssembly. Теперь полноценная CAD-программа запускается прямо в браузере, без установки и регистрации. Весь трюк провернули через GLM-5.2 в OpenCode: попросили модель портировать проект в WASM, и она справилась, хотя и с трудом. Модели не хватало компьютерного зрения, чтобы самостоятельно дебажить глюки, но человека с руками хватило.

Обычный десктопный LibreCAD умеет читать DXF и DWG, работать со слоями, размерами, штриховками. Это не облегчённая версия и не эмуляция — тот же самый C++ код скомпилили через Emscripten и официальную поддержку WebAssembly от Qt. Никакого серверного рендеринга или JavaScript-клона.

Самое сложное было заставить работать модальные диалоги. Десктопное приложение часто вызывает QDialog::exec(), который блокирует поток, пока не закроешь окно. В браузере так нельзя — страница замёрзнет. Штатное решение от Emscripten — Asyncify — умеет сворачивать только один уровень блокировки. А в LibreCAD диалоги внутри диалогов: открыл настройки, там выпадающий список, там цветовая палитра — всё ломается. Спасает JSPI (JavaScript Promise Integration), который поддерживает любую вложенность. Но JSPI требует, чтобы каждый клик обрабатывался в специальном «обещающем» контексте. Пришлось патчить Qt: регистрировать обработчики событий как emscripten::async(), оборачивать таймеры и переделывать main() в асинхронную форму.

С производительностью тоже было интересно. Сначала было 4-5 FPS. Оказалось, Qt для WebAssembly использует формат пикселей RGBA8888, который не входит в её быстрые пути растеризации — каждый блит уходил в медленный универсальный 64-битный блендер. Переключили на premultiplied ARGB32 — получили трёхкратный прирост кадров.

Файловая система в браузере эмулируется: open загружает файл в виртуальную память через JavaScript, save скидывает Blob как скачиваемый файл. Настройки хранятся в IndexedDB. Шрифты и паттерны (30 МБ) упакованы Brotli — общий трафик около 18 МБ. Работает пока только в Chromium-браузерах (Chrome/Edge 137+), Firefox и Safari JSPI не реализовали. Весь код на GitHub с минимальными правками именно самого LibreCAD — основная работа легла на слой платформы и патчи Qt.

Читать оригинал →