From 896136c58e191b6eb50b903e0925b924e7d7da16 Mon Sep 17 00:00:00 2001 From: KnifeLemon Date: Wed, 28 Oct 2026 12:03:59 +0900 Subject: [PATCH] Render quality harness: feature matrix, read-back checks and compare against rhwp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Measures a document renderer without sample files in the repository (Project 4, M0): - Feature matrix written in code (RenderFeatures): line spacing kinds x alignment, tabs, lists, tables, headers and footers, notes, columns, floating objects, equations and paragraphs in eight scripts, through the HWPX writer or DocxBuilder and the DOCX reader; binary HWP twins made with rhwp convert. - Read-back checks with PdfPig, one tested function each (PdfChecks): text round trip, overlapping glyphs (> 0.05 em), glyphs outside the page and the margins, page count, baselines (±0.5 pt), fonts embedded and subset. - Differential compare (RenderDiff): page count, line-break agreement (Myers LCS over lines), baselines and per-page SSIM of PDFium pictures at 100 dpi; proven by rhwp against itself and by perturbed renderings. - Thresholds and an allow-list for known rhwp defects in render-thresholds.json; a worse value fails the test. - One seam for the layout engine (DocumentRenderers.Candidate); its compare is skipped until it is registered. - build/render-compare.ps1: a private corpus (FILEE_RENDER_CORPUS, doc.hwpx + the PDF 한글 printed) to an HTML report in the temp folder. PdfPageWriterTests now share the checks, SSIM and the HarfBuzz test shaper (TestShaper) with the harness. Co-Authored-By: Claude Opus 5.5 --- build/render-compare.ps1 | 55 +++ docs/ENGINES.md | 10 +- docs/RENDER-QUALITY.md | 137 +++++++ .../Filee.Engines.Tests.csproj | 2 + .../Filee.Engines.Tests/PdfPageWriterTests.cs | 228 ++---------- .../RenderQuality/DocumentRenderers.cs | 86 +++++ .../RenderQuality/PageImage.cs | 129 +++++++ .../RenderQuality/PdfChecks.cs | 250 +++++++++++++ .../RenderQuality/PdfLines.cs | 122 +++++++ .../RenderQuality/RenderChecksTests.cs | 327 +++++++++++++++++ .../RenderQuality/RenderCorpusTests.cs | 157 ++++++++ .../RenderQuality/RenderDiff.cs | 61 ++++ .../RenderQuality/RenderFeatures.cs | 336 ++++++++++++++++++ .../RenderQuality/RenderHarness.cs | 182 ++++++++++ .../RenderQuality/RenderQualityTests.cs | 181 ++++++++++ .../RenderQuality/RenderThresholds.cs | 91 +++++ .../RenderQuality/SequenceMatch.cs | 92 +++++ .../RenderQuality/render-thresholds.json | 52 +++ tests/Filee.Engines.Tests/TestShaper.cs | 69 ++++ 19 files changed, 2360 insertions(+), 207 deletions(-) create mode 100644 build/render-compare.ps1 create mode 100644 docs/RENDER-QUALITY.md create mode 100644 tests/Filee.Engines.Tests/RenderQuality/DocumentRenderers.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/PageImage.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/PdfChecks.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/PdfLines.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/RenderChecksTests.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/RenderCorpusTests.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/RenderDiff.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/RenderFeatures.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/RenderHarness.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/RenderQualityTests.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/RenderThresholds.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/SequenceMatch.cs create mode 100644 tests/Filee.Engines.Tests/RenderQuality/render-thresholds.json create mode 100644 tests/Filee.Engines.Tests/TestShaper.cs diff --git a/build/render-compare.ps1 b/build/render-compare.ps1 new file mode 100644 index 000000000..86df7f8cf --- /dev/null +++ b/build/render-compare.ps1 @@ -0,0 +1,55 @@ +<# +.SYNOPSIS + Compares Filee's document renderers with the PDFs 한글 printed, over a private corpus outside the repository. + +.DESCRIPTION + The corpus is a folder (searched recursively) of documents next to the PDF 한글 printed of each: doc.hwpx + doc.pdf, + or doc.hwp + doc.pdf. Nothing of it is copied into the repository. Every document is rendered by rhwp (fetch it with + build/fetch-engines.ps1 -Only rhwp) and, once one is registered, by Filee's layout engine; each rendering is compared + with 한글's PDF (page count, line breaks, baselines, per-page SSIM at 100 dpi) and read back (text, overlapping + glyphs, glyphs outside the page, embedded fonts). The results go to an HTML report with the page that differs most of + each document side by side. + + It runs RenderCorpusTests in tests/Filee.Engines.Tests (docs/RENDER-QUALITY.md). + +.PARAMETER Corpus + The corpus folder. Defaults to the FILEE_RENDER_CORPUS environment variable. + +.PARAMETER Report + The HTML report to write. Defaults to filee-render-compare-