Skip to content

v0.2.10

Choose a tag to compare

@lilith lilith released this 20 Apr 18:30
· 46 commits to main since this release

Bug-fix release. No public API change; cargo semver-checks --workspace clean.

Highlights

  • AlphaPolicy::CompositeOnto now 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 inserts PremulToStraight before MatteComposite when source alpha mode is Premultiplied.
  • 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 Linear was 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 / LinearF32ToGamma22F32 are pub(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::AnyIntent with moxcms+lcms2 AND-gate verification.
  • Descriptor with_transfer/with_primaries/with_alpha documented as relabel-only (#21). Prior doc comments understated the key semantic: these change the descriptor without touching pixel bytes. Use RowConverter::new with 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)