diff --git a/src/bin/ephoto_filters.c b/src/bin/ephoto_filters.c index f824dfc..2c6557e 100644 --- a/src/bin/ephoto_filters.c +++ b/src/bin/ephoto_filters.c @@ -645,10 +645,10 @@ _dither(void *data) { int index = y * w + x; - 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 = (ef->im_data_new[index]) & 0xff; + g = ((ef->im_data_new[index] >> 8) & 0xff); + r = ((ef->im_data_new[index] >> 16) & 0xff); + a = ((ef->im_data_new[index] >> 24) & 0xff); b = _mul_color_alpha(b, a); g = _mul_color_alpha(g, a); r = _mul_color_alpha(r, a); @@ -670,10 +670,10 @@ _dither(void *data) if ((x+1) < w) { index = y * 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 = (ef->im_data_new[index] & 0xff); + g = ((ef->im_data_new[index] >> 8) & 0xff); + r = ((ef->im_data_new[index] >> 16) & 0xff); + a = ((ef->im_data_new[index] >> 24) & 0xff); b = _mul_color_alpha(b, a); g = _mul_color_alpha(g, a); r = _mul_color_alpha(r, a); @@ -692,10 +692,10 @@ _dither(void *data) 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 = (ef->im_data_new[index] & 0xff); + g = ((ef->im_data_new[index] >> 8) & 0xff); + r = ((ef->im_data_new[index] >> 16) & 0xff); + a = ((ef->im_data_new[index] >> 24) & 0xff); b = _mul_color_alpha(b, a); g = _mul_color_alpha(g, a); r = _mul_color_alpha(r, a); @@ -714,10 +714,10 @@ _dither(void *data) if ((y+1) < h) { index = (y + 1) * w + x; - 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 = (ef->im_data_new[index] & 0xff); + g = ((ef->im_data_new[index] >> 8) & 0xff); + r = ((ef->im_data_new[index] >> 16) & 0xff); + a = ((ef->im_data_new[index] >> 24) & 0xff); b = _mul_color_alpha(b, a); g = _mul_color_alpha(g, a); r = _mul_color_alpha(r, a); @@ -736,10 +736,10 @@ _dither(void *data) if ((y+1) < h && (x+1) < w) { 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 = (ef->im_data_new[index] & 0xff); + g = ((ef->im_data_new[index] >> 8) & 0xff); + r = ((ef->im_data_new[index] >> 16) & 0xff); + a = ((ef->im_data_new[index] >> 24) & 0xff); b = _mul_color_alpha(b, a); g = _mul_color_alpha(g, a); r = _mul_color_alpha(r, a); @@ -755,12 +755,7 @@ _dither(void *data) ef->im_data_new[index] = (a << 24) | (rr << 16) | (gg << 8) | bb; } -/*Extra incrementing the x and y values to get - * the desired checkerboard effect is likely a - * bad hack*/ - x++; } - y++; passes++; if (passes == 500) { @@ -779,27 +774,31 @@ _grayscale(void *data) { Ephoto_Filter *ef = data; int gray, i, r, g, b, a, passes = 0; - Evas_Coord w, h; + Evas_Coord w, h, x, y; w = ef->w; h = ef->h; - for (i = ef->pos; i < (w * h); i++) + for (y = ef->pos; y < h; y++) { - b = (int) ((ef->im_data[i]) & 0xff); - g = (int) ((ef->im_data[i] >> 8) & 0xff); - r = (int) ((ef->im_data[i] >> 16) & 0xff); - a = (int) ((ef->im_data[i] >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - gray = (int) ((0.3 * r) + (0.59 * g) + (0.11 * b)); - if (a >= 0 && a < 255) - gray = (gray * a) / 255; - ef->im_data_new[i] = (a << 24) | (gray << 16) | (gray << 8) | gray; + for (x = 0; x < w; x++) + { + i = y * w + x; + b = (int) ((ef->im_data[i]) & 0xff); + g = (int) ((ef->im_data[i] >> 8) & 0xff); + r = (int) ((ef->im_data[i] >> 16) & 0xff); + a = (int) ((ef->im_data[i] >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + gray = (int) ((0.3 * r) + (0.59 * g) + (0.11 * b)); + if (a >= 0 && a < 255) + gray = (gray * a) / 255; + ef->im_data_new[i] = (a << 24) | (gray << 16) | (gray << 8) | gray; + } passes++; if (passes == 500) { - ef->pos = i++; + ef->pos = y++; return EINA_TRUE; } } @@ -814,33 +813,38 @@ _sepia(void *data) { Ephoto_Filter *ef = data; int i, r, rr, g, gg, b, bb, a, passes = 0; - Evas_Coord w, h; + Evas_Coord w, h, x, y; w = ef->w; h = ef->h; - for (i = ef->pos; i < (w * h); i++) + for (y = ef->pos; y < h; y++) { - b = (int) ((ef->im_data[i]) & 0xff); - g = (int) ((ef->im_data[i] >> 8) & 0xff); - r = (int) ((ef->im_data[i] >> 16) & 0xff); - a = (int) ((ef->im_data[i] >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - rr = (int) ((r * .393) + (g * .769) + (b * .189)); - rr = _normalize_color(rr); - gg = (int) ((r * .349) + (g * .686) + (b * .168)); - gg = _normalize_color(gg); - bb = (int) ((r * .272) + (g * .534) + (b * .131)); - 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[i] = (a << 24) | (rr << 16) | (gg << 8) | bb; + for (x = 0; x < w; x++) + { + i = y * w + x; + + b = (int) ((ef->im_data[i]) & 0xff); + g = (int) ((ef->im_data[i] >> 8) & 0xff); + r = (int) ((ef->im_data[i] >> 16) & 0xff); + a = (int) ((ef->im_data[i] >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + rr = (int) ((r * .393) + (g * .769) + (b * .189)); + rr = _normalize_color(rr); + gg = (int) ((r * .349) + (g * .686) + (b * .168)); + gg = _normalize_color(gg); + bb = (int) ((r * .272) + (g * .534) + (b * .131)); + 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[i] = (a << 24) | (rr << 16) | (gg << 8) | bb; + } passes++; if (passes == 500) { - ef->pos = i++; + ef->pos = y++; return EINA_TRUE; } } @@ -856,34 +860,45 @@ _posterize(void *data) Ephoto_Filter *ef = data; int i, rr, gg, bb, a, passes = 0; double fr, fg, fb, rad; - Evas_Coord w, h; + Evas_Coord w, h, x, y; w = ef->w; h = ef->h; rad = ef->drad; - for (i = ef->pos; i < (w * h); i++) + for (y = ef->pos; y < h; y++) { - fb = ((ef->im_data[i]) & 0xff); - fg = ((ef->im_data[i] >> 8) & 0xff); - fr = ((ef->im_data[i] >> 16) & 0xff); - a = (int) ((ef->im_data[i] >> 24) & 0xff); - fr /= 255; - fg /= 255; - fb /= 255; - rr = 255 * rint((fr * rad)) / rad; - rr = _normalize_color(rr); - gg = 255 * rint((fg * rad)) / rad; - gg = _normalize_color(gg); - bb = 255 * rint((fb * rad)) / rad; - bb = _normalize_color(bb); - ef->im_data_new[i] = (a << 24) | (rr << 16) | (gg << 8) | bb; + for (x = 0; x < w; x++) + { + i = y * w + x; + fb = ((ef->im_data[i]) & 0xff); + fg = ((ef->im_data[i] >> 8) & 0xff); + fr = ((ef->im_data[i] >> 16) & 0xff); + a = ((ef->im_data[i] >> 24) & 0xff); + fb = _mul_color_alpha(fb, a); + fg = _mul_color_alpha(fg, a); + fr = _mul_color_alpha(fr, a); + fr /= 255; + fg /= 255; + fb /= 255; + rr = 255 * rint((fr * rad)) / rad; + rr = _normalize_color(rr); + gg = 255 * rint((fg * rad)) / rad; + gg = _normalize_color(gg); + bb = 255 * rint((fb * rad)) / rad; + 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[i] = (a << 24) | (rr << 16) | (gg << 8) | bb; + } passes++; if (passes == 500) { - ef->pos = i++; + ef->pos = y++; return EINA_TRUE; } } + _idler_finishing_cb(ef, EINA_FALSE); return EINA_FALSE; @@ -895,34 +910,37 @@ _negative(void *data) Ephoto_Filter *ef = data; int i, r, g, b, rr, gg, bb, a; int passes = 0; - Evas_Coord w, h; + Evas_Coord w, h, x, y; w = ef->w; h = ef->h; - for (i = ef->pos; i < (w * h); i++) + for (y = ef->pos; y < h; y++) { - b = (int) ((ef->im_data[i]) & 0xff); - g = (int) ((ef->im_data[i] >> 8) & 0xff); - r = (int) ((ef->im_data[i] >> 16) & 0xff); - a = (int) ((ef->im_data[i] >> 24) & 0xff); - b = _mul_color_alpha(b, a); - g = _mul_color_alpha(g, a); - r = _mul_color_alpha(r, a); - rr = 255 - r; - gg = 255 - g; - bb = 255 - b; - rr = _normalize_color(rr); - 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[i] = (a << 24) | (rr << 16) | (gg << 8) | bb; - + for (x = 0; x < w; x++) + { + i = y * w + x; + b = (int) ((ef->im_data[i]) & 0xff); + g = (int) ((ef->im_data[i] >> 8) & 0xff); + r = (int) ((ef->im_data[i] >> 16) & 0xff); + a = (int) ((ef->im_data[i] >> 24) & 0xff); + b = _mul_color_alpha(b, a); + g = _mul_color_alpha(g, a); + r = _mul_color_alpha(r, a); + rr = 255 - r; + gg = 255 - g; + bb = 255 - b; + rr = _normalize_color(rr); + 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[i] = (a << 24) | (rr << 16) | (gg << 8) | bb; + } passes++; if (passes == 500) { - ef->pos = i++; + ef->pos = y++; return EINA_TRUE; } } @@ -938,40 +956,48 @@ static Eina_Bool _dodge(void *data) { Ephoto_Filter *ef = data; - double r, g, b, rr, gg, bb; - int i, rrr, ggg, bbb, passes = 0;; - Evas_Coord w, h; + double a, r, g, b, aa, rr, gg, bb; + int i, aaa, rrr, ggg, bbb, passes = 0; + Evas_Coord w, h, x, y; w = ef->w; h = ef->h; - for (i = ef->pos; i < (w * h); i++) + for (y = ef->pos; y < h; y++) { - b = ((ef->im_data_two[i]) & 0xff); - g = ((ef->im_data_two[i] >> 8) & 0xff); - r = ((ef->im_data_two[i] >> 16) & 0xff); + for (x = 0; x < w; x++) + { + i = y * w + x; + b = ((ef->im_data_two[i]) & 0xff); + g = ((ef->im_data_two[i] >> 8) & 0xff); + r = ((ef->im_data_two[i] >> 16) & 0xff); + a = ((ef->im_data_two[i] >> 24) & 0xff); - bb = ((ef->im_data[i]) & 0xff); - gg = ((ef->im_data[i] >> 8) & 0xff); - rr = ((ef->im_data[i] >> 16) & 0xff); + bb = ((ef->im_data[i]) & 0xff); + gg = ((ef->im_data[i] >> 8) & 0xff); + rr = ((ef->im_data[i] >> 16) & 0xff); + aa = ((ef->im_data[i] >> 24) & 0xff); - b *= 255; - g *= 255; - r *= 255; + b *= 255; + g *= 255; + r *= 255; + a *= 255; - bbb = rint(b / (255 - bb)); - ggg = rint(g / (255 - gg)); - rrr = rint(r / (255 - rr)); + bbb = rint(b / (255 - bb)); + ggg = rint(g / (255 - gg)); + rrr = rint(r / (255 - rr)); + aaa = rint(a / (255 - aa)); - rrr = _normalize_color(rrr); - ggg = _normalize_color(ggg); - bbb = _normalize_color(bbb); - - ef->im_data_new[i] = (255 << 24) | (rrr << 16) | (ggg << 8) | bbb; + rrr = _normalize_color(rrr); + ggg = _normalize_color(ggg); + bbb = _normalize_color(bbb); + aaa = _normalize_color(aaa); + ef->im_data_new[i] = (aaa << 24) | (rrr << 16) | (ggg << 8) | bbb; + } passes++; if (passes == 500) { - ef->pos = i++; + ef->pos = y++; return EINA_TRUE; } } @@ -1062,7 +1088,7 @@ _emboss(void *data) p = ef->im_data_new + (y * w); for (x = 0; x < w; x++) { - int a = 0, rr = 0, gg = 0, bb = 0; + int aa = 0, rr = 0, gg = 0, bb = 0; if (y > 0 && x > 0 && y < (h - 2) && x < (w - 2)) { for (i = -1; i <= 1; i++) @@ -1078,14 +1104,16 @@ _emboss(void *data) emboss[i+1][j+1]; rr += (int) ((pix >> 16) & 0xff) * emboss[i+1][j+1]; + aa += (int) ((pix >> 24) & 0xff) * + emboss[i+1][j+1]; } } } + aa = _normalize_color(aa); bb = _normalize_color(bb); gg = _normalize_color(gg); rr = _normalize_color(rr); - a = (*p >> 24) & 0xff; - *p = (a << 24) | (rr << 16) | (gg << 8) | bb; + *p = (aa << 24) | (rr << 16) | (gg << 8) | bb; p++; } passes++; @@ -1226,6 +1254,8 @@ ephoto_filter_dither(Evas_Object *main, Evas_Object *image) { Ephoto_Filter *ef = _initialize_filter(EPHOTO_IMAGE_FILTER_DITHER, main, image); + ef->im_data_new = memcpy(ef->im_data_new, ef->im_data, + sizeof(unsigned int) * ef->w * ef->h); ef->popup = _processing(main); ef->idler = ecore_idler_add(_dither, ef);