Открытый код для Paint, Draw, PDF, Chart и медиа Slides (исследование, 2026-10-04)
Область: MOffice Paint, MOffice Draw (+ Scene/Diagram), MOffice PDF (+ Crypto для подписей), MOffice Chart, медиа Slides. Правила и классы лицензий —
docs/research/BRIEF.md,docs/12-license-policy.md. Статус: готово для ревью (2026-10-04). Автор — исследовательский агент; решения по классу 2 — за владельцем. Пометки: «(TSV)» — данныеdocs/research/oss-verified.tsvот 2026-10-04; «(проверено 2026-10-04)» — проверено в этом исследовании по коду клона, crates.io API, GitHub API, Hugging Face API или странице проекта; «(не проверено)» — по памяти или косвенно, требует проверки перед использованием. Пути клонов даны относительноscratchpad/oss-src/<owner_repo>/(см. BRIEF).
1. Выводы
1.1 Топ-10 решений с экономией
Экономия — разница «писать с нуля» минус «перенос/подключение» в
чел.-мес. инженеров для работ, которые docs/08-roadmap.md и
docs/apps/*.md закладывают как собственную разработку (E2.3
Chart, E3.1/E3.3/E3.8 Draw, E3.4 Slides, E4.1–E4.5/E4.7 Paint/PDF). То,
что план уже подключает готовым (pdfium на этапе A, image,
Tesseract, кодеры ОС), в экономию не входит.
| # | Что берём | Лицензия, класс | Стратегия | Куда в MOffice | Эпик | Экономия, чел.-мес. |
|---|---|---|---|---|---|---|
| 1 | hayro (основа своего рендера, декодеры JBIG2/JPX/CCITT) + lopdf (парсер, шифрование, инкрементальная запись) + pdfium-render (обёртки pdfium этапа A) | Apache-2.0 OR MIT / MIT / MIT OR Apache-2.0, 1 | fork / fork / fork | codec-pdf: meridian-pdf-render,
meridian-pdf-core, meridian-pdfium-sys |
E4.4, apps/pdf.md этапы A–C |
12–18 |
| 2 | Подписи PAdES B-B/B-T/B-LT и формы AcroForm — порт из Apache PDFBox;
криптография — RustCrypto cms, x509-cert,
x509-tsp, x509-ocsp |
Apache-2.0 / Apache-2.0 OR MIT, 1 | port / adopt | MOffice Crypto, PDF → Подпись, Формы | E4.5, E4.7 | 4–6 |
| 3 | 37 эффектов + 9 коррекций Pinta (код из Paint.NET 3.36) с 125 эталонными PNG для тестов | MIT, 1 (иконки — нет) | port | Paint → Эффекты/Коррекция, raster |
E4.1 | 4–5 |
| 4 | Движок кистей libmypaint, 196 кистей mypaint-brushes, стабилизатор ink-stroke-modeler | ISC, 1 / CC0, 0 / Apache-2.0, 1 | port / adopt данных / port | Paint → Кисти, Notes → перо | E4.1, E4.9 | 4–6 (включая 1–2 дизайна) |
| 5 | Раскладки и коннекторы: mxGraph (иерархия, деревья, органическая,
mxEdgeStyle), dagre, WebCola (VPSC, gridrouter),
d3-force |
Apache-2.0 / MIT / MIT / ISC, 1 | port | MOffice Scene, Draw → Автораскладка, коннекторы; Diagram (SmartArt-аналог) | E3.1, E3.3 | 6–8 |
| 6 | Общие трафареты draw.io (≈ 3,5 тыс. фигур в 28 наборах) без вендорских иконок | Apache-2.0 + запрет Atlassian, 1* | fork (конвертер в .mvs) |
Draw → Трафареты | E3.3, E3.8 | 2–4 (нетто, после затрат на конвертер) |
| 7 | OCR: Tesseract 5 + tessdata (уже в плане), второй движок PP-OCRv5
(официальные ONNX, кириллица eslav_/cyrillic_)
через ort |
Apache-2.0, 1 | adopt | PDF → Распознать текст; Notes | E4.5 (P1) | 0,5–1 (готовые веса и постобработка вместо подбора своей модели) |
| 8 | PDF → Write/Sheets: алгоритм LAParams (pdfminer.six), таблицы (pdfplumber), модели раскладки и таблиц Docling | MIT / MIT / MIT, Apache-2.0, CDLA-Permissive-2.0, 1 | port / port / adopt моделей | PDF → Преобразовать в docx/xlsx | E4.5 | 3–5 |
| 9 | Chart: шкалы и «красивые» деления (d3-scale, d3-array), монотонные кривые, круговые/кольцевые, накопление (d3-shape), treemap/sunburst (d3-hierarchy), бины гистограммы, палитры ColorBrewer/viridis | ISC + Apache-2.0 + CC0, 0–1 | port / adopt данных | MOffice Chart | E2.3 | 2–3 |
| 10 | Снимки и запись экрана: код владельца ScreenPrompt (WGC, WASAPI, ScreenCaptureKit, политика источников, протокол помощника) + windows-capture, xcap (только Windows/Linux), ashpd + pipewire | ★ MIT владельца / Apache-2.0 / MIT, 1 | own + adopt | Paint → Снимок, Вставка → Снимок экрана, Slides → Запись экрана | E4.2 | 1–2 (скриншоты; запись экрана в roadmap нет) |
Дополнительно: экспорт видео на кодерах ОС и WebM с готовыми
обёртками (≈ 1 чел.-мес., E3.4 P1), аудио без symphonia. Вне плана, но
дёшево благодаря готовому коду: «Удалить фон» (ort +
IS-Net/BiRefNet, ≈ 1–2 чел.-мес. против своей разработки), Lottie через
Skottie из Skia (≈ 2 чел.-мес. против своего плеера), запись экрана в
Slides. Итого против плана ≈ 40–60 чел.-мес. (≈ 2 %
базового плана 2 660 чел.-мес.; ≈ 15–25 % трудоёмкости фазы 4 и
Draw-части фазы 3 по численности команд в roadmap).
1.2 Новые факты, меняющие план (проверено 2026-10-04, подробности в разделах 3–5)
- rembg по умолчанию использует
bria-rmbg— веса Bria под собственной некоммерческой лицензией → класс 3. Берём только код-идеи и модели U-2-Net/IS-Net (Apache-2.0), BiRefNet/BEN2 (MIT). - ocrs: код MIT/Apache, но веса на HF
robertknight/ocrs— CC BY-SA 4.0 (обучены на HierText), алфавит по умолчанию — только ASCII-латиница → для продукта не годится (только как образец конвейера на Rust). - surya / marker: код Apache-2.0 (в TSV класс 1), но веса — CC BY-NC-SA 4.0 на HF и «модифицированная OpenRAIL-M» с порогом 5 млн USD (README marker) → класс 3.
- pdf2docx — MIT, но
requirements.txtтребуетPyMuPDF>=1.26.7(AGPL) → как зависимость запрещён. - bpmn-js в TSV помечен классом 1, но его LICENSE требует не удалять водяной знак bpmn.io → класс 3 по политике.
- rodio 0.22 по умолчанию декодирует
flac/mp3/mp4/vorbis/wav через symphonia (MPL-2.0) → только
default-features = false+claxon,hound,lewton,minimp3. - Qt 6.8 Multimedia по умолчанию работает через FFmpeg (поставляется Qt), нативный бэкенд Windows объявлен устаревшим с Qt 6.10 → конфликт с «FFmpeg не встраиваем» и с мерой риска фазы 3 в roadmap.
- xcap на macOS снимает через
CGWindowListCreateImage(устарел в macOS 14) → на macOS — ScreenCaptureKit (как в ScreenPrompt), xcap — только Windows/Linux. - lopdf 0.45 уже умеет инкрементальные обновления
(
IncrementalDocument) и запись объектных потоков — утверждениеapps/pdf.md(«инкрементальных записей нет») устарело; нет только ленивого чтения. - hayro (Apache-2.0 OR MIT, 779★, экспериментальный)
— рендер PDF на Rust с собственными декодерами JBIG2, JPEG 2000, CCITT;
проходит 1 400+ файлов регрессии PDFBox и pdf.js → основа этапа B
apps/pdf.md. - Lottie без rlottie: у
skia-safeесть флагskottie(модуль Skottie из Skia, BSD-3). - mypaint-brushes: по
Licenses.dep5CC0 толькоbrushes/*; корневые сборочные файлы — GPL-2+ (не берём). - draw.io: ограничение «не для продуктов Atlassian»
распространяется на трафареты, наборы иконок, шаблоны и любые их
производные (конвертации, обводки) → переносим условие в наши
.mvsи NOTICE. - mxGraph
OrthConnectorвыбирает маршрут по таблице шаблонов между двумя фигурами и не обходит прочие фигуры → обход препятствий пишем сами (libavoid — LGPL-2.1, не берём).
2. Таблицы по подобластям
Колонки: ★ — звёзды GitHub, «загр.» — загрузки crates.io; дата —
последний коммит или версия (TSV, если не указано иное). Стратегии — как
в BRIEF. «Эк.» — экономия против плана в чел.-мес. (— для
reference/avoid; «в плане» — подключение уже заложено в roadmap или
docs/apps/*.md; «вне плана» — функции нет в roadmap, в
скобках — экономия против собственной разработки). Ссылки: репозитории
из TSV — github.com/<id>, крейты —
crates.io/crates/<имя>; вне TSV (проверено
2026-10-04): github.com/LaurenzV/hayro, thorvg/thorvg,
linebender/velato, jneem/linesweeper, Logicalshift/flo_curves,
kamadak/exif-rs, paolobarbolini/img-parts, adobe/xmp-toolkit-rs,
tirr-c/jxl-oxide, rust-av/dav1d-rs, Cykooz/libheif-rs, dnglab/dnglab,
pedrocr/rawloader, RustCrypto/formats (cms,
x509-tsp, x509-ocsp), typst/pdf-writer,
SpaceManiac/opus-rs, RustAudio/ogg, ruuda/hound, ruuda/claxon,
RustAudio/lewton, BOB450/minimp3-rs, HEnquist/rubato,
austinleroy/webm-iterable, alfg/mp4-rust, HEnquist/wasapi-rs,
doom-fish/screencapturekit-rs, madsmtm/objc2, xuebinqin/DIS,
hustvl/ViTMatte, pymatting/pymatting, google/ink;
huggingface.co/ZhengPeng7/BiRefNet, PramaLLC/BEN2, PaddlePaddle,
docling-project.
2.1 Paint (кодеки, ресамплинг, кисти, эффекты, фон, снимки)
| Кандидат | SPDX, класс | ★ / загр. | Дата | Язык | Что даёт MOffice | Стратегия | Писать самим, риски | Эк. |
|---|---|---|---|---|---|---|---|---|
image + png, gif,
tiff, image-webp, zune-jpeg |
MIT OR Apache-2.0 (tiff — MIT; zune-jpeg +
Zlib), 1 |
5,9 тыс.★ / 203 млн (image) |
2026-09 | Rust | чтение/запись png/jpg/webp/gif/bmp/tiff/ico | adopt | 16 бит и float, сохранение EXIF/XMP/ICC — свои обёртки (E4.3) | в плане |
exr |
BSD-3-Clause, 1 | 76 млн загр. | 2026-07 | Rust | HDR-слои в .mpi |
adopt | — | в плане |
ravif + rav1e / dav1d
(libdav1d BSD-2) |
BSD-3 / BSD-2 / MIT (проверено 2026-10-04), 1 | 50 млн / 1,4 млн | 2026-01 / 2025-11 | Rust, C | AVIF запись / чтение | adopt | dav1d — C-библиотека, сборка на 3 ОС | 0,5 |
jxl-oxide |
MIT OR Apache-2.0 (проверено 2026-10-04), 1 | 2,4 млн | 2026-05 | Rust | JPEG XL чтение (P2) | adopt | — | 0,3 |
psd |
MIT/Apache-2.0, 1 | 0,17 млн | 2024-01 | Rust | psd R | adopt → fork | заброшен; запись psd — своя по публичной спецификации Adobe | 0,5 |
| mozjpeg | BSD-3 + IJG + Zlib, 1 | 5,7 тыс.★ | 2025-06 | C | качественный JPEG «Экспорт для веба» | adopt | лицензия Rust-обёртки (не проверено) | 0,3 |
kamadak-exif, img-parts,
xmp_toolkit |
BSD-2 / MIT OR Apache-2.0 / MIT OR Apache-2.0 (проверено 2026-10-04), 1 | 14 / 11 / 0,2 млн | 2024–2026 | Rust | EXIF, вставка ICC/XMP без перекодирования | adopt | xmp_toolkit тянет C++ XMP SDK (BSD-3) |
0,5 |
libheif-rs → libheif |
MIT обёртка, но libheif — LGPL-3.0, 2 | 0,9 млн | 2026-08 | Rust/C | heic R | avoid → платформенные декодеры (WIC/ImageIO), Linux — системный libheif по решению владельца | раздел 4 | — |
rawler, rawloader; libraw |
LGPL-2.1 (проверено 2026-10-04); LGPL-2.1/CDDL-1.0, 2 | 0,14 / 0,32 млн | 2026-08 | Rust/C | RAW R | avoid → WIC RAW / ImageIO, DNG через tiff |
раздел 4 | — |
fast_image_resize |
MIT OR Apache-2.0, 1 | 463★ / 20 млн | 2026-07 | Rust | ресамплинг SIMD: Box, Bilinear, Hamming, CatmullRom, Mitchell, Gaussian, Lanczos3 | adopt | предфильтрация для 16 бит/float проверить | 1 |
imageproc |
MIT, 1 | 980★ / 13,6 млн | 2026-06 | Rust | морфология, контуры, flood fill, distance transform | adopt выборочно | — | 0,5 |
| OpenCV | Apache-2.0, 1 | 91 тыс.★ | 2026-10 | C++ | GrabCut, inpainting Telea | reference / port отдельных функций | как зависимость слишком тяжёл | — |
| photon, miniPaint, jspaint | Apache-2.0 / MIT / MIT, 1 | 3,9 / 3,5 / 7,9 тыс.★ | 2026 | Rust/JS | поведение простых редакторов | reference | — | — |
| libmypaint | ISC, 1 | 384★ | 2026-04 | C | движок кистей, формат .myb |
port (разбор 3.1) | свой растеризатор дабов на тайлах 256×256 | 2–3 |
| mypaint-brushes | CC0-1.0 (только brushes/*), 0 |
43★ | 2021-04 (TSV: 2024-09) | данные | 196 кистей + превью | adopt данных | перерисовать превью в стиле MDS | 1–2 (дизайн) |
| ink-stroke-modeler | Apache-2.0, 1 | 141★ | 2026-08 | C++ | сглаживание и предсказание штриха | port | ≈ 3,9 тыс. строк C++ → ≈ 2 тыс. Rust | 1 |
| Pinta | MIT (иконки — нет), 1 | 4,0 тыс.★ | 2026-10-02 (клон) | C# | 37 эффектов, 9 коррекций, режимы смешивания, ORA | port (разбор 3.2) | 16 бит/float, GPU-предпросмотр, маски | 4–5 |
| Krita | GPL-3.0, 3 | 10,4 тыс.★ | 2026-09 | C++ | — | avoid (чистая комната) | — | — |
ort + ONNX Runtime |
MIT OR Apache-2.0 (ort 2.0.0-rc.13) / MIT, 1 | 2,5 / 21,9 тыс.★ | 2026-09 | Rust/C++ | инференс моделей фона, OCR, раскладки | adopt | ort 2.0 всё ещё rc; DLL ORT ≈ 10–20 МБ на ОС |
входит в строки моделей |
tract, candle |
MIT OR Apache-2.0, 1 | 3,1 / 21,1 тыс.★ | 2026-09/10 | Rust | инференс без внешней DLL (WASM) | reference / резерв | не все операторы ONNX | — |
| rembg + U-2-Net, IS-Net, BiRefNet | MIT; веса Apache-2.0 / Apache-2.0 / MIT (разбор 3.3), 1 | 24,9 / 9,8 / 4,2 тыс.★ | 2026-09 | Python | «Удалить фон» офлайн | port пред/постобработки, adopt весов | модель rembg по умолчанию — bria (класс 3) | вне плана (1–2) |
xcap, windows-capture, ashpd + pipewire |
Apache-2.0 / MIT / MIT / MIT, 1 | 1,0 / 0,5 / 0,4 тыс.★ | 2026-08/09 | Rust | снимки и запись экрана | adopt (разбор 3.4) | xcap на macOS устарел | 1–2 |
2.2 Draw (геометрия, булевы операции, раскладки, коннекторы, трафареты, текст → диаграмма)
| Кандидат | SPDX, класс | ★ / загр. | Дата | Язык | Что даёт MOffice | Стратегия | Писать самим, риски | Эк. |
|---|---|---|---|---|---|---|---|---|
kurbo |
Apache-2.0 OR MIT, 1 | 1,0 тыс.★ / 49 млн | 2026-09 | Rust | Безье, длина дуги, ближайшая точка, offset-кривые | adopt | — | 1 |
Skia PathOps (в skia-safe) |
BSD-3-Clause, 1 | (Skia 11 тыс.★) | 2026-09 | C++ | булевы операции над путями с кривыми: объединить/вычесть/пересечь/исключить | adopt | точность на вырожденных случаях — тесты | 1–2 |
i_overlay |
MIT OR Apache-2.0, 1 | 211★ / 9,1 млн | 2026-09 | Rust | булевы и offset полигонов (WASM, без Skia) | adopt | кривые аппроксимировать | — |
linesweeper, flo_curves |
MIT OR Apache-2.0 / Apache-2.0 (проверено 2026-10-04), 1 | 28 тыс. / 0,3 млн загр. | 2026-06/08 | Rust | булевы Безье без аппроксимации | reference / резерв | молодые проекты | — |
lyon, geo |
MIT OR Apache-2.0, 1 | 2,6 тыс.★ / 23 млн (geo) |
2026 | Rust | тесселяция для GPU, упрощение, выпуклая оболочка | adopt выборочно | — | 0,5 |
petgraph |
MIT OR Apache-2.0, 1 | 4,0 тыс.★ / 536 млн | 2026-10 | Rust | графы: циклы, SCC, топосортировка для раскладок | adopt | — | 0,5 |
| mxGraph / draw.io (код) | Apache-2.0, 1 | 6,9 тыс.★ (архив 2020) / 8,5 тыс.★ | 2026-10 | JS, Java | иерархическая, деревья, радиальная, органическая, круговая раскладки; стили рёбер; периметры | port (разбор 3.5) | обход препятствий нет | 4–5 |
| draw.io трафареты и шаблоны | Apache-2.0 + запрет Atlassian, 1* | — | 2026-10 | данные | ≈ 3,5 тыс. общих фигур, 312 шаблонов (часть вендорские) | fork общих, вендорские — нет | конвертер стилей mxGraph → scene |
2–4 |
| dagre | MIT, 1 | 5,8 тыс.★ | 2026-08 | TypeScript | Sugiyama: network simplex, барицентр, Brandes–Köpf, вложенные графы | port | ≈ 150 КБ TS | 1–2 |
| WebCola | MIT, 1 | 2,1 тыс.★ | 2026-04 | TypeScript | стресс-мажоризация, VPSC (без перекрытий), маршрутизация по сетке | port частей | — | 1 |
| d3-force | ISC, 1 | 2,0 тыс.★ | 2023-12 | JS | силовая раскладка (Barnes–Hut) для сетей и mind map | port | — | 0,5 |
layout-rs |
MIT, 1 | 739★ / 0,7 млн | 2025-04 | Rust | DOT-парсер + Sugiyama на Rust | reference / импорт .dot |
малый проект, один автор | 0,5 |
| antvis/X6 | MIT, 1 | 6,7 тыс.★ | 2026-08 | TypeScript | роутер «manhattan» с обходом препятствий | reference / port роутера | путь в коде не проверен | 0,5 |
| cytoscape.js, Excalidraw | MIT, 1 | 11,2 / 133 тыс.★ | 2026-09 | JS/TS | раскладки-расширения; стиль «эскиз» | reference | лицензии расширений не проверены | — |
| ELK / elkjs; Graphviz | EPL-2.0; EPL-1.0, 2 | 0,4 / 2,8 / 1,4 тыс.★ | 2026 | Java/JS/C | эталон качества раскладок | reference только по документации и поведению | раздел 4 | — |
| JointJS, Penpot | MPL-2.0, 2 | 5,4 / 60,5 тыс.★ | 2026-09 | JS/Clojure | — | avoid | раздел 4 | — |
| bpmn-js, tldraw | MIT + обязательный водяной знак / собственная, 3 | 9,7 / 50,7 тыс.★ | 2026 | JS/TS | — | avoid | раздел 5 | — |
| Mermaid | MIT, 1 | 90,5 тыс.★ | 2026-09 | TypeScript | синтаксис: 19 jison-грамматик и 18 langium-файлов | port парсеров (разбор 3.5) | раскладка — наша (dagre-порт) | 2–3 |
| PlantUML | LGPL-3.0 (проверено 2026-10-04), 2 | 13,4 тыс.★ | 2026-10 | Java | — | только синтаксис по документации | раздел 4 | — |
2.3 PDF и OCR
| Кандидат | SPDX, класс | ★ / загр. | Дата | Язык | Что даёт MOffice | Стратегия | Писать самим, риски | Эк. |
|---|---|---|---|---|---|---|---|---|
| pdfium | BSD-3-Clause + Apache-2.0 (оба текста в LICENSE, проверено 2026-10-04), 1 | — | 2026 | C++ | рендер, текст, формы на этапе A | adopt (песочный процесс) | NOTICE по third_party/ (FreeType FTL, OpenJPEG, lcms,
libjpeg-turbo, zlib, AGG) |
в плане |
| bblanchon/pdfium-binaries | MIT (скрипты), 1 | 1,5 тыс.★ | 2026-09 | Shell | сборки на все ОС еженедельно, есть V8-варианты | adopt на старте → своя сборка | нет подписи и аттестации сборок (проверено 2026-10-04) | 0,5 |
pdfium-render |
MIT OR Apache-2.0, 1 | 711★ / 2,9 млн | 2026-08 | Rust | безопасные обёртки FPDF_*, формы, подписи (только чтение) | adopt в прототипе, fork в meridian-pdfium-sys |
≈ 206 тыс. строк (в основном биндинги) | 1 |
lopdf |
MIT, 1 | 2,3 тыс.★ / 22 млн | 2026-10 | Rust | объекты, xref, IncrementalDocument, объектные потоки,
RC4/AES |
fork частей в meridian-pdf-core |
нет ленивого чтения | 3–4 |
hayro (+ -syntax, -interpret,
-jbig2, -jpeg2000, -ccitt,
-cmap) |
Apache-2.0 OR MIT (проверено 2026-10-04), 1 | 779★ / 2,9 млн | 2026-06 | Rust | интерпретатор и растеризатор PDF, декодеры изображений | fork для этапа B | «экспериментальный»; нет knockout-групп, неэмбеднутых CID | 8–12 |
pdf (pdf-rs) |
MIT, 1 | 1,7 тыс.★ / 0,6 млн | 2026-07 | Rust | ленивое разрешение объектов (не проверено) | reference | — | — |
pdf-writer, krilla |
MIT OR Apache-2.0, 1 | 4,8 млн загр. | 2026-05 | Rust | сериализация объектов; PDF/A, PDF/UA при экспорте | adopt | krilla не редактирует существующие PDF | 1 |
| qpdf | Apache-2.0, 1 | 5,4 тыс.★ | 2026-09 | C++ | линеаризация, восстановление xref, проверка | reference + инструмент-оракул в CI | — | 0,5 |
| Apache PDFBox | Apache-2.0, 1 | 3,1 тыс.★ | 2026-09 | Java | подписи PAdES, видимая подпись, LTV, AcroForm с генерацией внешнего вида, FDF, порядок чтения | port (разбор 3.6) | ASN.1/CMS — через RustCrypto | 4–6 |
| pdf.js | Apache-2.0, 1 | 53,9 тыс.★ | 2026-09 | JS | порядок чтения текста, внешний вид аннотаций, шрифты | reference / port частей | — | 1 |
| pdfcpu, pdf-lib, pypdf, Stirling-PDF | Apache-2.0 / MIT / BSD-3 / MIT, 1 | 8,9 / 8,7 / 10,2 / 93 тыс.★ | 2024–2026 | Go/TS/Python/Java | валидация, формы, набор операций | reference | состав Stirling-PDF (проприетарные модули) не проверен | — |
RustCrypto cms, x509-cert,
x509-tsp, x509-ocsp |
Apache-2.0 OR MIT (проверено 2026-10-04), 1 | 13,5 / 43 / 2,2 / 1,0 млн | 2024–2026 | Rust | CMS SignedData, сертификаты, штамп времени RFC 3161, OCSP | adopt | x509-tsp 0.1.0 (2023) — дописать |
1 |
cryptographic-message-syntax |
MPL-2.0, 2 | 6,0 млн | 2025-08 | Rust | — | avoid (замена cms) |
раздел 4 | — |
| MuPDF, PyMuPDF, iText | AGPL-3.0, 3 | 3,0 / 2,3 тыс.★ | 2026 | C/Java | — | avoid | раздел 5 | — |
| Tesseract 5 + tessdata_fast/best | Apache-2.0, 1 | 76,8 тыс.★ | 2026-09 | C++ | OCR 100+ языков, OSD поворота | adopt (плагин, динамически) | Leptonica — лицензия не проверена | в плане |
| PaddleOCR PP-OCRv5 (официальные ONNX) / RapidOCR | Apache-2.0 код и веса (проверено 2026-10-04), 1 | 90,4 / 8,0 тыс.★ | 2026-09 | Python | второй движок: фото, скриншоты, кириллица
eslav_/cyrillic_ |
adopt весов + port пред/постобработки DB/CTC | DB unclip — через i_overlay offset |
0,5–1 |
| ocrs | код MIT OR Apache-2.0, веса CC BY-SA 4.0 (проверено 2026-10-04), код 1 / веса 3 | 1,9 тыс.★ | 2026-09 | Rust | образец конвейера OCR на Rust | reference | только латиница | — |
| doctr, EasyOCR | Apache-2.0, 1 | 6,4 / 30 тыс.★ | 2025–2026 | Python | — | reference | — | — |
| pdfminer.six, pdfplumber | MIT, 1 | 7,0 / 10,8 тыс.★ | 2026 | Python | раскладка текста LAParams, таблицы по линиям и выравниванию | port (разбор 3.7) | — | 2 |
| Docling + docling-ibm-models; веса docling-models, docling-layout-heron | MIT; CDLA-Permissive-2.0 + Apache-2.0; Apache-2.0 (проверено 2026-10-04), 1 | 68,3 тыс.★ | 2026-10 | Python | раскладка страницы, структура таблиц (TableFormer), порядок чтения | adopt весов через ort + port постобработки |
экспорт в ONNX — свой (не проверено) | 2–3 |
| pdf2docx | MIT, но тянет PyMuPDF (AGPL) | 3,5 тыс.★ | 2026-05 | Python | алгоритмы секций/колонок/таблиц | reference только как текст MIT | как зависимость — запрет | — |
| surya, marker | код Apache-2.0; веса CC BY-NC-SA 4.0 / OpenRAIL-M с порогом, 3 | 21,4 / 40,1 тыс.★ | 2026-09 | Python | — | avoid | раздел 5 | — |
| layout-parser | Apache-2.0, 1 | 5,8 тыс.★ | 2024-08 | Python | — | reference (заброшен) | — | — |
2.4 Chart
| Кандидат | SPDX, класс | ★ | Дата | Язык | Что даёт MOffice | Стратегия | Писать самим, риски | Эк. |
|---|---|---|---|---|---|---|---|---|
| d3-scale, d3-array | ISC, 1 | 1,6 / 0,5 тыс.★ | 2025–2026 | JS | «красивые» деления и границы осей, логарифмические, symlog, временные шкалы, бины гистограмм | port (разбор 3.8) | правила Excel для осей (min/max/основная единица) — свои | 1 |
| d3-shape | ISC, 1 | 2,5 тыс.★ | 2023-10 | JS | монотонные/кардинальные/ступенчатые кривые, сектора с отступами и скруглениями, накопление | port | — | 0,5 |
| d3-hierarchy | ISC, 1 | 1,3 тыс.★ | 2025-04 | JS | treemap (squarify/resquarify), sunburst (partition) | port | — | 0,5 |
| d3-scale-chromatic + ColorBrewer, viridis | ISC + Apache-2.0 + CC0, 0–1 | 1,1 тыс.★ (colorbrewer) | 2021–2024 | JS/данные | палитры категорий, последовательные, расходящиеся | adopt данных | Tableau10 не брать (условия не проверены) | 0,3 |
| ECharts | Apache-2.0, 1 | 67,4 тыс.★ | 2026-09 | TypeScript | эталон типов (водопад, воронка, биржевая, радар, ящик с усами, sankey), раскладка подписей без перекрытий | reference / port отдельных алгоритмов | пути в коде не проверены | 0,5 |
| Vega / Vega-Lite, Observable Plot | BSD-3 / ISC, 1 | 12,0 / 5,5 / 5,4 тыс.★ | 2026 | JS/TS | грамматика графики для шаблонов .mcht |
reference | — | — |
| Chart.js | MIT, 1 | 67,7 тыс.★ | 2026-09 | JS | поведение подсказок и анимаций | reference | — | — |
| plotters, charming | MIT / MIT OR Apache-2.0, 1 | 4,6 / 2,6 тыс.★ | 2024–2026 | Rust | — | avoid (нет модели OOXML-диаграмм; charming требует JS-движок) | — | — |
2.5 Slides: медиа (Lottie, экспорт видео, аудио)
| Кандидат | SPDX, класс | ★ / загр. | Дата | Язык | Что даёт MOffice | Стратегия | Писать самим, риски | Эк. |
|---|---|---|---|---|---|---|---|---|
Skottie (модуль Skia, флаг skottie в
skia-safe) |
BSD-3-Clause (проверено 2026-10-04), 1 | — | 2026-09 | C++ | воспроизведение Lottie тем же растеризатором | adopt | API Rust-обёртки неполный (не проверено) | вне плана (2) |
| rlottie | MIT + части FTL/BSD, 1 | 1,4 тыс.★ | 2026-09 | C++ | Lottie | резерв | вторая графическая библиотека | — |
ThorVG; velato |
MIT; Apache-2.0 OR MIT (проверено 2026-10-04), 1 | 1,9 тыс.★ / 27 тыс. загр. | 2026-09/10 | C++/Rust | Lottie + SVG; Lottie на vello | reference / резерв для vello | — | — |
| Media Foundation, AVFoundation/VideoToolbox | API ОС | — | — | — | H.264/HEVC в mp4 без лицензий кодеков | adopt | Windows N без Media Feature Pack | в плане |
GStreamer + крейт gstreamer |
LGPL-2.1+ (системный), 2; крейт MIT OR Apache-2.0 | 11 млн загр. | 2026-09 | C/Rust | экспорт на Linux (VA-API) | adopt как системная библиотека по решению владельца | раздел 4 | в плане |
rav1e; libvpx |
BSD-2 (+ патентная лицензия AOM); BSD-3 (+ патентный грант WebM), 1 | 4,2 / 1,0 тыс.★ | 2026-09/10 | Rust/C | webm AV1/VP9 | adopt | rav1e медленный — пресеты скорости | 0,5 |
| openh264 | BSD-2, 1 | 6,2 тыс.★ | 2026-09 | C++ | H.264 на Linux без VA-API | adopt только загрузкой бинаря Cisco | патенты покрыты лишь бинарём Cisco | — |
opus + audiopus_sys (libopus BSD-3);
ogg |
MIT/Apache-2.0; ISC; BSD-3 (проверено 2026-10-04), 1 | 2,5 / 3,7 / 10,9 млн | 2021–2026 | Rust/C | звук для webm, ogg | adopt | — | 0,3 |
webm-iterable; mp4 |
MIT (проверено 2026-10-04), 1 | 0,4 / 13,9 млн | 2026-08 / 2023-08 | Rust | мультиплексирование webm; разбор mp4 | adopt | mp4 не развивается |
0,5 |
cpal, rodio (без флагов по умолчанию),
rubato |
Apache-2.0 / MIT OR Apache-2.0 / MIT OR Apache-2.0, 1 | 23 / 12 / 12 млн | 2026 | Rust | вывод звука, микширование, ресемплинг | adopt | rodio по умолчанию тянет symphonia | 0,5 |
hound, claxon, lewton,
minimp3/minimp3_fixed,
puremp3 |
Apache-2.0 / Apache-2.0 / MIT OR Apache-2.0 / MIT / MIT OR CC0 (проверено 2026-10-04), 0–1 | 20 / 5 / 9,6 / 1,8 / 0,1 млн | 2019–2025 | Rust | WAV, FLAC, Vorbis, MP3 | adopt | claxon/lewton не развиваются с 2020–2021 | 0,5 |
| symphonia | MPL-2.0, 2 | 3,4 тыс.★ / 15,7 млн | 2026-08 | Rust | — | avoid (раздел 4) | — | — |
| FFmpeg | LGPL/GPL, 3 (TSV) | 64,7 тыс.★ | 2026-10 | C | — | avoid; не встраиваем | Qt Multimedia 6.8 по умолчанию на FFmpeg | — |
| reveal.js, marp-core | MIT, 1 | 72,3 / 1,2 тыс.★ | 2026-09 | JS | экспорт слайдов в HTML | reference | — | — |
3. Глубокие разборы
3.1 Кисти: libmypaint, формат .myb, mypaint-brushes, ink-stroke-modeler
libmypaint (mypaint_libmypaint, ISC —
COPYING: «Copyright (C) 2008-2011 Martin Renold and
contributors», последний коммит 2026-04-14; проверено 2026-10-04). 5 419
строк в 16 файлах .c (+ 945 в 19 .h):
| Файл | Строк | Что внутри | Решение |
|---|---|---|---|
mypaint-brush.c |
1 698 | движок: update_states_and_setting_values (стр. 708),
prepare_and_draw_dab (1042), count_dabs_to
(1253), mypaint_brush_stroke_to (1300), загрузка JSON
(1551–1690) |
port |
mypaint-mapping.c |
196 | кусочно-линейные кривые «вход → параметр» | port |
helpers.c |
608 | HSV/HSL/HCY, спектральное смешивание «как краска»
(rgb_to_spectral, mix_colors) |
port |
mypaint-tiled-surface.c |
974 | маска даба (render_dab_mask 376,
calculate_rr_antialiased 278), draw_dab 690,
get_color 803 (для размазывания) |
port формул, растр — свой |
brushmodes.c |
626 | режимы даба: Normal, Normal_Paint (спектральный), Posterize, Color, Eraser, LockAlpha | port формул |
mypaint-symmetry.c |
161 | симметрия: вертикальная, горизонтальная, вращательная, «снежинка» | port |
rng-double.c |
136 | генератор Кнута (public domain) | port |
operationqueue.c, tilemap.c,
fifo.c, mypaint-fixed-tiled-surface.c |
≈ 610 | очередь дабов по тайлам 64×64 | не нужно (свои тайлы 256×256) |
fastapprox/*.h |
— | быстрые pow/exp/log (BSD-3, Paul Mineiro) | по необходимости, с уведомлением |
brushsettings.json описывает 18 входов (pressure,
random, stroke, direction, tilt_declination, tilt_ascension, speed1,
speed2, custom, direction_angle, attack_angle, tilt_declinationx/y,
gridmap_x/y, viewzoom, brush_radius, barrel_rotation), 65 параметров и
44 состояния; заголовки генерирует generate.py.
Зависимости: json-c (MIT, только для разбора .myb через
#include <json.h> в mypaint-brush.c),
GLib/GObject-Introspection и GEGL — опционально (LGPL — не включать:
--without-glib --disable-introspection). Тестовые данные:
tests/events/painting30sec.dat (30 с событий t, x, y,
давление) и tests/brushes/*.myb — готовый набор для
сравнительных тестов порта. Перевод po/ru.po (165 строк)
помечен «same license as the MyPaint package» (MyPaint — GPL-2+) —
неоднозначно, названия параметров переводим сами.
Формат .myb — JSON версии 3:
{comment, group, description, notes, parent_brush_name, settings: {<параметр>: {base_value, inputs: {<вход>: [[x, y], …]}}}, version: 3}.
Все 196 кистей набора — версия 3, вместе используют 64 из 65 параметров
и 17 из 18 входов (проверено разбором JSON). Разбор — на Rust
(serde_json), json-c не нужен.
mypaint-brushes
(mypaint_mypaint-brushes): 196 .myb + 196
превью *_prev.png + order.conf (порядок
групп): classic 35, deevad 36 (David Revoy), Dieterle 19, experimental
23, kaerhon_v1 20 (Guillaume Loussarévian), ramon 28 (Ramón Miranda),
tanda 35 (Marcelo Cerviño). Мастер-документ лицензий —
Licenses.dep5: brushes/* — CC0-1.0 (по
авторам), но Files: * (корневые сборочные файлы) — GPL-2+;
Licenses.md скопирован из MyPaint и упоминает GPL — вводит
в заблуждение. Берём только brushes/**
(проверено 2026-10-04).
FFI или порт. FFI (сборка C через cc,
свой MyPaintSurface2 поверх тайлов MOffice) — 0,5–1
чел.-мес., но оставляет C в процессе редактора, формат пикселей
libmypaint (uint16 fix15, премультиплицированный) требует конвертации на
каждом тайле, сложнее WASM. Рекомендация — port: движок
(≈ 2,6 тыс. строк C → ≈ 2 тыс. Rust) + формулы дабов, растеризация —
своя SIMD на тайлах 256×256 в u16/f32; C-версия — только в тестах как
эталон (дифференциальные тесты на painting30sec.dat). 2–3
чел.-мес. Остаётся писать самим: кисти-штампы и текстурные (в libmypaint
их нет — только процедурные круглые/эллиптические дабы), импорт
.abr/.gbr, редактор кривых входов, превью
мазков, динамика планшета из QTabletEvent.
ink-stroke-modeler
(google_ink-stroke-modeler, Apache-2.0, последний коммит
2026-08-02): C++20 + Abseil (Apache-2.0), ≈ 3,9 тыс. строк без тестов
(1,8 тыс. в .cc). Модули: stroke_modeler.cc
(API Reset/Update/ Predict),
internal/position_modeler.* (масса на пружине с
сопротивлением), wobble_smoother.* (подавление дрожания на
малой скорости), stylus_state_modeler.* (давление/наклон по
проекции на сглаженную траекторию),
loop_contraction_mitigation_modeler.* (против «стягивания»
петель), prediction/kalman_predictor.* +
kalman_filter/* (предсказание на 1–2 кадра для снижения
задержки), stroke_end_predictor.h; параметры с проверкой —
params.{h,cc}. README предупреждает: модель для рукописи
(гладкость важнее точности); сама Google Ink (google/ink,
Apache-2.0, проверено 2026-10-04) перешла на новую реализацию — не
исследована. Решение: в Paint оставить one-euro фильтр
из apps/paint.md (P0, предсказуемый); ink-stroke-modeler
портировать (≈ 1 чел.-мес.) для пера Notes, рисования в PDF-аннотациях и
режима «Сглаженное перо» Paint (P1).
3.2 Эффекты и коррекции Pinta
Лицензии (PintaProject_Pinta, последний
коммит в клоне 2026-10-02; проверено 2026-10-04): собственный код Pinta
— MIT (license-mit.txt, © 2010 Jonathan Pobst); код
Paint.NET 3.36 — MIT (license-pdn.txt, © dotPDN LLC, Rick
Brewster и др., Portions © Microsoft) с исключением:
логотип и «icon artwork» Paint.NET — CC BY-NC-ND 2.5. При этом
readme.md Pinta называет иконки Paint.NET 3.0 «MIT», плюс
наборы Silk и Fugue (CC BY 3.0) и собственные иконки
(Pinta.Resources/icons/pinta-icons.md). Из-за противоречия
не берём ни одну из 207 иконок
Pinta.Resources/icons — только код; иконки рисуем в MOffice
Glyphs.
37 эффектов (категории — как в меню Pinta; ★ — собственные Pinta, остальные 31 — порт Paint.NET с заголовком «Paint.NET … Ported to Pinta by»):
| Категория | Эффекты (файлы Pinta.Effects/Effects/*Effect.cs) |
|---|---|
| Художественные (3) | Ink Sketch, Oil Painting, Pencil Sketch |
| Размытие (6) | Fragment, Gaussian Blur, Motion Blur, Radial Blur, Unfocus, Zoom Blur |
| Цвет (1) | Dithering ★ |
| Искажение (7) | Bulge, Dents, Frosted Glass, Pixelate, Polar Inversion, Tile Reflection, Twist |
| Шум (3) | Add Noise, Median, Reduce Noise |
| Объект (3) | Align Object ★, Feather Object ★, Outline Object ★ |
| Фото (5) | Glow, Red Eye Removal, Sharpen, Soften Portrait, Vignette |
| Рендер (5) | Cells ★, Clouds, Julia Fractal, Mandelbrot Fractal, Voronoi Diagram ★ |
| Стилизация (4) | Edge Detect, Emboss, Outline Edge, Relief |
9 коррекций
(Pinta.Effects/Adjustments/*, все из Paint.NET): Auto
Level, Black and White, Brightness/Contrast, Curves, Hue/Saturation,
Invert Colors, Levels, Posterize, Sepia.
Объём и устройство. Эффекты и коррекции — 6 131
строка C#; вспомогательное
Pinta.Effects/{Algorithms, Utilities,Classes} — 1 444
(LocalHistogram, Warp,
BrightnessContrastPixelOp, EdgeBehavior,
ErrorDiffusionMatrix, градиенты, палитры, sRGB);
Pinta.Core/Algorithms с PixelOps — 3 318
(гистограммы, шум Перлина, фракталы, UserBlendOps.* — 14
режимов смешивания: Normal, Multiply, ColorBurn, ColorDodge, Reflect,
Glow, Overlay, Difference, Negation, Lighten, Darken, Screen, Xor,
Additive). Итого ≈ 10,9 тыс. строк. Все эффекты реализуют
Render(ImageSurface src, ImageSurface dest, ReadOnlySpan<RectangleI> rois)
над буфером ColorBgra (8 бит, премультиплицированный BGRA),
с тайлингом (IsTileable), без рисования через Cairo — порт
прямой. В tests/Pinta.Effects.Tests/Assets — 125 эталонных
PNG и тесты по категориям → golden-тесты порта бит-в-бит.
Оценка порта на Rust: модуль
meridian-raster::fx с трейтом эффекта над тайлами; режим 8
бит (совпадение с эталонами) + f32 (линейный свет, 16 бит). ≈ 7–8 тыс.
строк Rust, 4–5 чел.-мес. против 9–10 с нуля. Покрывает P0
apps/paint.md §2.6–2.7: размытие Гаусса/в
движении/радиальное/zoom, резкость, шум (добавить, медиана, уменьшение),
мозаика, масляная краска, тиснение/рельеф, края, виньетка, скручивание,
«сферизация» (Bulge), облака (P1), уровни, кривые, оттенок/насыщенность,
яркость/контраст, ч/б, инверсия, постеризация, автоуровни.
Писать самим: нерезкая маска с порогом и high pass,
цветовой баланс, порог, ч/б-микшер 6 цветов, экспозиция, сочность,
тени/света, температура, волны/рябь, полярные координаты, смещение
(offset), своё ядро, минимум/максимум, Собель/Прюитт/Лаплас,
зернистость, рамка, GPU-предпросмотр (SkRuntimeEffect),
неразрушающие корректирующие слои. Попутно из Pinta:
Pinta.Core/ImageFormats/OraFormat.cs (OpenRaster — формат
P0 Paint), PaletteFormats/* (палитры GIMP, Paint.NET,
PaintShop Pro), алгоритмы инструментов (волшебная палочка, заливка с
допуском, клонирование, перекраска, градиенты —
Pinta.Tools/Tools/*, 28 файлов) — reference.
3.3 Удаление фона и сегментация
rembg (MIT, 24,9 тыс.★, 2026-09-20) — Python: сессия модели → ONNX Runtime → маска → постобработка. Модели (README, проверено 2026-10-04): u2net, u2netp, u2net_human_seg, u2net_cloth_seg, silueta, isnet-general-use, isnet-anime, sam, birefnet-general, birefnet-general-lite, birefnet-portrait, birefnet-dis, birefnet-hrsod, birefnet-cod, birefnet-massive и bria-rmbg — по умолчанию (1024×1024); облачный withoutbg. Постобработка: альфа-маттинг (закрытая форма, pymatting — MIT), «очистка цвета» краёв, ViTMatte.
Лицензии весов (проверено 2026-10-04 через Hugging Face API и GitHub API):
| Модель | Источник весов | Лицензия весов | Класс | Роль в MOffice |
|---|---|---|---|---|
| IS-Net general-use | xuebinqin/DIS | Apache-2.0 | 1 | модель по умолчанию «Удалить фон» |
| BiRefNet, BiRefNet_lite (+ portrait, DIS, HRSOD, COD, massive) | HF ZhengPeng7/BiRefNet* | MIT | 1 | режим «Высокое качество» |
| U-2-Net, u2netp, u2net_human_seg | xuebinqin/U-2-Net | Apache-2.0 | 1 | «Быстро» (u2netp ≈ 4,7 МБ — не проверено) |
| BEN2 | HF PramaLLC/BEN2 | MIT | 1 | альтернатива BiRefNet (нет в rembg) |
| isnet-anime | skytnt/anime-segmentation | Apache-2.0 | 1 | иллюстрации |
| u2net_cloth_seg | levindabhi/cloth-segmentation (архив) | MIT | 1 | не нужна |
| SAM (vit-base и др.) | HF facebook/sam-vit-* | Apache-2.0 | 1 | «Быстрое выделение» (P2) по точкам |
| ViTMatte | hustvl/ViTMatte (код MIT), HF vitmatte-small-composition-1k | Apache-2.0 | 1 | уточнение волос и краёв (P1) |
| silueta | — | не проверено | 9 | не брать до проверки |
| RMBG-1.4 / RMBG-2.0 (bria-rmbg) | HF briaai/* | «other: bria-rmbg» — некоммерческая лицензия Bria | 3 | запрещено, хотя это умолчание rembg |
Инференс: ort 2.0.0-rc.13 (MIT OR
Apache-2.0) + ONNX Runtime (MIT; в NOTICE — его ThirdPartyNotices),
провайдеры DirectML (Windows), CoreML (macOS), CPU; резерв без внешней
DLL — tract (MIT OR Apache-2.0). Что портируем из
rembg и pymatting (MIT): предобработку по модели (размер входа,
нормализация mean/std), постобработку маски (обратный ресайз,
морфологическое открытие, размытие кромки), обрезку по альфе, оценку
цвета переднего плана estimate_foreground_ml (≈ 150 строк).
Альфа-маттинг закрытой формы требует разреженного решателя — заменяем
guided filter (He et al., 2010, реализуем по статье) или ViTMatte.
Свои: UI (маска слоя вместо удаления пикселей, кисть
«+/−»), загрузка моделей по требованию с SHA-256 из зеркала MOffice,
тайлинг больших изображений, повышение разрешения маски. Функции нет в
roadmap; против своей разработки экономия 1–2 чел.-мес.
3.4 Снимки и запись экрана
ScreenPrompt владельца
(~/Mac1amoros/ScreenPrompt, MIT, © 2026 ScreenPrompt
contributors; прочитано 2026-10-04):
| Файл | Строк | Что делает | Переносим в MOffice |
|---|---|---|---|
native/windows/src/capture.rs |
711 | сеанс Windows.Graphics.Capture через windows-capture
2.0.1: источники monitor:N,
window:<hwnd>, picker:system (системный
пикер с отказом от неоднозначного сопоставления); кадры BGRA →
встроенный VideoEncoder (H.264 MP4, 30 к/с, 10 Мбит/с);
перенос меток времени после паузы; метрики frames,
max_frame_gap_sec; проверка политики на каждом кадре
(заголовок окна мог смениться) |
да, почти целиком |
native/windows/src/audio.rs |
498 | WASAPI loopback (системный звук) + микрофон (wasapi,
MIT) → отдельные float WAV 48 кГц (hound), роли дорожек,
смещение звука к видео |
да |
native/windows/src/timing.rs |
84 | PauseTimeline: пауза без «дыр» в медиавремени,
монотонные метки (тики 100 нс) |
да |
native/windows/src/policy.rs |
485 | политика захвата: разрешённые/запрещённые приложения и заголовки по маскам fnmatch, класс источника, загрузка по SHA-256, аттестация, сравнение за постоянное время | да (Business: «не снимать окна банков») |
native/windows/src/protocol.rs,
main.rs |
502 | JSON-протокол помощника: id/event/payload, ok/failure с кодом и признаком recoverable, версия 1.0 | да (процесс-помощник meridian-capture) |
native/windows/src/mux_plan.rs |
90 | аргументы FFmpeg для склейки видео и звука | нет (FFmpeg не встраиваем) |
apps/desktop/src-tauri/src/capture_backend.rs |
217 | модель возможностей бэкенда (Available, PermissionRequired, Unsupported, Degraded, Failed, FallbackActive), выбор auto/native/ffmpeg, запрет тихого отката | да, без ветки FFmpeg |
apps/desktop/src-tauri/src/recorder.rs |
551 | один активный рекордер; атомарный файл управления
(.recording-control.json через tmp + rename,
schema_version, request_id), состояние с
проверкой
recording_id/owner_pid/ack_request_id,
таймауты, остановка группы процессов, восстановление, кадр-превью |
да, как паттерн MOffice Broker |
native/macos/Sources/ScreenPromptCapture/*.swift |
≈ 1 400 | ScreenCaptureKit: SCContentSharingPicker (macOS 14+),
SCStream с отдельными выходами экрана, системного звука и
микрофона, AVAssetWriter (H.264 + AAC, дорожки с
метаданными ролей), SCRecordingOutput (macOS 15), разбор
ошибок SCStream (-3801 отказ, -3803 нет прав),
Policy.swift |
да: логика → Rust через objc2-screen-capture-kit или
отдельный Swift-помощник |
Paint → «Снимок» (область/окно/экран, задержка, в
буфер/документ/файл) и «Вставка → Снимок экрана»: Windows —
один кадр WGC (windows-capture, MIT) или xcap
(GDI BitBlt/PrintWindow, WGC; Apache-2.0); macOS — ScreenCaptureKit
(SCScreenshotManager с macOS 14, на macOS 13 — один кадр
SCStream) через objc2-screen-capture-kit (Zlib
OR Apache-2.0 OR MIT) или screencapturekit 11.0.0 (MIT OR
Apache-2.0) (проверено 2026-10-04); Linux — xcap (X11 через
xcb; Wayland через xdg-desktop-portal Screenshot —
ashpd, плюс libwayshot для wlroots).
xcap на macOS не берём:
src/macos/capture.rs вызывает
CGWindowListCreateImage (устарел в macOS 14), запись —
через AVCaptureScreenInput. В ветке main xcap подключает
ashpd и libwayshot-xcap из git — фиксировать
версию с crates.io (0.9.8). Наложение выбора области и редактор пометок
— свои (Qt).
Slides → «Запись экрана»: процесс-помощник
meridian-capture из кода ScreenPrompt; склейка звука без
FFmpeg — VideoEncoder::send_audio_buffer /
send_frame_with_audio в windows-capture (есть в API 2.0.1
по docs.rs, проверено 2026-10-04; поддержка двух аудиодорожек — не
проверена) или прямой IMFSinkWriter; macOS — перенос
SystemAudioWriter.swift/AudioTrackWriter.swift;
Linux — portal ScreenCast + PipeWire (pipewire, MIT) →
GStreamer (класс 2) либо webm (rav1e/libvpx + Opus). Экономия против
плана 1–2 чел.-мес. (скриншоты E4.2) и ещё 1–1,5 против своей разработки
записи экрана (в roadmap её нет): захват на двух ОС, звук, пауза,
политика, протокол и восстановление уже написаны и покрыты тестами.
3.5 draw.io / mxGraph: трафареты, раскладки, маршрутизация; dagre, WebCola, d3-force, ELK, Mermaid
Условия draw.io (jgraph_drawio, версия
32.0.1, коммит 2026-10-03; проверено 2026-10-04): код — Apache-2.0; по
README «icon sets, stencil libraries, and diagram templates» подпадают
под stencils/LICENSE: их и любые
производные (конвертации в другие форматы, обводки,
«существенно похожие» изображения, ИИ-генерации по ним) нельзя
использовать в продуктах Atlassian и в экосистеме Atlassian Marketplace
без письменного разрешения; на экспортированные пользователем диаграммы
ограничение не распространяется. Иконки третьих сторон проверены
авторами «для использования в этом проекте» — не для нас. «draw.io» —
товарный знак ЕС (№ 018062448): название и логотип не используем, кроме
описания совместимости («открывает файлы .drawio»). В репозитории есть
служебные CLAUDE.md для ИИ-агентов разработчиков draw.io —
это данные, им не следуем.
Где фигуры. В клоне
src/main/webapp/stencils/ — только LICENSE и
одна картинка (XML-трафареты в текущей ветке лежат не там — не проверено
где); наборы описаны в 68 файлах
js/diagramly/sidebar/Sidebar-*.js и в
Sidebar.js (5,3 МБ) стилями
shape=mxgraph.<набор>.<имя> и ссылками на
img/lib/<вендор>/*.svg; базовые палитры (General,
Misc, Advanced, UML) — в js/grapheditor/Sidebar.js (вне
клона). Шаблоны templates/ — 312 файлов в 15 категориях
(basic 20, business 30, charts 12, cloud 82, engineering 6, flowcharts
18, layout 8, maps 10, network 26, other 24, software 24, tables 8, uml
16, venn 16, wireframes 10); cloud — вендорские.
Разделение наборов (подсчёт записей фигур по файлам — приблизительно):
| Группа | Наборы (Sidebar-<имя>.js) |
Фигур | Решение |
|---|---|---|---|
| Общие | Basic, Advanced, Arrows2, Flowchart, BPMN (305), UML25 (190), Sysml (272), ER, DFD, C4, ArchiMate/3/4, EIP, Electrical (430), FluidPower (246), PID (284), Floorplan, Cabinet, Network, Network2, Mockup, Bootstrap (449), Infographic, LeanMapping, Sitemap, Signs, ThreatModeling, Rack / General | ≈ 3 500 | берём: конвертер в .mvs + условие
Atlassian в NOTICE и манифесте; названия нотаций SysML®, ArchiMate® —
товарные знаки OMG и The Open Group (только как название нотации);
условия иконок EIP — проверить |
| Вендорские | AWS, AWS3, AWS3D, AWS4 (1 045), AWS4b, Azure, Azure2 (766), GCP, GCP2, GCP3, GCPIcons, Cisco, Cisco19, CiscoSafe (506), IBM, IBMCloud, SAP, Salesforce, Veeam, Veeam2, VVD (VMware), Citrix, Citrix2, AlibabaCloud, AlliedTelesis, Cumulus, Atlassian, Atlassian2, Office, Dynamics365, ActiveDirectory, MSCAE, Kubernetes, OpenStack, WebIcons (логотипы сайтов), Ios, Ios7, Android, Gmdl, Rack / Dell, F5, HPE Aruba | ≈ 9 100 | не берём: товарные знаки и условия вендоров. При
импорте .drawio — SVG из файла, если вложен, иначе заглушка
с именем; пользователь может загрузить официальный набор вендора в «Мои
трафареты» |
Алгоритмы mxGraph (Apache-2.0,
jgraph/mxgraph, архив 2020; дерево проверено 2026-10-04
через GitHub API; Java-версия java/src/com/mxgraph/... — та
же логика с типами, удобнее для порта):
Файл javascript/src/js/… |
Размер | Назначение | Куда в MOffice |
|---|---|---|---|
layout/hierarchical/mxHierarchicalLayout.js +
model/mxGraphHierarchyModel.js +
stage/mxMinimumCycleRemover.js,
mxMedianHybridCrossingReduction.js,
mxCoordinateAssignment.js |
20 + 20 + 3 + 17 + 43 КБ | многоуровневая раскладка блок-схем | Draw → Автораскладка «Иерархия» |
layout/hierarchical/mxSwimlaneLayout.js +
model/mxSwimlaneModel.js +
stage/mxSwimlaneOrdering.js |
23 + 24 + 3 КБ | раскладка с дорожками | BPMN, кросс-функциональные схемы |
layout/mxCompactTreeLayout.js,
mxRadialTreeLayout.js |
23 + 8 КБ | деревья, оргсхемы, радиальные | MOffice Diagram (иерархии), mind map |
layout/mxFastOrganicLayout.js,
mxCircleLayout.js |
14 + 4 КБ | силовая и круговая | сети |
layout/mxStackLayout.js,
mxPartitionLayout.js, mxParallelEdgeLayout.js,
mxEdgeLabelLayout.js,
mxCompositeLayout.js |
13 + 6 + 6 + 3 + 2 КБ | контейнеры, параллельные рёбра, подписи | Scene/Diagram |
view/mxEdgeStyle.js |
1 652 строки | EntityRelation, Loop, ElbowConnector, SideToSide, TopToBottom,
SegmentConnector (стр. 592), OrthConnector (стр. 1054;
таблицы routePatterns, inlineRoutePatterns,
limits) |
scene::connector |
view/mxPerimeter.js |
21 КБ | точки выхода на контуре: прямоугольник, эллипс, ромб, треугольник, шестиугольник | scene::connector |
OrthConnector выбирает шаблон маршрута по взаимному
положению двух фигур и не учитывает остальные — обход
препятствий пишем сами по статье Wybrow, Marriott, Stuckey
«Orthogonal Connector Routing» (GD 2009): граф ортогональной видимости +
A* со штрафом за изгибы + разведение параллельных сегментов; образцы с
MIT — WebCola src/gridrouter.ts (30 КБ) и роутер
«manhattan» в antvis/X6 (путь не проверен). libavoid (Adaptagrams,
LGPL-2.1) не читаем. План порта: коннекторы и периметры (0,5 чел.-мес.)
→ дерево/радиальное (0,5) → иерархия с дорожками (1,5) →
органическая/круговая/контейнеры (1) → обход препятствий (1,5–2). Итого
4–5,5 чел.-мес.
dagre (MIT, TypeScript, дерево проверено
2026-10-04): lib/acyclic.ts + greedy-fas.ts
(разрыв циклов), rank/network-simplex.ts +
feasible-tree.ts (ранжирование), order/*
(барицентр, cross-count.ts, sort-subgraph.ts),
position/bk.ts (Brandes–Köpf, 21 КБ),
nesting-graph.ts, parent-dummy-chains.ts,
add-border-segments.ts (вложенные кластеры),
layout.ts (32 КБ, конвейер). Метрика
apps/draw.md уже задана «пересечения не хуже dagre ±5 %» →
порт dagre (1–2 чел.-мес.) как базовая «Иерархия», mxSwimlaneLayout —
для дорожек. WebCola (MIT): src/vpsc.ts
(размещение с ограничениями зазоров — «убрать перекрытия», «выровнять»),
rectangle.ts (removeOverlaps), descent.ts
(стресс-мажоризация), gridrouter.ts, geom.ts,
shortestpaths.ts. d3-force (ISC):
src/simulation.js, manyBody.js (Barnes–Hut на
d3-quadtree), link.js, collide.js,
center.js, radial.js (пути не проверены
построчно) — порт 0,5 чел.-мес. для mind map и сетей.
ELK/elkjs (EPL-2.0) и Graphviz
(EPL-1.0) — только сравнение результатов на эталонных графах (класс
2).
Mermaid (MIT, дерево проверено 2026-10-04): 19
jison-грамматик
packages/mermaid/src/diagrams/*/parser/*.jison (flowchart
flow.jison, sequence, class, state, er, gantt, mindmap,
timeline, journey, c4, block, quadrant, xychart, sankey, requirement,
kanban, ishikawa, venn, agentflow) и 18 langium-файлов
packages/parser/src/language/* (pie, gitGraph,
architecture, packet, radar, treemap, info, railroad*, wardley, cynefin,
eventmodeling, treeView). План «Вставка → Из текста»: P1 — flowchart,
sequence, class, state, er, mindmap (→ Draw/Diagram); pie, xychart,
sankey, quadrant, treemap → MOffice Chart; gantt → MOffice Plan (фаза
7). Парсер — свой на Rust по грамматикам Mermaid (уведомление MIT),
раскладка — наш порт dagre. 2–3 чел.-мес. PlantUML
(LGPL-3.0, проверено 2026-10-04) и D2 (MPL-2.0, не проверено) —
синтаксис только по документации.
3.6 PDF: рендер, правка, подписи, формы
pdfium. Файл LICENSE
(pdfium.googlesource.com, ветка main; проверено 2026-10-04) содержит
BSD-3-Clause («Copyright 2014 The PDFium Authors») и полный текст
Apache-2.0 → класс 1. Отдельно соблюдаем third_party/:
FreeType (FTL), OpenJPEG (BSD-2), Little-CMS (MIT), libjpeg-turbo
(IJG/BSD-3/Zlib), zlib, libpng, libtiff, AGG 2.3, Abseil (Apache-2.0),
при pdf_use_skia — Skia (BSD-3); V8 и XFA не включаем
(состав поимённо не проверен — генерировать NOTICE из
third_party/*/LICENSE при сборке).
bblanchon/pdfium-binaries (MIT): Windows x64/x86/arm64,
macOS x64/arm64/universal, Linux glibc и musl, Android, iOS, WASM
(эксп.), варианты с V8; сборка еженедельно с 2017; подписей и аттестации
сборок нет (проверено 2026-10-04) → на старте — с проверкой хэша, к
релизу 2.5 — своя сборка в CI по их скриптам (GN:
pdf_use_skia=true, pdf_enable_v8=false,
pdf_enable_xfa=false). pdfium-render 0.9.4
(MIT OR Apache-2.0): обёртки рендера, текста (PdfPageText),
форм (src/pdf/document/form.rs), подписей — только
чтение (signature.rs), вложений, закладок,
объектов страницы; флаги thread_safe, static →
источник кода для meridian-pdfium-sys (решение
apps/pdf.md 1.4).
lopdf 0.45.0 (MIT, коммит 2026-10-02):
src/incremental_document.rs (правки поверх исходных
байтов), object_stream.rs (ObjectStreamBuilder
— запись объектных потоков), encryption.rs +
encryption/{algorithms, crypt_filters,rc4,pkcs5}.rs (RC4,
AES-128/256), reader.rs (1 914 строк, восстановление xref),
parser/* (nom 8), parser/cmap_parser.rs,
writer.rs, xref.rs, encodings/*;
всего ≈ 21 тыс. строк. Ограничение — документ целиком в памяти.
Fork частей в meridian-pdf-core
(лексер/парсер, xref, шифрование, инкрементальная запись, писатель) с
заменой хранилища на ленивое (индекс xref + кеш объектов): 3–4 чел.-мес.
экономии.
hayro (Apache-2.0 OR MIT, 779★, автор LaurenzV —
также krilla и subsetter; проверено 2026-10-04): крейты
hayro-syntax (разбор), hayro-interpret
(интерпретатор → абстрактное устройство Device),
hayro (растр), hayro-svg,
hayro-jpeg2000, hayro-jbig2,
hayro-ccitt, hayro-postscript,
hayro-cmap. Проходит 1 400+ PDF регрессионных наборов
PDFBox и pdf.js; не поддерживает knockout-группы и неэмбеднутые
CID-шрифты; скорость не оптимизировалась; аннотаций и форм нет.
Предложение: этап B apps/pdf.md строить на
fork hayro-interpret со своим Device → список
отображения MOffice Render → Skia; декодеры JBIG2/JPX/CCITT брать сразу
(вместо «jbig2dec-порта» и OpenJPEG). Экономия 8–12 чел.-мес. от оценки
«2–3 человеко-года» в apps/pdf.md; риск — один автор,
поэтому fork и свой корпус.
qpdf (Apache-2.0): reference линеаризации,
восстановления xref и проверки структуры; в CI — оракул
(qpdf --check), в продукт не входит.
Apache PDFBox (Apache-2.0; дерево проверено 2026-10-04) — что портировать:
| Тема | Файлы | Что берём |
|---|---|---|
| Подпись при сохранении | pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
(61 КБ) |
инкрементальная запись, резерв /Contents, вычисление
/ByteRange, doWriteSignature |
| Модель подписи | pdmodel/interactive/digitalsignature/{PDSignature, SignatureOptions, SigningSupport, ExternalSigningSupport, SignatureInterface, PDSeedValue*, PDPropBuild*}.java |
словарь подписи, внешняя подпись (ключ в хранилище ОС), seed values |
| Видимая подпись | digitalsignature/visible/{PDVisibleSignDesigner, PDVisibleSigBuilder, PDFTemplateBuilder, …}.java |
внешний вид поля подписи |
| PAdES B-T, B-LT | examples/src/main/java/org/apache/pdfbox/examples/signature/{CreateSignatureBase, CreateVisibleSignature2, CreateEmbeddedTimeStamp, ValidationTimeStamp, TSAClient, SigUtils, ShowSignature}.java,
validation/{AddValidationInformation, CertInformationCollector}.java,
cert/{OcspHelper, CRLVerifier, CertificateVerifier}.java |
штамп времени RFC 3161, DSS/VRI, OCSP/CRL, DocMDP (сертификация), проверка |
| Формы | pdmodel/interactive/form/{PDAcroForm (30 КБ), AppearanceGeneratorHelper (44 КБ), PDFieldFactory}.java,
interactive/PlainTextFormatter.java,
pdmodel/fdf/FDFDocument.java |
flatten, NeedAppearances, генерация /AP (авторазмер,
многострочный, comb, выравнивание), FDF/XFDF |
| Текст | text/PDFTextStripper.java (82 КБ),
TextPosition.java |
порядок чтения, статьи /B, эвристики пробелов и
абзацев |
| Страницы | multipdf/PDFMergerUtility.java (61 КБ) |
объединение с формами, закладками и структурой |
Криптография для подписей — RustCrypto (все Apache-2.0 OR MIT,
проверено 2026-10-04): cms 0.2.3 (SignedData и
построитель), x509-cert, x509-tsp 0.1.0 (2023,
дописать), x509-ocsp 0.2.1, der,
rsa, p256/p384,
sha2; ключи — CNG/NCrypt, Keychain SecKey,
PKCS#11 на Linux (крейт cryptoki — лицензия не проверена).
cryptographic-message-syntax (MPL-2.0) не нужен. Профили:
B-B (CMS с signing-certificate-v2), B-T (+ штамп времени),
B-LT (+ DSS), B-LTA (+ DocTimeStamp). Экономия: подписи и проверка 2–3
чел.-мес., формы и FDF/XFDF 1,5–2, объединение 0,5.
pdf.js (Apache-2.0) — reference (пути по известной
структуре, не проверены): src/core/evaluator.js
(getTextContent: склейка глифов, пробелы по геометрии,
вертикальный текст), src/core/annotation.js (внешний вид
FreeText, Ink, виджетов),
src/core/{fonts,cff_parser,type1_parser,cmap}.js (для
своего рендера), src/display/text_layer.js (выделяемый
текст поверх растра).
3.7 OCR и конвертация PDF → Write/Sheets
Tesseract 5 (Apache-2.0, 76,8 тыс.★) +
tessdata_fast / tessdata_best (Apache-2.0):
LSTM, OSD (поворот), 100+ языков; конвейер уже описан в
apps/pdf.md (OSD → psm → TSV → невидимый текстовый слой).
Связь — свой тонкий слой над C-API (tesseract 0.15 MIT и
leptess MIT 2023 — устаревают); Leptonica — лицензия не
проверена. Модели — загрузка по языку из зеркала MOffice.
PP-OCRv5 (PaddleOCR, Apache-2.0 код и веса;
официальные ONNX на HF PaddlePaddle —
PP-OCRv5_server_rec_onnx,
PP-OCRv5_mobile_rec_onnx,
eslav_PP-OCRv5_mobile_rec_onnx (русский, украинский,
белорусский), cyrillic_PP-OCRv5_mobile_rec_onnx,
latin_, arabic_, devanagari_,
el_, korean_, th_,
ta_, te_, en_; проверено
2026-10-04) — второй движок через ort для фото, скриншотов
и сложного фона. Портируем постобработку детекции DB (бинаризация,
контуры, unclip-расширение — i_overlay offset) и
CTC-декодирование (≈ 1 тыс. строк Python RapidOCR/PaddleOCR → ≈ 1,2 тыс.
Rust; пути не проверены). ONNX детектора PP-OCRv5_*_det —
наличие официального ONNX не проверено (PyTorch/Paddle-веса Apache-2.0
есть).
ocrs — код MIT OR Apache-2.0 (Rust, движок rten), но
веса HF robertknight/ocrs — CC BY-SA 4.0, обучены на
HierText (CC BY-SA 4.0), в ocrs-models лицензии весов нет,
алфавит DEFAULT_ALPHABET (ocrs/src/lib.rs:34)
— только ASCII. Веса не берём; код группировки слов в строки
(ocrs/src/layout_analysis*, не проверено построчно) — можно
портировать как MIT.
Конвейер «PDF → Преобразовать в docx/xlsx»:
- Глифы с координатами — pdfium
FPDFText_*(этап A), позже свой интерпретатор. - Символы → строки → блоки → порядок чтения — порт
pdfminer/layout.py(pdfminer.six, MIT):LAParams(line_overlap,char_margin,line_margin,word_margin,boxes_flow,detect_vertical),LTLayoutContainer.group_objects(символы → строки),group_textlines(строки → блоки по индексуPlaneизpdfminer/utils.py),group_textboxes(иерархическая кластеризация блоков по площади охватывающего прямоугольника), сортировка поboxes_flow. ≈ 1 тыс. строк, 1 чел.-мес. - Таблицы — порт
pdfplumber/table.py(MIT): стратегииlines,lines_strict,text,explicit;snap_edges→join_edge_group→merge_edges→edges_to_intersections→intersections_to_cells→cells_to_tables; допускиsnap_tolerance,join_tolerance,edge_min_length,intersection_tolerance. Даёт «PDF → Sheets» (таблицы в ячейки) и таблицы в docx. 1 чел.-мес. - Структура страницы (заголовки, списки, подписи, колонтитулы,
рисунки, формулы, таблицы без линий) — модели Docling через
ort:docling-layout-heron(Apache-2.0) и TableFormer изdocling-models(CDLA-Permissive-2.0 + Apache-2.0); постобработка раскладки, порядок чтения и декодирование TableFormer — порт изdocling-ibm-models(MIT) иdocling(MIT) (пути модулей не проверены). Экспорт моделей в ONNX — своя задача. 2–3 чел.-мес. экономии против своей модели раскладки, недостижимой для команды PDF из 2 Rust-инженеров (roadmap фазы 4). - Сборка документа Write/Sheets: стили по кеглю и насыщенности (заголовки 1–3), абзацы и отступы, списки по маркерам, колонки → разделы, изображения, таблицы, сноски. Это остаётся своим (≈ 2 чел.-мес.).
Не берём: pdf2docx как зависимость (MIT, но
requirements.txt: PyMuPDF>=1.26.7 — AGPL;
код можно читать как MIT для идей секций/колонок и
«stream/lattice»-таблиц), surya и marker (веса класс 3), layout-parser
(заброшен с 2024). Отдельно проверить собственный Formulник/AXEL
владельца (OCR счетов, таблицы из PDF на sagr) — раздел 8.
3.8 Chart: модули d3, ECharts, ColorBrewer
Все модули d3 — ISC (© Mike Bostock), пути проверены по деревьям репозиториев 2026-10-04:
| Модуль | Файлы src/… |
Что портируем | Где в MOffice Chart |
|---|---|---|---|
| d3-array | ticks.js (tickIncrement,
tickStep: шаги 1/2/5·10ᵏ с порогами √50, √10, √2),
nice.js, bin.js,
threshold/{sturges,scott,freedmanDiaconis}.js |
«красивые» деления, бины гистограммы и правила их числа | оси, тип «Гистограмма» (P0) |
| d3-scale | linear.js (nice()), log.js,
symlog.js, time.js (деления по календарю),
tickFormat.js (точность подписей), nice.js,
threshold.js |
шкалы, логарифмическая ось, оси дат | все типы с осями |
| d3-shape | curve/monotone.js (monotoneX по Steffen 1990 — без
выбросов за данные), curve/linear.js и др.,
arc.js (padAngle, cornerRadius, внутренний радиус),
pie.js, stack.js + offset/*
(expand — 100 %, diverging — отрицательные) |
сглаженные линии, круговая/кольцевая, накопление | линейная, площадная, круговая, кольцевая, с накоплением |
| d3-hierarchy | treemap/squarify.js (Bruls–Huizing–van Wijk, золотое
сечение), treemap/resquarify.js (стабильность при
обновлении), partition.js |
treemap и sunburst | P1 (1.6) |
| d3-scale-chromatic | categorical/* (category10, Set1–3, Pastel, Dark2,
Paired, Accent), diverging/* (RdYlBu и др.),
sequential-multi/viridis.js |
палитры как данные | галерея цветов диаграмм |
d3-scale-chromatic/LICENSE включает ISC и «Apache-Style
Software License for ColorBrewer» (© 2002 Cynthia Brewer, Mark Harrower,
Penn State) — в NOTICE оба текста; viridis/magma/inferno/plasma — CC0
(не проверено построчно); Tableau10 не берём (условия не указаны). Объём
порта ≈ 2–3 тыс. строк JS → ≈ 1,5–2 тыс. Rust, 1,5 чел.-мес.
ECharts (Apache-2.0) — reference для типов P1
(радар, воронка, водопад как накопленный столбец с невидимой базой,
биржевая, ящик с усами, sankey, treemap, sunburst) и авто-раскладки
подписей без перекрытий (выноски круговой диаграммы); пути в коде не
проверены. Vega/Vega-Lite (BSD-3) и Observable
Plot (ISC) — образец декларативного описания для шаблонов
.mcht. Свои: модель c:chart
DrawingML, правила Excel для автоматических границ и единиц осей
(отличаются от d3 — проверять снимочными тестами против Excel, порог
roadmap SSIM ≥ 0,92), стили диаграмм Office (части chartStyle/colors),
линии тренда (statrs/nalgebra), рендер через
scene. Правило числа бинов гистограммы в Excel (по
документации Microsoft — правило Скотта) — не проверено. Экономия 2–3
чел.-мес. против E2.3.
3.9 Slides и медиа: Lottie, экспорт видео, аудио
Lottie. У skia-safe 0.153.3 есть флаг
skottie (проверено по crates.io 2026-10-04) — модуль
Skottie из Skia (BSD-3) рисует Lottie тем же растеризатором, что и
слайд, а экспорт видео и PDF идёт из того же списка отображения.
Рекомендация — Skottie (adopt); rlottie (MIT + части
FTL/BSD, Samsung) — резерв, ThorVG (MIT) — альтернатива,
velato (Apache-2.0 OR MIT) — для экспериментального vello.
Формат .lottie (ZIP с JSON и ресурсами) — свой разбор.
Полнота Rust-обёртки Skottie — не проверена. Экономия ≈ 2 чел.-мес.
против своего плеера.
Экспорт видео (roadmap: P1 в 2.1, открытый вопрос №
9). Кадры рендерятся из списка отображения и подаются в кодер ОС:
Windows — Media Foundation IMFSinkWriter (H.264 + AAC в
MP4, аппаратно; на Windows N без Media Feature Pack — сообщение и webm);
macOS — AVAssetWriter/VideoToolbox (как
SystemAudioWriter.swift владельца); Linux — GStreamer как
системная библиотека (класс 2) только с аппаратными VA-API кодерами
(x264enc — GPL, нельзя) или openh264 с загрузкой бинаря
Cisco (патенты покрыты только им). WebM на всех ОС:
rav1e (AV1, BSD-2 + патентная лицензия AOM) или libvpx
(VP9, BSD-3 + патентный грант WebM) + Opus (opus
MIT/Apache-2.0 → audiopus_sys ISC → libopus BSD-3) →
мультиплексор webm-iterable (MIT). Вставка AV1-видео —
декодер dav1d (BSD-2). FFmpeg не встраиваем.
Воспроизведение медиа в Slides. Qt 6.8 Multimedia по
умолчанию использует FFmpeg-бэкенд (FFmpeg 7.1 в установщике Qt);
нативные бэкенды включаются
QT_MEDIA_BACKEND=windows|darwin|gstreamer с «ограниченной
поддержкой», а бэкенд Windows Media Foundation объявлен устаревшим с Qt
6.10 (doc.qt.io, проверено 2026-10-04). Это противоречит «FFmpeg — не
встраиваем» и мере риска фазы 3 roadmap («единый бэкенд — FFmpeg-бэкенд
Qt 6.8»). Рекомендация: свой тонкий медиаслой над
IMFMediaEngine (Windows), AVPlayer (macOS),
GStreamer playbin (Linux) с выводом кадров в текстуру QRhi;
вариант «Qt Multimedia + FFmpeg в LGPL-сборке, динамически» — только
решением владельца (раздел 4).
Аудио без symphonia (лицензии проверены 2026-10-04):
вывод — cpal (Apache-2.0) + rodio (MIT OR
Apache-2.0) строго с
default-features = false, features = ["playback", "claxon", "hound", "lewton", "minimp3"],
потому что флаги по умолчанию rodio 0.22.2 (flac,
mp3, mp4, vorbis,
wav) включают symphonia-*;
minimp3 в rodio ведёт к minimp3_fixed 0.5.4
(MIT). Форматы: WAV — hound (Apache-2.0), FLAC —
claxon (Apache-2.0, 2020), Vorbis — lewton
(MIT OR Apache-2.0, 2021) + ogg (BSD-3), MP3 —
minimp3/minimp3_fixed (MIT, C-ядро minimp3 —
CC0) или puremp3 (MIT OR CC0), Opus — opus;
AAC/M4A/ALAC/WMA — декодеры ОС (MF, AVFoundation, GStreamer). Ресемплинг
— rubato; запись дикторского текста — cpal +
hound. Экономия ≈ 1 чел.-мес.
4. Класс 2 — решения владельца
| Компонент | Лицензия | Зачем мог бы понадобиться | Альтернатива классов 0–1 | Рекомендация |
|---|---|---|---|---|
| GStreamer (системный) | LGPL-2.1+ | экспорт и воспроизведение видео/аудио на Linux | только webm (rav1e/libvpx + Opus) и openh264 от Cisco | одобрить как системную библиотеку ОС (не поставляем; во Flatpak — из runtime), динамически, без своих патчей |
| FFmpeg через Qt Multimedia 6.8 | LGPL-2.1+ (при сборке без GPL-частей); GPL-сборки — класс 3 | воспроизведение медиа в Slides «из коробки» | свой медиаслой над IMFMediaEngine / AVPlayer / GStreamer playbin | не брать; если сроки фазы 3 горят — временно, с собственной LGPL-сборкой и записью в реестре |
| symphonia | MPL-2.0 | декодирование AAC/ALAC/MP4-аудио на Rust | hound, claxon, lewton,
minimp3_fixed, opus + декодеры ОС |
не брать; запрет в deny.toml |
cryptographic-message-syntax |
MPL-2.0 | CMS SignedData для подписей | RustCrypto cms (Apache-2.0 OR MIT) |
не брать |
| libheif (+ libde265) | LGPL-3.0 | HEIC на Linux | WIC + HEIF Extension (Windows), ImageIO (macOS) | на Linux — системная библиотека по решению владельца, иначе HEIC на Linux не поддерживается |
libraw; rawler, rawloader |
LGPL-2.1 / CDDL-1.0; LGPL-2.1 | RAW-фото | WIC Raw Image Extension, ImageIO RAW; DNG через
tiff |
libraw — плагин с динамической загрузкой P1 (как уже в
apps/paint.md); Rust-крейты не брать |
| ELK / elkjs; Graphviz | EPL-2.0; EPL-1.0 | эталонные раскладки | порты dagre, mxGraph, WebCola, d3-force | код не нужен; только сравнение результатов на тестовых графах |
| libavoid (Adaptagrams) | LGPL-2.1 | обход препятствий коннекторами | статья Wybrow 2009 + WebCola gridrouter.ts, X6
manhattan (MIT) |
не брать, исходники не читать |
| PlantUML; D2 | LGPL-3.0 (проверено); MPL-2.0 (не проверено) | импорт текстовых диаграмм | свой парсер по документации синтаксиса | не брать код |
| JointJS, Penpot | MPL-2.0 | редакторы схем | свой редактор на scene |
не нужны |
5. Запрещено (класс 3) и замены
| Проект | Лицензия / причина | Где возникает соблазн | Замена |
|---|---|---|---|
| MuPDF, PyMuPDF | AGPL-3.0 | рендер, правка, конвертация PDF | pdfium + hayro-fork + lopdf-fork + PDFBox-порт |
| iText | AGPL-3.0 | подписи, формы | порт PDFBox + RustCrypto cms |
| Poppler, Xpdf, Ghostscript | GPL / AGPL | рендер, растеризация, эталоны | pdfium (рендер), pdf.js и pdfium — эталоны тестов |
| pdf2docx (как зависимость) | MIT, но PyMuPDF>=1.26.7 (AGPL) |
PDF → docx | свой конвейер раздела 3.7 |
| Веса surya и marker | CC BY-NC-SA 4.0 (HF) / модифицированная OpenRAIL-M с порогом 5 млн USD (README marker) | раскладка, OCR, таблицы | Docling (Apache-2.0, CDLA-Permissive-2.0), PP-OCRv5, Tesseract |
| bria RMBG-1.4 / 2.0 | некоммерческая лицензия Bria; модель rembg по умолчанию | «Удалить фон» | IS-Net, U-2-Net (Apache-2.0), BiRefNet, BEN2 (MIT) |
| Веса ocrs | CC BY-SA 4.0 (данные HierText) | OCR на чистом Rust | PP-OCRv5 ONNX, Tesseract |
| Krita, GIMP, MyPaint (приложение) | GPL-3.0 / GPL-3.0 / GPL-2+ | кисти, фильтры, форматы | libmypaint (ISC), Pinta (MIT), спецификации форматов, чистая комната |
| Корневые файлы mypaint-brushes | GPL-2+ по Licenses.dep5 |
— | берём только brushes/** (CC0) |
| x264, x265, GPL-сборки FFmpeg | GPL | экспорт H.264/HEVC | Media Foundation, VideoToolbox, VA-API, rav1e, libvpx |
| bpmn-js (в TSV ошибочно класс 1) | MIT + обязательный видимый водяной знак bpmn.io | редактор BPMN | трафареты BPMN draw.io + свой редактор |
| tldraw | собственная лицензия с водяным знаком | доска, свободное рисование | свой холст scene |
| Иконки Paint.NET и все иконки Pinta | CC BY-NC-ND 2.5; смешанные CC BY 3.0 и противоречивые заявления | значки эффектов и инструментов | MOffice Glyphs |
| Вендорские иконки draw.io (AWS, Azure, GCP, Cisco, Kubernetes, SAP…) | не лицензия, а товарные знаки и условия вендоров + ограничение Atlassian | сетевые и облачные схемы | официальные наборы вендоров загружает пользователь |
| Логотип и имя draw.io | товарный знак ЕС | маркетинг | только «открывает файлы .drawio» |
6. Что переносим кодом
Пути MOffice — по дереву docs/03-architecture.md §2
(kernel/crates/*, apps/<app>/); новые
крейты помечены ⊕ и предложены в разделе 7. Для порта: в заголовке
каждого файла — «Основано на <проект> (<лицензия>), ©
<авторы>», текст лицензии — в NOTICE и окне «О программе →
Лицензии открытого ПО»; для Apache-2.0 — также пометка об изменениях и
перенос их NOTICE.
| Источник (клон или репозиторий: файлы) | Куда в MOffice | Лицензия | NOTICE и заголовок |
|---|---|---|---|
libmypaint: mypaint-brush.c,
mypaint-mapping.c, helpers.c,
mypaint-symmetry.c, rng-double.c,
brushsettings.json |
kernel/crates/meridian-raster/src/brush/mypaint/{engine,mapping,color,symmetry,rng,settings}.rs |
ISC; rng — public domain (Кнут) | «Based on libmypaint © 2008-2011 Martin Renold and contributors (ISC)» |
libmypaint: mypaint-tiled-surface.c (маска и
сглаживание даба), brushmodes.c |
meridian-raster/src/brush/dab.rs (формулы; растр и SIMD
свои) |
ISC | то же |
libmypaint: fastapprox/*.h (по необходимости) |
meridian-raster/src/simd/fastapprox.rs |
BSD-3-Clause (Paul Mineiro) | уведомление BSD-3 |
mypaint-brushes: brushes/** (*.myb,
*_prev.png, order.conf) |
apps/paint/brushes/mypaint/ |
CC0-1.0 | не обязательно; авторов из Licenses.dep5 указываем из
уважения |
ink-stroke-modeler:
ink_stroke_modeler/{stroke_modeler,params,types}.{h,cc},
internal/** |
meridian-raster/src/ink/ (общий для Paint, Notes,
аннотаций PDF) |
Apache-2.0 | NOTICE + пометка об изменениях |
Pinta: Pinta.Effects/Effects/*.cs,
Adjustments/*.cs, Algorithms/*,
Utilities/*, Classes/* |
meridian-raster/src/fx/{artistic,blur,color,distort,noise,object,photo,render,stylize}/*.rs,
src/adjust/*.rs |
MIT (Pinta) + MIT (код Paint.NET 3.36) | два уведомления: © 2010 Jonathan Pobst и участники Pinta; © dotPDN LLC, Rick Brewster, Tom Jackson и др., Portions © Microsoft; пометка «иконки и логотип Paint.NET не используются» |
Pinta: Pinta.Core/Algorithms/PixelOps/UserBlendOps*.cs,
Histogram*.cs, PerlinNoise.cs |
meridian-raster/src/blend/,
src/fx/util/ |
MIT | то же |
Pinta: Pinta.Core/ImageFormats/OraFormat.cs,
PaletteFormats/*.cs |
kernel/crates/codec-image/src/ora.rs,
src/palette/ |
MIT | то же |
Pinta: tests/Pinta.Effects.Tests/Assets/*.png
(125) |
tests/corpus/golden/paint-fx/ (вне продукта) |
MIT | NOTICE репозитория |
rembg: пред- и постобработка сессий, post_process,
обрезка по альфе; pymatting: estimate_foreground_ml |
kernel/crates/meridian-assist/src/remove_bg/ |
MIT / MIT | заголовок + NOTICE (пути в rembg не проверены) |
ScreenPrompt:
native/windows/src/{capture,audio,timing,policy,protocol}.rs,
apps/desktop/src-tauri/src/{capture_backend,recorder}.rs,
native/macos/Sources/ScreenPromptCapture/*.swift |
⊕
kernel/crates/meridian-capture/src/{windows,macos,linux,policy,timeline,protocol}/
+ процесс-помощник; управление записью — MOffice Broker |
MIT (владелец) | © владельца сохраняем; без mux_plan.rs и ветки
FFmpeg |
xcap: src/linux/* (если не зависимостью) |
meridian-capture/src/linux/ |
Apache-2.0 | NOTICE |
mxGraph:
javascript/src/js/view/{mxEdgeStyle,mxPerimeter}.js (или
Java com/mxgraph/view/*) |
kernel/crates/meridian-scene/src/connector/{style,perimeter}.rs |
Apache-2.0 | «Portions derived from mxGraph © 2006-2015 JGraph Ltd, Gaudenz Alder (Apache-2.0)» |
mxGraph: javascript/src/js/layout/** |
⊕
kernel/crates/meridian-diagram/src/layout/{hierarchical,swimlane,tree,radial,organic,circle,stack,partition}.rs |
Apache-2.0 | то же |
draw.io: общие наборы js/diagramly/sidebar/Sidebar-*.js
(28 файлов из раздела 3.5) + XML-трафареты +
templates/{basic,business,flowcharts,uml,software,tables,venn,wireframes}
после ревью |
apps/draw/stencils/*.mvs,
apps/draw/templates/ (генерирует конвертер
tools/stencil-convert ⊕) |
Apache-2.0 + stencils/LICENSE |
NOTICE + текст ограничения Atlassian в манифесте каждого
.mvs |
dagre: lib/**/*.ts |
meridian-diagram/src/layout/layered/ |
MIT | заголовок + NOTICE |
WebCola:
src/{vpsc,rectangle,descent,gridrouter,geom,shortestpaths}.ts |
meridian-diagram/src/constraints/,
meridian-scene/src/connector/router/ |
MIT | то же |
d3-force: src/*.js |
meridian-diagram/src/layout/force/ |
ISC | то же |
Mermaid:
packages/mermaid/src/diagrams/{flowchart,sequence,class,state,er,mindmap,gantt}/parser/*.jison,
packages/parser/src/language/{pie,treemap}/*.langium |
⊕ kernel/crates/codec-mermaid/src/grammar/ |
MIT | то же |
lopdf:
src/{parser/*,reader.rs,xref.rs,object_stream.rs,incremental_document.rs,writer.rs,encryption.rs,encryption/*} |
kernel/crates/codec-pdf/ →
meridian-pdf-core/{lexer,parser,xref,objstm,incremental,writer,crypt} |
MIT | то же |
hayro: крейты hayro-syntax,
hayro-interpret, hayro-jbig2,
hayro-jpeg2000, hayro-ccitt,
hayro-cmap, hayro-postscript |
fork в third_party/hayro/ →
meridian-pdf-render (свой Device →
meridian-render) |
Apache-2.0 OR MIT (выбрать одну и указать) | NOTICE |
pdfium-render: src/bindings*, обёртки рендера, текста,
форм |
meridian-pdfium-sys (решение
apps/pdf.md) |
MIT OR Apache-2.0 | NOTICE |
PDFBox: pdfwriter/COSWriter.java (подпись),
pdmodel/interactive/digitalsignature/**, examples
signature/** |
⊕ kernel/crates/meridian-crypto/src/pades/,
meridian-pdf-core/sign/ |
Apache-2.0 | NOTICE PDFBox («Apache PDFBox, Copyright The Apache Software Foundation») + пометка об изменениях |
PDFBox:
form/{PDAcroForm,AppearanceGeneratorHelper,PDFieldFactory}.java,
interactive/PlainTextFormatter.java,
fdf/FDFDocument.java,
multipdf/PDFMergerUtility.java |
meridian-pdf-core/{forms,fdf,merge}/ |
Apache-2.0 | то же |
PDFBox text/PDFTextStripper.java + pdf.js
src/core/evaluator.js (эвристики пробелов) |
codec-pdf/src/text/reading_order.rs |
Apache-2.0 | NOTICE обоих |
pdf.js: src/core/annotation.js (внешний вид FreeText,
Ink) |
meridian-pdf-core/annot/appearance/ |
Apache-2.0 | NOTICE |
pdfminer.six: pdfminer/layout.py,
pdfminer/utils.py (Plane) |
codec-pdf/src/convert/layout.rs |
MIT | заголовок + NOTICE |
pdfplumber: pdfplumber/table.py |
codec-pdf/src/convert/tables.rs |
MIT | то же |
| docling-ibm-models, docling: постобработка раскладки, порядок чтения, декодирование TableFormer; веса docling-layout-heron, TableFormer | codec-pdf/src/convert/structure/; веса — загрузка по
требованию |
MIT; веса Apache-2.0 и CDLA-Permissive-2.0 | NOTICE + тексты Apache-2.0 и CDLA-Permissive-2.0 |
| PaddleOCR/RapidOCR: постобработка DB и CTC; веса PP-OCRv5 ONNX | ⊕ kernel/crates/meridian-ocr/src/paddle/; веса — по
требованию |
Apache-2.0 | NOTICE |
d3-array ticks.js, nice.js,
bin.js, threshold/*; d3-scale
linear.js, log.js, symlog.js,
time.js, tickFormat.js; d3-shape
curve/monotone.js, arc.js,
pie.js, stack.js, offset/*;
d3-hierarchy treemap/{squarify,resquarify}.js,
partition.js |
kernel/crates/meridian-chart/src/{scale,shape,layout}/ |
ISC | «Based on d3 © Mike Bostock (ISC)» |
| d3-scale-chromatic: схемы ColorBrewer, категориальные, viridis | meridian-chart/data/palettes.json |
ISC + Apache-2.0 (ColorBrewer) + CC0 (viridis) | NOTICE ColorBrewer (Apache-2.0) |
7. Предложения в библию и план
В библию (docs/00-foundation.md):
- §4, строка «Видеокодеры (Slides)»: дописать «воспроизведение медиа — свой медиаслой над IMFMediaEngine / AVPlayer / GStreamer playbin; Qt Multimedia с FFmpeg-бэкендом (умолчание Qt 6.8) не используем». В roadmap §3.3 («Риски фазы») заменить меру «единый бэкенд (FFmpeg-бэкенд Qt 6.8)» на этот медиаслой.
- §4, строка «PDF-рендер»: «этап B — fork hayro (Apache-2.0 OR MIT) с декодерами JBIG2/JPEG 2000/CCITT; объектная модель — fork частей lopdf (MIT)».
- §2.2: закрепить крейты ⊕
meridian-diagram(раскладки графов, Diagram, импорт Mermaid),meridian-capture(снимки и запись экрана, процесс-помощник на основе ScreenPrompt),meridian-crypto(PAdES/XAdES, CMS на RustCrypto),meridian-ocr(Tesseract + PP-OCRv5) иcodec-mermaid; добавить их в деревоdocs/03-architecture.md§2. - §3.2: в манифест трафарета
.mvsдобавить поляlicenseиrestrictions(для наборов из draw.io — текст ограничения Atlassian, который пользователь получает вместе с трафаретом). - §3.3, Draw, «Чтение»: добавить
.mmd(Mermaid, подмножество) и.dot(Graphviz DOT через свой парсер илиlayout-rs). - §9/§6 «Модели ИИ»: вести реестр весов (источник, SHA-256, лицензия,
класс) в
THIRD_PARTY.md; модели не кладём в установщик, грузим по требованию с зеркала MOffice; в запрещённых — bria RMBG, веса surya/marker, ocrs.
В план (docs/08-roadmap.md) и описания
приложений:
- E4.1: «кисти — порт libmypaint (ISC) + 196 CC0-кистей MyPaint как стартовая библиотека» (I13–I14); «эффекты — порт Pinta с golden-тестами на 125 эталонах» (I14–I15); E4.9 — превью кистей в стиле MDS.
apps/paint.md: импорт.mybподнять с P2 до P1 (формат уже нужен для своих кистей); стабилизатор P0 — one-euro, режим «Сглаженное перо» P1 — ink-stroke-modeler (общий с Notes); «Удалить фон» — P1 (IS-Net по умолчанию, BiRefNet-lite «Качество», u2netp «Быстро»), «Быстрое выделение» P2 — SAM; RAW и HEIC — сначала декодеры ОС (WIC/ImageIO), libraw/libheif — плагины по решению владельца; на macOS 13 снимки черезSCStream(SCScreenshotManagerиSCContentSharingPicker— только с macOS 14).- E3.1/E3.3 и
apps/draw.md: базовая «Автораскладка → Иерархия» — порт dagre (метрика уже задана относительно dagre), дорожки —mxSwimlaneLayout, деревья —mxCompactTreeLayout, коннекторы —mxEdgeStyle+ свой обход препятствий по Wybrow 2009 (1,5–2 чел.-мес. отдельной строкой); стенсилы P0 — общие наборы draw.io через конвертер (I11–I13), вендорские иконки — только загрузка пользователем; E3.8 «10 наборов, 600 фигур» сократить до доводки и оформления сконвертированных наборов. apps/pdf.md§1.4 п. 2: заменить «в lopdf нет инкрементальных записей» на «естьIncrementalDocumentи запись объектных потоков; нет ленивого чтения — берём fork частей»; этап B — на основе hayro; «Прочие зависимости» — добавитьx509-tsp,x509-ocsp, профили PAdES B-B/B-T/B-LT по образцу PDFBox.- E4.5 «PDF → docx»: конвейер раздела 3.7 (pdfminer-раскладка →
pdfplumber-таблицы → модели Docling через
ort); «PDF → xlsx» (таблицы в Sheets) — P1 в 2.6; OCR — Tesseract (P1, как в плане) + PP-OCRv5 как второй движок (P1). - E3.4/E3.2 и открытый вопрос № 9: зафиксировать вариант «системные
кодеры ОС + WebM (rav1e/libvpx + Opus +
webm-iterable)», GStreamer на Linux — системный (класс 2, решение владельца); Lottie — Skottie (P1). - E2.3 Chart: порт модулей d3 (шкалы, кривые, сектора, накопление, бины) в I06–I07; treemap/sunburst — P1 (1.6) на d3-hierarchy.
deny.toml: запретитьsymphonia*,cryptographic-message-syntax,rawler,rawloader,libheif-sys(до решения владельца);rodio— только без флагов по умолчанию (иначе в графе появится symphonia и сработает запрет).docs/research/oss-overrides.tsv: bpmn-io/bpmn-js → класс 3 (водяной знак); datalab-to/surya и datalab-to/marker → «код 1, веса 3»; robertknight/ocrs → «код 1, веса 3»; ArtifexSoftware/pdf2docx → «1, зависимость PyMuPDF — 3»; mypaint/mypaint-brushes → «0 толькоbrushes/**».docs/research/component-map.md: «PDF / OCR» — убрать ocrs (веса CC BY-SA 4.0), указать PP-OCRv5 ONNX; «PDF / рендер» — добавить hayro (этап B); «Slides / медиа» — Skottie вместо rlottie; «Paint / удаление фона» — IS-Net/BiRefNet, запрет bria RMBG; новые крейты ⊕ из п. 3.
8. Непроверенное
- Пути в коде, не сверенные с клоном или деревом репозитория: d3-force
src/*, pdf.jssrc/core/*иsrc/display/text_layer.js, ECharts (типы и раскладка подписей), постобработка RapidOCR/PaddleOCR, модули rembg, docling и docling-ibm-models, роутер «manhattan» в antvis/X6,layout_analysisв ocrs. - Где в текущей ветке draw.io лежат XML-трафареты (в
src/main/webapp/stencils/клона их нет); состав и условияjgraph/drawio-libs(Apache-2.0 по TSV, вендорские иконки внутри — не проверены); условия иконок EIP. - Лицензии: silueta (rembg), MobileSAM, Leptonica,
cryptoki, Rust-обёртка mozjpeg, парсер-комбинаторы для Mermaid (winnow/chumsky), libwayshot, D2 (MPL-2.0 — по памяти); поимённый составthird_party/pdfium и наличие файлов лицензий в архивах pdfium-binaries. - windows-capture: что
VideoEncoderпостроен на Media Foundation и умеет больше одной аудиодорожки (есть толькоsend_audio_buffer/send_frame_with_audio). - Официальные ONNX детектора PP-OCRv5 и возможность экспорта моделей Docling (heron, TableFormer) в ONNX; размеры весов (u2netp ≈ 4,7 МБ и др.).
- Полнота Rust-обёртки Skottie в
skia-safe; работаrodioбез флагов по умолчанию сminimp3_fixed. - Качество и скорость hayro на корпусе MOffice (заявлено 1 400+ файлов регрессии PDFBox/pdf.js; аннотаций и форм нет).
- Статус
CGWindowListCreateImageв SDK macOS 15 (по документации Apple — недоступен) и правило бинов гистограммы Excel (правило Скотта) — по памяти. - Stirling-PDF: есть ли проприетарные модули; Google Ink
(
google/ink, Apache-2.0) как замена ink-stroke-modeler. - Собственный Formulник/AXEL владельца на sagr (OCR счетов, таблицы из PDF) — не исследован: может закрыть часть раздела 3.7 своим кодом.
- Оценки экономии — экспертные (сравнение объёма переносимого кода с работой с нуля), а не из декомпозиции эпиков roadmap: в roadmap трудоёмкость дана по командам фаз, а не по эпикам.
Источники веб-проверок 2026-10-04: crates.io API (версии и лицензии
крейтов), GitHub API (лицензии и деревья jgraph/mxgraph, dagrejs/dagre,
tgdwyer/WebCola, d3/*, mermaid-js/mermaid, apache/pdfbox), Hugging Face
API (лицензии весов BiRefNet, RMBG, BEN2, docling, PP-OCRv5, SAM,
ViTMatte, surya, ocrs), pdfium
LICENSE, pdfium-binaries,
rembg, ocrs-models, marker, hayro, windows-capture
VideoEncoder, Qt 6.8
Multimedia, requirements.txt pdf2docx, LICENSE
bpmn-js.