Skip to content

Tier 3 (deferred): colorzones spline-curve precision HSL fallback #98

Description

@chipi

Per RFC-023, HSL Color Mixer parity ships via `colorequal` (Tier 2, commit `1b5db21`). That covers ~95% of HSL workflow.

This issue tracks the 5% case: photographers who want Lightroom HSL Range slider precision — explicit per-zone falloff control via spline-curve manipulation. `colorequal`'s `smoothing_hue` and `param_size` globals only give global falloff. `colorzones` (mv5, the legacy module) carries 3 explicit per-channel curves with 20 (x, y) anchor nodes each — that's the tool for sliders-precision-matters use cases.

Why deferred

  • `colorequal` covers the dominant HSL workflow; the gap is real but small.
  • `colorzones` is genuinely Tier 3-shaped: 520-byte struct with 60 (x, y) node slots that are mostly inactive. Same empirical-baseline blocker as Bucket A.1: tone curve (tonecurve mv5) Path C decoder — needs darktable session for baseline #94 tonecurve — synthesizing op_params from struct knowledge alone is risky.
  • darktable itself is moving away from `colorzones`. Investing in spline-curve decoding for a deprecated module is asymmetric cost.

The clean ship for this is discrete entries only: capture 4-6 known curves in darktable's GUI (e.g., `hsl_blue_sky_steep` — a curve that aggressively desaturates blue at one specific point), drop them in. No parameterized decoder.

Scope

  1. Capture baselines from darktable GUI — author 4-8 reference `colorzones` dtstyles for common HSL precision moves:
    • `hsl_blue_sky_steep` (sharp blue desaturation curve)
    • `hsl_orange_skin_protect` (preserves orange at central hue, attenuates at edges)
    • `hsl_green_foliage_warm_curve` (curve-based green→yellow shift)
    • 4-5 more as photographic cases dictate
  2. Drop into `vocabulary/packs/expressive-baseline/layers/L3/colorzones/` — discrete entries, no decoder.
  3. Manifest entries — no `parameters` block (these are pre-baked discrete entries).
  4. Lab-grade direction-of-change tests for each (curve effect on the colorchecker chart should be measurable for the saturation curves).
  5. No 5-layer coverage gate — discrete entries don't trigger ADR-080's parameterized-entry coverage check.

Definition of done

  • 4-8 curated `colorzones` dtstyles, captured empirically from darktable GUI
  • Manifest entries without `parameters` blocks
  • Lab-grade direction-of-change tests in `_lab_grade_deltas.py`'s discrete-effect map
  • Documentation note in `docs/capability-survey.md` § 13 marking the curve-precision HSL case as "discrete-only"

Priority

Lowest of the v1.8.0 Tier 3 set. Easy to defer to v1.9.0 or beyond if real-session feedback doesn't surface the gap.

References

  • RFC-023 §"Trade-offs" + §"Alternatives considered" Alt 1 for the rejected `colorzones` parameterization path
  • `docs/adr/ADR-081-parameterization-tiering-policy.md` (Tier 3 discrete-entry path)
  • darktable source: `src/iop/colorzones.c` `dt_iop_colorzones_params_t` v5

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions