jpeg pushed a commit to branch master.

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

commit fe14ab64f3906009287c5d9213274b49f2f034ba
Author: Jean-Philippe Andre <[email protected]>
Date:   Tue Sep 6 21:03:11 2016 +0900

    evas: Small simplification of object color_set
---
 src/lib/evas/canvas/evas_object_main.c | 39 ++++++++--------------------------
 src/lib/evas/include/evas_inline.x     | 12 +++++++++++
 2 files changed, 21 insertions(+), 30 deletions(-)

diff --git a/src/lib/evas/canvas/evas_object_main.c 
b/src/lib/evas/canvas/evas_object_main.c
index 1e63b5c..b44f4bf 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -1511,35 +1511,18 @@ EOLIAN static void
 _efl_canvas_object_efl_gfx_color_set(Eo *eo_obj, Evas_Object_Protected_Data 
*obj,
                                      int r, int g, int b, int a)
 {
+   int prev_a;
+
    if (obj->delete_me) return;
-   if (r > 255) r = 255;
-   if (r < 0) r = 0;
-   if (g > 255) g = 255;
-   if (g < 0) g = 0;
-   if (b > 255) b = 255;
-   if (b < 0) b = 0;
-   if (a > 255) a = 255;
-   if (a < 0) a = 0;
-   if (r > a)
-     {
-        r = a;
-        ERR("Evas only handles pre multiplied colors!");
-     }
-   if (g > a)
-     {
-        g = a;
-        ERR("Evas only handles pre multiplied colors!");
-     }
-   if (b > a)
-     {
-        b = a;
-        ERR("Evas only handles pre multiplied colors!");
-     }
+
+   if (EVAS_COLOR_SANITIZE(r, g, b, a))
+     ERR("Evas only handles premultiplied colors (0 <= R,G,B <= A <= 255)");
 
    evas_object_async_block(obj);
    if (evas_object_intercept_call_color_set(eo_obj, obj, r, g, b, a)) return;
    if (obj->is_smart)
      {
+        // FIXME: why is this here, before the state check?
         efl_canvas_group_color_set(eo_obj, r, g, b, a);
      }
    if ((obj->cur->color.r == r) &&
@@ -1547,22 +1530,18 @@ _efl_canvas_object_efl_gfx_color_set(Eo *eo_obj, 
Evas_Object_Protected_Data *obj
        (obj->cur->color.b == b) &&
        (obj->cur->color.a == a)) return;
 
+   prev_a = obj->cur->color.a;
    EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
      {
         state_write->color.r = r;
         state_write->color.g = g;
         state_write->color.b = b;
+        state_write->color.a = a;
      }
    EINA_COW_STATE_WRITE_END(obj, state_write, cur);
 
    evas_object_clip_dirty(eo_obj, obj);
-   if ((obj->cur->color.a == 0) && (a == 0) && (obj->cur->render_op == 
EVAS_RENDER_BLEND)) return;
-
-   EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
-     {
-        state_write->color.a = a;
-     }
-   EINA_COW_STATE_WRITE_END(obj, state_write, cur);
+   if ((prev_a == 0) && (a == 0) && (obj->cur->render_op == 
EVAS_RENDER_BLEND)) return;
 
    obj->changed_color = EINA_TRUE;
    evas_object_change(eo_obj, obj);
diff --git a/src/lib/evas/include/evas_inline.x 
b/src/lib/evas/include/evas_inline.x
index d7c94db..b784319 100644
--- a/src/lib/evas/include/evas_inline.x
+++ b/src/lib/evas/include/evas_inline.x
@@ -414,4 +414,16 @@ evas_canvas_async_block(Evas_Public_Data *e)
      }
 }
 
+#define _EVAS_COLOR_CLAMP(x, y) do { \
+   if (x > y) { x = y; bad = 1; } \
+   if (x < 0) { x = 0; bad = 1; } } while (0)
+
+#define EVAS_COLOR_SANITIZE(r, g, b, a) \
+   ({ int bad = 0; \
+   _EVAS_COLOR_CLAMP(a, 255); \
+   _EVAS_COLOR_CLAMP(r, a); \
+   _EVAS_COLOR_CLAMP(g, a); \
+   _EVAS_COLOR_CLAMP(b, a); \
+   bad; })
+
 #endif

-- 


Reply via email to