From 9472e035461dd42a533cf893362063bb95811f34 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Fri, 14 Feb 2014 16:28:35 +0900 Subject: [PATCH] Evas filters: Fix RGBA displacement filter Well... it was just broken: typo, lack of normalization on alpha, invalid formula for blending. Duh! --- src/lib/evas/filters/evas_filter_displace.c | 23 ++++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/lib/evas/filters/evas_filter_displace.c b/src/lib/evas/filters/evas_filter_displace.c index 37ce266d89..994cbe990a 100644 --- a/src/lib/evas/filters/evas_filter_displace.c +++ b/src/lib/evas/filters/evas_filter_displace.c @@ -95,6 +95,7 @@ _filter_displace_cpu_rgba_do(int w, int h, int map_w, int map_h, int intensity, for (x = 0, map_x = 0; x < w; x++, dst++, src++, map_x++) { int offx = 0, offy = 0, offx_dec = 0, offy_dec = 0, val = 0; + DATA32 col = 0; Eina_Bool out = 0; // wrap (x) @@ -121,16 +122,16 @@ _filter_displace_cpu_rgba_do(int w, int h, int map_w, int map_h, int intensity, // get value if (out && !stretch) - val = A_VAL(src + offx + offy * w) << (ALPHA * 8); + col = A_VAL(src + offx + offy * w) << (ALPHA * 8); else if (!smooth) - val = src[offx + offy * w]; + col = src[offx + offy * w]; else { int R, G, B, A; DATA32 s00, s01, s10, s11; // indexes represent x,y int mul00, mul01, mul10, mul11; - mul00 = (128 - offx_dec) * (128 * offy_dec); + mul00 = (128 - offx_dec) * (128 - offy_dec); mul01 = (128 - offx_dec) * offy_dec; mul10 = offx_dec * (128 - offy_dec); mul11 = offx_dec * offy_dec; @@ -152,18 +153,24 @@ _filter_displace_cpu_rgba_do(int w, int h, int map_w, int map_h, int intensity, B = (BLUE_OF(s00) * mul00) + (BLUE_OF(s10) * mul10) + (BLUE_OF(s01) * mul01) + (BLUE_OF(s11) * mul11); + A >>= 14; R >>= 14; G >>= 14; B >>= 14; - val = ARGB_JOIN(A, R, G, B); + col = ARGB_JOIN(A, R, G, B); } - // apply alpha - if (blend && map[ALPHA] != 0xFF) - *dst = INTERP_256(map[ALPHA], val, *dst); + if (map[ALPHA] != 0xFF) + col = MUL_256(map[ALPHA], col); + + if (blend) + { + DATA32 a = 256 - ALPHA_OF(col); + *dst = col + MUL_256(a, *dst); + } else - *dst = val; + *dst = col; } } }