summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2014-10-22 11:12:33 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2014-10-22 11:14:09 +0900
commit6935880171c4d5d75c5944ec2e85720939c1ad26 (patch)
treed455f1564b417e8bf22c77206bdb6762bce0306b
parent9364083b44c4cfa1ffec4dc90e625eb0f9f85c1f (diff)
downloadefl-6935880171c4d5d75c5944ec2e85720939c1ad26.tar.gz
Evas filters: Move filter COW to evas global stuff
It will be shared between TEXT and IMAGE objects.
-rw-r--r--src/lib/evas/canvas/evas_object_main.c12
-rw-r--r--src/lib/evas/canvas/evas_object_text.c82
-rw-r--r--src/lib/evas/include/evas_filter.h1
-rw-r--r--src/lib/evas/include/evas_private.h16
4 files changed, 48 insertions, 63 deletions
diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c
index 816e043d7f..b288623d69 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -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;
}
diff --git a/src/lib/evas/canvas/evas_object_text.c b/src/lib/evas/canvas/evas_object_text.c
index 5190c7ae03..4be7f37f16 100644
--- a/src/lib/evas/canvas/evas_object_text.c
+++ b/src/lib/evas/canvas/evas_object_text.c
@@ -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);
}
diff --git a/src/lib/evas/include/evas_filter.h b/src/lib/evas/include/evas_filter.h
index 7bbecf3555..70b45bfdb1 100644
--- a/src/lib/evas/include/evas_filter.h
+++ b/src/lib/evas/include/evas_filter.h
@@ -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;
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 1f21522ef4..08fc629caf 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -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)