revert(heal): cut the mask's own fade again, not a step over the whole brush

This reverts 8809eb8. The step cut takes the whole brush out of the frame, so
the fill below has only the rim left to read from.

The colour leak that cut was for no longer needs it: 49c5c9c handed the mask
the whole spot, and heal-colour-pass.mjs measures the repair 1.08 levels off
the ground with the fade cut — the same 1.08 it measures with the step.
This commit is contained in:
2026-10-16 06:13:35 +07:00
parent 1633287a46
commit f670de1377
2 changed files with 4 additions and 51 deletions
+4 -15
View File
@@ -87,30 +87,19 @@ function num(v: unknown, fallback: number): number {
}
// The first of the fill's two passes: the photo with the painted pixels taken
// out of it. The colour of every pixel is kept and its alpha drops to nothing
// over the brush, which is what turns the mask into a hole the second pass can
// see the rim of. Written as premultiplied — rgb times that alpha — because
// out of it. The colour of every pixel is kept and its alpha drops to what the
// brush did not touch, which is what turns the mask into a hole the second pass
// can see the rim of. Written as premultiplied — rgb times that alpha — because
// that is what every surface here holds, and the blur below is built on it: a
// blur of premultiplied pixels is a weighted average of the pixels that are
// still there, with the hole weighing nothing.
//
// The cut is the WHOLE stroke, and it is a step rather than the mask's own fade.
// The fill below reads the rim of this hole, so whatever is left standing inside
// it is weighed into the repair. Cut at the mask's fade instead — `a = 1 -
// mask.a`, the obvious reading of "take the mask out" — and the outer quarter of
// every spot stays behind at partial weight. A brush aimed at a blemish has the
// blemish's own rim in exactly that band, so the repair came back in the colour
// of the thing being repaired: on a grey ground with a red blemish, the obvious
// cut is 4.1 levels off the ground and the step is 1.1 (measured, the cut
// variants in heal-colour-pass.mjs). The threshold is lightcraft's own: the
// pixels a heal may read its tone from are the ones at alpha < 0.02 (spots.rs).
export const HEAL_CUT_SKSL = `
uniform shader img;
uniform shader mask;
half4 main(float2 pos) {
half4 c = img.eval(pos);
half a = mask.eval(pos).a < 0.02 ? 1.0 : 0.0;
half a = 1.0 - mask.eval(pos).a;
half3 straight = c.a > 0.0001 ? c.rgb / c.a : c.rgb;
return half4(straight * a, a);
}