edje: cleanup and more accurate evaluation of CURRENT.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 28 Nov 2011 10:20:51 +0000 (10:20 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 28 Nov 2011 10:20:51 +0000 (10:20 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@65642 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/edje_calc.c
src/lib/edje_private.h
src/lib/edje_program.c

index a777be8..d9fd51d 100644 (file)
@@ -1,10 +1,5 @@
 #include "edje_private.h"
 
-#define FLAG_NONE 0
-#define FLAG_X    0x01
-#define FLAG_Y    0x02
-#define FLAG_XY   (FLAG_X | FLAG_Y)
-
 static void _edje_part_make_rtl(Edje_Part_Description_Common *desc);
 static Edje_Part_Description_Common *_edje_get_description_by_orientation(Edje *ed, Edje_Part_Description_Common *src, Edje_Part_Description_Common **dst, unsigned char type);
 
@@ -14,7 +9,6 @@ static void _edje_part_recalc_single(Edje *ed, Edje_Real_Part *ep,
                                     Edje_Real_Part *rel1_to_x, Edje_Real_Part *rel1_to_y,
                                     Edje_Real_Part *rel2_to_x, Edje_Real_Part *rel2_to_y,
                                     Edje_Real_Part *confine_to, Edje_Calc_Params *params);
-static void _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags);
 
 void
 _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos, FLOAT_T v1, FLOAT_T v2)
@@ -459,7 +453,7 @@ _edje_recalc_do(Edje *ed)
 
        ep = ed->table_parts[i];
        if (ep->calculated != FLAG_XY)
-          _edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY);
+          _edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY, NULL);
      }
    if (!ed->calc_only) ed->recalc = 0;
 #ifdef EDJE_CALC_CACHE
@@ -471,7 +465,7 @@ _edje_recalc_do(Edje *ed)
 void
 _edje_part_recalc_1(Edje *ed, Edje_Real_Part *ep)
 {
-   _edje_part_recalc(ed, ep, FLAG_XY);
+  _edje_part_recalc(ed, ep, FLAG_XY, NULL);
 }
 
 int
@@ -2122,7 +2116,7 @@ _edje_real_part_state_get(Edje *ed, Edje_Real_Part *ep, int flags, int id, int *
         result = ed->table_parts[id % ed->table_parts_size];
         if (result)
           {
-             if (!result->calculated) _edje_part_recalc(ed, result, flags);
+           if (!result->calculated) _edje_part_recalc(ed, result, flags, NULL);
 #ifdef EDJE_CALC_CACHE
              if (state) *state = result->state;
 #else
@@ -2133,8 +2127,8 @@ _edje_real_part_state_get(Edje *ed, Edje_Real_Part *ep, int flags, int id, int *
    return result;
 }
 
-static void
-_edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
+void
+_edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *state)
 {
 #ifdef EDJE_CALC_CACHE
    Eina_Bool proxy_invalidate = EINA_FALSE;
@@ -2166,7 +2160,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
        return;
      }
 
-   if ((ep->calculated & FLAG_XY) == FLAG_XY)
+   if ((ep->calculated & FLAG_XY) == FLAG_XY && !state)
      {
        return;
      }
@@ -2200,7 +2194,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
        return;
      }
 #ifdef EDJE_CALC_CACHE
-   if (ep->state == ed->state)
+   if (ep->state == ed->state && !state)
      return ;
 #endif
 
@@ -2209,14 +2203,14 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
        ep->calculating |= flags & FLAG_X;
        if (ep->param1.rel1_to_x)
          {
-            _edje_part_recalc(ed, ep->param1.rel1_to_x, FLAG_X);
+           _edje_part_recalc(ed, ep->param1.rel1_to_x, FLAG_X, NULL);
 #ifdef EDJE_CALC_CACHE
             state1 = ep->param1.rel1_to_x->state;
 #endif
          }
        if (ep->param1.rel2_to_x)
          {
-            _edje_part_recalc(ed, ep->param1.rel2_to_x, FLAG_X);
+           _edje_part_recalc(ed, ep->param1.rel2_to_x, FLAG_X, NULL);
 #ifdef EDJE_CALC_CACHE
             if (state1 < ep->param1.rel2_to_x->state)
               state1 = ep->param1.rel2_to_x->state;
@@ -2226,14 +2220,14 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
          {
             if (ep->param2->rel1_to_x)
               {
-                 _edje_part_recalc(ed, ep->param2->rel1_to_x, FLAG_X);
+                _edje_part_recalc(ed, ep->param2->rel1_to_x, FLAG_X, NULL);
 #ifdef EDJE_CALC_CACHE
                  state2 = ep->param2->rel1_to_x->state;
 #endif
               }
             if (ep->param2->rel2_to_x)
               {
-                 _edje_part_recalc(ed, ep->param2->rel2_to_x, FLAG_X);
+                _edje_part_recalc(ed, ep->param2->rel2_to_x, FLAG_X, NULL);
 #ifdef EDJE_CALC_CACHE
                  if (state2 < ep->param2->rel2_to_x->state)
                    state2 = ep->param2->rel2_to_x->state;
@@ -2246,7 +2240,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
        ep->calculating |= flags & FLAG_Y;
        if (ep->param1.rel1_to_y)
          {
-            _edje_part_recalc(ed, ep->param1.rel1_to_y, FLAG_Y);
+           _edje_part_recalc(ed, ep->param1.rel1_to_y, FLAG_Y, NULL);
 #ifdef EDJE_CALC_CACHE
             if (state1 < ep->param1.rel1_to_y->state)
               state1 = ep->param1.rel1_to_y->state;
@@ -2254,7 +2248,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
          }
        if (ep->param1.rel2_to_y)
          {
-            _edje_part_recalc(ed, ep->param1.rel2_to_y, FLAG_Y);
+           _edje_part_recalc(ed, ep->param1.rel2_to_y, FLAG_Y, NULL);
 #ifdef EDJE_CALC_CACHE
             if (state1 < ep->param1.rel2_to_y->state)
               state1 = ep->param1.rel2_to_y->state;
@@ -2264,7 +2258,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
          {
             if (ep->param2->rel1_to_y)
               {
-                 _edje_part_recalc(ed, ep->param2->rel1_to_y, FLAG_Y);
+                _edje_part_recalc(ed, ep->param2->rel1_to_y, FLAG_Y, NULL);
 #ifdef EDJE_CALC_CACHE
                  if (state2 < ep->param2->rel1_to_y->state)
                    state2 = ep->param2->rel1_to_y->state;
@@ -2272,7 +2266,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
               }
             if (ep->param2->rel2_to_y)
               {
-                 _edje_part_recalc(ed, ep->param2->rel2_to_y, FLAG_Y);
+                _edje_part_recalc(ed, ep->param2->rel2_to_y, FLAG_Y, NULL);
 #ifdef EDJE_CALC_CACHE
                  if (state2 < ep->param2->rel2_to_y->state)
                    state2 = ep->param2->rel2_to_y->state;
@@ -2283,7 +2277,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
    if (ep->drag && ep->drag->confine_to)
      {
        confine_to = ep->drag->confine_to;
-       _edje_part_recalc(ed, confine_to, flags);
+       _edje_part_recalc(ed, confine_to, flags, NULL);
 #ifdef EDJE_CALC_CACHE
        statec = confine_to->state;
 #endif
@@ -2354,6 +2348,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
             statel1 >= ep->param1.state ||
             statep1 >= ep->param1.state ||
             proxy_invalidate ||
+            state ||
            ((ep->part->type == EDJE_PART_TYPE_TEXT || ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) && ed->text_part_change))
 #endif
          {
@@ -2374,23 +2369,16 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 
         if (ep->current)
           {
-             p1->x = ep->current->x - ed->x;
-             p1->y = ep->current->y - ed->y;
-             p1->w = ep->current->w;
-             p1->h = ep->current->h;
-             p1->color.r = ep->current->color.r;
-             p1->color.g = ep->current->color.g;
-             p1->color.b = ep->current->color.b;
-             p1->color.a = ep->current->color.a;
-             p1->type.text.size = ep->current->type.text.size;
-             p1->type.text.color2.r = ep->current->type.text.color2.r;
-             p1->type.text.color2.g = ep->current->type.text.color2.g;
-             p1->type.text.color2.b = ep->current->type.text.color2.b;
-             p1->type.text.color2.a = ep->current->type.text.color2.a;
-             p1->type.text.color3.r = ep->current->type.text.color3.r;
-             p1->type.text.color3.g = ep->current->type.text.color3.g;
-             p1->type.text.color3.b = ep->current->type.text.color3.b;
-             p1->type.text.color3.a = ep->current->type.text.color3.a;
+             /* FIXME: except for text, we don't need in that case to recalc p1 at all*/
+             memcpy(p1, ep->current, sizeof (Edje_Calc_Params));
+             p1->x += ed->x;
+             p1->y += ed->y;
+             p1->map.center.x += ed->x;
+             p1->map.center.y += ed->y;
+             p1->map.light.x += ed->x;
+             p1->map.light.y += ed->y;
+             p1->map.persp.x += ed->x;
+             p1->map.persp.y += ed->y;
           }
 
        p3 = &lp3;
@@ -2408,6 +2396,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
             statel2 >= ep->param2->state ||
             statep2 >= ep->param2->state ||
             proxy_invalidate ||
+            state ||
            ((ep->part->type == EDJE_PART_TYPE_TEXT || ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) && ed->text_part_change))
 #endif
          {
@@ -2603,6 +2592,11 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
           }
      }
 
+   if (state)
+     {
+        memcpy(state, pf, sizeof (Edje_Calc_Params));
+     }
+
    ep->req = pf->req;
 
    if (ep->drag && ep->drag->need_reset)
index 8a96d9c..cbb3e03 100644 (file)
@@ -410,6 +410,12 @@ typedef struct _Edje_Text_Insert_Filter_Callback Edje_Text_Insert_Filter_Callbac
 #define EDJE_PART_PATH_SEPARATOR_STRING ":"
 #define EDJE_PART_PATH_SEPARATOR_INDEXL '['
 #define EDJE_PART_PATH_SEPARATOR_INDEXR ']'
+
+#define FLAG_NONE 0
+#define FLAG_X    0x01
+#define FLAG_Y    0x02
+#define FLAG_XY   (FLAG_X | FLAG_Y)
+
 /*----------*/
 
 struct _Edje_File
@@ -1998,6 +2004,8 @@ void _edje_multisense_shutdown(void);
 Eina_Bool _edje_multisense_internal_sound_sample_play(Edje *ed, const char *sample_name, const double speed);
 Eina_Bool _edje_multisense_internal_sound_tone_play(Edje *ed, const char *tone_name, const double duration);
 
+void _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *state);
+
 #ifdef HAVE_LIBREMIX
 #include <remix/remix.h>
 #endif
index 2c139e9..505b6a2 100644 (file)
@@ -505,29 +505,27 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig,
                         {
                             if ((rp->object) && (pr->tween.mode & EDJE_TWEEN_MODE_OPT_FROM_CURRENT))
                               {
-                                 rp->current = calloc(1, sizeof(Edje_Calc_Params));
-                                 evas_object_geometry_get(rp->object, &(rp->current->x),
-                                                          &(rp->current->y),
-                                                          &(rp->current->w),
-                                                          &(rp->current->h));
-                                 evas_object_color_get(rp->object, (int *)&(rp->current->color.r),
-                                                       (int *)&(rp->current->color.g),
-                                                       (int *)&(rp->current->color.b),
-                                                       (int *)&(rp->current->color.a));
-                                 evas_object_text_font_get(rp->object, NULL, &(rp->current->type.text.size));
-                                 evas_object_text_outline_color_get(rp->object,
-                                                       (int *)&(rp->current->type.text.color2.r),
-                                                       (int *)&(rp->current->type.text.color2.g),
-                                                       (int *)&(rp->current->type.text.color2.b),
-                                                       (int *)&(rp->current->type.text.color2.a));
-                                 evas_object_text_shadow_color_get(rp->object,
-                                                       (int *)&(rp->current->type.text.color3.r),
-                                                       (int *)&(rp->current->type.text.color3.g),
-                                                       (int *)&(rp->current->type.text.color3.b),
-                                                       (int *)&(rp->current->type.text.color3.a));
+                                 Edje_Calc_Params *tmp;
+
+                                 tmp = calloc(1, sizeof(Edje_Calc_Params));
+                                 if (!tmp) goto low_mem_current;
+                                _edje_part_recalc(ed, rp, FLAG_XY, tmp);
+
+                                 if (rp->current) free(rp->current);
+                                 rp->current = tmp;
+
+                                rp->current->x -= ed->x;
+                                rp->current->y -= ed->y;
+                                rp->current->map.center.x -= ed->x;
+                                rp->current->map.center.y -= ed->y;
+                                rp->current->map.light.x -= ed->x;
+                                rp->current->map.light.y -= ed->y;
+                                rp->current->map.persp.x -= ed->x;
+                                rp->current->map.persp.y -= ed->y;
                               }
                             else
                               {
+                              low_mem_current:
                                  if (rp->current) free(rp->current);
                                  rp->current = NULL;
                               }