forked from enlightenment/efl
Evas filters: Move 'fill' to its own file
This commit is contained in:
parent
75fed54f0e
commit
31984449a5
|
@ -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 \
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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) | \
|
||||
|
|
Loading…
Reference in New Issue