forked from enlightenment/efl
Evas filters: Move filter COW to evas global stuff
It will be shared between TEXT and IMAGE objects.
This commit is contained in:
parent
9364083b44
commit
6935880171
|
@ -32,25 +32,30 @@ static const Evas_Object_Protected_State default_state = {
|
|||
{ 255, 255, 255, 255 },
|
||||
1.0, 0, EVAS_RENDER_BLEND, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE
|
||||
};
|
||||
static const Evas_Object_Filter_Data default_filter = {
|
||||
NULL, NULL, NULL, 0, NULL, EINA_FALSE, EINA_FALSE
|
||||
};
|
||||
|
||||
Eina_Cow *evas_object_proxy_cow = NULL;
|
||||
Eina_Cow *evas_object_map_cow = NULL;
|
||||
Eina_Cow *evas_object_state_cow = NULL;
|
||||
|
||||
Eina_Cow *evas_object_3d_cow = NULL;
|
||||
Eina_Cow *evas_object_filter_cow = NULL;
|
||||
|
||||
static Eina_Bool
|
||||
_init_cow(void)
|
||||
{
|
||||
if (evas_object_map_cow && evas_object_proxy_cow && evas_object_state_cow && evas_object_3d_cow) return EINA_TRUE;
|
||||
if (evas_object_map_cow && evas_object_proxy_cow && evas_object_state_cow && evas_object_3d_cow && evas_object_filter_cow) return EINA_TRUE;
|
||||
|
||||
evas_object_proxy_cow = eina_cow_add("Evas Object Proxy", sizeof (Evas_Object_Proxy_Data), 8, &default_proxy, EINA_TRUE);
|
||||
evas_object_map_cow = eina_cow_add("Evas Object Map", sizeof (Evas_Object_Map_Data), 8, &default_map, EINA_TRUE);
|
||||
evas_object_state_cow = eina_cow_add("Evas Object State", sizeof (Evas_Object_Protected_State), 64, &default_state, EINA_FALSE);
|
||||
|
||||
evas_object_3d_cow = eina_cow_add("Evas Object 3D", sizeof (Evas_Object_3D_Data), 8, &default_proxy, EINA_TRUE);
|
||||
evas_object_filter_cow = eina_cow_add("Evas Filter Data", sizeof (Evas_Object_Filter_Data), 8, &default_filter, EINA_TRUE);
|
||||
|
||||
if (!(evas_object_map_cow && evas_object_proxy_cow && evas_object_state_cow && evas_object_3d_cow))
|
||||
if (!(evas_object_map_cow && evas_object_proxy_cow && evas_object_state_cow && evas_object_3d_cow && evas_object_filter_cow))
|
||||
{
|
||||
eina_cow_del(evas_object_proxy_cow);
|
||||
eina_cow_del(evas_object_map_cow);
|
||||
|
@ -62,6 +67,9 @@ _init_cow(void)
|
|||
eina_cow_del(evas_object_3d_cow);
|
||||
evas_object_3d_cow = NULL;
|
||||
|
||||
eina_cow_del(evas_object_filter_cow);
|
||||
evas_object_filter_cow = NULL;
|
||||
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,6 @@ static const char o_type[] = "text";
|
|||
/* private struct for text object internal data */
|
||||
typedef struct _Evas_Text_Data Evas_Text_Data;
|
||||
typedef struct _Evas_Object_Text_Item Evas_Object_Text_Item;
|
||||
typedef struct _Evas_Filter_Data Evas_Filter_Data;
|
||||
|
||||
struct _Evas_Text_Data
|
||||
{
|
||||
|
@ -42,7 +41,7 @@ struct _Evas_Text_Data
|
|||
Evas_Font_Size size;
|
||||
Evas_Text_Style_Type style;
|
||||
|
||||
const Evas_Filter_Data* filter; // cow
|
||||
const Evas_Object_Filter_Data* filter; // cow
|
||||
} cur, prev;
|
||||
|
||||
struct {
|
||||
|
@ -77,17 +76,6 @@ struct _Evas_Object_Text_Item
|
|||
Evas_Coord x, w, h, adv;
|
||||
};
|
||||
|
||||
struct _Evas_Filter_Data
|
||||
{
|
||||
Eina_Stringshare *code;
|
||||
Evas_Filter_Program *chain;
|
||||
Eina_Hash *sources; // Evas_Filter_Proxy_Binding
|
||||
int sources_count;
|
||||
void *output;
|
||||
Eina_Bool changed : 1;
|
||||
Eina_Bool invalid : 1; // Code parse failed
|
||||
};
|
||||
|
||||
/* private methods for text objects */
|
||||
static void evas_object_text_init(Evas_Object *eo_obj);
|
||||
static void evas_object_text_render(Evas_Object *eo_obj,
|
||||
|
@ -145,9 +133,6 @@ static const Evas_Object_Func object_func =
|
|||
NULL
|
||||
};
|
||||
|
||||
static Eina_Cow *evas_filter_cow = NULL;
|
||||
static const Evas_Filter_Data evas_filter_cow_default_data = {0};
|
||||
|
||||
/* the actual api call to add a rect */
|
||||
/* it has no other api calls as all properties are standard */
|
||||
|
||||
|
@ -380,26 +365,6 @@ evas_object_text_add(Evas *e)
|
|||
return eo_obj;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_init_cow(Eo *eo_obj)
|
||||
{
|
||||
if (!evas_filter_cow)
|
||||
{
|
||||
evas_filter_cow = eina_cow_add("Evas filter data",
|
||||
sizeof (Evas_Filter_Data),
|
||||
8,
|
||||
&evas_filter_cow_default_data,
|
||||
EINA_TRUE);
|
||||
}
|
||||
if (!evas_filter_cow)
|
||||
{
|
||||
eo_error_set(eo_obj);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
_evas_text_eo_base_constructor(Eo *eo_obj, Evas_Text_Data *o)
|
||||
{
|
||||
|
@ -411,10 +376,7 @@ _evas_text_eo_base_constructor(Eo *eo_obj, Evas_Text_Data *o)
|
|||
eo_do(eo_obj, parent = eo_parent_get());
|
||||
evas_object_inject(eo_obj, obj, evas_object_evas_get(parent));
|
||||
|
||||
if (!_init_cow(eo_obj))
|
||||
return;
|
||||
|
||||
o->cur.filter = eina_cow_alloc(evas_filter_cow);
|
||||
o->cur.filter = eina_cow_alloc(evas_object_filter_cow);
|
||||
}
|
||||
|
||||
EOLIAN static void
|
||||
|
@ -443,9 +405,9 @@ _evas_text_filter_changed_set(Evas_Text_Data *o, Eina_Bool val)
|
|||
{
|
||||
if (o->cur.filter && (o->cur.filter->changed != val))
|
||||
{
|
||||
EINA_COW_WRITE_BEGIN(evas_filter_cow, o->cur.filter, Evas_Filter_Data, fcow)
|
||||
EINA_COW_WRITE_BEGIN(evas_object_filter_cow, o->cur.filter, Evas_Object_Filter_Data, fcow)
|
||||
fcow->changed = val;
|
||||
EINA_COW_WRITE_END(evas_filter_cow, o->cur.filter, fcow);
|
||||
EINA_COW_WRITE_END(evas_object_filter_cow, o->cur.filter, fcow);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1582,7 +1544,7 @@ evas_object_text_free(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
|
|||
/* free filter output */
|
||||
if (o->cur.filter)
|
||||
{
|
||||
EINA_COW_WRITE_BEGIN(evas_filter_cow, o->cur.filter, Evas_Filter_Data, fcow)
|
||||
EINA_COW_WRITE_BEGIN(evas_object_filter_cow, o->cur.filter, Evas_Object_Filter_Data, fcow)
|
||||
{
|
||||
if (fcow->output)
|
||||
ENFN->image_free(ENDT, fcow->output);
|
||||
|
@ -1595,7 +1557,7 @@ evas_object_text_free(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
|
|||
fcow->code = NULL;
|
||||
fcow->sources_count = 0;
|
||||
}
|
||||
EINA_COW_WRITE_END(evas_filter_cow, o->cur.filter, fcow);
|
||||
EINA_COW_WRITE_END(evas_object_filter_cow, o->cur.filter, fcow);
|
||||
}
|
||||
|
||||
/* free obj */
|
||||
|
@ -1647,9 +1609,9 @@ _filter_cb(Evas_Filter_Context *ctx, void *data, Eina_Bool success)
|
|||
Evas_Text_Data *o = (Evas_Text_Data *) obj->private_data;
|
||||
|
||||
ERR("Filter failed at runtime!");
|
||||
EINA_COW_WRITE_BEGIN(evas_filter_cow, o->cur.filter, Evas_Filter_Data, fcow)
|
||||
EINA_COW_WRITE_BEGIN(evas_object_filter_cow, o->cur.filter, Evas_Object_Filter_Data, fcow)
|
||||
fcow->invalid = EINA_TRUE;
|
||||
EINA_COW_WRITE_END(evas_filter_cow, o->cur.filter, fcow);
|
||||
EINA_COW_WRITE_END(evas_object_filter_cow, o->cur.filter, fcow);
|
||||
|
||||
// Update object
|
||||
_evas_object_text_items_clear(o);
|
||||
|
@ -1780,8 +1742,8 @@ evas_object_text_render(Evas_Object *eo_obj,
|
|||
Eina_Bool ok;
|
||||
int ox = 0, oy = 0;
|
||||
void *previous = o->cur.filter->output;
|
||||
Evas_Filter_Data *fcow =
|
||||
eina_cow_write(evas_filter_cow, (const Eina_Cow_Data**)&(o->cur.filter));
|
||||
Evas_Object_Filter_Data *fcow =
|
||||
eina_cow_write(evas_object_filter_cow, (const Eina_Cow_Data**)&(o->cur.filter));
|
||||
|
||||
/* NOTE: Font effect rendering is now done ENTIRELY on CPU.
|
||||
* So we rely on cache/cache2 to allocate a real image buffer,
|
||||
|
@ -1819,7 +1781,7 @@ evas_object_text_render(Evas_Object *eo_obj,
|
|||
evas_filter_program_del(pgm);
|
||||
fcow->invalid = EINA_TRUE;
|
||||
|
||||
eina_cow_done(evas_filter_cow, (const Eina_Cow_Data**)&(o->cur.filter),
|
||||
eina_cow_done(evas_object_filter_cow, (const Eina_Cow_Data**)&(o->cur.filter),
|
||||
fcow, EINA_TRUE);
|
||||
goto normal_render;
|
||||
}
|
||||
|
@ -1860,7 +1822,7 @@ evas_object_text_render(Evas_Object *eo_obj,
|
|||
EINA_FALSE, // smooth
|
||||
do_async);
|
||||
|
||||
eina_cow_done(evas_filter_cow, (const Eina_Cow_Data**)&(o->cur.filter),
|
||||
eina_cow_done(evas_object_filter_cow, (const Eina_Cow_Data**)&(o->cur.filter),
|
||||
fcow, EINA_TRUE);
|
||||
return;
|
||||
}
|
||||
|
@ -1873,7 +1835,7 @@ evas_object_text_render(Evas_Object *eo_obj,
|
|||
ERR("Parsing failed?");
|
||||
evas_filter_context_destroy(filter);
|
||||
|
||||
eina_cow_done(evas_filter_cow, (const Eina_Cow_Data**)&(o->cur.filter),
|
||||
eina_cow_done(evas_object_filter_cow, (const Eina_Cow_Data**)&(o->cur.filter),
|
||||
fcow, EINA_TRUE);
|
||||
goto normal_render;
|
||||
}
|
||||
|
@ -1914,7 +1876,7 @@ evas_object_text_render(Evas_Object *eo_obj,
|
|||
|
||||
if (!ok) fcow->invalid = EINA_TRUE;
|
||||
|
||||
eina_cow_done(evas_filter_cow, (const Eina_Cow_Data**)&(o->cur.filter),
|
||||
eina_cow_done(evas_object_filter_cow, (const Eina_Cow_Data**)&(o->cur.filter),
|
||||
fcow, EINA_TRUE);
|
||||
|
||||
if (ok)
|
||||
|
@ -2407,7 +2369,7 @@ _evas_text_filter_program_set(Eo *eo_obj, Evas_Text_Data *o, const char *arg)
|
|||
if (o->cur.filter->code && arg && !strcmp(arg, o->cur.filter->code)) return;
|
||||
}
|
||||
|
||||
EINA_COW_WRITE_BEGIN(evas_filter_cow, o->cur.filter, Evas_Filter_Data, fcow)
|
||||
EINA_COW_WRITE_BEGIN(evas_object_filter_cow, o->cur.filter, Evas_Object_Filter_Data, fcow)
|
||||
{
|
||||
// Parse filter program
|
||||
evas_filter_program_del(fcow->chain);
|
||||
|
@ -2427,7 +2389,7 @@ _evas_text_filter_program_set(Eo *eo_obj, Evas_Text_Data *o, const char *arg)
|
|||
fcow->invalid = (pgm == NULL);
|
||||
eina_stringshare_replace(&fcow->code, arg);
|
||||
}
|
||||
EINA_COW_WRITE_END(evas_filter_cow, o->cur.filter, fcow);
|
||||
EINA_COW_WRITE_END(evas_object_filter_cow, o->cur.filter, fcow);
|
||||
|
||||
// Update object
|
||||
obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
|
||||
|
@ -2462,9 +2424,9 @@ _filter_source_hash_free_cb(void *data)
|
|||
|
||||
if (o && proxy)
|
||||
{
|
||||
EINA_COW_WRITE_BEGIN(evas_filter_cow, o->cur.filter, Evas_Filter_Data, fcow)
|
||||
EINA_COW_WRITE_BEGIN(evas_object_filter_cow, o->cur.filter, Evas_Object_Filter_Data, fcow)
|
||||
fcow->sources_count--;
|
||||
EINA_COW_WRITE_END(evas_filter_cow, o->cur.filter, fcow);
|
||||
EINA_COW_WRITE_END(evas_object_filter_cow, o->cur.filter, fcow);
|
||||
|
||||
if (!o->cur.filter->sources_count)
|
||||
{
|
||||
|
@ -2485,7 +2447,7 @@ _evas_text_filter_source_set(Eo *eo_obj, Evas_Text_Data *o, const char *name, Ev
|
|||
Evas_Object_Protected_Data *obj;
|
||||
Evas_Filter_Proxy_Binding *pb, *pb_old = NULL;
|
||||
Evas_Object_Protected_Data *source = NULL;
|
||||
Evas_Filter_Data *fcow = NULL;
|
||||
Evas_Object_Filter_Data *fcow = NULL;
|
||||
|
||||
obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
|
||||
if (eo_source) source = eo_data_scope_get(eo_source, EVAS_OBJECT_CLASS);
|
||||
|
@ -2501,7 +2463,7 @@ _evas_text_filter_source_set(Eo *eo_obj, Evas_Text_Data *o, const char *name, Ev
|
|||
if (!source && (!o->cur.filter || !o->cur.filter->sources))
|
||||
return;
|
||||
|
||||
fcow = eina_cow_write(evas_filter_cow, (const Eina_Cow_Data**)&o->cur.filter);
|
||||
fcow = eina_cow_write(evas_object_filter_cow, (const Eina_Cow_Data**)&o->cur.filter);
|
||||
|
||||
if (!fcow->sources)
|
||||
{
|
||||
|
@ -2523,7 +2485,7 @@ _evas_text_filter_source_set(Eo *eo_obj, Evas_Text_Data *o, const char *name, Ev
|
|||
pb_old = eina_hash_find(fcow->sources, name);
|
||||
if (!pb_old)
|
||||
{
|
||||
eina_cow_done(evas_filter_cow, (const Eina_Cow_Data**)&o->cur.filter,
|
||||
eina_cow_done(evas_object_filter_cow, (const Eina_Cow_Data**)&o->cur.filter,
|
||||
fcow, EINA_TRUE);
|
||||
return;
|
||||
}
|
||||
|
@ -2558,7 +2520,7 @@ update:
|
|||
{
|
||||
fcow->changed = EINA_TRUE;
|
||||
fcow->invalid = EINA_FALSE;
|
||||
eina_cow_done(evas_filter_cow, (const Eina_Cow_Data**)&o->cur.filter,
|
||||
eina_cow_done(evas_object_filter_cow, (const Eina_Cow_Data**)&o->cur.filter,
|
||||
fcow, EINA_TRUE);
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
|
||||
typedef struct _Evas_Filter_Context Evas_Filter_Context;
|
||||
typedef struct _Evas_Filter_Command Evas_Filter_Command;
|
||||
typedef struct _Evas_Filter_Program Evas_Filter_Program;
|
||||
typedef struct _Evas_Filter_Instruction Evas_Filter_Instruction;
|
||||
typedef struct _Evas_Filter_Buffer Evas_Filter_Buffer;
|
||||
typedef struct _Evas_Filter_Proxy_Binding Evas_Filter_Proxy_Binding;
|
||||
|
|
|
@ -52,6 +52,9 @@ typedef struct _Evas_Object_3D_Data Evas_Object_3D_Data;
|
|||
typedef struct _Evas_Object_Protected_State Evas_Object_Protected_State;
|
||||
typedef struct _Evas_Object_Protected_Data Evas_Object_Protected_Data;
|
||||
|
||||
typedef struct _Evas_Filter_Program Evas_Filter_Program;
|
||||
typedef struct _Evas_Object_Filter_Data Evas_Object_Filter_Data;
|
||||
|
||||
// 3D stuff
|
||||
|
||||
#define EVAS_3D_VERTEX_ATTRIB_COUNT 5
|
||||
|
@ -1074,6 +1077,17 @@ struct _Evas_Device
|
|||
Evas_Device_Subclass subclas;
|
||||
};
|
||||
|
||||
struct _Evas_Object_Filter_Data
|
||||
{
|
||||
Eina_Stringshare *code;
|
||||
Evas_Filter_Program *chain;
|
||||
Eina_Hash *sources; // Evas_Filter_Proxy_Binding
|
||||
int sources_count;
|
||||
void *output;
|
||||
Eina_Bool changed : 1;
|
||||
Eina_Bool invalid : 1; // Code parse failed
|
||||
};
|
||||
|
||||
struct _Evas_Object_Func
|
||||
{
|
||||
void (*free) (Evas_Object *obj, Evas_Object_Protected_Data *pd, void *type_private_data);
|
||||
|
@ -1701,6 +1715,8 @@ extern Eina_Cow *evas_object_image_pixels_cow;
|
|||
extern Eina_Cow *evas_object_image_load_opts_cow;
|
||||
extern Eina_Cow *evas_object_image_state_cow;
|
||||
|
||||
extern Eina_Cow *evas_object_filter_cow;
|
||||
|
||||
# define EINA_COW_STATE_WRITE_BEGIN(Obj, Write, State) \
|
||||
EINA_COW_WRITE_BEGIN(evas_object_state_cow, Obj->State, \
|
||||
Evas_Object_Protected_State, Write)
|
||||
|
|
Loading…
Reference in New Issue