mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-03 06:30:00 -06:00
PDF.R1: integrate shared reader with bounded nesting checks
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Architecture
|
||||
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (shared PDF writer; app output policy and existing reader retained; verified PngSuite downloads, #1729; synthetic control-input budgets, #1709; desktop printing uses craft-print; Windows 7 fallback retained) · **Target:** Adobe Illustrator 2026 (30.x)
|
||||
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-13 · **Change:** minor (shared PDF reader and writer; app output policy and editable-import adapter retained; verified PngSuite downloads, #1729; synthetic control-input budgets, #1709; desktop printing uses craft-print; Windows 7 fallback retained) · **Target:** Adobe Illustrator 2026 (30.x)
|
||||
|
||||
How VectorCraft is built today. The design rationale lives in the local, gitignored `plan/architecture.md`;
|
||||
this file describes what is committed. Day-to-day rules (clean-room, never crash, quality gates) are in
|
||||
@@ -61,9 +61,11 @@ its target excludes the shared backend because Windows.Data.Pdf is unavailable t
|
||||
|
||||
PDF writing uses the optional `craft-pdf` writer at an immutable craft-libs revision. Shared
|
||||
configuration, metadata, font preparation and guarded serialization leave drawing, colour
|
||||
policy, layers, editing data and print composition in this app. The reader keeps its existing
|
||||
Hayro dependencies. `cargo xtask pdf-deps` verifies the shared writer and patched Krilla source;
|
||||
see [pdf-backend.md](pdf-backend.md).
|
||||
policy, layers, editing data and print composition in this app. `cargo xtask pdf-deps` verifies
|
||||
the shared facade and patched Krilla and Hayro sources at the same revision.
|
||||
The reader facade opens the PDF with per-document decode limits; the app scans layer and
|
||||
overprint content in windows and rejects known incomplete content before returning a document.
|
||||
See [pdf-backend.md](pdf-backend.md).
|
||||
|
||||
## Agent control
|
||||
|
||||
@@ -90,6 +92,7 @@ saves copies in the background. See [development.md](development.md#robustness-v
|
||||
|---|---|---|
|
||||
| 2026-10-13 | minor | Pinned PngSuite HTTPS files verified by SHA-256 before publication; bounded downloads replace archive extraction (#1729). Scores and hours unchanged. |
|
||||
| 2026-10-13 | minor | Bounded synthetic control input (#1709): counts and queued events validated before mutation; control-channel bursts yield between frames. Scores and hours unchanged. |
|
||||
| 2026-10-13 | minor | PDF.R1: editable PDF import uses the shared pinned reader; layer and overprint scans preserve state across content windows and reject known incomplete input. Synthetic streaming, decoder-limit and dependency-source regressions added; scores and hours unchanged. |
|
||||
| 2026-10-13 | minor | PDF writer setup and guarded finalization use craft-pdf; drawing and output policy remain app-owned. |
|
||||
| 2026-10-12 | minor | Desktop PDF spooler shared through craft-print; exact physical sizes, composed copies and Windows 7 fallback retained. Scores and remaining gaps unchanged. |
|
||||
| 2026-10-10 | minor | Added the `three-d` crate |
|
||||
|
||||
File diff suppressed because one or more lines are too long
+46
-4
@@ -1,13 +1,13 @@
|
||||
# PDF writer backend
|
||||
# PDF backend
|
||||
|
||||
PDF writing uses `craft-pdf` from `storytold/craft-libs`, pinned to
|
||||
`c3487320b2d1de657b860b3c8abb44e1f2b32bd8`. Its `write` feature supplies Krilla configuration,
|
||||
`89dcbb3060377a26c99a6d80caa16084366704c4`. Its `write` feature supplies Krilla configuration,
|
||||
metadata construction, fallible font preparation and serialization, and native unwind guards.
|
||||
The dependency disables default features and enables only `write`.
|
||||
The dependency disables default features and enables `write` and `interpret`.
|
||||
|
||||
VectorCraft owns document traversal, drawing, font selection and embedding policy, colour
|
||||
conversion, presets, page boxes, layers, editing data, postprocessing and print composition.
|
||||
The existing Hayro reader dependencies and editable import adapters keep their current sources.
|
||||
Editable import keeps its VectorCraft adapter, layer routing, colour policy and text decisions.
|
||||
Desktop printer submission remains in `craft-print`.
|
||||
|
||||
The shared writer vendors Krilla 0.8.2 with an unwind-safe cleanup and poisoning patch.
|
||||
@@ -24,3 +24,45 @@ VectorCraft retains its finite-coordinate checks and the existing behavior that
|
||||
outside the writer's supported coordinate range. Font preparation checks the shared
|
||||
512 MiB per-font copy limit and variation coordinates before allocation; failure preserves
|
||||
VectorCraft's reported outline fallback. The writer is not a peak-memory or runtime budget.
|
||||
|
||||
PDF reading uses the same shared revision's patched Hayro syntax 0.7.2, interpreter 0.7.0
|
||||
and JBIG2 0.3.0. The application explicitly preserves its existing accepted file sizes with
|
||||
`OpenOptions { max_input_bytes: usize::MAX, ..Default::default() }`; this migration adds no
|
||||
new file-size ceiling. Ordinary decoded streams use the shared backend's immutable
|
||||
per-document limits. Those limits are separate from streaming page-content budgets and
|
||||
do not bound aggregate document or process memory. Password classification and the
|
||||
existing permissions-password fallback remain application policy.
|
||||
|
||||
The layer and overprint pre-scan consumes `ContentReader` windows through `TypedIter`,
|
||||
retaining graphics and marked-content state between windows. It does not collect a whole
|
||||
page before scanning. Reaching the scan's operator, nesting or instruction-window limit,
|
||||
a reported failed/truncated stream, a cap-reaching filtered form, or an undecidable final
|
||||
operand tail returns an import error and discards the partial document. Previously the
|
||||
operator limit could return a partial layer routing with a warning. Interpreter completion
|
||||
warnings also become errors before a document is returned. Whitespace and comments at
|
||||
EOF remain valid. The typed iterator does not classify every malformed operator, so this
|
||||
is known-incomplete rejection rather than a general PDF validity certificate.
|
||||
|
||||
The three patched Hayro crates and Krilla are selected in the root `[patch.crates-io]`
|
||||
from the same immutable revision as `craft-pdf`. `cargo xtask pdf-deps` rejects missing,
|
||||
duplicate, local-path, registry and mismatched revisions for those five packages.
|
||||
`craft-print` and `craft-ui` keep their existing independent revisions.
|
||||
|
||||
Dependency asset hashes and sources are in `ASSETS.md`; redistributed license texts are
|
||||
in `licenses/pdf-backend`. Package staging carries those texts together with `NOTICE`
|
||||
and `ASSETS.md`. Fonts and profiles remain dependency data; this repository adds no font
|
||||
or profile binaries. Native page interpretation has a shared unwind guard; WASM aborts
|
||||
and process-wide allocation failures cannot be caught.
|
||||
|
||||
The app retains the raw PDF-object nesting guard and the imported document-depth cap.
|
||||
Before recursive operand parsing, decoded page content is checked through the same incremental
|
||||
reader used by layer scanning and interpretation. Its nesting check carries literal-string,
|
||||
comment, hexadecimal-string and dictionary-delimiter state across 64 KiB scratch windows;
|
||||
lowering the ordinary stream-materialization limit still produces the app's specific error for
|
||||
content nested more than 256 levels. The shared parser separately caps direct containers at
|
||||
128 levels: the low-limit regression previously returned an incomplete-content error, so it
|
||||
demonstrates restored preflight coverage and error classification, not a successful import or
|
||||
a crash bypass.
|
||||
Known decoder truncation remains an import error. The scratch bound does not cover whole-filter
|
||||
fallback decoding or aggregate parser/process memory. Synthetic regressions exercise lowered
|
||||
ordinary limits, split delimiters and lexical state across content boundaries.
|
||||
|
||||
+3
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user