diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ea15043..255b3ca2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -144,6 +144,24 @@ Open cycle — bug-fix / housekeeping. Entries land here as they merge. until the baseline advances past this release. No canonical API or behaviour change. +- **The legacy ECS PDF render pipeline is deprecated.** Follow-up to the ECS + engine deprecation above. The `Entity`-based PDFBox renderer + (`PdfRenderingSystemECS` and its collaborators — `PdfRenderSession`, `PdfCanvas`, + `PdfStream`, `PdfImageCache`, `PdfFileManagerSystem`, `PdfGuidesRenderer`, the + render-marker handlers, and the `TableCellBox` / `PdfBookmarkBuilder` helpers) is + the renderer for the removed `GraphCompose.pdf(...)` surface and now runs only + under the legacy engine regression tests; canonical PDF output goes through + `com.demcha.compose.document.backend.fixed.pdf`. Because `engine.render.pdf` is a + *mixed* package — it also holds the canonical-shared `PdfFont`, + `GlyphFallbackLogger`, and the header/footer + watermark post-processors — the + legacy classes were physically moved into a new `engine.render.pdf.ecs` + (with `.handlers` / `.helpers` sub-packages), which is then `@Deprecated` at + package level (so no deprecation-warning cascade, same pattern as the ECS engine + packages). The four genuinely shared `engine.render.pdf` types are **not** + deprecated and stay put. No behaviour change. The relocated renderer has no + public entry point and carries no binary-compatibility promise, so the move is + excluded from the japicmp gate rather than treated as a breaking removal. + ### Tests / tooling - **Benchmark regression gate and measurement probe (benchmarks module, not part diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a56d4855..3aef92a9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -168,10 +168,11 @@ not need any of them. - Engine render markers implement backend-neutral `Render`. Do not add backend-specific render interfaces back into `engine/components`. -- PDF rendering logic lives in - `src/main/java/com/demcha/compose/engine/render/pdf/handlers/`. +- PDF rendering logic for the legacy ECS renderer (deprecated; canonical PDF + output goes through `com.demcha.compose.document.backend.fixed.pdf`) lives in + `src/main/java/com/demcha/compose/engine/render/pdf/ecs/handlers/`. Backend-only helper objects live in - `com.demcha.compose.engine.render.pdf.helpers`, not in + `com.demcha.compose.engine.render.pdf.ecs.helpers`, not in `components/renderable`. - Builders and layout code get text width and line metrics from `TextMeasurementSystem`, not from @@ -208,7 +209,7 @@ The rules above are enforced by tests: [EnginePdfBoundaryTest.java](./src/test/java/com/demcha/compose/engine/architecture/EnginePdfBoundaryTest.java), [CanonicalTemplateComposerPdfBoundaryTest.java](./src/test/java/com/demcha/compose/document/templates/architecture/CanonicalTemplateComposerPdfBoundaryTest.java), [PdfRenderInterfaceGuardTest.java](./src/test/java/com/demcha/compose/engine/render/pdf/PdfRenderInterfaceGuardTest.java), - [PdfRenderingSystemECSDispatchTest.java](./src/test/java/com/demcha/compose/engine/render/pdf/PdfRenderingSystemECSDispatchTest.java) + [PdfRenderingSystemECSDispatchTest.java](./src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSDispatchTest.java) ## Adding a new feature @@ -325,7 +326,7 @@ Choose the smallest tests that match the change: - For low-level test harness changes: [ComponentBuilderTest.java](./src/test/java/com/demcha/compose/engine/components/ComponentBuilderTest.java) - For render-marker dispatch changes: - [PdfRenderingSystemECSDispatchTest.java](./src/test/java/com/demcha/compose/engine/render/pdf/PdfRenderingSystemECSDispatchTest.java) + [PdfRenderingSystemECSDispatchTest.java](./src/test/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECSDispatchTest.java) - For layout/positioning behavior: [ComputedPositionTest.java](./src/test/java/com/demcha/compose/engine/components/layout/ComputedPositionTest.java) - For pagination and multi-page behavior: diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md index 09aa9566..f6da7b89 100644 --- a/docs/architecture/overview.md +++ b/docs/architecture/overview.md @@ -231,8 +231,8 @@ code should not need any of them. into the active renderer - render marker components identify *what* needs to be rendered; *how* it is drawn lives in renderer-owned handler packages such as - `...render.pdf.handlers` (with helper objects under - `...render.pdf.helpers`) + `...render.pdf.ecs.handlers` (with helper objects under + `...render.pdf.ecs.helpers`) - `RenderStream` acts as a session factory, not as a per-entity content-stream opener - `RenderPassSession` is the shared seam for page lifetime and diff --git a/docs/architecture/package-map.md b/docs/architecture/package-map.md index 4cb497a0..fcf77042 100644 --- a/docs/architecture/package-map.md +++ b/docs/architecture/package-map.md @@ -49,7 +49,8 @@ intended. | `com.demcha.compose.engine.pagination` | Page-breaking helpers and pagination fallback systems. | Maintain child-first ordering and page-shift propagation rules. | | `com.demcha.compose.engine.measurement` | Text measurement contracts and font-backed implementations. | Builders/layout helpers depend on this seam instead of reaching into renderers. | | `com.demcha.compose.engine.render` | Backend-neutral render contracts, handler registry, render ordering, and render-pass session lifetime. | Add backend-neutral contracts here, backend-specific drawing elsewhere. | -| `com.demcha.compose.engine.render.pdf` | Low-level PDF backend internals for ECS rendering. | PDFBox state stays here and in child handler/helper packages. | +| `com.demcha.compose.engine.render.pdf` | Shared PDFBox primitives for the canonical fixed-layout backend: `PdfFont`, `GlyphFallbackLogger`, and the header/footer + watermark renderers under `helpers`. | Add canonical-shared PDF support here; the legacy ECS renderer lives in the deprecated `ecs` sub-package. | +| `com.demcha.compose.engine.render.pdf.ecs` | **Deprecated.** Legacy `Entity`-based ECS PDF renderer (`PdfRenderingSystemECS` and collaborators, plus the `ecs.handlers` / `ecs.helpers` sub-packages). | Dead renderer kept only for legacy regression tests; do not extend or optimize. | | `com.demcha.compose.engine.render.word` | Experimental Word backend internals. | Treat as research until a supported public surface is designed. | | `com.demcha.compose.engine.text` | Internal text hot-path utilities shared by layout and render stages. | Keep helpers backend-neutral and avoid public authoring concepts here. | | `com.demcha.compose.engine.text.markdown` | Markdown token parsing used by text preparation. | Keep output backend-neutral. | diff --git a/docs/contributing/implementation-guide.md b/docs/contributing/implementation-guide.md index 340ef547..d76b946d 100644 --- a/docs/contributing/implementation-guide.md +++ b/docs/contributing/implementation-guide.md @@ -259,7 +259,7 @@ Relevant files: - [TableBuilder.java](./../src/test/java/com/demcha/compose/testsupport/engine/assembly/TableBuilder.java) - [TableRow.java](./../src/main/java/com/demcha/compose/engine/components/renderable/TableRow.java) -- [TableCellBox.java](./../src/main/java/com/demcha/compose/engine/render/pdf/helpers/TableCellBox.java) +- [TableCellBox.java](./../src/main/java/com/demcha/compose/engine/render/pdf/ecs/helpers/TableCellBox.java) - [TableResolvedCell.java](./../src/main/java/com/demcha/compose/engine/components/content/table/TableResolvedCell.java) Rule of thumb: @@ -321,21 +321,29 @@ Preferred extension pattern for new backends: 4. keep backend-only helper drawing in renderer-owned helper packages when the code is not an entity render marker 5. keep renderer ordering policy in the rendering layer rather than in pagination utilities +> **Deprecated reference implementation.** The PDF renderer named below +> (`PdfRenderingSystemECS` and the `engine.render.pdf.ecs` handlers/helpers) is the +> legacy `Entity`-based ECS renderer, kept only for regression tests; canonical PDF +> output is produced by `com.demcha.compose.document.backend.fixed.pdf`. The +> backend-neutral `engine.render` *contracts* (`Render`, `RenderPassSession`, +> `RenderStream`, `EntityRenderOrder`) are **not** deprecated — only the ECS PDF +> implementation is. Do not extend the `ecs` renderer. + Important files: - [Render.java](./../src/main/java/com/demcha/compose/engine/render/Render.java) - [RenderPassSession.java](./../src/main/java/com/demcha/compose/engine/render/RenderPassSession.java) - [RenderStream.java](./../src/main/java/com/demcha/compose/engine/render/RenderStream.java) -- [PdfRenderingSystemECS.java](./../src/main/java/com/demcha/compose/engine/render/pdf/PdfRenderingSystemECS.java) -- [PdfRenderSession.java](./../src/main/java/com/demcha/compose/engine/render/pdf/PdfRenderSession.java) +- [PdfRenderingSystemECS.java](./../src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderingSystemECS.java) +- [PdfRenderSession.java](./../src/main/java/com/demcha/compose/engine/render/pdf/ecs/PdfRenderSession.java) - [EntityRenderOrder.java](./../src/main/java/com/demcha/compose/engine/render/EntityRenderOrder.java) Migration rule for new engine components: - implement backend-neutral `Render`, not backend-specific render interfaces -- move PDF drawing into `...render.pdf.handlers` +- move PDF drawing into `...render.pdf.ecs.handlers` - use `TextMeasurementSystem` for text width and line metrics instead of reaching through `LayoutSystem` -- place PDF-only helper objects in `...render.pdf.helpers` +- place PDF-only helper objects in `...render.pdf.ecs.helpers` - keep page-surface lifetime in a backend-specific `RenderPassSession`, not in engine builders or render markers - keep resolved draw ordering in renderer-owned or renderer-neutral rendering helpers such as `EntityRenderOrder` - register a render handler for every engine render marker because the PDF entity path no longer supports a backend-specific render fallback diff --git a/pom.xml b/pom.xml index 13edfa87..a0fbfc0e 100644 --- a/pom.xml +++ b/pom.xml @@ -692,6 +692,29 @@ --> com.demcha.compose.document.layout.payloads + + com.demcha.compose.engine.render.pdf.ecs + com.demcha.compose.engine.render.pdf.ecs.handlers + com.demcha.compose.engine.render.pdf.ecs.helpers + com.demcha.compose.engine.render.pdf.handlers + com.demcha.compose.engine.render.pdf.PdfRenderingSystemECS + com.demcha.compose.engine.render.pdf.PdfCanvas + com.demcha.compose.engine.render.pdf.PdfStream + com.demcha.compose.engine.render.pdf.PdfFileManagerSystem + com.demcha.compose.engine.render.pdf.PdfGuidesRenderer + com.demcha.compose.engine.render.pdf.helpers.TableCellBox + com.demcha.compose.engine.render.pdf.helpers.PdfBookmarkBuilder