Evas filters: Introduce "fill" mode in script API

This would mean: repeat (X,Y) or stretch (X,Y), for buffer
operations where it means something (blend, bump, ...)
This commit is contained in:
Jean-Philippe Andre 2013-12-31 16:01:06 +09:00
parent 37eb6b6233
commit a87ef5735d
2 changed files with 63 additions and 0 deletions

View File

@ -33,6 +33,25 @@ static struct
{ "transparent", 0x00000000 }
};
static struct
{
const char *name;
Evas_Filter_Fill_Mode value;
} fill_modes[] =
{
{ "none", EVAS_FILTER_FILL_MODE_NONE },
{ "stretch_x", EVAS_FILTER_FILL_MODE_STRETCH_X },
{ "stretch_y", EVAS_FILTER_FILL_MODE_STRETCH_Y },
{ "repeat_x", EVAS_FILTER_FILL_MODE_REPEAT_X },
{ "repeat_y", EVAS_FILTER_FILL_MODE_REPEAT_Y },
{ "repeat_x_stretch_y", EVAS_FILTER_FILL_MODE_REPEAT_X_STRETCH_Y },
{ "repeat_y_stretch_x", EVAS_FILTER_FILL_MODE_REPEAT_Y_STRETCH_X },
{ "repeat", EVAS_FILTER_FILL_MODE_REPEAT_XY }, // alias
{ "repeat_xy", EVAS_FILTER_FILL_MODE_REPEAT_XY },
{ "stretch", EVAS_FILTER_FILL_MODE_STRETCH_XY }, // alias
{ "stretch_xy", EVAS_FILTER_FILL_MODE_STRETCH_XY }
};
typedef enum
{
VT_NONE,
@ -682,6 +701,7 @@ _blend_instruction_prepare(Evas_Filter_Instruction *instr)
_instruction_param_seq_add(instr, "ox", VT_INT, 0);
_instruction_param_seq_add(instr, "oy", VT_INT, 0);
_instruction_param_name_add(instr, "color", VT_COLOR, 0xFFFFFFFF);
_instruction_param_name_add(instr, "fill", VT_STRING, "none");
return EINA_TRUE;
}
@ -791,6 +811,7 @@ _bump_instruction_prepare(Evas_Filter_Instruction *instr)
_instruction_param_name_add(instr, "dst", VT_BUFFER, "output");
_instruction_param_name_add(instr, "black", VT_COLOR, 0xFF000000);
_instruction_param_name_add(instr, "white", VT_COLOR, 0xFFFFFFFF);
_instruction_param_name_add(instr, "fill", VT_STRING, "repeat");
return EINA_TRUE;
}
@ -872,6 +893,7 @@ _displace_instruction_prepare(Evas_Filter_Instruction *instr)
_instruction_param_seq_add(instr, "flags", VT_INT, 0x0); // FIXME
_instruction_param_name_add(instr, "src", VT_BUFFER, "input");
_instruction_param_name_add(instr, "dst", VT_BUFFER, "output");
_instruction_param_name_add(instr, "fill", VT_STRING, "repeat");
return EINA_TRUE;
}
@ -968,6 +990,7 @@ _mask_instruction_prepare(Evas_Filter_Instruction *instr)
_instruction_param_seq_add(instr, "src", VT_BUFFER, "input");
_instruction_param_seq_add(instr, "dst", VT_BUFFER, "output");
_instruction_param_name_add(instr, "color", VT_COLOR, 0xFFFFFFFF);
_instruction_param_name_add(instr, "fill", VT_STRING, "none");
return EINA_TRUE;
}
@ -1267,6 +1290,24 @@ evas_filter_program_proxy_source_get(Evas_Filter_Program *pgm, const char *name)
#define RESETCOLOR() do { ENFN->context_color_set(ENDT, dc, R, G, B, A); } while (0)
int A, R, G, B;
static Evas_Filter_Fill_Mode
_fill_mode_get(Evas_Filter_Instruction *instr)
{
const char *fill;
unsigned k;
if (!instr) return EVAS_FILTER_FILL_MODE_NONE;
fill = _instruction_param_gets(instr, "fill", NULL);
for (k = 0; k < sizeof(fill_modes) / sizeof(fill_modes[0]); k++)
{
if (!strcasecmp(fill_modes[k].name, fill))
return fill_modes[k].value;
}
return EVAS_FILTER_FILL_MODE_NONE;
}
static int
_instr2cmd_blend(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm,
Evas_Filter_Instruction *instr, void *dc)
@ -1275,6 +1316,7 @@ _instr2cmd_blend(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm,
const char *src, *dst;
DATA32 color;
Buffer *in, *out;
Evas_Filter_Fill_Mode fillmode;
int cmdid, ox, oy;
src = _instruction_param_gets(instr, "src", NULL);
@ -1282,6 +1324,7 @@ _instr2cmd_blend(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm,
ox = _instruction_param_geti(instr, "ox", NULL);
oy = _instruction_param_geti(instr, "oy", NULL);
color = _instruction_param_getc(instr, "color", &isset);
fillmode = _fill_mode_get(instr);
in = _buffer_get(pgm, src);
out = _buffer_get(pgm, dst);
@ -1342,6 +1385,7 @@ _instr2cmd_bump(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm,
Evas_Filter_Instruction *instr, void *dc)
{
Evas_Filter_Bump_Flags flags = EVAS_FILTER_BUMP_NORMAL;
Evas_Filter_Fill_Mode fillmode;
const char *src, *dst, *map;
DATA32 color, black, white;
Buffer *in, *out, *bump;
@ -1359,6 +1403,7 @@ _instr2cmd_bump(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm,
depth = _instruction_param_getd(instr, "depth", NULL);
specular = _instruction_param_getd(instr, "specular", NULL);
compensate = _instruction_param_geti(instr, "compensate", NULL);
fillmode = _fill_mode_get(instr);
if (compensate) flags |= EVAS_FILTER_BUMP_COMPENSATE;
in = _buffer_get(pgm, src);
@ -1377,6 +1422,7 @@ _instr2cmd_displace(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm,
Evas_Filter_Instruction *instr, void *dc)
{
//Evas_Filter_Displacement_Flags flags = EVAS_FILTER_DISPLACE_RG;
Evas_Filter_Fill_Mode fillmode;
const char *src, *dst, *map;
Buffer *in, *out, *mask;
int cmdid, intensity, flags;
@ -1386,6 +1432,7 @@ _instr2cmd_displace(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm,
map = _instruction_param_gets(instr, "map", NULL);
intensity = _instruction_param_geti(instr, "intensity", NULL);
flags = _instruction_param_geti(instr, "flags", NULL);
fillmode = _fill_mode_get(instr);
in = _buffer_get(pgm, src);
out = _buffer_get(pgm, dst);
@ -1448,6 +1495,7 @@ static int
_instr2cmd_mask(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm,
Evas_Filter_Instruction *instr, void *dc)
{
Evas_Filter_Fill_Mode fillmode;
const char *src, *dst, *msk;
Buffer *in, *out, *mask;
DATA32 color;
@ -1458,6 +1506,7 @@ _instr2cmd_mask(Evas_Filter_Context *ctx, Evas_Filter_Program *pgm,
dst = _instruction_param_gets(instr, "dst", NULL);
msk = _instruction_param_gets(instr, "mask", NULL);
color = _instruction_param_getc(instr, "color", NULL);
fillmode = _fill_mode_get(instr);
in = _buffer_get(pgm, src);
out = _buffer_get(pgm, dst);

View File

@ -13,6 +13,7 @@ typedef enum _Evas_Filter_Blur_Type Evas_Filter_Blur_Type;
typedef enum _Evas_Filter_Channel Evas_Filter_Channel;
typedef enum _Evas_Filter_Displacement_Flags Evas_Filter_Displacement_Flags;
typedef enum _Evas_Filter_Bump_Flags Evas_Filter_Bump_Flags;
typedef enum _Evas_Filter_Fill_Mode Evas_Filter_Fill_Mode;
typedef Eina_Bool (* Evas_Filter_Apply_Func) (Evas_Filter_Command *cmd);
typedef void (* Evas_Filter_Cb) (Evas_Filter_Context *ctx, void *data);
@ -74,6 +75,19 @@ enum _Evas_Filter_Bump_Flags
EVAS_FILTER_BUMP_COMPENSATE = 0x1 /**< Compensate for darkening (diffuse light) or brightening (specular light) of zero gradient surfaces */
};
enum _Evas_Filter_Fill_Mode
{
EVAS_FILTER_FILL_MODE_NONE = 0x0,
EVAS_FILTER_FILL_MODE_STRETCH_X = 0x1,
EVAS_FILTER_FILL_MODE_STRETCH_Y = 0x2,
EVAS_FILTER_FILL_MODE_REPEAT_X = 0x4,
EVAS_FILTER_FILL_MODE_REPEAT_Y = 0x8,
EVAS_FILTER_FILL_MODE_REPEAT_X_STRETCH_Y = EVAS_FILTER_FILL_MODE_REPEAT_X | EVAS_FILTER_FILL_MODE_STRETCH_Y,
EVAS_FILTER_FILL_MODE_REPEAT_Y_STRETCH_X = EVAS_FILTER_FILL_MODE_REPEAT_Y | EVAS_FILTER_FILL_MODE_STRETCH_X,
EVAS_FILTER_FILL_MODE_REPEAT_XY = EVAS_FILTER_FILL_MODE_REPEAT_X | EVAS_FILTER_FILL_MODE_REPEAT_Y,
EVAS_FILTER_FILL_MODE_STRETCH_XY = EVAS_FILTER_FILL_MODE_STRETCH_X | EVAS_FILTER_FILL_MODE_STRETCH_Y
};
/* Parser stuff (high level API) */
Evas_Filter_Program *evas_filter_program_new(const char *name);
Eina_Bool evas_filter_program_parse(Evas_Filter_Program *pgm, const char *str);