fix scaling on edje_scale - works with smnall sizes now too. problem is
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 10 Sep 2008 06:39:57 +0000 (06:39 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 10 Sep 2008 06:39:57 +0000 (06:39 +0000)
really i was chasing a freeze/thaw problem. something is up.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@35922 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

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

index 4272f36..d12d722 100644 (file)
@@ -138,9 +138,13 @@ _edje_recalc(Edje *ed)
 {
    int i;
 
-   if (!ed->dirty) return;
-   if (ed->freeze)
+   if (!ed->dirty)
      {
+       return;
+     }
+   if ((ed->freeze > 0) || (_edje_freeze_val > 0))
+     {
+       _edje_freeze_calc_count++;
        ed->recalc = 1;
        if (!ed->calc_only) return;
      }
@@ -257,45 +261,79 @@ _edje_part_recalc_single(Edje *ed,
 //   if (flags & FLAG_X)
      {
        minw = desc->min.w;
-       if (ep->swallow_params.min.w > desc->min.w) minw = ep->swallow_params.min.w;
+       if (ep->part->scale) minw = (int)(((double)minw) * _edje_scale);
+       if (ep->swallow_params.min.w > desc->min.w)
+         minw = ep->swallow_params.min.w;
 
        /* XXX TODO: remove need of EDJE_INF_MAX_W, see edje_util.c */
        if ((ep->swallow_params.max.w <= 0) ||
            (ep->swallow_params.max.w == EDJE_INF_MAX_W))
-         maxw = desc->max.w;
+         {
+            maxw = desc->max.w;
+            if (maxw > 0)
+              {
+                 if (ep->part->scale) maxw = (int)(((double)maxw) * _edje_scale);
+                 if (maxw < 1) maxw = 1;
+              }
+         }
        else
          {
             if (desc->max.w <= 0)
               maxw = ep->swallow_params.max.w;
             else
-              maxw = MIN(ep->swallow_params.max.w, desc->max.w);
+              {
+                 maxw = desc->max.w;
+                 if (maxw > 0)
+                   {
+                      if (ep->part->scale) maxw = (int)(((double)maxw) * _edje_scale);
+                      if (maxw < 1) maxw = 1;
+                   }
+                 if (ep->swallow_params.max.w < maxw)
+                   maxw = ep->swallow_params.max.w;
+              }
          }
-       if (ep->part->scale)
+       if (maxw >= 0)
          {
-            minw *= _edje_scale;
-            maxw *= _edje_scale;
+            if (maxw < minw) maxw = minw;
          }
      }
 //   if (flags & FLAG_Y)
      {
        minh = desc->min.h;
-       if (ep->swallow_params.min.h > desc->min.h) minh = ep->swallow_params.min.h;
+       if (ep->part->scale) minh = (int)(((double)minh) * _edje_scale);
+       if (ep->swallow_params.min.h > desc->min.h)
+         minh = ep->swallow_params.min.h;
 
        /* XXX TODO: remove need of EDJE_INF_MAX_H, see edje_util.c */
        if ((ep->swallow_params.max.h <= 0) ||
            (ep->swallow_params.max.h == EDJE_INF_MAX_H))
-         maxh = desc->max.h;
+         {
+            maxh = desc->max.h;
+            if (maxh > 0)
+              {
+                 if (ep->part->scale) maxh = (int)(((double)maxh) * _edje_scale);
+                 if (maxh < 1) maxh = 1;
+              }
+         }
        else
          {
             if (desc->max.h <= 0)
               maxh = ep->swallow_params.max.h;
             else
-              maxh = MIN(ep->swallow_params.max.h, desc->max.h);
+              {
+                 maxh = desc->max.h;
+                 if (maxh > 0)
+                   {
+                      if (ep->part->scale) maxh = (int)(((double)maxh) * _edje_scale);
+                      if (maxh < 1) maxh = 1;
+                   }
+                 if (ep->swallow_params.max.h < maxh)
+                   maxh = ep->swallow_params.max.h;
+              }
          }
-       if (ep->part->scale)
+       if (maxh >= 0)
          {
-            minh *= _edje_scale;
-            maxh *= _edje_scale;
+            if (maxh < minh) maxh = minh;
          }
      }
    /* relative coords of top left & bottom right */
index 7db5d37..550d5d2 100644 (file)
@@ -1004,6 +1004,8 @@ extern Evas_List       *_edje_edjes;
 
 extern char            *_edje_fontset_append;
 extern double           _edje_scale;
+extern int              _edje_freeze_val;
+extern int              _edje_freeze_calc_count;
 
 void  _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, double pos);
 Edje_Part_Description *_edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name, double val);
index bb45a0b..beb74b3 100644 (file)
@@ -12,6 +12,8 @@ static Evas_Hash *_edje_text_class_member_hash = NULL;
 
 char *_edje_fontset_append = NULL;
 double _edje_scale = 1.0;
+int _edje_freeze_val = 0;
+int _edje_freeze_calc_count = 0;
 
 typedef struct _Edje_List_Foreach_Data Edje_List_Foreach_Data;
 
@@ -29,6 +31,8 @@ Edje_Real_Part *_edje_real_part_recursive_get_helper(Edje *ed, char **path);
 
 /* FIXDOC: These all need to be looked over, Verified/Expanded upon.  I just got lazy and stopped putting FIXDOC next to each function in this file. */
 
+//#define FASTFREEZE 1
+
 /** Freeze all Edje objects in the current process.
  *
  * See edje_object_freeze() for more.
@@ -36,11 +40,17 @@ Edje_Real_Part *_edje_real_part_recursive_get_helper(Edje *ed, char **path);
 EAPI void
 edje_freeze(void)
 {
+#ifdef FASTFREEZE   
+   _edje_freeze_val++;
+   printf("fr ++ ->%i\n", _edje_freeze_val);
+#else   
+// FIXME: could just have a global freeze instead of per object
+// above i tried.. but this broke some things. notable e17's menus. why?
    Evas_List *l;
 
-   // FIXME: could just have a global freeze instead of per object
    for (l = _edje_edjes; l; l = l->next)
      edje_object_freeze((Evas_Object *)(l->data));
+#endif   
 }
 
 /** Thaw all Edje objects in the current process.
@@ -50,11 +60,39 @@ edje_freeze(void)
 EAPI void
 edje_thaw(void)
 {
+#ifdef FASTFREEZE   
+   _edje_freeze_val--;
+   printf("fr -- ->%i\n", _edje_freeze_val);
+   if ((_edje_freeze_val == 0) && (_edje_freeze_calc_count > 0))
+     {
+       Evas_List *l;
+
+       _edje_freeze_calc_count = 0;
+       for (l = _edje_edjes; l; l = l->next)
+         {
+            Edje *ed;
+            
+            ed = _edje_fetch(l->data);
+            if (ed->recalc)
+              {
+                 if (ed->freeze == 0)
+                   {
+                      printf("  CALC %p\n", l->data);
+                      _edje_recalc(ed);
+                   }
+                 else
+                   printf("  !CALC %p\n", l->data);
+              }
+         }
+     }
+#else   
+// FIXME: could just have a global freeze instead of per object
+// comment as above.. why?
    Evas_List *l;
 
-   // FIXME: could just have a global freeze instead of per object
    for (l = _edje_edjes; l; l = l->next)
      edje_object_thaw((Evas_Object *)(l->data));
+#endif   
 }
 
 /* FIXDOC: Expand */
@@ -1138,15 +1176,22 @@ EAPI void
 edje_object_calc_force(Evas_Object *obj)
 {
    Edje *ed;
-   int pf;
+   int pf, pf2;
 
    ed = _edje_fetch(obj);
    if (!ed) return;
    ed->dirty = 1;
+   
+   pf2 = _edje_freeze_val;
    pf = ed->freeze;
+   
+   _edje_freeze_val = 0;
    ed->freeze = 0;
+   
    _edje_recalc(ed);
+   
    ed->freeze = pf;
+   _edje_freeze_val = pf2;
 }
 
 /** Calculate minimum size