New "Filter Ops (live-preview)" node — image_effects.py + image_effects_preview.js.
Adaptive widget UI: only the controls for the current effect are shown.
Effect set:
- Blur (Gaussian / Average / Edge Average) with R/G/B/H/S/V/RGB/HSV/Oklab
source channel selection, hue blurred on the unit circle.
- Halftone with 12 shapes, screen-function + Bayer dithering, angle wheel.
- Color Filter with HSV color wheel (hue + density), preserve-highlights.
- Sharpen (unsharp mask, negative amount = soften).
- Pixelate / Mosaic.
- Posterize with 5 dither modes (None / Bayer / Random / Floyd-Steinberg /
Atkinson), RGB or Luminance space.
- Vignette with draggable center widget.
- Levels with histogram + draggable B/gamma/W handles.
- Color Balance with 3 color wheels (shadows / midtones / highlights).
Custom canvas widgets (color wheels, histogram, vignette center) mirror
the underlying numeric values both ways. effect + blend_mode pinned at the
top with a separator; values for hidden widgets are preserved across
effect switches. Live preview uses requestIdleCallback so the slider stays
smooth on heavy effects.
MASK input added to both nodes — restricts the effect to the masked region
with auto-resize / batch broadcast.
Channel Ops:
- Added Red+Green / Red+Blue / Green+Blue to Source AND Destination.
- Updated channel_ops_preview.js to mirror.
Misc:
- Fixed inverted hue formula in the JS preview's rgb_to_hsv.
- Widget labels show with spaces instead of underscores.
- README rewritten — compact, single page.