web: raster images, WBLOCK/SAVEALL/SCRIPT/CTB/LAYTRANS/INSERT, filled TTF text

A fresh web-vs-desktop audit found the remaining gaps; this closes the
top ten.

Raster images: IMAGE attach read the picked file via image::open on a
name-only path (dead on wasm), and raster references inside opened
drawings decoded the same way. Picked bytes are now registered in a
name-keyed store (the PDF-underlay pattern), decoding runs from memory,
and dropped .png/.jpg/.bmp/.tif files register by name so unresolved
references in opened drawings re-resolve and render (and export to PDF).

Command gaps fixed with the bytes-at-pick / download_bytes pattern:
- WBLOCK now downloads the extracted block instead of failing on fs.
- SAVEALL saves every dirty tab instead of printing a no-op message.
- SCRIPT picks and reads the .scr file through the browser picker.
- CENTERLTYPEFILE picks the .lin/.dnl file and populates from text.
- Custom .ctb tables picked on web now parse, register for the
  session, appear in the plot dialog list, and apply (load_named
  previously returned builtin-only on wasm).
- LAYTRANS 'Load standards file' parses the picked drawing on the
  existing web worker.
- INSERT 'from file' in the block palette parses picked bytes and
  feeds the shared import path.

Text fidelity: TTF-named styles rendered as thin stroke glyphs on web
because the font database was empty. Fetched Noto faces are now
registered into it with a family alias table (Arial, Times New Roman,
Cambria, ... -> Noto Sans/Serif), so those styles render filled, shape,
export to PDF as vector fills, and appear in the style picker.
ViewCube labels request semibold again on web.

docs/native-vs-web.md: the hatch and font rows were stale (both work on
web now), the GPU row claimed WebGPU is used where available (the
backend is pinned to OpenGL), and the parallelism row missed the parse
worker — all corrected.
This commit is contained in:
Afonsop committed 2026-09-17 20:59:58 +01:00
1 parent fa7ef87f00
commit c643a10ed9
43 files changed
+3216 -1336

No files matched your search

+1
View File
@@ -1969,6 +1969,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: حُفظ __ocs_fmt_0__ رسم__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: يجري بالفعل حفظ __ocs_fmt_0__
.saveall-failed-e = SAVEALL: فشل __ocs_fmt_0__: ‏__ocs_fmt_1__
.load-linetype-file = تحميل ملف نوع الخط
.script-path-to-the-scr-file = SCRIPT مسار ملف ‎.scr:
.script-cannot-read-p-e = SCRIPT: تعذرت قراءة __ocs_fmt_0__: ‏__ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: يجري تشغيل __ocs_fmt_0__ أمر من __ocs_fmt_1__.
+1
View File
@@ -1956,6 +1956,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: запазени __ocs_fmt_0__ чертеж(а)__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ вече има изпълняващо се запазване
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ се провали: __ocs_fmt_1__
.load-linetype-file = Зареждане на файл с типове линии
.script-path-to-the-scr-file = SCRIPT път до .scr файла:
.script-cannot-read-p-e = SCRIPT: не може да се прочете __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: изпълняват се __ocs_fmt_0__ команда(и) от __ocs_fmt_1__.
+1
View File
@@ -1956,6 +1956,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: uložený výkres(y) __ocs_fmt_0__ __ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ již probíhá ukládání
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ se nezdařilo: __ocs_fmt_1__
.load-linetype-file = Načíst soubor typů čar
.script-path-to-the-scr-file = Cesta SCRIPT k souboru .scr:
.script-cannot-read-p-e = SCRIPT: nelze číst __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: spuštění příkazu(ů) __ocs_fmt_0__ ze __ocs_fmt_1__.
+1
View File
@@ -1957,6 +1957,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: gespeichert __ocs_fmt_0__ Zeichnung(en)__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: Für __ocs_fmt_0__ wird bereits gespeichert
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ fehlgeschlagen: __ocs_fmt_1__
.load-linetype-file = Linetype-Datei laden
.script-path-to-the-scr-file = SCRIPT Pfad zur .scr-Datei:
.script-cannot-read-p-e = SCRIPT: kann nicht lesen __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: Ausführen des Befehls __ocs_fmt_0__ aus __ocs_fmt_1__.
+1
View File
@@ -1956,6 +1956,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: αποθηκεύτηκαν __ocs_fmt_0__ σχέδιο(α)__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: για το __ocs_fmt_0__ εκτελείται ήδη αποθήκευση
.saveall-failed-e = SAVEALL: το __ocs_fmt_0__ απέτυχε: __ocs_fmt_1__
.load-linetype-file = Φόρτωση αρχείου τύπου γραμμής
.script-path-to-the-scr-file = SCRIPT διαδρομή προς το αρχείο .scr:
.script-cannot-read-p-e = SCRIPT: δεν είναι δυνατή η ανάγνωση του __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: εκτέλεση __ocs_fmt_0__ εντολής(ών) από __ocs_fmt_1__.
+1
View File
@@ -1957,6 +1957,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: saved __ocs_fmt_0__ drawing(s)__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ already has a save running
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ failed: __ocs_fmt_1__
.load-linetype-file = Load linetype file
.script-path-to-the-scr-file = SCRIPT path to the .scr file:
.script-cannot-read-p-e = SCRIPT: cannot read __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: running __ocs_fmt_0__ command(s) from __ocs_fmt_1__.
+1
View File
@@ -1957,6 +1957,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: se guardaron __ocs_fmt_0__ dibujos__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ ya tiene un guardado en curso
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ falló: __ocs_fmt_1__
.load-linetype-file = Cargar archivo de tipos de línea
.script-path-to-the-scr-file = SCRIPT ruta del archivo .scr:
.script-cannot-read-p-e = SCRIPT: no se puede leer __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: ejecutando __ocs_fmt_0__ comandos desde __ocs_fmt_1__.
+1
View File
@@ -1956,6 +1956,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: tallennettu __ocs_fmt_0__-piirustukset __ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__:n tallennus on jo käynnissä
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ epäonnistui: __ocs_fmt_1__
.load-linetype-file = Lataa viivatyylitiedosto
.script-path-to-the-scr-file = SCRIPT polku .scr-tiedostoon:
.script-cannot-read-p-e = SCRIPT: ei voi lukea __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: __ocs_fmt_0__-komentojen suorittaminen lähteestä __ocs_fmt_1__.
+1
View File
@@ -1957,6 +1957,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: enregistré __ocs_fmt_0__ dessin(s)__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ a déjà un enregistrement en cours d'exécution
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ échoué: __ocs_fmt_1__
.load-linetype-file = Charger le fichier de type de ligne
.script-path-to-the-scr-file = SCRIPT chemin vers le fichier .scr :
.script-cannot-read-p-e = SCRIPT: ne peut pas lire __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT : exécuter __ocs_fmt_0__ commande(s) depuis __ocs_fmt_1__.
+1
View File
@@ -1945,6 +1945,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: __ocs_fmt_0__ ड्रॉइंग सहेजी गईं; __ocs_fmt_1__।
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ पहले से ही एक बचा दौड़ है
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ विफल: __ocs_fmt_1__
.load-linetype-file = लाइनटाइप फ़ाइल लोड करें
.script-path-to-the-scr-file = SCRIPT .scr फ़ाइल के लिए पथ:
.script-cannot-read-p-e = SCRIPTनहीं पढ़ सकते __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: __ocs_fmt_0__ __ocs_fmt_1__ से कमांड (s) चला रहा है।
+1
View File
@@ -1956,6 +1956,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: mentett __ocs_fmt_0__ rajz(ok)__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: A __ocs_fmt_0__ már fut egy mentés
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ sikertelen: __ocs_fmt_1__
.load-linetype-file = Vonaltípusfájl betöltése
.script-path-to-the-scr-file = SCRIPT elérési út a .scr fájlhoz:
.script-cannot-read-p-e = SCRIPT: nem tudja olvasni __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: __ocs_fmt_0__ parancs(ok) futtatása a __ocs_fmt_1__ fájlból.
+1
View File
@@ -1956,6 +1956,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: disegno/i __ocs_fmt_0__ salvato/i__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ ha già un salvataggio in corso
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ non riuscito: __ocs_fmt_1__
.load-linetype-file = Carica file tipi di linea
.script-path-to-the-scr-file = SCRIPT percorso del file .scr:
.script-cannot-read-p-e = SCRIPT: impossibile leggere __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: esecuzione dei comandi __ocs_fmt_0__ da __ocs_fmt_1__.
+1
View File
@@ -1947,6 +1947,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: __ocs_fmt_0__ 件の図面を保存しました__ocs_fmt_1__。
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ は既に保存中です
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ 失敗: __ocs_fmt_1__
.load-linetype-file = 線種ファイルを読み込む
.script-path-to-the-scr-file = SCRIPT .scr ファイルのパス:
.script-cannot-read-p-e = SCRIPT: __ocs_fmt_0__ を読み込めません: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: __ocs_fmt_1__ から __ocs_fmt_0__ 個のコマンドを実行中です。
+1
View File
@@ -1956,6 +1956,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: __ocs_fmt_0__ 도면 __ocs_fmt_1__를 저장했습니다.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__에는 이미 실행 중인 저장이 있습니다.
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ 실패: __ocs_fmt_1__
.load-linetype-file = 선종 파일 로드
.script-path-to-the-scr-file = .scr 파일에 대한 SCRIPT 경로:
.script-cannot-read-p-e = SCRIPT: __ocs_fmt_0__: __ocs_fmt_1__를 읽을 수 없습니다.
.script-running-command-s-from-p = SCRIPT: __ocs_fmt_1__에서 __ocs_fmt_0__ 명령을 실행합니다.
+1
View File
@@ -1957,6 +1957,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: opgeslagen __ocs_fmt_0__ tekening(s)__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ heeft al een opslag uitgevoerd
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ mislukt: __ocs_fmt_1__
.load-linetype-file = Lijntypebestand laden
.script-path-to-the-scr-file = SCRIPT pad naar het .scr bestand:
.script-cannot-read-p-e = SCRIPT: kan __ocs_fmt_0__ niet lezen: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: __ocs_fmt_0__ commando(s) van __ocs_fmt_1__.
+1
View File
@@ -1956,6 +1956,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: zapisane rysunki __ocs_fmt_0__ __ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ ma już uruchomiony zapis
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ nie powiodło się: __ocs_fmt_1__
.load-linetype-file = Wczytaj plik typów linii
.script-path-to-the-scr-file = Ścieżka SCRIPT do pliku .scr:
.script-cannot-read-p-e = SCRIPT: nie można odczytać __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: uruchamianie poleceń __ocs_fmt_0__ z __ocs_fmt_1__.
+1
View File
@@ -1957,6 +1957,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: __ocs_fmt_0__ desenhos salvos__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ já tem um salvamento em andamento
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ falhou: __ocs_fmt_1__
.load-linetype-file = Carregar arquivo de tipos de linha
.script-path-to-the-scr-file = SCRIPT caminho do arquivo .scr:
.script-cannot-read-p-e = SCRIPT: não é possível ler __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: executando __ocs_fmt_0__ comandos de __ocs_fmt_1__.
+1
View File
@@ -1960,6 +1960,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: сохранен __ocs_fmt_0__ чертеж(ы)__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ уже имеет резервный ход
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ не получилось: __ocs_fmt_1__
.load-linetype-file = Загрузить файл типов линий
.script-path-to-the-scr-file = SCRIPT Путь к файлу .scr:
.script-cannot-read-p-e = SCRIPT: не может читать __ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: выполнение команды (команд) __ocs_fmt_0__ из __ocs_fmt_1__.
+1
View File
@@ -1940,6 +1940,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL: __ocs_fmt_0__ çizim kaydedildi__ocs_fmt_1__.
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ için zaten bir kaydetme işlemi çalışıyor
.saveall-failed-e = SAVEALL: __ocs_fmt_0__ başarısız: __ocs_fmt_1__
.load-linetype-file = Çizgi tipi dosyasını yükle
.script-path-to-the-scr-file = SCRIPT .scr dosyasının yolu:
.script-cannot-read-p-e = SCRIPT: __ocs_fmt_0__ okunamıyor: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT: __ocs_fmt_1__ dosyasından __ocs_fmt_0__ komut çalıştırılıyor.
+1
View File
@@ -1944,6 +1944,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL:已保存 __ocs_fmt_0__ 绘图 __ocs_fmt_1__ 。
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ 已经有一个保存运行
.saveall-failed-e = SAVEALL : __ocs_fmt_0__ 失败 : __ocs_fmt_1__
.load-linetype-file = 加载线型文件
.script-path-to-the-scr-file = SCRIPT 路径 :
.script-cannot-read-p-e = SCRIPT: 无法读取__ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT:从__ocs_fmt_1__运行__ocs_fmt_0__命令。
+1
View File
@@ -1956,6 +1956,7 @@ file =
.saveall-saved-saved-drawing-s = SAVEALL:已儲存 __ocs_fmt_0__ 繪圖 __ocs_fmt_1__ 。
.saveall-already-has-a-save-running = SAVEALL: __ocs_fmt_0__ 已經有一個儲存執行
.saveall-failed-e = SAVEALL : __ocs_fmt_0__ 失敗 : __ocs_fmt_1__
.load-linetype-file = 載入線型檔案
.script-path-to-the-scr-file = SCRIPT 路徑 :
.script-cannot-read-p-e = SCRIPT: 無法讀取__ocs_fmt_0__: __ocs_fmt_1__
.script-running-command-s-from-p = SCRIPT:從__ocs_fmt_1__執行__ocs_fmt_0__命令。