v0.2.10
Bug-fix release. No public API change; cargo semver-checks --workspace clean.
Highlights
AlphaPolicy::CompositeOntonow produces correct pixels for premultiplied source (#22). The matte-composite kernel applies the straight-alpha over operator; feeding it premul bytes multiplied by α twice, silently wrong by up to ~24 u8 codes at α≈0.25. Planner now insertsPremulToStraightbeforeMatteCompositewhen source alpha mode isPremultiplied.- Planner no longer silently passes bytes through on TF changes (#20). Same-depth integer TF changes (
U8 Gamma22 → U8 Srgb, etc.) were emitting[Identity]and producing wrong pixels labeled with the target TF. Integer↔F32 cross-TF combinations without a fused kernel dropped the EOTF/OETF entirely — mid-gray error was up to 55× off for PQ inputs.U8 Bt709 ↔ F32 Linearwas using the sRGB-specific fused kernel (~17% linear-light error). All fixed; routes through F32 linear intermediate where no fused kernel exists. Adds 54 regression tests. - First-class Gamma 2.2 (Adobe RGB 1998) transfer in the built-in planner (#18). AdobeRGB ↔ PQ / HLG / BT.2020 / Linear compose correctly without dropping to the moxcms CMS fallback.
ConvertStep::Gamma22F32ToLinearF32/LinearF32ToGamma22F32arepub(crate); no public API surface added. - ICC hash tables regenerated with 23 new canonical entries (#17): jpegli/libjxl V4 testdata canonicals, Rec2020 PQ CICP, RawTherapee working spaces, misc test profiles. RGB table 209 → 240 lines; gray table 31 → 34. All hashes classified as
Safe::AnyIntentwith moxcms+lcms2 AND-gate verification. - Descriptor
with_transfer/with_primaries/with_alphadocumented as relabel-only (#21). Prior doc comments understated the key semantic: these change the descriptor without touching pixel bytes. UseRowConverter::newwith the new descriptor as destination to actually re-encode.
Silent wrong-pixel class (umbrella issue #19)
The fixes in #20 and #22 close several longstanding cases where ConvertPlan::new / RowConverter::new accepted a request and produced visually-wrong pixels with no error and no CMS fallback. Remaining items in #19 (Unknown TF/primaries explicit opt-in, drop-alpha-from-premul semantics) are deferred pending concrete in-tree consumers.
Commits
- #17 chore: regen icc tables with 23 new canonical/test entries (
c876b94) - #18 feat(zenpixels-convert): first-class Gamma 2.2 (Adobe RGB) transfer (
2238309) - #20 fix(zenpixels-convert): planner no longer silently passes bytes through on TF changes (
a9cb1c3) - #21 docs(zenpixels): clarify descriptor with_* methods as relabel-only operations (
da5ba60) - #22 fix(zenpixels-convert): AlphaPolicy::CompositeOnto on premul source (
ae0ebd8) - release commit (
5b8202e)