forked from enlightenment/efl
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:
parent
37eb6b6233
commit
a87ef5735d
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue