лаборатория рендера ядра · фаза 0

Рендер docx: наш движок против эталона

98 документов корпуса, 295 страниц. Эталон — LibreOffice 26.8 (PDF → растр 72 dpi). Каждая страница сравнивается по SSIM; страница считается совпавшей при SSIM ≥ 0.95. Цель вехи M0.4 — 60 % совпавших страниц.

Страниц с SSIM ≥ 0.95
20.3 %
60 из 295 · цель M0.4 — 60 %
Средний SSIM страницы
0.702
размытие 1 px, окна 8×8
Строгий SSIM «по чернилам»
0.174
только пиксели текста и линий
Совпало число страниц
88 / 98
документов

Распределение SSIM по страницам

390–0.5
440.5–0.6
530.6–0.7
530.7–0.8
260.8–0.9
200.9–0.95
60≥ 0.95

Документы

Показано: 98. По возрастанию среднего SSIM — сверху то, что чинить в первую очередь.

ДокументСтраниц: наш / эталонСредний SSIM≥ 0.95
docx/poi/stress012.docx1 / 40.1820 из 4
docx/poi/chartex.docx1 / 30.2860 из 3
docx/poi/stress017.docx1 / 20.2970 из 2
docx/govdocs1/426080.docx4 / 70.3220 из 7
docx/poi/MultipleBodyBug.docx1 / 30.3311 из 3
docx/govdocs1/533917.docx3 / 40.3930 из 4
docx/poi/stress016.docx5 / 50.3930 из 5
docx/govdocs1/224940.docx5 / 40.4060 из 5
docx/poi/stress015.docx6 / 70.4510 из 7
docx/govdocs1/404064.docx2 / 20.4800 из 2
docx/poi/stress006.docx5 / 80.4860 из 8
docx/govdocs1/795716.docx6 / 50.5670 из 6
docx/govdocs1/265532.docx2 / 20.5750 из 2
docx/govdocs1/313486.docx12 / 120.5842 из 12
docx/govdocs1/635928.docx4 / 40.5990 из 4
docx/poi/stress005.docx4 / 40.6000 из 4
docx/govdocs1/223624.docx12 / 120.6170 из 12
docx/govdocs1/014760.docx7 / 70.6250 из 7
docx/govdocs1/732705.docx1 / 10.6530 из 1
docx/poi/60329.docx3 / 30.6630 из 3
docx/tika/NullHeader.docx2 / 20.6660 из 2
docx/govdocs1/436784.docx6 / 60.6760 из 6
docx/poi/table-alignment.docx1 / 10.6940 из 1
docx/poi/sample.docx1 / 10.6950 из 1
docx/govdocs1/343986.docx2 / 20.6970 из 2
docx/govdocs1/295148.docx3 / 30.6970 из 3
docx/govdocs1/280856.docx6 / 60.7060 из 6
docx/govdocs1/616486.docx1 / 10.7070 из 1
docx/poi/OPCCompliance_CoreProperties_OnlyOneCorePropertiesPartFAIL.docx1 / 10.7080 из 1
docx/govdocs1/372437.docx12 / 120.7100 из 12
docx/poi/stress010.docx12 / 120.7150 из 12
docx/govdocs1/598938.docx1 / 10.7170 из 1
docx/govdocs1/632014.docx5 / 50.7200 из 5
docx/govdocs1/380433.docx12 / 120.7201 из 12
docx/govdocs1/224363.docx11 / 110.7292 из 11
docx/govdocs1/216688.docx5 / 50.7300 из 5
docx/govdocs1/956803.docx6 / 60.7320 из 6
docx/govdocs1/216689.docx3 / 30.7470 из 3
docx/govdocs1/623902.docx1 / 10.7480 из 1
docx/govdocs1/448024.docx12 / 120.7531 из 12
docx/govdocs1/510523.docx1 / 10.7650 из 1
docx/govdocs1/021526.docx1 / 10.7730 из 1
docx/govdocs1/619629.docx1 / 10.7810 из 1
docx/tika/testWORD_endnote_table.docx12 / 120.7890 из 12
docx/poi/Bug54849.docx1 / 10.8020 из 1
docx/govdocs1/595353.docx2 / 20.8071 из 2
docx/poi/60316.docx1 / 10.8250 из 1
docx/govdocs1/435413.docx4 / 40.8291 из 4
docx/poi/issue_51265_3.docx1 / 10.8340 из 1
docx/govdocs1/420596.docx7 / 70.8372 из 7
docx/poi/WordWithAttachments.docx2 / 20.8420 из 2
docx/poi/bug-paragraph-alignment.docx1 / 10.8740 из 1
docx/poi/stress001.docx1 / 10.8800 из 1
docx/poi/shapes-with-text.docx1 / 10.9030 из 1
docx/govdocs1/651924.docx1 / 10.9210 из 1
docx/poi/PageSpecificHeadFoot.docx2 / 20.9350 из 2
docx/poi/table_footnotes.docx1 / 10.9420 из 1
docx/poi/FancyFoot.docx2 / 20.9451 из 2
docx/poi/HeaderFooterUnicode.docx2 / 20.9461 из 2
docx/poi/52449.docx1 / 10.9501 из 1
docx/poi/issue_51265_1.docx1 / 10.9501 из 1
docx/poi/TestOpenPackageINPUT.docx1 / 10.9551 из 1
docx/govdocs1/630008.docx1 / 10.9611 из 1
docx/poi/ThreeColHead.docx2 / 20.9642 из 2
docx/poi/ThreeColFoot.docx2 / 20.9652 из 2
docx/poi/Bug54771b.docx1 / 10.9721 из 1
docx/poi/55966.docx1 / 10.9741 из 1
docx/tika/testWPSAttachment.docx1 / 10.9781 из 1
docx/poi/Bug54771a.docx1 / 10.9791 из 1
docx/poi/Bug60337.docx1 / 10.9801 из 1
docx/govdocs1/601015.docx1 / 10.9811 из 1
docx/poi/TestDocument.docx1 / 10.9811 из 1
docx/tika/testWORD_EMFAndAttachments.docx1 / 10.9861 из 1
docx/tika/testWORD_override_list_numbering.docx2 / 20.9862 из 2
docx/tika/testExternalRefs.docx1 / 10.9861 из 1
docx/poi/EmbeddedDocument.docx1 / 10.9881 из 1
docx/poi/Styles.docx1 / 10.9901 из 1
docx/govdocs1/605378.docx2 / 20.9902 из 2
docx/poi/58618.docx1 / 10.9911 из 1
docx/tika/testWORD_boldHyperlink.docx1 / 10.9921 из 1
docx/poi/capitalized.docx1 / 10.9931 из 1
docx/poi/documentProtection_forms_no_password.docx1 / 10.9951 из 1
docx/poi/57312.docx1 / 10.9951 из 1
docx/poi/tika-3388.docx1 / 10.9961 из 1
docx/govdocs1/605377.docx1 / 10.9961 из 1
docx/tika/testComment.docx1 / 10.9971 из 1
docx/tika/testSubdocument.docx1 / 10.9971 из 1
docx/poi/saut_page.docx3 / 30.9973 из 3
docx/poi/FldSimple.docx1 / 10.9981 из 1
docx/poi/hello-world-office-2010-technical-preview-unsigned.docx1 / 10.9981 из 1
docx/poi/hello-world-unsigned.docx1 / 10.9981 из 1
docx/tika/testOptionalHyphen.docx1 / 10.9981 из 1
docx/tika/testWORD_1img.docx1 / 10.9981 из 1
docx/poi/EmptyDocumentWithHeaderFooter.docx1 / 10.9981 из 1
docx/poi/NumberingWithOutOfOrderId.docx1 / 10.9981 из 1
docx/poi/Headers.docx3 / 30.9993 из 3
docx/poi/WithTabs.docx1 / 10.9991 из 1
docx/poi/59378.docx1 / 11.0001 из 1

Покрытие docx

ВозможностьСостояниеПримечание
Стили абзацев и знаков (docDefaults → basedOn → прямое)естьOOXML §17.7.2, toggle-свойства
Шрифты: метрически совместимые заменыестьLiberation, Carlito; Cambria/Georgia — нет в комплекте
Разрыв строк как в Wordестьтолько после пробела и дефиса; UAX #14 — для CJK и тайского
Интервалы: множитель, точно, минимум; внешний интерлиньяжестьформула vcl, TNR 12 pt = 13,8 pt
Выравнивание, отступы, висячие строкиестьkeepNext / keepLines — нет
Переносы словесть46 языков (форк hypher)
Списки numbering.xmlестьдесятичные, буквы, римские, русские, маркеры, %N, isLgl
Табуляции и заполнителиестьвлево, центр, вправо, по разделителю; за правым отступом
Рамки и заливка абзацачастичнобез линии between между абзацами
Таблицычастичносетка, объединения, рамки, заливка, поля, отступ, перенос строк; без автоподбора ширины
Разделы и колонкичастичновсе типы начала раздела, равные колонки; без балансировки и неравных колонок
Колонтитулы, поля PAGE / NUMPAGESестьпервая / чётная / по умолчанию, наследование
Картинки PNG / JPEG: встроенные и плавающиечастичнобез обтекания текстом; EMF/WMF — нет
Надписи и фигуры (wps, VML)нетследующий шаг — главная причина расхождений на титулах
Сноски и концевые сноскинет
Диаграммы, SmartArt, формулынет
Поля TOC, PAGEREF и прочиечастичнопоказывается сохранённый результат поля
Экспорт PDF/A-2bестьподмножества шрифтов, слой текста, валидатор krilla

Скорость конвейера

98 документов, 784 страниц, всего 3.3 с; release-сборка, macos aarch64, потоков / threads: 18; один поток на документ / single-threaded. Растр — 96 dpi.

ЭтапМедиана на страницу, мс95-й перцентиль, мсВсего, с
Чтение docx0.320.960.14
Вёрстка0.110.430.23
Растр (tiny-skia)1.579.482.43
PDF/A-2b (krilla)0.441.580.54

Самые долгие документы

ДокументСтраницРазмер, КБВёрстка, мсРастр, мсPDF, мс
docx/govdocs1/313486.docx214927230.6773.3234.2
docx/govdocs1/448024.docx106227319.6444.332.4
docx/tika/testWORD_endnote_table.docx21185.9201.49.2
docx/poi/stress010.docx177257124.939.119.6
docx/govdocs1/223624.docx2519666.3120.726.4
docx/govdocs1/372437.docx287465.0118.421.4
docx/govdocs1/380433.docx182113.774.07.3
docx/govdocs1/635928.docx47880.423.439.8

Методика

Документы — первые 100 docx корпуса по детерминированному выбору (GovDocs1 — общественное достояние; тестовые файлы Apache POI и Tika — Apache-2.0). Эталон строит LibreOffice 26.8 без интерфейса: docx → PDF → растр 72 dpi (pdftoppm). Наш рендер — тот же конвейер ядра, что в оболочке: чтение docx → вёрстка в целых EMU → растр tiny-skia. До 12 страниц на документ.

SSIM считается на сером изображении после размытия 1 px (окна 8×8, шаг 4): так сдвиг глифа на субпиксель не наказывается, а сдвиг строки — наказывается. Строгий SSIM «по чернилам» берёт только окна с текстом и линиями. «Разница» — карта расхождений: чем темнее, тем сильнее отличие.

Известное систематическое отличие: при интервале «множитель» LibreOffice кладёт добавку под строку, Word — над строкой; ядро следует Word, поэтому к эталону LibreOffice остаётся сдвиг 1–3 px. Для цели M0.4 нужны эталоны из Word.