Skip to content
Merged
Show file tree
Hide file tree
Changes from 141 commits
Commits
Show all changes
155 commits
Select commit Hold shift + click to select a range
01acd4c
feat(rendering): re-add OutputIntent + rendering intent + default-CS …
RayVR Jun 5, 2026
dc190ae
feat(rendering): wire OutputIntent + rendering intent + default-CS in…
RayVR Jun 5, 2026
a4bad8e
feat(rendering): wire matching colour-policy borrows at separation re…
RayVR Jun 5, 2026
130f2af
test(rendering): pin OutputIntent CMYK paint renders via ICC (failing)
RayVR Jun 5, 2026
ba8a6bd
feat(rendering): route DeviceCMYK conversion through OutputIntent ICC…
RayVR Jun 5, 2026
da4469c
test(rendering): pin §10.3.5 additive-clamp fallback when no OutputIn…
RayVR Jun 5, 2026
d179d33
style(rendering): rustfmt sweep over OutputIntent threading change set
RayVR Jun 5, 2026
31f7cf8
test(rendering): unit-pin the OutputIntent-aware CMYK→RGB helper
RayVR Jun 5, 2026
bd524d1
test(rendering): pin §10.3.5 cross-helper consistency and TDD-discipl…
RayVR Jun 5, 2026
92af02e
test(rendering): byte-exact qcms-reference pin replaces ±10 tolerance…
RayVR Jun 5, 2026
25e4e0a
test(rendering): probe OutputIntent profile-validation fragility
RayVR Jun 5, 2026
c2e531a
test(rendering): foundation coverage probes for q/Q, alpha edges, and…
RayVR Jun 5, 2026
58795e0
test(rendering): pin embedded /ICCBased N=4 takes precedence over doc…
RayVR Jun 5, 2026
b45e249
feat(rendering): route /ICCBased N=4 paint through the embedded profi…
RayVR Jun 5, 2026
720f56c
test(rendering): pin Separation/DeviceN Type-4 alt-DeviceCMYK composi…
RayVR Jun 5, 2026
13d752a
style(rendering): rustfmt sweep over the new OutputIntent ICCBased / …
RayVR Jun 5, 2026
5a25505
test(rendering): QA round-2 edge probes for /ICCBased N=4 precedence …
RayVR Jun 5, 2026
55183d4
test(rendering): pin embedded /ICCBased N=4 must route CMYK to plates…
RayVR Jun 5, 2026
55fbda6
feat(rendering): dual-payload IccCmyk variant routes ICC RGB to compo…
RayVR Jun 5, 2026
97623c6
test(rendering): pin qcms accepts ICC v4 CMYK profile headers byte-fo…
RayVR Jun 5, 2026
ced65be
feat(rendering): per-page CMYK transform cache amortises qcms constru…
RayVR Jun 5, 2026
3154588
test(rendering): pin qcms 0.3.0 intent-invariance + spec defaulting rule
RayVR Jun 5, 2026
a92eea0
docs(cargo): correct test-support feature comment to reflect actual API
RayVR Jun 5, 2026
c1873cf
test(rendering): pin §8.6.5.6 /Default[Gray|RGB|CMYK] precedence (fai…
RayVR Jun 5, 2026
12034ec
feat(rendering): route bare device-family paint through /Default* ove…
RayVR Jun 5, 2026
02ab688
test(rendering): HONEST_GAP probe for qcms 0.3.0 BPC absence
RayVR Jun 5, 2026
63e30a5
test(rendering): pin OutputIntent shifts vendor-green build away from…
RayVR Jun 5, 2026
209a13f
test(rendering): pin /DefaultRGB N=3 ICC override must amortise trans…
RayVR Jun 5, 2026
f05653e
feat(rendering): route /ICCBased N=3 through per-page transform cache
RayVR Jun 5, 2026
4f67fe0
test(rendering): tighten /DefaultGray G assertion from ±10 tolerance …
RayVR Jun 5, 2026
14e5517
test(rendering): pin /DefaultGray [/ICCBased N=1] must route bare /De…
RayVR Jun 5, 2026
fa257a5
feat(rendering): route /ICCBased N=1 Gray through qcms via the per-pa…
RayVR Jun 5, 2026
992b464
test(rendering): pin malformed /DefaultCMYK <string> must fall throug…
RayVR Jun 5, 2026
2d53c7d
feat(rendering): malformed /Default<Family> entries fall through to O…
RayVR Jun 5, 2026
88a2fed
style(rendering): rustfmt over the round-4 fix change set
RayVR Jun 5, 2026
bd62dfd
test(rendering): pin /OutputIntents shape edge-case fall-throughs to …
RayVR Jun 5, 2026
546f397
refactor(rendering): rename CmykTransformCache to IccTransformCache
RayVR Jun 5, 2026
66dcb52
docs(changelog): add [Unreleased] entry for /OutputIntents CMYK ICC w…
RayVR Jun 5, 2026
2522f79
style(rendering): rustfmt over the IccTransformCache rename
RayVR Jun 5, 2026
f6cdd2e
docs(changelog): correct OutputIntent ICC transform direction in desc…
RayVR Jun 6, 2026
ccf294f
test(rendering): pin §11.3.4 /CA + /ca ExtGState alpha against pixel …
RayVR Jun 6, 2026
b629201
test(rendering): pin §11.4.7 image-attached SMask alpha against diago…
RayVR Jun 6, 2026
36ac117
test(rendering): pin §11.4.7 Form-XObject SMask gaps (alpha, luminosi…
RayVR Jun 6, 2026
6b3a046
test(rendering): pin §11.4.5 transparency group isolated, knockout, a…
RayVR Jun 6, 2026
a4a42c3
test(rendering): pin §11.3.5.2 separable blend modes against per-mode…
RayVR Jun 6, 2026
d1eca45
test(rendering): pin §11.3.5.3 non-separable blend modes against HSL/…
RayVR Jun 6, 2026
c07d381
test(rendering): pin §11.7.4 overprint dispatch gap on composite path
RayVR Jun 6, 2026
02a71a8
test(rendering): pin §11.4 + Annex G transparency-then-OutputIntent p…
RayVR Jun 6, 2026
d525762
test(rendering): un-ignore §11.4.6.2 knockout group composition probe
RayVR Jun 6, 2026
1c0b24a
feat(rendering): honour transparency group /K knockout flag
RayVR Jun 6, 2026
bc5f624
test(rendering): un-ignore §11.3.5.3 Luminosity blend probe
RayVR Jun 6, 2026
355588d
feat(rendering): implement §11.3.5.3 non-separable blend modes in HSL…
RayVR Jun 6, 2026
b6d1ea3
test(rendering): un-ignore §11.4.7 SMask Form Alpha probe
RayVR Jun 6, 2026
868bc9f
feat(rendering): honour ExtGState /SMask Form-XObject soft masks
RayVR Jun 6, 2026
7c93df8
test(rendering): un-ignore §11.7.4 composite overprint probe
RayVR Jun 6, 2026
4f23abf
feat(rendering): apply §11.7.4 overprint correction on composite path
RayVR Jun 6, 2026
147d6fe
style(rendering): rustfmt + clippy doc-list-indent over transparency …
RayVR Jun 6, 2026
273e4e2
feat(rendering): apply SMask + overprint correction to Stroke operator
RayVR Jun 6, 2026
1b4fbdb
style(rendering): rustfmt over stroke SMask + overprint wiring
RayVR Jun 6, 2026
d7d82c9
test(rendering): pin QA round-2 findings (10 paint-arm coverage probe…
RayVR Jun 6, 2026
dacfa91
test(rendering): un-ignore non-linear ICC compose-before-convert probe
RayVR Jun 6, 2026
57a2f8f
feat(rendering): composite CMYK paint in source space when transparen…
RayVR Jun 6, 2026
fb9b7ee
test(rendering): un-ignore SMask + overprint probes for fill/stroke c…
RayVR Jun 6, 2026
0b8d5fb
feat(rendering): apply SMask + overprint + compose-first on fill/stro…
RayVR Jun 6, 2026
7275cd9
test(rendering): un-ignore SMask + overprint probes for fill EvenOdd …
RayVR Jun 6, 2026
c133b97
feat(rendering): apply SMask + overprint + compose-first on EvenOdd f…
RayVR Jun 6, 2026
a992c14
test(rendering): probe SMask coverage on shading and Form XObject Do …
RayVR Jun 6, 2026
1c1850c
feat(rendering): apply SMask + overprint + compose-first on shading, …
RayVR Jun 6, 2026
c960962
style(rendering): rustfmt over transparency paint-arm wiring
RayVR Jun 6, 2026
6bb7d42
test(rendering): replace compose-first tolerance with byte-exact refe…
RayVR Jun 6, 2026
85f2af9
test(rendering): pin compose-first bounded loss under ICC backdrop as…
RayVR Jun 6, 2026
581ef6e
test(rendering): add Type 1 font fixture for text-arm probes
RayVR Jun 6, 2026
c605005
test(rendering): probe text-arm SMask wiring
RayVR Jun 6, 2026
3418533
test(rendering): probe text-arm overprint wiring
RayVR Jun 6, 2026
c0836b7
test(rendering): probe SMask cache invalidation under nested Form XOb…
RayVR Jun 6, 2026
b934b71
test(rendering): probe SMask scope through clip stack mutations
RayVR Jun 6, 2026
53df5a9
test(rendering): probe SMask defensive handling of malformed soft-mas…
RayVR Jun 6, 2026
396c18e
test(rendering): probe SMask + knockout interaction
RayVR Jun 6, 2026
359ad05
style(rendering): rustfmt over transparency QA probes
RayVR Jun 6, 2026
cfafbb6
test(rendering): probe cyclic /SMask /G recursion (stack overflow at …
RayVR Jun 6, 2026
e63d8d4
feat(rendering): cap SMask materialisation at MAX_SMASK_DEPTH=32
RayVR Jun 6, 2026
5b2aa43
test(rendering): pin cyclic /SMask /G cap-boundary centre pixel byte-…
RayVR Jun 6, 2026
81b6118
test(rendering): tighten SMask paint-arm probes to byte-exact (255, 1…
RayVR Jun 6, 2026
05078ae
test(rendering): tighten audit SMask + /CA probes to byte-exact refer…
RayVR Jun 6, 2026
4077f05
test(rendering): tighten audit blend / group / composite probes to by…
RayVR Jun 6, 2026
2438b5c
test(rendering): demand press-accurate composite overprint + compose-…
RayVR Jun 6, 2026
0323de9
feat(rendering): keep CMYK plates resident through composite render
RayVR Jun 6, 2026
1fee5e2
style(rendering): rustfmt over round-4 transparency changes
RayVR Jun 6, 2026
e45b042
style(rendering): clippy cleanup over sidecar helpers (question_mark …
RayVR Jun 6, 2026
ff458ff
test(rendering): QA probes for CMYK-sidecar architectural deviation
RayVR Jun 6, 2026
d10b2de
feat(rendering): allocate spot-ink sidecar lanes alongside CMYK plane
RayVR Jun 6, 2026
3a6da0f
test(rendering): QA probes for round-1 spot sidecar pinning #46 bugs
RayVR Jun 6, 2026
6984bfa
fix(document): exclude /Process colorants from /DeviceN spot set
RayVR Jun 6, 2026
6986f51
fix(rendering): honour /BM array form when detecting transparency
RayVR Jun 6, 2026
e9355f4
fix(rendering): surface spot-ink discovery error via log warning
RayVR Jun 6, 2026
14202b1
docs(rendering): resolve broken intra-doc links in sidecar module
RayVR Jun 6, 2026
f5bdb9b
feat(rendering): wire spot lane writes from Separation/DeviceN paint ops
RayVR Jun 6, 2026
cee63a4
test(rendering): QA probes for round-2 spot paint write pinning #46 bugs
RayVR Jun 6, 2026
a994fcb
fix(rendering): SMask attenuates spot lanes, cs resets initial colour…
RayVR Jun 6, 2026
a01a855
feat(rendering): expose per-plate decomposition on the CMYK sidecar
RayVR Jun 6, 2026
69498b0
fix(rendering): reset sidecar lanes between knockout group element re…
RayVR Jun 6, 2026
29379f8
feat(rendering): route transparency-bearing pages through composite-t…
RayVR Jun 6, 2026
ad38e2a
test(rendering): probes for composite-then-decompose separation rende…
RayVR Jun 6, 2026
a6bb0e2
test(rendering): round-3 QA probes for separation composite-then-deco…
RayVR Jun 6, 2026
407393f
fix(rendering): skip post-Do sidecar mirror for Form XObjects
RayVR Jun 6, 2026
7862015
test(rendering): pin Do-dispatcher mechanism behind nested-form spot …
RayVR Jun 6, 2026
8bc1b7a
fix(rendering): implement §11.7.4.3 CompatibleOverprint blend functio…
RayVR Jun 6, 2026
859eacc
test(rendering): byte-exact §11.7.4.3 overprint probes; remove round-…
RayVR Jun 6, 2026
804fd46
test(rendering): round-4 QA byte-exact probes for §11.7.4.3 overprint
RayVR Jun 6, 2026
c4f0083
fix(rendering): reconstruct DeviceN /Process source CMYK for overprint
RayVR Jun 6, 2026
1a510c6
fix(rendering): polish DeviceN /Process attribution under overprint
RayVR Jun 6, 2026
23fd64b
fix(rendering): walk Pattern colour space underlying for ink discovery
RayVR Jun 6, 2026
f3963f6
test(rendering): byte-exact probes for DeviceN /Process polish and Pa…
RayVR Jun 6, 2026
64b8517
test(rendering): round-5 QA byte-exact probes for DeviceN /Process po…
RayVR Jun 7, 2026
fe1e25f
fix(rendering): deref indirect ref when classifying Pattern underlyin…
RayVR Jun 7, 2026
e33475b
test(rendering): correct ImageMask /Decode default citation to §8.9.6.2
RayVR Jun 7, 2026
879ce18
feat(rendering): real coverage masks for text-show / Image Do / shadi…
RayVR Jun 7, 2026
58f8611
test(rendering): close text-show / Image Do / shading sh HONEST_GAPs …
RayVR Jun 7, 2026
91c4f17
test(rendering): round-6 QA probes — sh→f leak, multi-glyph TJ, OPM+c…
RayVR Jun 7, 2026
3bdf15d
fix(rendering): preserve invisible-text render mode in coverage scratch
RayVR Jun 7, 2026
22a4c26
style(rendering): collapse shading-arm if condition to one line per r…
RayVR Jun 7, 2026
03e8711
feat(color): add IccBackend trait + lcms2 backend behind icc-lcms2 fe…
RayVR Jun 8, 2026
7bdd91e
test(color): byte-exact ICC retargeting probes + Sync-safe lcms2 tran…
RayVR Jun 8, 2026
beb6d3d
test(render-output-intent): gate qcms-invariant probes to qcms-only path
RayVR Jun 8, 2026
2370597
test(46/round7): remove String::from_utf8_unchecked on binary ICC bytes
RayVR Jun 8, 2026
8697fc6
feat(color): thread rendering intent through ICC retargeting
RayVR Jun 8, 2026
dd3f4e7
test(color): byte-exact perceptual / saturation / default intent probes
RayVR Jun 8, 2026
167eb89
docs(test): cross-link round-5 HONEST_GAP narrative to round-7 closure
RayVR Jun 8, 2026
65f28e9
style(test): rustfmt the round-7 intent probes' assert_eq arg layout
RayVR Jun 8, 2026
dd112bf
test(transparency): drop stale HONEST_GAP labels for shipped features
RayVR Jun 8, 2026
2b1c16f
feat(rendering): convert RGB-source paints into the CMYK sidecar per …
RayVR Jun 8, 2026
6032953
feat(rendering): SMask /TR Type 0 sampled + Type 4 PostScript evaluation
RayVR Jun 8, 2026
7adc896
feat(rendering): SMask /BC backdrop for DeviceN with five or more col…
RayVR Jun 8, 2026
5720f7c
feat(rendering): SMask /TR Type 3 stitching dispatcher
RayVR Jun 8, 2026
fd9fb3f
test(transparency): adversarial probes for TR Type 0/3/4, BC malforme…
RayVR Jun 8, 2026
d7a871a
docs(test): cross-link round-7 ICC-profile-mismatch matrix to round-5…
RayVR Jun 8, 2026
b74ae93
docs(rendering): tighten §11.3.4 blend-space citations with §11.4.5.1
RayVR Jun 8, 2026
2f82cd0
feat(rendering): /BC n>=5 evaluates Type 0 / Type 3 tint transforms a…
RayVR Jun 8, 2026
cf405cb
test(transparency): byte-exact composite-overprint, non-degenerate Co…
RayVR Jun 8, 2026
77a8e79
Merge remote-tracking branch 'upstream/main' into feature/transparenc…
RayVR Jun 8, 2026
eba5eff
fix(docs): drop intra-doc links for cfg-gated backends
RayVR Jun 8, 2026
47209fe
fix(rendering): bound colour-space ink walker against self-referentia…
RayVR Jun 9, 2026
8d6eef4
fix(rendering): render SMask form under host base_transform per §11.6…
RayVR Jun 9, 2026
cc79252
fix(rendering): un-premultiply non-separable blend source/dest per §1…
RayVR Jun 9, 2026
a294be7
perf(rendering): hoist ICC transform cache lookup out of transparency…
RayVR Jun 9, 2026
52d1e19
perf(rendering): cache CMYK retarget transform + memoise OutputIntent…
RayVR Jun 9, 2026
8d51c1e
fix(rendering): detect transparency through indirect refs and nested-…
RayVR Jun 9, 2026
c4693d4
fix(rendering): warn on silent K=0 fallback under declared /OutputInt…
RayVR Jun 9, 2026
5199aac
docs+test(rendering): refresh stale docstrings and tighten adversaria…
RayVR Jun 9, 2026
eb79cce
fix(rendering): resolve indirect refs in ExtGState parser per §7.3.10
RayVR Jun 9, 2026
294b504
chore(docs): remove internal research note from tree
RayVR Jun 9, 2026
408b089
Merge branch 'main' into feature/transparency-flattening
RayVR Jun 10, 2026
c6c9b88
ci(wasm): raise -Oz size ceiling to 16384 KB for the §11 transparency…
yfedoseev Jun 10, 2026
54f711a
Merge branch 'main' into feature/transparency-flattening
RayVR Jun 11, 2026
818aad5
Merge branch 'main' into feature/transparency-flattening
yfedoseev Jun 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

45 changes: 36 additions & 9 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,13 @@
# WASM-only runtime deps (gated on `wasm` feature)
"getrandom_02",
"web-sys",
# Press-grade ICC backend (gated on `icc-lcms2` feature)
"lcms2",
]
ignored-paths = [
# Runnable examples — not declared as [[example]] targets because they use
# `cargo run --manifest-path examples/rust/.../Cargo.toml` pattern.
"examples/rust/*/main.rs",

Check warning on line 35 in Cargo.toml

View workflow job for this annotation

GitHub Actions / Unused deps (cargo-shear)

shear/redundant_ignore_path

redundant ignored paths pattern `examples/rust/*/main.rs` (remove from ignored paths list)
# Placeholder modules kept disabled for future work (see src/pipeline/mod.rs)
"src/pipeline/input_parsers/mod.rs",
"src/structure/builder.rs",
Expand Down Expand Up @@ -214,11 +216,20 @@
# Parallel extraction
rayon = { version = "1.12", optional = true }

# ICC colour management (Firefox's qcms, pure Rust). Default features
# bring in `cmyk` + `iccv4-enabled` which cover every colour space PDF
# /ICCBased streams actually use.
# ICC colour management — pure-Rust qcms (Firefox's colour engine).
# Default features bring in `cmyk` + `iccv4-enabled` which cover every
# colour space PDF /ICCBased streams actually use. Gated on
# `icc-qcms`; the legacy `icc` feature aliases to it.
qcms = { version = "0.3", optional = true }

# ICC colour management — press-grade lcms2 (Little CMS, C). Opt-in
# behind `icc-lcms2` because it pulls in the lcms2-sys C dependency.
# Required for CMYK→CMYK profile retargeting, Black Point Compensation,
# and per-intent dispatch — the bits qcms 0.3 doesn't implement. Real
# prepress / packaging consumers turn this on; library embedders
# targeting WASM or C# AOT stay on the qcms default.
lcms2 = { version = "6", optional = true }

# Math and algorithms
ndarray = { version = "0.17", optional = true, features = ["std"] }
linfa = { version = "0.8", optional = true }
Expand Down Expand Up @@ -331,12 +342,28 @@
# Combining `fips` with `legacy-crypto` is a compile-time error.
fips = ["dep:aws-lc-rs", "aws-lc-rs/fips"]

# Real ICC colour management via qcms (Firefox's colour engine).
# When enabled, ICCBased colour spaces and CMYK images are converted
# using the embedded profile instead of ISO 32000-1 §10.3.5's
# additive-clamp fallback. Pure Rust, so WASM and C# AOT targets keep
# working without a C toolchain dependency.
icc = ["dep:qcms"]
# Real ICC colour management.
#
# Three modes:
#
# - `icc-qcms` (default, via the `icc` alias): pure-Rust Firefox-derived
# colour engine. CMYK→RGB through the embedded profile, no CMYK→CMYK
# retargeting, no Black Point Compensation. Pure Rust so WASM and
# C# AOT targets keep working without a C toolchain dependency.
#
# - `icc-lcms2`: opt-in C-dep press-grade CMM. Adds CMYK→CMYK profile
# retargeting through Lab PCS (closes the DeviceN /Process ICC
# profile-mismatch gap for prepress/packaging workloads), BPC, and
# per-intent dispatch the spec asks for. Drags in lcms2-sys (C).
#
# - both: when both `icc-qcms` and `icc-lcms2` are enabled the active
# backend is lcms2 — it's the strict superset.
#
# Backwards-compat alias: `icc` resolves to `icc-qcms`. Users who built
# with `--features icc` keep the same behaviour and the same dep graph.
icc = ["icc-qcms"]
icc-qcms = ["dep:qcms"]
icc-lcms2 = ["dep:lcms2"]

# Gate MD5 key-derivation (R≤4 PDF Standard Security) and RC4 cipher
# behind this feature. Default-on so existing users keep full R≤4 read/write
Expand Down
Loading
Loading