jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=6935880171c4d5d75c5944ec2e85720939c1ad26

commit 6935880171c4d5d75c5944ec2e85720939c1ad26
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Wed Oct 22 11:12:33 2014 +0900

    Evas filters: Move filter COW to evas global stuff
    
    It will be shared between TEXT and IMAGE objects.
---
 src/lib/evas/canvas/evas_object_main.c | 12 ++++-
 src/lib/evas/canvas/evas_object_text.c | 82 +++++++++-------------------------
 src/lib/evas/include/evas_filter.h     |  1 -
 src/lib/evas/include/evas_private.h    | 16 +++++++
 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 816e043..b288623 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 5190c7a..4be7f37 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 7bbecf3..70b45bf 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 1f21522..08fc629 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)

-- 


Reply via email to