diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index c942d216be..b2d1c7a4f9 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -543,6 +543,7 @@ lib/evas/filters/evas_filter_blur.c \ lib/evas/filters/evas_filter_bump.c \ lib/evas/filters/evas_filter_curve.c \ lib/evas/filters/evas_filter_displace.c \ +lib/evas/filters/evas_filter_fill.c \ lib/evas/filters/evas_filter_mask.c \ lib/evas/filters/evas_filter_parser.c \ lib/evas/filters/evas_filter_transform.c \ diff --git a/src/lib/evas/filters/evas_filter.c b/src/lib/evas/filters/evas_filter.c index 42f2da8578..b7d8370973 100644 --- a/src/lib/evas/filters/evas_filter.c +++ b/src/lib/evas/filters/evas_filter.c @@ -28,11 +28,6 @@ static void _buffer_free(Evas_Filter_Buffer *fb); static void _command_del(Evas_Filter_Context *ctx, Evas_Filter_Command *cmd); static RGBA_Image *_rgba_image_alloc(Evas_Filter_Buffer const *fb, void *data); -#ifdef CLAMP -# undef CLAMP -#endif -#define CLAMP(a,b,c) MIN(MAX((b),(a)),(c)) - #define DRAW_COLOR_SET(r, g, b, a) do { cmd->draw.R = r; cmd->draw.G = g; cmd->draw.B = b; cmd->draw.A = a; } while (0) #define DRAW_CLIP_SET(_x, _y, _w, _h) do { cmd->draw.clip.x = _x; cmd->draw.clip.y = _y; cmd->draw.clip.w = _w; cmd->draw.clip.h = _h; } while (0) #define DRAW_FILL_SET(fmode) do { cmd->draw.fillmode = fmode; } while (0) @@ -1365,71 +1360,6 @@ evas_filter_command_transform_add(Evas_Filter_Context *ctx, return cmd->id; } -static Eina_Bool -_fill_cpu(Evas_Filter_Command *cmd) -{ - Evas_Filter_Buffer *fb = cmd->output; - int step = fb->alpha_only ? sizeof(DATA8) : sizeof(DATA32); - int x = MAX(0, cmd->draw.clip.x); - int y = MAX(0, cmd->draw.clip.y); - DATA8 *ptr = ((RGBA_Image *) fb->backing)->image.data8; - int w, h, k, j; - - if (!cmd->draw.clip_mode_lrtb) - { - if (cmd->draw.clip.w) - w = MIN(cmd->draw.clip.w, fb->w - x); - else - w = fb->w - x; - if (cmd->draw.clip.h) - h = MIN(cmd->draw.clip.h, fb->h - y); - else - h = fb->h - y; - } - else - { - x = MAX(0, cmd->draw.clip.l); - y = MAX(0, cmd->draw.clip.t); - w = CLAMP(0, fb->w - x - cmd->draw.clip.r, fb->w - x); - h = CLAMP(0, fb->h - y - cmd->draw.clip.b, fb->h - y); - } - - ptr += y * step * fb->w; - if ((fb->alpha_only) - || (!cmd->draw.R && !cmd->draw.G && !cmd->draw.B && !cmd->draw.A) - || ((cmd->draw.R == 0xff) && (cmd->draw.G == 0xff) - && (cmd->draw.B == 0xff) && (cmd->draw.A == 0xff))) - { - for (k = 0; k < h; k++) - { - memset(ptr + (x * step), cmd->draw.A, step * w); - ptr += step * fb->w; - } - } - else - { - DATA32 *dst = ((DATA32 *) ptr) + x; - DATA32 color = ARGB_JOIN(cmd->draw.A, cmd->draw.R, cmd->draw.G, cmd->draw.B); - for (k = 0; k < h; k++) - { - for (j = 0; j < w; j++) - *dst++ = color; - dst += fb->w - w; - } - } - - return EINA_TRUE; -} - -Evas_Filter_Apply_Func -evas_filter_fill_cpu_func_get(Evas_Filter_Command *cmd) -{ - EINA_SAFETY_ON_NULL_RETURN_VAL(cmd, NULL); - EINA_SAFETY_ON_NULL_RETURN_VAL(cmd->output, NULL); - return _fill_cpu; -} - - /* Final target */ Eina_Bool evas_filter_target_set(Evas_Filter_Context *ctx, void *draw_context, diff --git a/src/lib/evas/filters/evas_filter_fill.c b/src/lib/evas/filters/evas_filter_fill.c new file mode 100644 index 0000000000..52932333e0 --- /dev/null +++ b/src/lib/evas/filters/evas_filter_fill.c @@ -0,0 +1,65 @@ +#include "evas_filter_private.h" + +static Eina_Bool +_fill_cpu(Evas_Filter_Command *cmd) +{ + Evas_Filter_Buffer *fb = cmd->output; + int step = fb->alpha_only ? sizeof(DATA8) : sizeof(DATA32); + int x = MAX(0, cmd->draw.clip.x); + int y = MAX(0, cmd->draw.clip.y); + DATA8 *ptr = ((RGBA_Image *) fb->backing)->image.data8; + int w, h, k, j; + + if (!cmd->draw.clip_mode_lrtb) + { + if (cmd->draw.clip.w) + w = MIN(cmd->draw.clip.w, fb->w - x); + else + w = fb->w - x; + if (cmd->draw.clip.h) + h = MIN(cmd->draw.clip.h, fb->h - y); + else + h = fb->h - y; + } + else + { + x = MAX(0, cmd->draw.clip.l); + y = MAX(0, cmd->draw.clip.t); + w = CLAMP(0, fb->w - x - cmd->draw.clip.r, fb->w - x); + h = CLAMP(0, fb->h - y - cmd->draw.clip.b, fb->h - y); + } + + ptr += y * step * fb->w; + if ((fb->alpha_only) + || (!cmd->draw.R && !cmd->draw.G && !cmd->draw.B && !cmd->draw.A) + || ((cmd->draw.R == 0xff) && (cmd->draw.G == 0xff) + && (cmd->draw.B == 0xff) && (cmd->draw.A == 0xff))) + { + for (k = 0; k < h; k++) + { + memset(ptr + (x * step), cmd->draw.A, step * w); + ptr += step * fb->w; + } + } + else + { + DATA32 *dst = ((DATA32 *) ptr) + x; + DATA32 color = ARGB_JOIN(cmd->draw.A, cmd->draw.R, cmd->draw.G, cmd->draw.B); + for (k = 0; k < h; k++) + { + for (j = 0; j < w; j++) + *dst++ = color; + dst += fb->w - w; + } + } + + return EINA_TRUE; +} + +Evas_Filter_Apply_Func +evas_filter_fill_cpu_func_get(Evas_Filter_Command *cmd) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(cmd, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(cmd->output, NULL); + return _fill_cpu; +} diff --git a/src/lib/evas/include/evas_macros.h b/src/lib/evas/include/evas_macros.h index ed29dbd75f..c3bc339de5 100644 --- a/src/lib/evas/include/evas_macros.h +++ b/src/lib/evas/include/evas_macros.h @@ -13,6 +13,10 @@ #undef MAX #define MAX(x, y) (((x) > (y)) ? (x) : (y)) +/* clamp b between a and c */ +#undef CLAMP +#define CLAMP(a,b,c) MIN(MAX((b),(a)),(c)) + #define SWAP32(x) (x) = \ ((((x) & 0x000000ff ) << 24) | \ (((x) & 0x0000ff00 ) << 8) | \