From cc42bfe52bbd4d3a1c447ab572d6170d88f4509e Mon Sep 17 00:00:00 2001
From: DemchaAV
Date: Sun, 5 Jul 2026 23:19:39 +0100
Subject: [PATCH 1/2] build: extract the PDF backend into
graph-compose-render-pdf
2.0's lean-core goal: a consumer that does not render PDF should not pull PDFBox.
Move the entire PDF backend out of the engine into a new graph-compose-render-pdf
module, leaving graph-compose-core with zero org.apache.pdfbox. The graph-compose
wrapper depends on render-pdf, so a bare graph-compose still renders PDF unchanged.
- New graph-compose-render-pdf: the fixed-layout PDF backend
(document.backend.fixed.pdf.**) and the engine.render.pdf.** render tree (the ecs
system, helpers, PdfFont), plus the two ServiceLoader provider implementations and
their META-INF/services files. PDFBox, zxing (barcodes), and the
commons-logging->SLF4J bridge leave the root pom and live here.
- graph-compose-core keeps the DocumentSession API, the ServiceLoader seam
(FixedLayoutBackendProvider / FontMetricsProvider), and the PDFBox-free pdf.options
value classes. It throws MissingBackendException (naming render-pdf) if asked to
render, rasterize, or measure without a backend on the classpath.
- FontShowcase, a DSL-based preview builder, moves to
com.demcha.compose.document.showcase (it cannot live in the backend-neutral font
catalog); the GraphCompose.renderAvailableFontsPreview() facade stays.
- The wrapper depends on render-pdf; render-docx / render-pptx add it at test scope
(their export lays out through the moved metrics provider); benchmarks add it at
compile scope; examples get it transitively via the wrapper.
- Test relocation: the render harness and the backend's own tests move to
render-pdf/src/test (which builds a tests-classifier jar); the core-functionality
render suites move to graph-compose-qa (which consumes that jar and gains javafx
for the dev-preview tool). MissingBackendContractTest guards the lean-core contract
in core's backend-free scope.
- Wired into the aggregator, the CI build gate, publish, cut-release, and
VersionConsistencyGuardTest.
---
.github/workflows/ci.yml | 12 +-
.github/workflows/publish.yml | 14 +-
.gitignore | 1 +
CHANGELOG.md | 17 +-
aggregator/pom.xml | 1 +
benchmarks/pom.xml | 7 +
pom.xml | 35 --
qa/pom.xml | 31 ++
.../devtool/DevToolPreviewProvider.java | 0
.../compose/devtool/GraphComposeDevTool.java | 0
.../devtool/GraphComposeDevToolLauncher.java | 0
.../compose/devtool/PdfRenderBridge.java | 0
.../compose/devtool/PreviewCompilerTest.java | 0
.../com/demcha/compose/document/Test.java | 0
.../DocumentSessionAvailableHeightTest.java | 0
...umentSessionConveniencePdfOptionsTest.java | 0
.../api/DocumentSessionLifecycleTest.java | 0
.../DocumentSessionParallelStressTest.java | 0
...DocumentSessionRenderingExceptionTest.java | 0
.../document/api/DocumentSessionTest.java | 0
.../api/LayerStackRowCompositionTest.java | 0
.../document/api/NegativeMarginTest.java | 0
.../document/api/PageBackgroundTest.java | 0
.../compose/document/api/PageMarginTest.java | 0
.../document/api/PaginationEdgeCaseTest.java | 0
.../document/api/SessionChromeApiTest.java | 0
.../document/api/SessionLayoutApiTest.java | 0
.../api/TableSlicePaginationTest.java | 0
.../ShapeContainerInvariantsTest.java | 0
.../ShapeOutlineRenderCoverageTest.java | 0
.../backend/fixed/BackendProvidersTest.java | 0
.../pdf/FontShowcaseLayoutSnapshotTest.java | 1 +
.../document/dsl/AddLinkShortcutTest.java | 0
.../compose/document/dsl/BlockAlignTest.java | 0
.../document/dsl/BlockSvgRenderTest.java | 0
.../document/dsl/DocumentBleedTest.java | 0
.../compose/document/dsl/EmojiRenderTest.java | 0
.../dsl/InlineHighlightRenderTest.java | 0
.../document/dsl/InlineShapeRenderTest.java | 0
.../document/dsl/InlineSvgRenderTest.java | 0
.../document/dsl/LayerStackBuilderTest.java | 0
.../compose/document/dsl/LineFillTest.java | 0
.../compose/document/dsl/PathBuilderTest.java | 0
.../compose/document/dsl/RichTextTest.java | 0
.../compose/document/dsl/RowBuilderTest.java | 0
.../compose/document/dsl/RowColumnsTest.java | 0
.../compose/document/dsl/RowFlexTest.java | 0
.../document/dsl/RowVerticalAlignTest.java | 0
.../document/dsl/SectionKeepTogetherTest.java | 0
.../dsl/ShapeContainerBuilderTest.java | 0
.../document/dsl/TableBuilderColSpanTest.java | 0
.../dsl/TableBuilderRepeatHeaderTest.java | 0
.../document/dsl/TableBuilderRowSpanTest.java | 0
.../dsl/TransformableLeafBuildersTest.java | 0
.../layout/LayoutCompilerInvariantsTest.java | 0
.../document/snapshot/PageIndexTest.java | 0
.../document/style/DocumentBordersTest.java | 0
.../style/DocumentTextAutoSizeTest.java | 0
.../compose/document/svg/SvgIconTest.java | 0
.../core/widgets/TableWidgetTest.java | 0
.../presets/CoverLetterV2SmokeTest.java | 0
.../cv/presets/BlueBannerSmokeTest.java | 0
.../cv/presets/BoxedSectionsSmokeTest.java | 0
.../cv/presets/ClassicSerifSmokeTest.java | 0
.../cv/presets/CompactMonoSmokeTest.java | 0
.../cv/presets/EditorialBlueSmokeTest.java | 0
.../presets/EngineeringResumeSmokeTest.java | 0
.../cv/presets/ExecutiveSmokeTest.java | 0
.../presets/MinimalUnderlinedSmokeTest.java | 0
.../cv/presets/MintEditorialSmokeTest.java | 0
.../presets/ModernProfessionalSmokeTest.java | 0
.../cv/presets/MonogramSidebarSmokeTest.java | 0
.../cv/presets/NordicCleanSmokeTest.java | 0
.../templates/cv/presets/PanelSmokeTest.java | 0
.../cv/presets/SidebarPortraitSmokeTest.java | 0
.../cv/presets/TimelineMinimalSmokeTest.java | 0
.../templates/cv/widgets/WidgetSmokeTest.java | 0
.../presets/ModernInvoiceSmokeTest.java | 0
.../presets/ModernProposalSmokeTest.java | 0
.../components/ComponentBuilderTest.java | 0
.../content/ImageDataCacheTest.java | 0
.../EngineComposerHarnessContractTest.java | 0
...gineComposerHarnessLayoutSnapshotTest.java | 0
...mposerHarnessMutationInvalidationTest.java | 0
.../core/NewFeaturesIntegrationTest.java | 0
.../integration/BlockTextIntegrationTest.java | 0
.../integration/CircleIntegrationTest.java | 0
.../integration/ImageIntegrationTest.java | 3 +-
.../LargeContainerIntegrationTest.java | 0
.../integration/LineIntegrationTest.java | 0
.../PageBreakerIntegrationTest.java | 0
.../SingleLineTextIntegrationTest.java | 0
.../TableColSpanIntegrationTest.java | 0
.../TableLayoutIntegrationTest.java | 0
.../TableMultilineIntegrationTest.java | 0
.../TableStylingIntegrationTest.java | 0
.../TextPaginationIntegrationTest.java | 0
.../FontLibraryTextMeasurementSystemTest.java | 0
.../render/RenderHandlerRegistryTest.java | 0
.../render/guides/GuidesRendererTest.java | 0
.../font/FontLibraryIntegrationTest.java | 3 +-
.../java/com/demcha/compose/qa/RepoPaths.java | 44 +++
.../DocumentationExamplesTest.java | 3 +-
.../demcha/testing/visual/DevelopTest.java | 0
.../testing/visual/HttpStreamingDemoTest.java | 0
.../testing/visual/LayerStackRowDemoTest.java | 0
.../visual/PageCapacityToleranceDemoTest.java | 0
.../ShapeContainerTransformDemoTest.java | 0
.../visual/ShapeContainerZIndexDemoTest.java | 0
.../visual/TableRepeatHeaderDemoTest.java | 0
.../visual/TableZebraAndTotalsDemoTest.java | 0
.../visual/UnicodeFallbackDemoTest.java | 0
render-docx/pom.xml | 8 +
render-pdf/pom.xml | 322 ++++++++++++++++++
.../fixed/pdf/PdfBookmarkOutlineWriter.java | 0
.../fixed/pdf/PdfDocumentPostProcessor.java | 0
.../fixed/pdf/PdfFixedLayoutBackend.java | 0
.../pdf/PdfFixedLayoutBackendProvider.java | 0
.../fixed/pdf/PdfFontLibraryFactory.java | 0
.../backend/fixed/pdf/PdfFontLoader.java | 0
.../fixed/pdf/PdfFontMetricsProvider.java | 0
.../fixed/pdf/PdfFragmentRenderHandler.java | 0
.../fixed/pdf/PdfGuideLinesRenderer.java | 0
.../fixed/pdf/PdfInternalLinkWriter.java | 0
.../fixed/pdf/PdfLinkAnnotationWriter.java | 0
.../fixed/pdf/PdfMeasurementResources.java | 0
.../fixed/pdf/PdfNodeLabelRenderer.java | 0
.../backend/fixed/pdf/PdfOptionsAdapter.java | 0
.../fixed/pdf/PdfOutputOptionsTranslator.java | 0
.../fixed/pdf/PdfRenderEnvironment.java | 0
.../backend/fixed/pdf/PdfRenderSession.java | 0
.../fixed/pdf/handlers/PdfAlphaSupport.java | 0
.../PdfAnchorMarkerRenderHandler.java | 0
.../PdfBarcodeFragmentRenderHandler.java | 0
.../PdfBookmarkMarkerRenderHandler.java | 0
.../PdfEllipseFragmentRenderHandler.java | 0
.../PdfImageFragmentRenderHandler.java | 0
.../PdfLineFragmentRenderHandler.java | 0
.../PdfParagraphFragmentRenderHandler.java | 0
.../PdfPathFragmentRenderHandler.java | 0
.../fixed/pdf/handlers/PdfPathPainter.java | 0
.../PdfPolygonFragmentRenderHandler.java | 0
.../fixed/pdf/handlers/PdfShadingSupport.java | 0
.../PdfShapeClipBeginRenderHandler.java | 0
.../PdfShapeClipEndRenderHandler.java | 0
.../PdfShapeFragmentRenderHandler.java | 0
.../fixed/pdf/handlers/PdfShapeGeometry.java | 0
.../PdfTableRowFragmentRenderHandler.java | 0
.../PdfTransformBeginRenderHandler.java | 0
.../PdfTransformEndRenderHandler.java | 0
.../fixed/pdf/handlers/package-info.java | 0
.../backend/fixed/pdf/package-info.java | 0
.../render/pdf/GlyphFallbackLogger.java | 0
.../compose/engine/render/pdf/PdfFont.java | 0
.../engine/render/pdf/ecs/PdfCanvas.java | 0
.../render/pdf/ecs/PdfFileManagerSystem.java | 0
.../render/pdf/ecs/PdfGuidesRenderer.java | 0
.../engine/render/pdf/ecs/PdfImageCache.java | 0
.../render/pdf/ecs/PdfRenderSession.java | 0
.../render/pdf/ecs/PdfRenderingSystemECS.java | 0
.../engine/render/pdf/ecs/PdfStream.java | 0
.../ecs/handlers/PdfBarcodeRenderHandler.java | 0
.../handlers/PdfBlockTextRenderHandler.java | 0
.../PdfChunkedBlockTextRenderHandler.java | 0
.../ecs/handlers/PdfCircleRenderHandler.java | 0
.../handlers/PdfContainerRenderHandler.java | 0
.../ecs/handlers/PdfElementRenderHandler.java | 0
.../ecs/handlers/PdfImageRenderHandler.java | 0
.../ecs/handlers/PdfLineRenderHandler.java | 0
.../ecs/handlers/PdfLinkRenderHandler.java | 0
.../handlers/PdfPageBreakRenderHandler.java | 0
.../handlers/PdfRectangleRenderHandler.java | 0
.../handlers/PdfTableRowRenderHandler.java | 0
.../ecs/handlers/PdfTextRenderHandler.java | 0
.../render/pdf/ecs/handlers/package-info.java | 0
.../pdf/ecs/helpers/PdfBookmarkBuilder.java | 0
.../render/pdf/ecs/helpers/TableCellBox.java | 0
.../render/pdf/ecs/helpers/package-info.java | 0
.../engine/render/pdf/ecs/package-info.java | 0
.../pdf/helpers/PdfHeaderFooterRenderer.java | 0
.../pdf/helpers/PdfWatermarkRenderer.java | 0
.../render/pdf/helpers/package-info.java | 0
.../engine/render/pdf/package-info.java | 0
...t.backend.fixed.FixedLayoutBackendProvider | 0
...document.backend.fixed.FontMetricsProvider | 0
.../fixed/pdf/ContainerBookmarkTest.java | 0
.../fixed/pdf/FontShowcaseRenderTest.java | 0
.../fixed/pdf/InternalLinkAnchorTest.java | 0
.../fixed/pdf/MeasurementFontParityTest.java | 0
.../fixed/pdf/MultiSectionDocumentTest.java | 0
.../pdf/PageIndexAnchorAgreementTest.java | 0
.../backend/fixed/pdf/PageReferenceTest.java | 0
.../pdf/ParagraphTextStateDedupTest.java | 0
.../pdf/PdfBackendExtensibilityTest.java | 0
.../fixed/pdf/PdfDebugNodeLabelsTest.java | 0
.../PdfFixedLayoutBackendFeaturesTest.java | 0
.../fixed/pdf/PdfLineStrokeStyleTest.java | 0
.../fixed/pdf/PdfPageNumberingTest.java | 0
.../fixed/pdf/PdfPathGradientTest.java | 0
.../fixed/pdf/PdfPathStrokeStyleTest.java | 0
.../backend/fixed/pdf/PdfShapeAlphaTest.java | 0
.../fixed/pdf/PdfShapeGradientTest.java | 0
.../pdf/PdfWatermarkStateIsolationTest.java | 0
.../document/backend/fixed/pdf/TocTest.java | 0
.../fixed/pdf/ViewerPreferencesTest.java | 0
.../render/pdf/PdfFontSanitizerTest.java | 0
.../pdf/PdfRenderInterfaceGuardTest.java | 0
.../render/pdf/ecs/PdfRenderSessionTest.java | 0
.../PdfRenderingSystemECSDispatchTest.java | 0
.../PdfRenderingSystemECSImageCacheTest.java | 0
.../handlers/PdfLinkRenderHandlerTest.java | 0
.../PdfTableRowRenderHandlerTest.java | 0
.../testsupport/EngineComposerHarness.java | 0
.../engine/assembly/BarcodeBuilder.java | 0
.../engine/assembly/BarcodeBuilderTest.java | 0
.../engine/assembly/BlockTextBuilder.java | 0
.../engine/assembly/BlockTextBuilderTest.java | 0
.../engine/assembly/CircleBuilder.java | 0
.../engine/assembly/ComponentBuilder.java | 0
.../assembly/DisplayUrlTextBuilder.java | 0
.../engine/assembly/DividerBuilder.java | 0
.../engine/assembly/ElementBuilder.java | 0
.../engine/assembly/HContainerBuilder.java | 0
.../engine/assembly/ImageBuilder.java | 0
.../engine/assembly/ImageBuilderTest.java | 0
.../engine/assembly/LineBuilder.java | 0
.../engine/assembly/LineBuilderTest.java | 0
.../engine/assembly/LinkBuilder.java | 0
.../engine/assembly/ModuleBuilder.java | 0
.../engine/assembly/PageBreakBuilder.java | 0
.../engine/assembly/RectangleBuilder.java | 0
.../engine/assembly/RowBuilder.java | 0
.../engine/assembly/TableBuilder.java | 0
.../engine/assembly/TableBuilderTest.java | 0
.../engine/assembly/TextBuilder.java | 0
.../engine/assembly/TextBuilderTest.java | 0
.../engine/assembly/VContainerBuilder.java | 0
.../engine/assembly/container/Box.java | 0
.../assembly/container/BuildEntity.java | 0
.../assembly/container/ContainerBuilder.java | 0
.../engine/assembly/container/EmptyBox.java | 0
.../assembly/container/EntityBuilderBase.java | 0
.../assembly/container/EntityCreator.java | 0
.../engine/assembly/container/Layout.java | 0
.../assembly/container/ShapeBuilderBase.java | 0
.../engine/assembly/container/StackAxis.java | 0
.../assembly/container/package-info.java | 0
render-pptx/pom.xml | 8 +
scripts/cut-release.ps1 | 10 +-
.../java/com/demcha/compose/GraphCompose.java | 16 +-
.../fixed/pdf => showcase}/FontShowcase.java | 2 +-
.../document/showcase/package-info.java | 8 +
.../api/MissingBackendContractTest.java | 34 ++
.../PdfBackendIsolationGuardTest.java | 14 +-
.../VersionConsistencyGuardTest.java | 3 +
wrapper/pom.xml | 10 +-
256 files changed, 543 insertions(+), 64 deletions(-)
rename {src => qa/src}/test/java/com/demcha/compose/devtool/DevToolPreviewProvider.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/devtool/GraphComposeDevTool.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/devtool/GraphComposeDevToolLauncher.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/devtool/PdfRenderBridge.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/devtool/PreviewCompilerTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/Test.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/DocumentSessionAvailableHeightTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/DocumentSessionConveniencePdfOptionsTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/DocumentSessionLifecycleTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/DocumentSessionParallelStressTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/DocumentSessionRenderingExceptionTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/DocumentSessionTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/LayerStackRowCompositionTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/NegativeMarginTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/PageBackgroundTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/PageMarginTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/PaginationEdgeCaseTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/SessionChromeApiTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/SessionLayoutApiTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/api/TableSlicePaginationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/architecture/ShapeContainerInvariantsTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/architecture/ShapeOutlineRenderCoverageTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/backend/fixed/BackendProvidersTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/AddLinkShortcutTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/BlockAlignTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/BlockSvgRenderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/DocumentBleedTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/EmojiRenderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/InlineHighlightRenderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/InlineShapeRenderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/InlineSvgRenderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/LayerStackBuilderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/LineFillTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/PathBuilderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/RichTextTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/RowBuilderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/RowColumnsTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/RowFlexTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/RowVerticalAlignTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/SectionKeepTogetherTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/ShapeContainerBuilderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/TableBuilderColSpanTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/TableBuilderRepeatHeaderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/TableBuilderRowSpanTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/dsl/TransformableLeafBuildersTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/layout/LayoutCompilerInvariantsTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/snapshot/PageIndexTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/style/DocumentBordersTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/style/DocumentTextAutoSizeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/svg/SvgIconTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/core/widgets/TableWidgetTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2SmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/BlueBannerSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/BoxedSectionsSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/ClassicSerifSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/CompactMonoSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/EditorialBlueSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/EngineeringResumeSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/ExecutiveSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/MinimalUnderlinedSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/MintEditorialSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/ModernProfessionalSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/MonogramSidebarSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/NordicCleanSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/PanelSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/SidebarPortraitSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/presets/TimelineMinimalSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/cv/widgets/WidgetSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/invoice/presets/ModernInvoiceSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/document/templates/proposal/presets/ModernProposalSmokeTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/components/ComponentBuilderTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/components/content/ImageDataCacheTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/core/EngineComposerHarnessContractTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/core/EngineComposerHarnessLayoutSnapshotTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/core/EngineComposerHarnessMutationInvalidationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/core/NewFeaturesIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/BlockTextIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/CircleIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/ImageIntegrationTest.java (98%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/LargeContainerIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/LineIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/PageBreakerIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/SingleLineTextIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/TableColSpanIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/TableLayoutIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/TableMultilineIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/TableStylingIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/integration/TextPaginationIntegrationTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/measurement/FontLibraryTextMeasurementSystemTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/render/RenderHandlerRegistryTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/engine/render/guides/GuidesRendererTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java (97%)
create mode 100644 qa/src/test/java/com/demcha/compose/qa/RepoPaths.java
rename {src => qa/src}/test/java/com/demcha/documentation/DocumentationExamplesTest.java (99%)
rename {src => qa/src}/test/java/com/demcha/testing/visual/DevelopTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/testing/visual/HttpStreamingDemoTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/testing/visual/LayerStackRowDemoTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/testing/visual/PageCapacityToleranceDemoTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/testing/visual/ShapeContainerTransformDemoTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/testing/visual/ShapeContainerZIndexDemoTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/testing/visual/TableRepeatHeaderDemoTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/testing/visual/TableZebraAndTotalsDemoTest.java (100%)
rename {src => qa/src}/test/java/com/demcha/testing/visual/UnicodeFallbackDemoTest.java (100%)
create mode 100644 render-pdf/pom.xml
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfBookmarkOutlineWriter.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfDocumentPostProcessor.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackend.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackendProvider.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontLibraryFactory.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontLoader.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontMetricsProvider.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFragmentRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfGuideLinesRenderer.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfInternalLinkWriter.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfLinkAnnotationWriter.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfMeasurementResources.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfNodeLabelRenderer.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfOptionsAdapter.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfOutputOptionsTranslator.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfRenderEnvironment.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfRenderSession.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfAlphaSupport.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfAnchorMarkerRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfBarcodeFragmentRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfBookmarkMarkerRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfEllipseFragmentRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfImageFragmentRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfLineFragmentRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfParagraphFragmentRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPathFragmentRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPathPainter.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPolygonFragmentRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShadingSupport.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeClipBeginRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeClipEndRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeFragmentRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeGeometry.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTableRowFragmentRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTransformBeginRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTransformEndRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/package-info.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/document/backend/fixed/pdf/package-info.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/GlyphFallbackLogger.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/PdfFont.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfCanvas.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfFileManagerSystem.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfGuidesRenderer.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfImageCache.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSession.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECS.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfStream.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfBarcodeRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfBlockTextRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfChunkedBlockTextRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfCircleRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfContainerRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfElementRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfImageRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLineRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLinkRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfPageBreakRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfRectangleRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTableRowRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTextRenderHandler.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/package-info.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/PdfBookmarkBuilder.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/TableCellBox.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/package-info.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/ecs/package-info.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/helpers/PdfHeaderFooterRenderer.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/helpers/PdfWatermarkRenderer.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/helpers/package-info.java (100%)
rename {src => render-pdf/src}/main/java/com/demcha/compose/engine/render/pdf/package-info.java (100%)
rename {src => render-pdf/src}/main/resources/META-INF/services/com.demcha.compose.document.backend.fixed.FixedLayoutBackendProvider (100%)
rename {src => render-pdf/src}/main/resources/META-INF/services/com.demcha.compose.document.backend.fixed.FontMetricsProvider (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/ContainerBookmarkTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseRenderTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/InternalLinkAnchorTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/MeasurementFontParityTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/MultiSectionDocumentTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PageIndexAnchorAgreementTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PageReferenceTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/ParagraphTextStateDedupTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfBackendExtensibilityTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfDebugNodeLabelsTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackendFeaturesTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfLineStrokeStyleTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPageNumberingTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPathGradientTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPathStrokeStyleTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfShapeAlphaTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfShapeGradientTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfWatermarkStateIsolationTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/TocTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/document/backend/fixed/pdf/ViewerPreferencesTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/engine/render/pdf/PdfFontSanitizerTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/engine/render/pdf/PdfRenderInterfaceGuardTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSessionTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSDispatchTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSImageCacheTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLinkRenderHandlerTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTableRowRenderHandlerTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/EngineComposerHarness.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/BarcodeBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/BarcodeBuilderTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/BlockTextBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/BlockTextBuilderTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/CircleBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/ComponentBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/DisplayUrlTextBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/DividerBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/ElementBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/HContainerBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/ImageBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/ImageBuilderTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/LineBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/LineBuilderTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/LinkBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/ModuleBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/PageBreakBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/RectangleBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/RowBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilderTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/TextBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/TextBuilderTest.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/VContainerBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/container/Box.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/container/BuildEntity.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/container/ContainerBuilder.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/container/EmptyBox.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/container/EntityBuilderBase.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/container/EntityCreator.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/container/Layout.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/container/ShapeBuilderBase.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/container/StackAxis.java (100%)
rename {src => render-pdf/src}/test/java/com/demcha/compose/testsupport/engine/assembly/container/package-info.java (100%)
rename src/main/java/com/demcha/compose/document/{backend/fixed/pdf => showcase}/FontShowcase.java (99%)
create mode 100644 src/main/java/com/demcha/compose/document/showcase/package-info.java
create mode 100644 src/test/java/com/demcha/compose/document/api/MissingBackendContractTest.java
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 826a60611..2b8f22c59 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -76,7 +76,7 @@ jobs:
# cross-module suites (which need the testing module + the engine test-jar on
# the classpath and so cannot live in the engine's own test scope). -am pulls
# the fonts / emoji upstreams; bundle / examples / benchmarks are excluded.
- run: ./mvnw -B -ntp -f aggregator/pom.xml clean verify -pl :graph-compose-core,:graph-compose-render-docx,:graph-compose-render-pptx,:graph-compose-testing,:graph-compose-qa -am
+ run: ./mvnw -B -ntp -f aggregator/pom.xml clean verify -pl :graph-compose-core,:graph-compose-render-pdf,:graph-compose-render-docx,:graph-compose-render-pptx,:graph-compose-testing,:graph-compose-qa -am
- name: Generate Javadoc
# Run only on the baseline JDK — Javadoc output is identical
@@ -119,10 +119,16 @@ jobs:
- name: Install root artifact (graph-compose-core)
run: ./mvnw -B -ntp -DskipTests install -pl .
+ - name: Install graph-compose-render-pdf (the PDF backend the wrapper brings)
+ # The graph-compose wrapper depends on render-pdf so a bare graph-compose
+ # renders PDF; install it after the core (its only dependency) and before
+ # the wrapper.
+ run: ./mvnw -B -ntp -f render-pdf/pom.xml -DskipTests install
+
- name: Install graph-compose (the compat wrapper, consumed by the examples module)
# examples depends on the graph-compose coordinate — the empty jar wrapper
- # over graph-compose-core. Install it after the core so the examples build
- # resolves it (and the engine classes transitively).
+ # over graph-compose-core + render-pdf. Install it after those so the
+ # examples build resolves it (and the engine + PDF backend transitively).
run: ./mvnw -B -ntp -f wrapper/pom.xml -DskipTests install
- name: Install graph-compose-render-docx (consumed by the examples module)
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 44a63e7c0..60ddc0bad 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -99,10 +99,20 @@ jobs:
CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }}
MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
+ - name: Publish render-pdf to Maven Central
+ # The PDF render backend, lockstep-versioned with the engine (ships on the
+ # same v* tag). graph-compose-core resolves from the local repo installed by
+ # the engine deploy above; the wrapper below depends on this.
+ run: ./mvnw -B -ntp -f render-pdf/pom.xml -P release -DskipTests -Dgpg.skip=false deploy
+ env:
+ CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }}
+ CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }}
+ MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
+
- name: Publish graph-compose (compat wrapper) to Maven Central
# The empty jar that keeps the `graph-compose` coordinate a drop-in: it
- # depends on graph-compose-core, resolved from the local repo installed by
- # the engine (core) deploy above. Ships on the same v* tag, lockstep.
+ # depends on graph-compose-core + graph-compose-render-pdf, resolved from the
+ # local repo installed by the deploys above. Ships on the same v* tag.
run: ./mvnw -B -ntp -f wrapper/pom.xml -P release -DskipTests -Dgpg.skip=false deploy
env:
CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }}
diff --git a/.gitignore b/.gitignore
index 17c75d506..69188cc9a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,6 +39,7 @@ build/
/logs/
benchmarks/logs/
qa/logs/
+render-pdf/logs/
/CV_Generated.pdf
*.pdf
# Allow PDF previews that are committed README assets.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e0fffc682..3c2ba3162 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -36,12 +36,21 @@ for this cycle.
existing `graph-compose` dependency keeps compiling and rendering PDF unchanged.
Consumer-testing support (`graph-compose-testing`) and the semantic DOCX / PPTX
backends (`graph-compose-render-docx` / `graph-compose-render-pptx`) are already
- separate artifacts; the PDF
- render backend and the built-in templates move into their own modules over the
- rest of the 2.0 cycle, at which point `graph-compose` aggregates the PDF backend
- and `graph-compose-core` becomes the lean, bring-your-own-backend coordinate. The
+ separate artifacts; the **PDF render backend now lives in
+ `graph-compose-render-pdf`**, which the `graph-compose` wrapper aggregates so a
+ bare `graph-compose` still renders PDF, while `graph-compose-core` alone is lean
+ (it throws `MissingBackendException` if asked to render without a backend). The
+ built-in templates move into their own module over the rest of the 2.0 cycle. The
optional `graph-compose-fonts` / `graph-compose-emoji` artifacts are unchanged.
Full install guidance ships with 2.0.0.
+- `graph-compose-render-pdf` is a separate artifact: the entire PDFBox backend —
+ `document.backend.fixed.pdf.**` and the `engine.render.pdf.**` render tree — plus
+ PDFBox, zxing (barcodes), and the commons-logging→SLF4J bridge leave
+ `graph-compose-core`. The core keeps the `DocumentSession` API and the
+ `ServiceLoader` seam (`FixedLayoutBackendProvider` / `FontMetricsProvider`); the
+ PDF provider ships in render-pdf and is discovered at runtime. Depend on
+ `graph-compose` (or `graph-compose-render-pdf` directly) for PDF; a bare
+ `graph-compose-core` renders nothing until a backend is on the classpath.
- The semantic office backends are separate artifacts and Apache POI leaves the
engine: `DocxSemanticBackend` ships in `graph-compose-render-docx` (which brings
POI transitively — add it to export DOCX), and `PptxSemanticBackend` ships in its
diff --git a/aggregator/pom.xml b/aggregator/pom.xml
index ac1a74123..5fa6c1ed1 100644
--- a/aggregator/pom.xml
+++ b/aggregator/pom.xml
@@ -58,6 +58,7 @@
-->
..
+ ../render-pdf
../wrapper
../fonts
../emoji
diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml
index 473ea7244..4fadf3082 100644
--- a/benchmarks/pom.xml
+++ b/benchmarks/pom.xml
@@ -53,6 +53,13 @@
graph-compose-core
${graphcompose.version}
+
+
+ io.github.demchaav
+ graph-compose-render-pdf
+ ${graphcompose.version}
+
3.27.7
@@ -119,33 +117,6 @@
slf4j-api
${slf4j.version}
-
-
- org.slf4j
- jcl-over-slf4j
- ${slf4j.version}
-
-
-
- org.apache.pdfbox
- pdfbox
- ${pdfbox.version}
-
-
- commons-logging
- commons-logging
-
-
-
@@ -76,6 +77,23 @@
${project.version}
test
+
+
+ io.github.demchaav
+ graph-compose-render-pdf
+ ${project.version}
+ test
+
+
+ io.github.demchaav
+ graph-compose-render-pdf
+ ${project.version}
+ test-jar
+ tests
+ test
+
io.github.demchaav
graph-compose-fonts
@@ -132,6 +150,19 @@
${logback.version}
test
+
+
+ org.openjfx
+ javafx-controls
+ ${javafx.version}
+ test
+
+
+ org.openjfx
+ javafx-swing
+ ${javafx.version}
+ test
+
diff --git a/src/test/java/com/demcha/compose/devtool/DevToolPreviewProvider.java b/qa/src/test/java/com/demcha/compose/devtool/DevToolPreviewProvider.java
similarity index 100%
rename from src/test/java/com/demcha/compose/devtool/DevToolPreviewProvider.java
rename to qa/src/test/java/com/demcha/compose/devtool/DevToolPreviewProvider.java
diff --git a/src/test/java/com/demcha/compose/devtool/GraphComposeDevTool.java b/qa/src/test/java/com/demcha/compose/devtool/GraphComposeDevTool.java
similarity index 100%
rename from src/test/java/com/demcha/compose/devtool/GraphComposeDevTool.java
rename to qa/src/test/java/com/demcha/compose/devtool/GraphComposeDevTool.java
diff --git a/src/test/java/com/demcha/compose/devtool/GraphComposeDevToolLauncher.java b/qa/src/test/java/com/demcha/compose/devtool/GraphComposeDevToolLauncher.java
similarity index 100%
rename from src/test/java/com/demcha/compose/devtool/GraphComposeDevToolLauncher.java
rename to qa/src/test/java/com/demcha/compose/devtool/GraphComposeDevToolLauncher.java
diff --git a/src/test/java/com/demcha/compose/devtool/PdfRenderBridge.java b/qa/src/test/java/com/demcha/compose/devtool/PdfRenderBridge.java
similarity index 100%
rename from src/test/java/com/demcha/compose/devtool/PdfRenderBridge.java
rename to qa/src/test/java/com/demcha/compose/devtool/PdfRenderBridge.java
diff --git a/src/test/java/com/demcha/compose/devtool/PreviewCompilerTest.java b/qa/src/test/java/com/demcha/compose/devtool/PreviewCompilerTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/devtool/PreviewCompilerTest.java
rename to qa/src/test/java/com/demcha/compose/devtool/PreviewCompilerTest.java
diff --git a/src/test/java/com/demcha/compose/document/Test.java b/qa/src/test/java/com/demcha/compose/document/Test.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/Test.java
rename to qa/src/test/java/com/demcha/compose/document/Test.java
diff --git a/src/test/java/com/demcha/compose/document/api/DocumentSessionAvailableHeightTest.java b/qa/src/test/java/com/demcha/compose/document/api/DocumentSessionAvailableHeightTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/DocumentSessionAvailableHeightTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/DocumentSessionAvailableHeightTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/DocumentSessionConveniencePdfOptionsTest.java b/qa/src/test/java/com/demcha/compose/document/api/DocumentSessionConveniencePdfOptionsTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/DocumentSessionConveniencePdfOptionsTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/DocumentSessionConveniencePdfOptionsTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/DocumentSessionLifecycleTest.java b/qa/src/test/java/com/demcha/compose/document/api/DocumentSessionLifecycleTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/DocumentSessionLifecycleTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/DocumentSessionLifecycleTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/DocumentSessionParallelStressTest.java b/qa/src/test/java/com/demcha/compose/document/api/DocumentSessionParallelStressTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/DocumentSessionParallelStressTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/DocumentSessionParallelStressTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/DocumentSessionRenderingExceptionTest.java b/qa/src/test/java/com/demcha/compose/document/api/DocumentSessionRenderingExceptionTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/DocumentSessionRenderingExceptionTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/DocumentSessionRenderingExceptionTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/DocumentSessionTest.java b/qa/src/test/java/com/demcha/compose/document/api/DocumentSessionTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/DocumentSessionTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/DocumentSessionTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/LayerStackRowCompositionTest.java b/qa/src/test/java/com/demcha/compose/document/api/LayerStackRowCompositionTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/LayerStackRowCompositionTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/LayerStackRowCompositionTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/NegativeMarginTest.java b/qa/src/test/java/com/demcha/compose/document/api/NegativeMarginTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/NegativeMarginTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/NegativeMarginTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/PageBackgroundTest.java b/qa/src/test/java/com/demcha/compose/document/api/PageBackgroundTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/PageBackgroundTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/PageBackgroundTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/PageMarginTest.java b/qa/src/test/java/com/demcha/compose/document/api/PageMarginTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/PageMarginTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/PageMarginTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/PaginationEdgeCaseTest.java b/qa/src/test/java/com/demcha/compose/document/api/PaginationEdgeCaseTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/PaginationEdgeCaseTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/PaginationEdgeCaseTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/SessionChromeApiTest.java b/qa/src/test/java/com/demcha/compose/document/api/SessionChromeApiTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/SessionChromeApiTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/SessionChromeApiTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/SessionLayoutApiTest.java b/qa/src/test/java/com/demcha/compose/document/api/SessionLayoutApiTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/SessionLayoutApiTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/SessionLayoutApiTest.java
diff --git a/src/test/java/com/demcha/compose/document/api/TableSlicePaginationTest.java b/qa/src/test/java/com/demcha/compose/document/api/TableSlicePaginationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/api/TableSlicePaginationTest.java
rename to qa/src/test/java/com/demcha/compose/document/api/TableSlicePaginationTest.java
diff --git a/src/test/java/com/demcha/compose/document/architecture/ShapeContainerInvariantsTest.java b/qa/src/test/java/com/demcha/compose/document/architecture/ShapeContainerInvariantsTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/architecture/ShapeContainerInvariantsTest.java
rename to qa/src/test/java/com/demcha/compose/document/architecture/ShapeContainerInvariantsTest.java
diff --git a/src/test/java/com/demcha/compose/document/architecture/ShapeOutlineRenderCoverageTest.java b/qa/src/test/java/com/demcha/compose/document/architecture/ShapeOutlineRenderCoverageTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/architecture/ShapeOutlineRenderCoverageTest.java
rename to qa/src/test/java/com/demcha/compose/document/architecture/ShapeOutlineRenderCoverageTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/BackendProvidersTest.java b/qa/src/test/java/com/demcha/compose/document/backend/fixed/BackendProvidersTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/BackendProvidersTest.java
rename to qa/src/test/java/com/demcha/compose/document/backend/fixed/BackendProvidersTest.java
diff --git a/qa/src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseLayoutSnapshotTest.java
index 6cfafc037..199496804 100644
--- a/qa/src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseLayoutSnapshotTest.java
+++ b/qa/src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseLayoutSnapshotTest.java
@@ -3,6 +3,7 @@
import com.demcha.compose.GraphCompose;
import com.demcha.compose.document.api.DocumentPageSize;
import com.demcha.compose.document.api.DocumentSession;
+import com.demcha.compose.document.showcase.FontShowcase;
import com.demcha.compose.testing.layout.LayoutSnapshotAssertions;
import org.junit.jupiter.api.Test;
diff --git a/src/test/java/com/demcha/compose/document/dsl/AddLinkShortcutTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/AddLinkShortcutTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/AddLinkShortcutTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/AddLinkShortcutTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/BlockAlignTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/BlockAlignTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/BlockAlignTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/BlockAlignTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/BlockSvgRenderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/BlockSvgRenderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/BlockSvgRenderTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/BlockSvgRenderTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/DocumentBleedTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/DocumentBleedTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/DocumentBleedTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/DocumentBleedTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/EmojiRenderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/EmojiRenderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/EmojiRenderTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/EmojiRenderTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/InlineHighlightRenderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/InlineHighlightRenderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/InlineHighlightRenderTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/InlineHighlightRenderTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/InlineShapeRenderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/InlineShapeRenderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/InlineShapeRenderTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/InlineShapeRenderTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/InlineSvgRenderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/InlineSvgRenderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/InlineSvgRenderTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/InlineSvgRenderTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/LayerStackBuilderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/LayerStackBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/LayerStackBuilderTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/LayerStackBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/LineFillTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/LineFillTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/LineFillTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/LineFillTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/PathBuilderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/PathBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/PathBuilderTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/PathBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/RichTextTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/RichTextTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/RichTextTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/RichTextTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/RowBuilderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/RowBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/RowBuilderTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/RowBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/RowColumnsTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/RowColumnsTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/RowColumnsTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/RowColumnsTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/RowFlexTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/RowFlexTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/RowFlexTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/RowFlexTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/RowVerticalAlignTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/RowVerticalAlignTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/RowVerticalAlignTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/RowVerticalAlignTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/SectionKeepTogetherTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/SectionKeepTogetherTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/SectionKeepTogetherTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/SectionKeepTogetherTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/ShapeContainerBuilderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/ShapeContainerBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/ShapeContainerBuilderTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/ShapeContainerBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/TableBuilderColSpanTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/TableBuilderColSpanTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/TableBuilderColSpanTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/TableBuilderColSpanTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/TableBuilderRepeatHeaderTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/TableBuilderRepeatHeaderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/TableBuilderRepeatHeaderTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/TableBuilderRepeatHeaderTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/TableBuilderRowSpanTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/TableBuilderRowSpanTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/TableBuilderRowSpanTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/TableBuilderRowSpanTest.java
diff --git a/src/test/java/com/demcha/compose/document/dsl/TransformableLeafBuildersTest.java b/qa/src/test/java/com/demcha/compose/document/dsl/TransformableLeafBuildersTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/dsl/TransformableLeafBuildersTest.java
rename to qa/src/test/java/com/demcha/compose/document/dsl/TransformableLeafBuildersTest.java
diff --git a/src/test/java/com/demcha/compose/document/layout/LayoutCompilerInvariantsTest.java b/qa/src/test/java/com/demcha/compose/document/layout/LayoutCompilerInvariantsTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/layout/LayoutCompilerInvariantsTest.java
rename to qa/src/test/java/com/demcha/compose/document/layout/LayoutCompilerInvariantsTest.java
diff --git a/src/test/java/com/demcha/compose/document/snapshot/PageIndexTest.java b/qa/src/test/java/com/demcha/compose/document/snapshot/PageIndexTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/snapshot/PageIndexTest.java
rename to qa/src/test/java/com/demcha/compose/document/snapshot/PageIndexTest.java
diff --git a/src/test/java/com/demcha/compose/document/style/DocumentBordersTest.java b/qa/src/test/java/com/demcha/compose/document/style/DocumentBordersTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/style/DocumentBordersTest.java
rename to qa/src/test/java/com/demcha/compose/document/style/DocumentBordersTest.java
diff --git a/src/test/java/com/demcha/compose/document/style/DocumentTextAutoSizeTest.java b/qa/src/test/java/com/demcha/compose/document/style/DocumentTextAutoSizeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/style/DocumentTextAutoSizeTest.java
rename to qa/src/test/java/com/demcha/compose/document/style/DocumentTextAutoSizeTest.java
diff --git a/src/test/java/com/demcha/compose/document/svg/SvgIconTest.java b/qa/src/test/java/com/demcha/compose/document/svg/SvgIconTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/svg/SvgIconTest.java
rename to qa/src/test/java/com/demcha/compose/document/svg/SvgIconTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/core/widgets/TableWidgetTest.java b/qa/src/test/java/com/demcha/compose/document/templates/core/widgets/TableWidgetTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/core/widgets/TableWidgetTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/core/widgets/TableWidgetTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2SmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2SmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2SmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/coverletter/presets/CoverLetterV2SmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/BlueBannerSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/BlueBannerSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/BlueBannerSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/BlueBannerSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/BoxedSectionsSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/BoxedSectionsSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/BoxedSectionsSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/BoxedSectionsSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/ClassicSerifSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ClassicSerifSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/ClassicSerifSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ClassicSerifSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/CompactMonoSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/CompactMonoSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/CompactMonoSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/CompactMonoSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/EditorialBlueSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/EditorialBlueSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/EditorialBlueSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/EditorialBlueSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/EngineeringResumeSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/EngineeringResumeSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/EngineeringResumeSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/EngineeringResumeSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/ExecutiveSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ExecutiveSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/ExecutiveSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ExecutiveSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/MinimalUnderlinedSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/MinimalUnderlinedSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/MinimalUnderlinedSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/MinimalUnderlinedSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/MintEditorialSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/MintEditorialSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/MintEditorialSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/MintEditorialSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/ModernProfessionalSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ModernProfessionalSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/ModernProfessionalSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/ModernProfessionalSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/MonogramSidebarSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/MonogramSidebarSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/MonogramSidebarSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/MonogramSidebarSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/NordicCleanSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NordicCleanSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/NordicCleanSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/NordicCleanSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/PanelSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/PanelSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/PanelSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/PanelSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/SidebarPortraitSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/SidebarPortraitSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/SidebarPortraitSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/SidebarPortraitSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/presets/TimelineMinimalSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TimelineMinimalSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/presets/TimelineMinimalSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/presets/TimelineMinimalSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/cv/widgets/WidgetSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/cv/widgets/WidgetSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/cv/widgets/WidgetSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/cv/widgets/WidgetSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/invoice/presets/ModernInvoiceSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ModernInvoiceSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/invoice/presets/ModernInvoiceSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/invoice/presets/ModernInvoiceSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/document/templates/proposal/presets/ModernProposalSmokeTest.java b/qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ModernProposalSmokeTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/templates/proposal/presets/ModernProposalSmokeTest.java
rename to qa/src/test/java/com/demcha/compose/document/templates/proposal/presets/ModernProposalSmokeTest.java
diff --git a/src/test/java/com/demcha/compose/engine/components/ComponentBuilderTest.java b/qa/src/test/java/com/demcha/compose/engine/components/ComponentBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/components/ComponentBuilderTest.java
rename to qa/src/test/java/com/demcha/compose/engine/components/ComponentBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/engine/components/content/ImageDataCacheTest.java b/qa/src/test/java/com/demcha/compose/engine/components/content/ImageDataCacheTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/components/content/ImageDataCacheTest.java
rename to qa/src/test/java/com/demcha/compose/engine/components/content/ImageDataCacheTest.java
diff --git a/src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessContractTest.java b/qa/src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessContractTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessContractTest.java
rename to qa/src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessContractTest.java
diff --git a/src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessLayoutSnapshotTest.java b/qa/src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessLayoutSnapshotTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessLayoutSnapshotTest.java
rename to qa/src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessLayoutSnapshotTest.java
diff --git a/src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessMutationInvalidationTest.java b/qa/src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessMutationInvalidationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessMutationInvalidationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/core/EngineComposerHarnessMutationInvalidationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/core/NewFeaturesIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/core/NewFeaturesIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/core/NewFeaturesIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/core/NewFeaturesIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/BlockTextIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/BlockTextIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/BlockTextIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/BlockTextIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/CircleIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/CircleIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/CircleIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/CircleIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/ImageIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/ImageIntegrationTest.java
similarity index 98%
rename from src/test/java/com/demcha/compose/engine/integration/ImageIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/ImageIntegrationTest.java
index ee7254ea8..469067a4f 100644
--- a/src/test/java/com/demcha/compose/engine/integration/ImageIntegrationTest.java
+++ b/qa/src/test/java/com/demcha/compose/engine/integration/ImageIntegrationTest.java
@@ -1,4 +1,5 @@
package com.demcha.compose.engine.integration;
+import com.demcha.compose.qa.RepoPaths;
import com.demcha.compose.GraphCompose;
import com.demcha.compose.testsupport.engine.assembly.ComponentBuilder;
@@ -26,7 +27,7 @@
class ImageIntegrationTest {
- private static final Path COVER_ASSET = Path.of("assets", "GraphComposeCover.png");
+ private static final Path COVER_ASSET = RepoPaths.resolve("assets", "GraphComposeCover.png");
@Test
void shouldRenderSingleImageWithGuides() throws Exception {
diff --git a/src/test/java/com/demcha/compose/engine/integration/LargeContainerIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/LargeContainerIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/LargeContainerIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/LargeContainerIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/LineIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/LineIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/LineIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/LineIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/PageBreakerIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/PageBreakerIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/PageBreakerIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/PageBreakerIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/SingleLineTextIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/SingleLineTextIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/SingleLineTextIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/SingleLineTextIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/TableColSpanIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/TableColSpanIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/TableColSpanIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/TableColSpanIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/TableLayoutIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/TableLayoutIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/TableLayoutIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/TableLayoutIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/TableMultilineIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/TableMultilineIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/TableMultilineIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/TableMultilineIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/TableStylingIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/TableStylingIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/TableStylingIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/TableStylingIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/integration/TextPaginationIntegrationTest.java b/qa/src/test/java/com/demcha/compose/engine/integration/TextPaginationIntegrationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/integration/TextPaginationIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/engine/integration/TextPaginationIntegrationTest.java
diff --git a/src/test/java/com/demcha/compose/engine/measurement/FontLibraryTextMeasurementSystemTest.java b/qa/src/test/java/com/demcha/compose/engine/measurement/FontLibraryTextMeasurementSystemTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/measurement/FontLibraryTextMeasurementSystemTest.java
rename to qa/src/test/java/com/demcha/compose/engine/measurement/FontLibraryTextMeasurementSystemTest.java
diff --git a/src/test/java/com/demcha/compose/engine/render/RenderHandlerRegistryTest.java b/qa/src/test/java/com/demcha/compose/engine/render/RenderHandlerRegistryTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/render/RenderHandlerRegistryTest.java
rename to qa/src/test/java/com/demcha/compose/engine/render/RenderHandlerRegistryTest.java
diff --git a/src/test/java/com/demcha/compose/engine/render/guides/GuidesRendererTest.java b/qa/src/test/java/com/demcha/compose/engine/render/guides/GuidesRendererTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/render/guides/GuidesRendererTest.java
rename to qa/src/test/java/com/demcha/compose/engine/render/guides/GuidesRendererTest.java
diff --git a/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java b/qa/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java
similarity index 97%
rename from src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java
rename to qa/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java
index ae13c181a..345818d2c 100644
--- a/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java
+++ b/qa/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java
@@ -1,4 +1,5 @@
package com.demcha.compose.font;
+import com.demcha.compose.qa.RepoPaths;
import com.demcha.compose.GraphCompose;
import com.demcha.compose.document.backend.fixed.pdf.PdfFontLibraryFactory;
@@ -41,7 +42,7 @@ void shouldRegisterCustomFontFamilyFromFilePaths() throws Exception {
// The bundled fonts moved to the graph-compose-fonts module in v1.8.0.
// This test exercises file-based registration, so it reads the real TTFs
// from that module's resources (engine test cwd is the repo root).
- Path fontsRoot = Path.of("fonts", "src", "main", "resources", "fonts", "google", "lato");
+ Path fontsRoot = RepoPaths.resolve("fonts", "src", "main", "resources", "fonts", "google", "lato");
try (EngineComposerHarness composer = com.demcha.compose.testsupport.EngineComposerHarness.pdf()
.registerFontFamily(
diff --git a/qa/src/test/java/com/demcha/compose/qa/RepoPaths.java b/qa/src/test/java/com/demcha/compose/qa/RepoPaths.java
new file mode 100644
index 000000000..2fa009f7b
--- /dev/null
+++ b/qa/src/test/java/com/demcha/compose/qa/RepoPaths.java
@@ -0,0 +1,44 @@
+package com.demcha.compose.qa;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+/**
+ * Resolves repository-root-relative paths independently of which module's working
+ * directory the suite runs from. Several cross-module suites moved into qa read
+ * sibling-module sources or repo-root assets (e.g. {@code fonts/src/...},
+ * {@code examples/src/...}, {@code assets/...}); those paths resolved from the
+ * engine module's basedir (the repo root) but not from qa's, so they go through
+ * here instead.
+ */
+public final class RepoPaths {
+
+ private RepoPaths() {
+ }
+
+ /**
+ * The repository root, located by walking up from the working directory until a
+ * directory that contains {@code aggregator/pom.xml} is found.
+ *
+ * @return the absolute repository-root path
+ */
+ public static Path repoRoot() {
+ for (Path dir = Path.of("").toAbsolutePath(); dir != null; dir = dir.getParent()) {
+ if (Files.exists(dir.resolve("aggregator/pom.xml"))) {
+ return dir;
+ }
+ }
+ return Path.of("").toAbsolutePath();
+ }
+
+ /**
+ * Resolves a repository-root-relative path.
+ *
+ * @param first the first path segment (may itself contain separators)
+ * @param more additional path segments
+ * @return the resolved absolute path under the repository root
+ */
+ public static Path resolve(String first, String... more) {
+ return repoRoot().resolve(Path.of(first, more));
+ }
+}
diff --git a/src/test/java/com/demcha/documentation/DocumentationExamplesTest.java b/qa/src/test/java/com/demcha/documentation/DocumentationExamplesTest.java
similarity index 99%
rename from src/test/java/com/demcha/documentation/DocumentationExamplesTest.java
rename to qa/src/test/java/com/demcha/documentation/DocumentationExamplesTest.java
index c2676a6be..e95f58878 100644
--- a/src/test/java/com/demcha/documentation/DocumentationExamplesTest.java
+++ b/qa/src/test/java/com/demcha/documentation/DocumentationExamplesTest.java
@@ -1,4 +1,5 @@
package com.demcha.documentation;
+import com.demcha.compose.qa.RepoPaths;
import com.demcha.compose.GraphCompose;
import com.demcha.compose.document.api.DocumentPageSize;
@@ -178,7 +179,7 @@ void shouldRenderComposeFirstBuiltInTemplateExampleToFile() throws Exception {
@Test
void runnableExamplesShouldUseCanonicalDocumentTemplates() throws IOException {
- Path examplesRoot = Path.of("examples/src/main/java/com/demcha/examples").toAbsolutePath().normalize();
+ Path examplesRoot = RepoPaths.resolve("examples/src/main/java/com/demcha/examples").toAbsolutePath().normalize();
try (var paths = Files.walk(examplesRoot)) {
List violations = new TreeSet<>(paths
diff --git a/src/test/java/com/demcha/testing/visual/DevelopTest.java b/qa/src/test/java/com/demcha/testing/visual/DevelopTest.java
similarity index 100%
rename from src/test/java/com/demcha/testing/visual/DevelopTest.java
rename to qa/src/test/java/com/demcha/testing/visual/DevelopTest.java
diff --git a/src/test/java/com/demcha/testing/visual/HttpStreamingDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/HttpStreamingDemoTest.java
similarity index 100%
rename from src/test/java/com/demcha/testing/visual/HttpStreamingDemoTest.java
rename to qa/src/test/java/com/demcha/testing/visual/HttpStreamingDemoTest.java
diff --git a/src/test/java/com/demcha/testing/visual/LayerStackRowDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/LayerStackRowDemoTest.java
similarity index 100%
rename from src/test/java/com/demcha/testing/visual/LayerStackRowDemoTest.java
rename to qa/src/test/java/com/demcha/testing/visual/LayerStackRowDemoTest.java
diff --git a/src/test/java/com/demcha/testing/visual/PageCapacityToleranceDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/PageCapacityToleranceDemoTest.java
similarity index 100%
rename from src/test/java/com/demcha/testing/visual/PageCapacityToleranceDemoTest.java
rename to qa/src/test/java/com/demcha/testing/visual/PageCapacityToleranceDemoTest.java
diff --git a/src/test/java/com/demcha/testing/visual/ShapeContainerTransformDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/ShapeContainerTransformDemoTest.java
similarity index 100%
rename from src/test/java/com/demcha/testing/visual/ShapeContainerTransformDemoTest.java
rename to qa/src/test/java/com/demcha/testing/visual/ShapeContainerTransformDemoTest.java
diff --git a/src/test/java/com/demcha/testing/visual/ShapeContainerZIndexDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/ShapeContainerZIndexDemoTest.java
similarity index 100%
rename from src/test/java/com/demcha/testing/visual/ShapeContainerZIndexDemoTest.java
rename to qa/src/test/java/com/demcha/testing/visual/ShapeContainerZIndexDemoTest.java
diff --git a/src/test/java/com/demcha/testing/visual/TableRepeatHeaderDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/TableRepeatHeaderDemoTest.java
similarity index 100%
rename from src/test/java/com/demcha/testing/visual/TableRepeatHeaderDemoTest.java
rename to qa/src/test/java/com/demcha/testing/visual/TableRepeatHeaderDemoTest.java
diff --git a/src/test/java/com/demcha/testing/visual/TableZebraAndTotalsDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/TableZebraAndTotalsDemoTest.java
similarity index 100%
rename from src/test/java/com/demcha/testing/visual/TableZebraAndTotalsDemoTest.java
rename to qa/src/test/java/com/demcha/testing/visual/TableZebraAndTotalsDemoTest.java
diff --git a/src/test/java/com/demcha/testing/visual/UnicodeFallbackDemoTest.java b/qa/src/test/java/com/demcha/testing/visual/UnicodeFallbackDemoTest.java
similarity index 100%
rename from src/test/java/com/demcha/testing/visual/UnicodeFallbackDemoTest.java
rename to qa/src/test/java/com/demcha/testing/visual/UnicodeFallbackDemoTest.java
diff --git a/render-docx/pom.xml b/render-docx/pom.xml
index 729825f50..7d20759a6 100644
--- a/render-docx/pom.xml
+++ b/render-docx/pom.xml
@@ -87,6 +87,14 @@
poi-ooxml
${poi.version}
+
+
+ io.github.demchaav
+ graph-compose-render-pdf
+ ${project.version}
+ test
+
diff --git a/render-pdf/pom.xml b/render-pdf/pom.xml
new file mode 100644
index 000000000..e6a2d2f53
--- /dev/null
+++ b/render-pdf/pom.xml
@@ -0,0 +1,322 @@
+
+
+ 4.0.0
+
+
+ io.github.demchaav
+ graph-compose-render-pdf
+ 2.0.0-SNAPSHOT
+
+ GraphCompose Render — PDF
+ The PDFBox-backed PDF render backend for GraphCompose.
+ https://github.com/DemchaAV/GraphCompose
+
+
+
+ MIT License
+ https://opensource.org/licenses/MIT
+ repo
+
+
+
+
+
+ DemchaAV
+ Artem Demchyshyn
+ demchishynartem@gmail.com
+ https://github.com/DemchaAV
+
+ Lead Developer
+ Architect
+
+ UTC 0
+
+
+
+
+ scm:git:https://github.com/DemchaAV/GraphCompose.git
+ scm:git:ssh://git@github.com/DemchaAV/GraphCompose.git
+ https://github.com/DemchaAV/GraphCompose/tree/main
+
+
+
+ UTF-8
+ 17
+
+ 1.18.46
+ 3.0.7
+ 3.5.4
+ 2.0.18
+ 6.1.1
+ 3.27.7
+ 5.23.0
+ 1.5.37
+ 1.0.0
+ 1.0.0
+
+ 3.15.0
+ 3.5.0
+ 3.5.6
+ 3.4.0
+ 3.12.0
+ 3.2.8
+ 0.11.0
+
+
+ true
+
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+ io.github.demchaav
+ graph-compose-core
+ ${project.version}
+
+
+
+ org.apache.pdfbox
+ pdfbox
+ ${pdfbox.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.slf4j
+ jcl-over-slf4j
+ ${slf4j.version}
+
+
+ com.google.zxing
+ core
+ ${zxing.version}
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ ${junit.bom.version}
+ test
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+ org.mockito
+ mockito-junit-jupiter
+ ${mockito.version}
+ test
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+ test
+
+
+ io.github.demchaav
+ graph-compose-fonts
+ ${graphcompose.fonts.version}
+ test
+
+
+ io.github.demchaav
+ graph-compose-emoji
+ ${graphcompose.emoji.version}
+ test
+
+
+
+ io.github.demchaav
+ graph-compose-core
+ ${project.version}
+ test-jar
+ tests
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven.compiler.plugin.version}
+
+ ${maven.compiler.release}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven.surefire.plugin.version}
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven.jar.plugin.version}
+
+
+ attach-test-jar
+
+ test-jar
+
+
+
+
+
+
+
+
+
+
+ release
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven.jar.plugin.version}
+
+
+ attach-test-jar
+ none
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ ${maven.source.plugin.version}
+
+
+ attach-sources
+ package
+
+ jar-no-fork
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven.javadoc.plugin.version}
+
+
+ attach-javadocs
+ package
+
+ jar
+
+
+ none
+ false
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ ${maven.gpg.plugin.version}
+
+
+ sign-artifacts
+ verify
+
+ sign
+
+
+ ${gpg.skip}
+
+ --pinentry-mode
+ loopback
+
+
+
+
+
+
+ org.sonatype.central
+ central-publishing-maven-plugin
+ ${central.publishing.plugin.version}
+ true
+
+ central
+ false
+ validated
+
+
+
+
+
+
+
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfBookmarkOutlineWriter.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfBookmarkOutlineWriter.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfBookmarkOutlineWriter.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfBookmarkOutlineWriter.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfDocumentPostProcessor.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfDocumentPostProcessor.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfDocumentPostProcessor.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfDocumentPostProcessor.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackend.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackend.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackend.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackend.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackendProvider.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackendProvider.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackendProvider.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackendProvider.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontLibraryFactory.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontLibraryFactory.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontLibraryFactory.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontLibraryFactory.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontLoader.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontLoader.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontLoader.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontLoader.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontMetricsProvider.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontMetricsProvider.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontMetricsProvider.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFontMetricsProvider.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFragmentRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFragmentRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFragmentRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfFragmentRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfGuideLinesRenderer.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfGuideLinesRenderer.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfGuideLinesRenderer.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfGuideLinesRenderer.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfInternalLinkWriter.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfInternalLinkWriter.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfInternalLinkWriter.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfInternalLinkWriter.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfLinkAnnotationWriter.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfLinkAnnotationWriter.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfLinkAnnotationWriter.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfLinkAnnotationWriter.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfMeasurementResources.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfMeasurementResources.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfMeasurementResources.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfMeasurementResources.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfNodeLabelRenderer.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfNodeLabelRenderer.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfNodeLabelRenderer.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfNodeLabelRenderer.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfOptionsAdapter.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfOptionsAdapter.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfOptionsAdapter.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfOptionsAdapter.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfOutputOptionsTranslator.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfOutputOptionsTranslator.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfOutputOptionsTranslator.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfOutputOptionsTranslator.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfRenderEnvironment.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfRenderEnvironment.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfRenderEnvironment.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfRenderEnvironment.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfRenderSession.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfRenderSession.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfRenderSession.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/PdfRenderSession.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfAlphaSupport.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfAlphaSupport.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfAlphaSupport.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfAlphaSupport.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfAnchorMarkerRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfAnchorMarkerRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfAnchorMarkerRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfAnchorMarkerRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfBarcodeFragmentRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfBarcodeFragmentRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfBarcodeFragmentRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfBarcodeFragmentRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfBookmarkMarkerRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfBookmarkMarkerRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfBookmarkMarkerRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfBookmarkMarkerRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfEllipseFragmentRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfEllipseFragmentRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfEllipseFragmentRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfEllipseFragmentRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfImageFragmentRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfImageFragmentRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfImageFragmentRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfImageFragmentRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfLineFragmentRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfLineFragmentRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfLineFragmentRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfLineFragmentRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfParagraphFragmentRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfParagraphFragmentRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfParagraphFragmentRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfParagraphFragmentRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPathFragmentRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPathFragmentRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPathFragmentRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPathFragmentRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPathPainter.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPathPainter.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPathPainter.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPathPainter.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPolygonFragmentRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPolygonFragmentRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPolygonFragmentRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfPolygonFragmentRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShadingSupport.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShadingSupport.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShadingSupport.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShadingSupport.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeClipBeginRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeClipBeginRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeClipBeginRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeClipBeginRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeClipEndRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeClipEndRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeClipEndRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeClipEndRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeFragmentRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeFragmentRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeFragmentRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeFragmentRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeGeometry.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeGeometry.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeGeometry.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfShapeGeometry.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTableRowFragmentRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTableRowFragmentRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTableRowFragmentRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTableRowFragmentRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTransformBeginRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTransformBeginRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTransformBeginRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTransformBeginRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTransformEndRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTransformEndRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTransformEndRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/PdfTransformEndRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/package-info.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/package-info.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/package-info.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/handlers/package-info.java
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/package-info.java b/render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/package-info.java
similarity index 100%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/package-info.java
rename to render-pdf/src/main/java/com/demcha/compose/document/backend/fixed/pdf/package-info.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/GlyphFallbackLogger.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/GlyphFallbackLogger.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/GlyphFallbackLogger.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/GlyphFallbackLogger.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/PdfFont.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/PdfFont.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/PdfFont.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/PdfFont.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfCanvas.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfCanvas.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfCanvas.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfCanvas.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfFileManagerSystem.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfFileManagerSystem.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfFileManagerSystem.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfFileManagerSystem.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfGuidesRenderer.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfGuidesRenderer.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfGuidesRenderer.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfGuidesRenderer.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfImageCache.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfImageCache.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfImageCache.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfImageCache.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSession.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSession.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSession.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSession.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECS.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECS.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECS.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECS.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfStream.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfStream.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfStream.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfStream.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfBarcodeRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfBarcodeRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfBarcodeRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfBarcodeRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfBlockTextRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfBlockTextRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfBlockTextRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfBlockTextRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfChunkedBlockTextRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfChunkedBlockTextRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfChunkedBlockTextRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfChunkedBlockTextRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfCircleRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfCircleRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfCircleRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfCircleRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfContainerRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfContainerRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfContainerRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfContainerRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfElementRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfElementRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfElementRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfElementRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfImageRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfImageRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfImageRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfImageRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLineRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLineRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLineRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLineRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLinkRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLinkRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLinkRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLinkRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfPageBreakRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfPageBreakRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfPageBreakRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfPageBreakRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfRectangleRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfRectangleRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfRectangleRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfRectangleRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTableRowRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTableRowRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTableRowRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTableRowRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTextRenderHandler.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTextRenderHandler.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTextRenderHandler.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTextRenderHandler.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/package-info.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/package-info.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/package-info.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/package-info.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/PdfBookmarkBuilder.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/PdfBookmarkBuilder.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/PdfBookmarkBuilder.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/PdfBookmarkBuilder.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/TableCellBox.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/TableCellBox.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/TableCellBox.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/TableCellBox.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/package-info.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/package-info.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/package-info.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/package-info.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/ecs/package-info.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/package-info.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/ecs/package-info.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/ecs/package-info.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/helpers/PdfHeaderFooterRenderer.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/helpers/PdfHeaderFooterRenderer.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/helpers/PdfHeaderFooterRenderer.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/helpers/PdfHeaderFooterRenderer.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/helpers/PdfWatermarkRenderer.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/helpers/PdfWatermarkRenderer.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/helpers/PdfWatermarkRenderer.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/helpers/PdfWatermarkRenderer.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/helpers/package-info.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/helpers/package-info.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/helpers/package-info.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/helpers/package-info.java
diff --git a/src/main/java/com/demcha/compose/engine/render/pdf/package-info.java b/render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/package-info.java
similarity index 100%
rename from src/main/java/com/demcha/compose/engine/render/pdf/package-info.java
rename to render-pdf/src/main/java/com/demcha/compose/engine/render/pdf/package-info.java
diff --git a/src/main/resources/META-INF/services/com.demcha.compose.document.backend.fixed.FixedLayoutBackendProvider b/render-pdf/src/main/resources/META-INF/services/com.demcha.compose.document.backend.fixed.FixedLayoutBackendProvider
similarity index 100%
rename from src/main/resources/META-INF/services/com.demcha.compose.document.backend.fixed.FixedLayoutBackendProvider
rename to render-pdf/src/main/resources/META-INF/services/com.demcha.compose.document.backend.fixed.FixedLayoutBackendProvider
diff --git a/src/main/resources/META-INF/services/com.demcha.compose.document.backend.fixed.FontMetricsProvider b/render-pdf/src/main/resources/META-INF/services/com.demcha.compose.document.backend.fixed.FontMetricsProvider
similarity index 100%
rename from src/main/resources/META-INF/services/com.demcha.compose.document.backend.fixed.FontMetricsProvider
rename to render-pdf/src/main/resources/META-INF/services/com.demcha.compose.document.backend.fixed.FontMetricsProvider
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/ContainerBookmarkTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/ContainerBookmarkTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/ContainerBookmarkTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/ContainerBookmarkTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseRenderTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseRenderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseRenderTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcaseRenderTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/InternalLinkAnchorTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/InternalLinkAnchorTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/InternalLinkAnchorTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/InternalLinkAnchorTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/MeasurementFontParityTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/MeasurementFontParityTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/MeasurementFontParityTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/MeasurementFontParityTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/MultiSectionDocumentTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/MultiSectionDocumentTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/MultiSectionDocumentTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/MultiSectionDocumentTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PageIndexAnchorAgreementTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PageIndexAnchorAgreementTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PageIndexAnchorAgreementTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PageIndexAnchorAgreementTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PageReferenceTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PageReferenceTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PageReferenceTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PageReferenceTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/ParagraphTextStateDedupTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/ParagraphTextStateDedupTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/ParagraphTextStateDedupTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/ParagraphTextStateDedupTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfBackendExtensibilityTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfBackendExtensibilityTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfBackendExtensibilityTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfBackendExtensibilityTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfDebugNodeLabelsTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfDebugNodeLabelsTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfDebugNodeLabelsTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfDebugNodeLabelsTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackendFeaturesTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackendFeaturesTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackendFeaturesTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfFixedLayoutBackendFeaturesTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfLineStrokeStyleTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfLineStrokeStyleTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfLineStrokeStyleTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfLineStrokeStyleTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPageNumberingTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPageNumberingTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPageNumberingTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPageNumberingTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPathGradientTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPathGradientTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPathGradientTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPathGradientTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPathStrokeStyleTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPathStrokeStyleTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPathStrokeStyleTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfPathStrokeStyleTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfShapeAlphaTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfShapeAlphaTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfShapeAlphaTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfShapeAlphaTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfShapeGradientTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfShapeGradientTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfShapeGradientTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfShapeGradientTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfWatermarkStateIsolationTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfWatermarkStateIsolationTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfWatermarkStateIsolationTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/PdfWatermarkStateIsolationTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/TocTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/TocTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/TocTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/TocTest.java
diff --git a/src/test/java/com/demcha/compose/document/backend/fixed/pdf/ViewerPreferencesTest.java b/render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/ViewerPreferencesTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/document/backend/fixed/pdf/ViewerPreferencesTest.java
rename to render-pdf/src/test/java/com/demcha/compose/document/backend/fixed/pdf/ViewerPreferencesTest.java
diff --git a/src/test/java/com/demcha/compose/engine/render/pdf/PdfFontSanitizerTest.java b/render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/PdfFontSanitizerTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/render/pdf/PdfFontSanitizerTest.java
rename to render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/PdfFontSanitizerTest.java
diff --git a/src/test/java/com/demcha/compose/engine/render/pdf/PdfRenderInterfaceGuardTest.java b/render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/PdfRenderInterfaceGuardTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/render/pdf/PdfRenderInterfaceGuardTest.java
rename to render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/PdfRenderInterfaceGuardTest.java
diff --git a/src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSessionTest.java b/render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSessionTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSessionTest.java
rename to render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSessionTest.java
diff --git a/src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSDispatchTest.java b/render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSDispatchTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSDispatchTest.java
rename to render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSDispatchTest.java
diff --git a/src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSImageCacheTest.java b/render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSImageCacheTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSImageCacheTest.java
rename to render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSImageCacheTest.java
diff --git a/src/test/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLinkRenderHandlerTest.java b/render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLinkRenderHandlerTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLinkRenderHandlerTest.java
rename to render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfLinkRenderHandlerTest.java
diff --git a/src/test/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTableRowRenderHandlerTest.java b/render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTableRowRenderHandlerTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTableRowRenderHandlerTest.java
rename to render-pdf/src/test/java/com/demcha/compose/engine/render/pdf/ecs/handlers/PdfTableRowRenderHandlerTest.java
diff --git a/src/test/java/com/demcha/compose/testsupport/EngineComposerHarness.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/EngineComposerHarness.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/EngineComposerHarness.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/EngineComposerHarness.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/BarcodeBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/BarcodeBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/BarcodeBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/BarcodeBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/BarcodeBuilderTest.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/BarcodeBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/BarcodeBuilderTest.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/BarcodeBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/BlockTextBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/BlockTextBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/BlockTextBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/BlockTextBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/BlockTextBuilderTest.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/BlockTextBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/BlockTextBuilderTest.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/BlockTextBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/CircleBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/CircleBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/CircleBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/CircleBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/ComponentBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/ComponentBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/ComponentBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/ComponentBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/DisplayUrlTextBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/DisplayUrlTextBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/DisplayUrlTextBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/DisplayUrlTextBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/DividerBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/DividerBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/DividerBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/DividerBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/ElementBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/ElementBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/ElementBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/ElementBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/HContainerBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/HContainerBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/HContainerBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/HContainerBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/ImageBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/ImageBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/ImageBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/ImageBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/ImageBuilderTest.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/ImageBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/ImageBuilderTest.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/ImageBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/LineBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/LineBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/LineBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/LineBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/LineBuilderTest.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/LineBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/LineBuilderTest.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/LineBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/LinkBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/LinkBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/LinkBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/LinkBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/ModuleBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/ModuleBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/ModuleBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/ModuleBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/PageBreakBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/PageBreakBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/PageBreakBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/PageBreakBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/RectangleBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/RectangleBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/RectangleBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/RectangleBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/RowBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/RowBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/RowBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/RowBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilderTest.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilderTest.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/TextBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/TextBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/TextBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/TextBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/TextBuilderTest.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/TextBuilderTest.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/TextBuilderTest.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/TextBuilderTest.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/VContainerBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/VContainerBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/VContainerBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/VContainerBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/Box.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/Box.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/container/Box.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/Box.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/BuildEntity.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/BuildEntity.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/container/BuildEntity.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/BuildEntity.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/ContainerBuilder.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/ContainerBuilder.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/container/ContainerBuilder.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/ContainerBuilder.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EmptyBox.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EmptyBox.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EmptyBox.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EmptyBox.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EntityBuilderBase.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EntityBuilderBase.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EntityBuilderBase.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EntityBuilderBase.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EntityCreator.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EntityCreator.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EntityCreator.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/EntityCreator.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/Layout.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/Layout.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/container/Layout.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/Layout.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/ShapeBuilderBase.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/ShapeBuilderBase.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/container/ShapeBuilderBase.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/ShapeBuilderBase.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/StackAxis.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/StackAxis.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/container/StackAxis.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/StackAxis.java
diff --git a/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/package-info.java b/render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/package-info.java
similarity index 100%
rename from src/test/java/com/demcha/compose/testsupport/engine/assembly/container/package-info.java
rename to render-pdf/src/test/java/com/demcha/compose/testsupport/engine/assembly/container/package-info.java
diff --git a/render-pptx/pom.xml b/render-pptx/pom.xml
index f181b8d83..7c0d5af1c 100644
--- a/render-pptx/pom.xml
+++ b/render-pptx/pom.xml
@@ -82,6 +82,14 @@
+
+
+ io.github.demchaav
+ graph-compose-render-pdf
+ ${project.version}
+ test
+
org.junit.jupiter
junit-jupiter
diff --git a/scripts/cut-release.ps1 b/scripts/cut-release.ps1
index cbab1b0a0..a76154ad3 100644
--- a/scripts/cut-release.ps1
+++ b/scripts/cut-release.ps1
@@ -304,7 +304,7 @@ function Run-ShowcaseSync {
$execProp = '"-Dexec.mainClass=com.demcha.examples.support.ShowcaseSync"'
# The examples module depends on these bumped SNAPSHOT siblings (not on
# Central); each must be installed before exec:java can resolve them.
- $exampleSnapshotSiblings = @('wrapper/pom.xml', 'render-docx/pom.xml', 'testing/pom.xml')
+ $exampleSnapshotSiblings = @('render-pdf/pom.xml', 'wrapper/pom.xml', 'render-docx/pom.xml', 'testing/pom.xml')
if ($DryRun) {
Write-Host " [DRY RUN] $mvnw -B -ntp -DskipTests install -pl ." -ForegroundColor Yellow
foreach ($modulePom in $exampleSnapshotSiblings) {
@@ -496,9 +496,10 @@ try {
Update-PomVersion (Join-Path $repoRoot 'aggregator/pom.xml') $Version
Update-PomVersion (Join-Path $repoRoot 'examples/pom.xml') $Version
Update-PomVersion (Join-Path $repoRoot 'benchmarks/pom.xml') $Version
- # render-docx / render-pptx track the engine line (lockstep): each
- # bumps here and its graph-compose-core dep is ${project.version} (follows
- # automatically).
+ # render-pdf / render-docx / render-pptx track the engine line (lockstep): each
+ # bumps here and its graph-compose-core dep is ${project.version}
+ # (follows automatically).
+ Update-PomVersion (Join-Path $repoRoot 'render-pdf/pom.xml') $Version
Update-PomVersion (Join-Path $repoRoot 'render-docx/pom.xml') $Version
Update-PomVersion (Join-Path $repoRoot 'render-pptx/pom.xml') $Version
# graph-compose-testing tracks the engine line (lockstep): its
@@ -577,6 +578,7 @@ try {
'pom.xml',
'aggregator/pom.xml',
'bundle/pom.xml',
+ 'render-pdf/pom.xml',
'render-docx/pom.xml',
'render-pptx/pom.xml',
'testing/pom.xml',
diff --git a/src/main/java/com/demcha/compose/GraphCompose.java b/src/main/java/com/demcha/compose/GraphCompose.java
index d27bce5b1..ce617e477 100644
--- a/src/main/java/com/demcha/compose/GraphCompose.java
+++ b/src/main/java/com/demcha/compose/GraphCompose.java
@@ -2,7 +2,7 @@
import com.demcha.compose.font.FontFamilyDefinition;
import com.demcha.compose.font.FontName;
-import com.demcha.compose.document.backend.fixed.pdf.FontShowcase;
+import com.demcha.compose.document.showcase.FontShowcase;
import com.demcha.compose.font.DefaultFonts;
import com.demcha.compose.document.api.DocumentPageSize;
import com.demcha.compose.document.api.DocumentSession;
@@ -134,16 +134,26 @@ public static List availableFonts() {
* Renders a PDF showcase of all bundled font families to disk.
*
* This is primarily a discovery helper for developers choosing a family for
- * {@code TextStyle}, templates, or themes.
+ * {@code TextStyle}, templates, or themes. Because it renders a PDF, a render
+ * backend must be on the classpath (the {@code graph-compose-render-pdf}
+ * artifact, brought transitively by {@code graph-compose}); on a bare
+ * {@code graph-compose-core} classpath it throws {@code MissingBackendException}.
+ *
+ * @param outputFile the file to write the preview PDF to
+ * @throws Exception if rendering fails, or {@code MissingBackendException} if no
+ * render backend is on the classpath
*/
public static void renderAvailableFontsPreview(Path outputFile) throws Exception {
FontShowcase.renderAvailableFontsPreview(outputFile);
}
/**
- * Renders a PDF showcase of all bundled font families in memory.
+ * Renders a PDF showcase of all bundled font families in memory. Requires a
+ * render backend on the classpath (see {@link #renderAvailableFontsPreview(Path)}).
*
* @return the generated preview document as PDF bytes
+ * @throws Exception if rendering fails, or {@code MissingBackendException} if no
+ * render backend is on the classpath
*/
public static byte[] renderAvailableFontsPreview() throws Exception {
return FontShowcase.renderAvailableFontsPreview();
diff --git a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcase.java b/src/main/java/com/demcha/compose/document/showcase/FontShowcase.java
similarity index 99%
rename from src/main/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcase.java
rename to src/main/java/com/demcha/compose/document/showcase/FontShowcase.java
index 8164ad9ad..fb8107916 100644
--- a/src/main/java/com/demcha/compose/document/backend/fixed/pdf/FontShowcase.java
+++ b/src/main/java/com/demcha/compose/document/showcase/FontShowcase.java
@@ -1,4 +1,4 @@
-package com.demcha.compose.document.backend.fixed.pdf;
+package com.demcha.compose.document.showcase;
import com.demcha.compose.GraphCompose;
import com.demcha.compose.document.api.DocumentPageSize;
diff --git a/src/main/java/com/demcha/compose/document/showcase/package-info.java b/src/main/java/com/demcha/compose/document/showcase/package-info.java
new file mode 100644
index 000000000..609c89b9a
--- /dev/null
+++ b/src/main/java/com/demcha/compose/document/showcase/package-info.java
@@ -0,0 +1,8 @@
+/**
+ * Document-building discovery helpers. {@link com.demcha.compose.document.showcase.FontShowcase}
+ * renders a preview of the bundled font families by authoring a document through
+ * the canonical DSL, so it lives in the document layer (it needs a render backend
+ * to produce output) rather than the backend-neutral {@code com.demcha.compose.font}
+ * catalog. Reached through {@code GraphCompose.renderAvailableFontsPreview(...)}.
+ */
+package com.demcha.compose.document.showcase;
diff --git a/src/test/java/com/demcha/compose/document/api/MissingBackendContractTest.java b/src/test/java/com/demcha/compose/document/api/MissingBackendContractTest.java
new file mode 100644
index 000000000..824ed30e1
--- /dev/null
+++ b/src/test/java/com/demcha/compose/document/api/MissingBackendContractTest.java
@@ -0,0 +1,34 @@
+package com.demcha.compose.document.api;
+
+import com.demcha.compose.GraphCompose;
+import com.demcha.compose.document.exceptions.MissingBackendException;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+/**
+ * The lean {@code graph-compose-core} carries no render backend. Any operation that
+ * needs one — measuring text to lay out, rendering, or rasterizing a document — must
+ * fail with a {@link MissingBackendException} that names the artifact to add
+ * ({@code graph-compose-render-pdf}). This is the defining contract of the lean core.
+ *
+ * The test lives in core's own backend-free test scope on purpose: a
+ * backend on the classpath (as in the qa module) would resolve the provider and hide
+ * a regression here.
+ */
+class MissingBackendContractTest {
+
+ @Test
+ void renderingWithoutABackendThrowsMissingBackendExceptionNamingRenderPdf() {
+ assertThatThrownBy(() -> {
+ try (DocumentSession session = GraphCompose.document()
+ .pageSize(200, 200)
+ .create()) {
+ session.pageFlow(page -> page.module("m", module -> module.paragraph("hi")));
+ session.toPdfBytes();
+ }
+ })
+ .isInstanceOf(MissingBackendException.class)
+ .hasMessageContaining("graph-compose-render-pdf");
+ }
+}
diff --git a/src/test/java/com/demcha/documentation/PdfBackendIsolationGuardTest.java b/src/test/java/com/demcha/documentation/PdfBackendIsolationGuardTest.java
index fca159fb5..8c89f1681 100644
--- a/src/test/java/com/demcha/documentation/PdfBackendIsolationGuardTest.java
+++ b/src/test/java/com/demcha/documentation/PdfBackendIsolationGuardTest.java
@@ -46,9 +46,10 @@ class PdfBackendIsolationGuardTest {
PROJECT_ROOT.resolve("src/main/java/com/demcha/compose/document/templates"),
PROJECT_ROOT.resolve("src/main/java/com/demcha/compose/document/backend/fixed"),
// The public font catalog names logical fonts; it never loads them.
- // PDFBox loading lives in the pdf backend factory, so compose.font
- // must stay PDFBox-free (FontShowcase, which renders a preview PDF,
- // lives under backend/fixed/pdf and is exempted like the rest of it).
+ // PDFBox loading lives in the graph-compose-render-pdf backend, so
+ // compose.font must stay PDFBox-free. (FontShowcase, which authors a
+ // preview document, is a document-layer helper under
+ // document.showcase, not part of the font catalog.)
PROJECT_ROOT.resolve("src/main/java/com/demcha/compose/font"));
@Test
@@ -65,10 +66,9 @@ void pdfboxShouldStayOutOfCanonicalAndNonPdfBackendContracts() throws IOExceptio
}
assertThat(violations)
- .describedAs("PDFBox dependencies must stay behind document.backend.fixed.pdf.* "
- + "or under engine.render.pdf.* (shared PDFBox primitives plus the legacy "
- + "ECS renderer in engine.render.pdf.ecs.*). Canonical API and layout contracts "
- + "should use document-level value objects such as DocumentPageSize.")
+ .describedAs("PDFBox now lives entirely in the graph-compose-render-pdf module; the "
+ + "core must stay PDFBox-free. Canonical API and layout contracts should use "
+ + "document-level value objects such as DocumentPageSize, not PDFBox types.")
.isEmpty();
}
diff --git a/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java b/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java
index 6ae30db87..8c6e6908e 100644
--- a/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java
+++ b/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java
@@ -67,6 +67,9 @@ void everyModuleResolvesToTheRootProjectVersion() throws Exception {
assertThat(effectiveVersion(PROJECT_ROOT.resolve("render-pptx/pom.xml")))
.describedAs("render-pptx (graph-compose-render-pptx) tracks the engine line and must equal the root version (%s)", root)
.isEqualTo(root);
+ assertThat(effectiveVersion(PROJECT_ROOT.resolve("render-pdf/pom.xml")))
+ .describedAs("render-pdf (graph-compose-render-pdf) tracks the engine line and must equal the root version (%s)", root)
+ .isEqualTo(root);
assertThat(effectiveVersion(PROJECT_ROOT.resolve("testing/pom.xml")))
.describedAs("testing (graph-compose-testing) tracks the engine line and must equal the root version (%s)", root)
.isEqualTo(root);
diff --git a/wrapper/pom.xml b/wrapper/pom.xml
index 4002d888d..efb825510 100644
--- a/wrapper/pom.xml
+++ b/wrapper/pom.xml
@@ -72,13 +72,19 @@
-
+
io.github.demchaav
graph-compose-core
${project.version}
+
+ io.github.demchaav
+ graph-compose-render-pdf
+ ${project.version}
+
From a62b333e2b232e60068b7cc55a101e345848042a Mon Sep 17 00:00:00 2001
From: DemchaAV
Date: Sun, 5 Jul 2026 23:25:13 +0100
Subject: [PATCH 2/2] ci: install graph-compose-render-pdf before the
benchmarks build
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The benchmarks module now depends on graph-compose-render-pdf (it calls buildPdf
and references the backend types), so the two benchmark CI jobs must install it
into the local repo after the core, or dependency resolution fails before compile —
the same pattern as the fonts/emoji/core install steps already there.
---
.github/workflows/ci.yml | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 2b8f22c59..a557201a3 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -232,6 +232,12 @@ jobs:
- name: Install root artifact
run: ./mvnw -B -ntp -DskipTests install -pl .
+ - name: Install graph-compose-render-pdf (consumed by the benchmarks module)
+ # benchmarks call buildPdf and reference the PDF backend types directly, so
+ # it depends on render-pdf; install it after the core, before the benchmarks
+ # build resolves it.
+ run: ./mvnw -B -ntp -f render-pdf/pom.xml -DskipTests install
+
- name: Compile benchmarks module
run: ./mvnw -B -ntp -f benchmarks/pom.xml clean compile
@@ -300,6 +306,12 @@ jobs:
- name: Install root artifact
run: ./mvnw -B -ntp -DskipTests install -pl .
+ - name: Install graph-compose-render-pdf (consumed by the benchmarks module)
+ # benchmarks call buildPdf and reference the PDF backend types directly, so
+ # it depends on render-pdf; install it after the core, before the benchmarks
+ # build resolves it.
+ run: ./mvnw -B -ntp -f render-pdf/pom.xml -DskipTests install
+
- name: Compile benchmarks module
run: ./mvnw -B -ntp -f benchmarks/pom.xml clean compile