MOffice

Открытый код для 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)

  1. rembg по умолчанию использует bria-rmbg — веса Bria под собственной некоммерческой лицензией → класс 3. Берём только код-идеи и модели U-2-Net/IS-Net (Apache-2.0), BiRefNet/BEN2 (MIT).
  2. ocrs: код MIT/Apache, но веса на HF robertknight/ocrs — CC BY-SA 4.0 (обучены на HierText), алфавит по умолчанию — только ASCII-латиница → для продукта не годится (только как образец конвейера на Rust).
  3. surya / marker: код Apache-2.0 (в TSV класс 1), но веса — CC BY-NC-SA 4.0 на HF и «модифицированная OpenRAIL-M» с порогом 5 млн USD (README marker) → класс 3.
  4. pdf2docx — MIT, но requirements.txt требует PyMuPDF>=1.26.7 (AGPL) → как зависимость запрещён.
  5. bpmn-js в TSV помечен классом 1, но его LICENSE требует не удалять водяной знак bpmn.io → класс 3 по политике.
  6. rodio 0.22 по умолчанию декодирует flac/mp3/mp4/vorbis/wav через symphonia (MPL-2.0) → только default-features = false + claxon, hound, lewton, minimp3.
  7. Qt 6.8 Multimedia по умолчанию работает через FFmpeg (поставляется Qt), нативный бэкенд Windows объявлен устаревшим с Qt 6.10 → конфликт с «FFmpeg не встраиваем» и с мерой риска фазы 3 в roadmap.
  8. xcap на macOS снимает через CGWindowListCreateImage (устарел в macOS 14) → на macOS — ScreenCaptureKit (как в ScreenPrompt), xcap — только Windows/Linux.
  9. lopdf 0.45 уже умеет инкрементальные обновления (IncrementalDocument) и запись объектных потоков — утверждение apps/pdf.md («инкрементальных записей нет») устарело; нет только ленивого чтения.
  10. hayro (Apache-2.0 OR MIT, 779★, экспериментальный) — рендер PDF на Rust с собственными декодерами JBIG2, JPEG 2000, CCITT; проходит 1 400+ файлов регрессии PDFBox и pdf.js → основа этапа B apps/pdf.md.
  11. Lottie без rlottie: у skia-safe есть флаг skottie (модуль Skottie из Skia, BSD-3).
  12. mypaint-brushes: по Licenses.dep5 CC0 только brushes/*; корневые сборочные файлы — GPL-2+ (не берём).
  13. draw.io: ограничение «не для продуктов Atlassian» распространяется на трафареты, наборы иконок, шаблоны и любые их производные (конвертации, обводки) → переносим условие в наши .mvs и NOTICE.
  14. 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»:

  1. Глифы с координатами — pdfium FPDFText_* (этап A), позже свой интерпретатор.
  2. Символы → строки → блоки → порядок чтения — порт 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 чел.-мес.
  3. Таблицы — порт 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 чел.-мес.
  4. Структура страницы (заголовки, списки, подписи, колонтитулы, рисунки, формулы, таблицы без линий) — модели 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).
  5. Сборка документа 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):

  1. §4, строка «Видеокодеры (Slides)»: дописать «воспроизведение медиа — свой медиаслой над IMFMediaEngine / AVPlayer / GStreamer playbin; Qt Multimedia с FFmpeg-бэкендом (умолчание Qt 6.8) не используем». В roadmap §3.3 («Риски фазы») заменить меру «единый бэкенд (FFmpeg-бэкенд Qt 6.8)» на этот медиаслой.
  2. §4, строка «PDF-рендер»: «этап B — fork hayro (Apache-2.0 OR MIT) с декодерами JBIG2/JPEG 2000/CCITT; объектная модель — fork частей lopdf (MIT)».
  3. §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.
  4. §3.2: в манифест трафарета .mvs добавить поля license и restrictions (для наборов из draw.io — текст ограничения Atlassian, который пользователь получает вместе с трафаретом).
  5. §3.3, Draw, «Чтение»: добавить .mmd (Mermaid, подмножество) и .dot (Graphviz DOT через свой парсер или layout-rs).
  6. §9/§6 «Модели ИИ»: вести реестр весов (источник, SHA-256, лицензия, класс) в THIRD_PARTY.md; модели не кладём в установщик, грузим по требованию с зеркала MOffice; в запрещённых — bria RMBG, веса surya/marker, ocrs.

В план (docs/08-roadmap.md) и описания приложений:

  1. E4.1: «кисти — порт libmypaint (ISC) + 196 CC0-кистей MyPaint как стартовая библиотека» (I13–I14); «эффекты — порт Pinta с golden-тестами на 125 эталонах» (I14–I15); E4.9 — превью кистей в стиле MDS.
  2. 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).
  3. 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 фигур» сократить до доводки и оформления сконвертированных наборов.
  4. apps/pdf.md §1.4 п. 2: заменить «в lopdf нет инкрементальных записей» на «есть IncrementalDocument и запись объектных потоков; нет ленивого чтения — берём fork частей»; этап B — на основе hayro; «Прочие зависимости» — добавить x509-tsp, x509-ocsp, профили PAdES B-B/B-T/B-LT по образцу PDFBox.
  5. E4.5 «PDF → docx»: конвейер раздела 3.7 (pdfminer-раскладка → pdfplumber-таблицы → модели Docling через ort); «PDF → xlsx» (таблицы в Sheets) — P1 в 2.6; OCR — Tesseract (P1, как в плане) + PP-OCRv5 как второй движок (P1).
  6. E3.4/E3.2 и открытый вопрос № 9: зафиксировать вариант «системные кодеры ОС + WebM (rav1e/libvpx + Opus + webm-iterable)», GStreamer на Linux — системный (класс 2, решение владельца); Lottie — Skottie (P1).
  7. E2.3 Chart: порт модулей d3 (шкалы, кривые, сектора, накопление, бины) в I06–I07; treemap/sunburst — P1 (1.6) на d3-hierarchy.
  8. deny.toml: запретить symphonia*, cryptographic-message-syntax, rawler, rawloader, libheif-sys (до решения владельца); rodio — только без флагов по умолчанию (иначе в графе появится symphonia и сработает запрет).
  9. 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/**».
  10. 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. Непроверенное

Источники веб-проверок 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.