From 9efd8a1aa518f5dfdf753e677731fb13985a2596 Mon Sep 17 00:00:00 2001 From: Rackoon <32634987+WildRackoon@users.noreply.github.com> Date: Fri, 12 Dec 2025 14:44:47 +0100 Subject: [PATCH] Improve Dither code readability --- src/libImaging/Convert.c | 77 +++++++++++++++------------------------- 1 file changed, 29 insertions(+), 48 deletions(-) diff --git a/src/libImaging/Convert.c b/src/libImaging/Convert.c index b04b9828a..d3221a665 100644 --- a/src/libImaging/Convert.c +++ b/src/libImaging/Convert.c @@ -1246,19 +1246,18 @@ topalette( /* Map each pixel to the nearest palette entry */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { - int r, r0, r1, r2; - int g, g0, g1, g2; - int b, b0, b1, b2; + int r, r0, r1; + int g, g0, g1; + int b, b0, b1; UINT8 *in = (UINT8 *)imIn->image[y]; UINT8 *out = alpha ? (UINT8 *)imOut->image32[y] : imOut->image8[y]; int *e = errors; r = r0 = r1 = 0; g = g0 = g1 = 0; - b = b0 = b1 = b2 = 0; + b = b0 = b1 = 0; for (x = 0; x < imIn->xsize; x++, in += 4) { - int d2; INT16 *cache; r = CLIP8(in[0] + (r + e[3 + 0]) / 16); @@ -1281,31 +1280,21 @@ topalette( g -= (int)palette->palette[cache[0] * 4 + 1]; b -= (int)palette->palette[cache[0] * 4 + 2]; - /* propagate errors (don't ask ;-) */ - r2 = r; - d2 = r + r; - r += d2; - e[0] = r + r0; - r += d2; - r0 = r + r1; - r1 = r2; - r += d2; - g2 = g; - d2 = g + g; - g += d2; - e[1] = g + g0; - g += d2; - g0 = g + g1; - g1 = g2; - g += d2; - b2 = b; - d2 = b + b; - b += d2; - e[2] = b + b0; - b += d2; - b0 = b + b1; - b1 = b2; - b += d2; + /* propagate errors */ + e[0] = 3*r + r0; + r0 = 5*r + r1; + r1 = r; + r = 7*r; + + e[1] = 3*g + g0; + g0 = 5*g + g1; + g1 = g; + g = 7*g; + + e[2] = 3*b + b0; + b0 = 5*b + b1; + b1 = b; + b = 7*b; e += 3; } @@ -1385,7 +1374,7 @@ tobilevel(Imaging imOut, Imaging imIn) { /* map each pixel to black or white, using error diffusion */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { - int l, l0, l1, l2, d2; + int l, l0, l1; UINT8 *in = (UINT8 *)imIn->image[y]; UINT8 *out = imOut->image8[y]; @@ -1398,14 +1387,10 @@ tobilevel(Imaging imOut, Imaging imIn) { /* propagate errors */ l -= (int)out[x]; - l2 = l; - d2 = l + l; - l += d2; - errors[x] = l + l0; - l += d2; - l0 = l + l1; - l1 = l2; - l += d2; + errors[x] = 3*l + l0; + l0 = 5*l + l1; + l1 = l; + l = 7*l; } errors[x] = l0; @@ -1416,7 +1401,7 @@ tobilevel(Imaging imOut, Imaging imIn) { /* map each pixel to black or white, using error diffusion */ ImagingSectionEnter(&cookie); for (y = 0; y < imIn->ysize; y++) { - int l, l0, l1, l2, d2; + int l, l0, l1; UINT8 *in = (UINT8 *)imIn->image[y]; UINT8 *out = imOut->image8[y]; @@ -1429,14 +1414,10 @@ tobilevel(Imaging imOut, Imaging imIn) { /* propagate errors */ l -= (int)out[x]; - l2 = l; - d2 = l + l; - l += d2; - errors[x] = l + l0; - l += d2; - l0 = l + l1; - l1 = l2; - l += d2; + errors[x] = 3*l + l0; + l0 = 5*l + l1; + l1 = l; + l = 7*l; } errors[x] = l0;