Ephoto: Cleanup dithering code, still needs improvement.

This commit is contained in:
Stephen okra Houston 2016-06-22 11:47:15 -05:00
parent ab8edacd0d
commit 51a8be20a6
1 changed files with 100 additions and 62 deletions

View File

@ -630,91 +630,129 @@ static Eina_Bool
_dither(void *data) _dither(void *data)
{ {
Ephoto_Filter *ef = data; Ephoto_Filter *ef = data;
unsigned int *p1, *p2;
int a, r, g, b, passes = 0;
int aa, rr, gg, bb;
int aaa, rrr, ggg, bbb;
int erra, errr, errg, errb;
Evas_Coord x, y, w, h; Evas_Coord x, y, w, h;
int a, r, g, b, passes = 0;
int rr, gg, bb;
int errr, errg, errb;
w = ef->w; w = ef->w;
h = ef->h; h = ef->h;
for (y = ef->pos; y < h; y++) for (y = ef->pos; y < h; y++)
{ {
for (x = 1; x < w; x++) for (x = 0; x < w; x++)
{ {
p1 = ef->im_data + (y * w) + x; int index = y * w + x;
p2 = ef->im_data_new + (y * w) + x;
b = (int) (*p1 & 0xff); b = (ef->im_data[index]) & 0xff;
g = (int) ((*p1 >> 8) & 0xff); g = ((ef->im_data[index] >> 8) & 0xff);
r = (int) ((*p1 >> 16) & 0xff); r = ((ef->im_data[index] >> 16) & 0xff);
a = (int) ((*p1 >> 24) & 0xff); a = ((ef->im_data[index] >> 24) & 0xff);
b = _mul_color_alpha(b, a);
g = _mul_color_alpha(g, a);
r = _mul_color_alpha(r, a);
bb = (b > 127) ? 255 : 0; bb = (b > 127) ? 255 : 0;
gg = (g > 127) ? 255 : 0; gg = (g > 127) ? 255 : 0;
rr = (r > 127) ? 255 : 0; rr = (r > 127) ? 255 : 0;
aa = (a > 127) ? 255 : 0; rr = _normalize_color(rr);
*p2 = (aa << 24) | (rr << 16) | (gg << 8) | bb; gg = _normalize_color(gg);
bb = _normalize_color(bb);
bb = _demul_color_alpha(bb, a);
gg = _demul_color_alpha(gg, a);
rr = _demul_color_alpha(rr, a);
ef->im_data_new[index] = (a << 24) | (rr << 16) |
(gg << 8) | bb;
errb = b - bb; errb = b - bb;
errg = g - gg; errg = g - gg;
errr = r - rr; errr = r - rr;
erra = a - aa;
if ((x+1) < w) if ((x+1) < w)
{ {
p1 = ef->im_data + (y * w) + (x+1); index = y * w + x + 1;
p2 = ef->im_data_new + (y * w) + (x+1); b = (ef->im_data[index] & 0xff);
bbb = (int) (*p1 & 0xff) + (7.0/16) * errb; g = ((ef->im_data[index] >> 8) & 0xff);
ggg = (int) ((*p1 >> 8) & 0xff) + (7.0/16) * errg; r = ((ef->im_data[index] >> 16) & 0xff);
rrr = (int) ((*p1 >> 16) & 0xff) + (7.0/16) * errr; a = ((ef->im_data[index] >> 24) & 0xff);
aaa = (int) ((*p1 >> 24) & 0xff) + (7.0/16) * erra; b = _mul_color_alpha(b, a);
bbb = _normalize_color(bbb); g = _mul_color_alpha(g, a);
ggg = _normalize_color(ggg); r = _mul_color_alpha(r, a);
rrr = _normalize_color(rrr); bb = b + ((7 * errb) >> 4);
aaa = _normalize_color(aaa); gg = g + ((7 * errg) >> 4);
*p2 = (aaa << 24) | (rrr << 16) | (ggg << 8) | bbb; rr = r + ((7 * errr) >> 4);
bb = _normalize_color(bb);
gg = _normalize_color(gg);
rr = _normalize_color(rr);
bb = _demul_color_alpha(bb, a);
gg = _demul_color_alpha(gg, a);
rr = _demul_color_alpha(rr, a);
ef->im_data_new[index] = (a << 24) | (rr << 16) |
(gg << 8) | bb;
}
if (x > 0 && (y+1) < h)
{
index = (y + 1) * w + (x - 1);
b = (ef->im_data[index] & 0xff);
g = ((ef->im_data[index] >> 8) & 0xff);
r = ((ef->im_data[index] >> 16) & 0xff);
a = ((ef->im_data[index] >> 24) & 0xff);
b = _mul_color_alpha(b, a);
g = _mul_color_alpha(g, a);
r = _mul_color_alpha(r, a);
bb = b + ((3 * errb) >> 4);
gg = g + ((3 * errg) >> 4);
rr = r + ((3 * errr) >> 4);
bb = _normalize_color(bb);
gg = _normalize_color(gg);
rr = _normalize_color(rr);
bb = _demul_color_alpha(bb, a);
gg = _demul_color_alpha(gg, a);
rr = _demul_color_alpha(rr, a);
ef->im_data_new[index] = (a << 24) | (rr << 16) |
(gg << 8) | bb;
} }
if ((y+1) < h) if ((y+1) < h)
{ {
p1 = ef->im_data + ((y+1) * w) + (x-1); index = (y + 1) * w + x;
p2 = ef->im_data_new + ((y+1) * w) + (x-1); b = (ef->im_data[index] & 0xff);
bbb = (int) (*p1 & 0xff) + (3.0/16) * errb; g = ((ef->im_data[index] >> 8) & 0xff);
ggg = (int) ((*p1 >> 8) & 0xff) + (3.0/16) * errg; r = ((ef->im_data[index] >> 16) & 0xff);
rrr = (int) ((*p1 >> 16) & 0xff) + (3.0/16) * errr; a = ((ef->im_data[index] >> 24) & 0xff);
aaa = (int) ((*p1 >> 24) & 0xff) + (3.0/16) * erra; b = _mul_color_alpha(b, a);
bbb = _normalize_color(bbb); g = _mul_color_alpha(g, a);
ggg = _normalize_color(ggg); r = _mul_color_alpha(r, a);
rrr = _normalize_color(rrr); bb = b + ((5 * errb) >> 4);
aaa = _normalize_color(aaa); gg = g + ((5 * errg) >> 4);
*p2 = (aaa << 24) | (rrr << 16) | (ggg << 8) | bbb; rr = r + ((5 * errr) >> 4);
} bb = _normalize_color(bb);
if ((y+1) < h) gg = _normalize_color(gg);
{ rr = _normalize_color(rr);
p1 = ef->im_data + ((y+1) * w) + x; bb = _demul_color_alpha(bb, a);
p2 = ef->im_data_new + ((y+1) * w) + x; gg = _demul_color_alpha(gg, a);
bbb = (int) (*p1 & 0xff) + (5.0/16) * errb; rr = _demul_color_alpha(rr, a);
ggg = (int) ((*p1 >> 8) & 0xff) + (5.0/16) * errg; ef->im_data_new[index] = (a << 24) | (rr << 16) |
rrr = (int) ((*p1 >> 16) & 0xff) + (5.0/16) * errr; (gg << 8) | bb;
aaa = (int) ((*p1 >> 24) & 0xff) + (5.0/16) * erra;
bbb = _normalize_color(bbb);
ggg = _normalize_color(ggg);
rrr = _normalize_color(rrr);
aaa = _normalize_color(aaa);
*p2 = (aaa << 24) | (rrr << 16) | (ggg << 8) | bbb;
} }
if ((y+1) < h && (x+1) < w) if ((y+1) < h && (x+1) < w)
{ {
p1 = ef->im_data + ((y+1) * w) + (x+1); index = (y + 1) * w + (x + 1);
p2 = ef->im_data_new + ((y+1) * w) + (x+1); b = (ef->im_data[index] & 0xff);
bbb = (int) (*p1 & 0xff) + (1.0/16) * errb; g = ((ef->im_data[index] >> 8) & 0xff);
ggg = (int) ((*p1 >> 8) & 0xff) + (1.0/16) * errg; r = ((ef->im_data[index] >> 16) & 0xff);
rrr = (int) ((*p1 >> 16) & 0xff) + (1.0/16) * errr; a = ((ef->im_data[index] >> 24) & 0xff);
aaa = (int) ((*p1 >> 24) & 0xff) + (1.0/16) * erra; b = _mul_color_alpha(b, a);
bbb = _normalize_color(bbb); g = _mul_color_alpha(g, a);
ggg = _normalize_color(ggg); r = _mul_color_alpha(r, a);
rrr = _normalize_color(rrr); bb = b + ((1 * errb) >> 4);
aaa = _normalize_color(aaa); gg = g + ((1 * errg) >> 4);
*p2 = (aaa << 24) | (rrr << 16) | (ggg << 8) | bbb; rr = r + ((1 * errr) >> 4);
bb = _normalize_color(bb);
gg = _normalize_color(gg);
rr = _normalize_color(rr);
bb = _demul_color_alpha(bb, a);
gg = _demul_color_alpha(gg, a);
rr = _demul_color_alpha(rr, a);
ef->im_data_new[index] = (a << 24) | (rr << 16) |
(gg << 8) | bb;
} }
} }
passes++; passes++;