* edje: fix edje use of aspect when constrained by min or max.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 14 Sep 2010 15:36:16 +0000 (15:36 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 14 Sep 2010 15:36:16 +0000 (15:36 +0000)
NOTE: If you have swallow or parts that where constrained by min and
max, and you used aspect on them, expect change on your layout.

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

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

index 0282dc3..9d232c4 100644 (file)
@@ -617,6 +617,8 @@ _edje_part_recalc_single_aspect(Edje_Real_Part *ep,
    params->y = TO_INT(ADD(want_y,
                          MUL(SUB(want_h, FROM_INT(params->h)),
                              desc->align.y)));
+
+   params->aspect = apref;
 }
 
 static void
@@ -954,31 +956,80 @@ _edje_part_recalc_single_text(FLOAT_T sc,
 }
 
 static void
+_edje_part_recalc_single_min_length(FLOAT_T align, int *start, int *length, int min)
+{
+   if (min >= 0)
+     {
+       if (*length < min)
+         {
+            *start += TO_INT(SCALE(align, (*length - min)));
+            *length = min;
+         }
+     }
+}
+
+static void
 _edje_part_recalc_single_min(Edje_Part_Description_Common *desc,
                             Edje_Calc_Params *params,
                             int minw, int minh,
-                            int flags)
+                            int flags __UNUSED__)
 {
-   if (flags & FLAG_X)
+   int tmp;
+   int w;
+   int h;
+
+   w = params->w ? params->w : 99999;
+   h = params->h ? params->h : 99999;
+
+   switch (params->aspect)
      {
-       if (minw >= 0)
-         {
-            if (params->w < minw)
-              {
-                 params->x += TO_INT(SCALE(desc->align.x, (params->w - minw)));
-                 params->w = minw;
-              }
-         }
+      case EDJE_ASPECT_PREFER_NONE:
+        break;
+      case EDJE_ASPECT_PREFER_VERTICAL:
+        tmp = minh * params->w / h;
+        if (tmp >= minw)
+          {
+             minw = tmp;
+             break;
+          }
+      case EDJE_ASPECT_PREFER_HORIZONTAL:
+        tmp = minw * params->h / w;
+        if (tmp >= minh)
+          {
+             minh = tmp;
+             break;
+          }
+      case EDJE_ASPECT_PREFER_BOTH:
+        tmp = minh * params->w / h;
+        if (tmp >= minw)
+          {
+             minw = tmp;
+             break;
+          }
+
+        tmp = minw * params->h / w;
+        if (tmp >= minh)
+          {
+             minh = tmp;
+             break;
+          }
+
+        break;
      }
-   if (flags & FLAG_Y)
+
+   _edje_part_recalc_single_min_length(desc->align.x, &params->x, &params->w, minw);
+   _edje_part_recalc_single_min_length(desc->align.y, &params->y, &params->h, minh);
+}
+
+static void
+_edje_part_recalc_single_max_length(FLOAT_T align, int *start, int *length, int max)
+{
+   if (max >= 0)
      {
-       if (minh >= 0)
+       if (*length > max)
          {
-            if (params->h < minh)
-              {
-                 params->y += TO_INT(SCALE(desc->align.y, (params->h - minh)));
-                 params->h = minh;
-              }
+            *start += TO_INT(SCALE(align, (*length - max)));
+            *length = max;
          }
      }
 }
@@ -987,30 +1038,53 @@ static void
 _edje_part_recalc_single_max(Edje_Part_Description_Common *desc,
                             Edje_Calc_Params *params,
                             int maxw, int maxh,
-                            int flags)
+                            int flags __UNUSED__)
 {
-   if (flags & FLAG_X)
-     {
-       if (maxw >= 0)
-         {
-            if (params->w > maxw)
-              {
-                 params->x += TO_INT(SCALE(desc->align.x, (params->w - maxw)));
-                 params->w = maxw;
-              }
-         }
-     }
-   if (flags & FLAG_Y)
+   int tmp;
+   int w;
+   int h;
+
+   w = params->w ? params->w : 99999;
+   h = params->h ? params->h : 99999;
+
+   switch (params->aspect)
      {
-       if (maxh >= 0)
-         {
-            if (params->h > maxh)
-              {
-                 params->y += TO_INT(SCALE(desc->align.y, (params->h - maxh)));
-                 params->h = maxh;
-              }
-         }
+      case EDJE_ASPECT_PREFER_NONE:
+        break;
+      case EDJE_ASPECT_PREFER_VERTICAL:
+        tmp = maxh * params->w / h;
+        if (tmp <= maxw)
+          {
+             maxw = tmp;
+             break;
+          }
+      case EDJE_ASPECT_PREFER_HORIZONTAL:
+        tmp = maxw * params->h / w;
+        if (tmp <= maxh)
+          {
+             maxh = tmp;
+             break;
+          }
+      case EDJE_ASPECT_PREFER_BOTH:
+        tmp = maxh * params->w / h;
+        if (tmp <= maxw)
+          {
+             maxw = tmp;
+             break;
+          }
+
+        tmp = maxw * params->h / w;
+        if (tmp <= maxh)
+          {
+             maxh = tmp;
+             break;
+          }
+
+        break;
      }
+
+   _edje_part_recalc_single_max_length(desc->align.x, &params->x, &params->w, maxw);
+   _edje_part_recalc_single_max_length(desc->align.y, &params->y, &params->h, maxh);
 }
 
 static void
index 37e4c58..423c6e0 100644 (file)
@@ -167,6 +167,13 @@ struct _Edje_Smart_Api
  * ? all unsafe calls that may result in callbacks must be marked and dealt with
  */
 
+typedef enum {
+  EDJE_ASPECT_PREFER_NONE,
+  EDJE_ASPECT_PREFER_VERTICAL,
+  EDJE_ASPECT_PREFER_HORIZONTAL,
+  EDJE_ASPECT_PREFER_BOTH
+} Edje_Internal_Aspect;
+
 struct _Edje_Perspective
 {
    Evas_Object *obj;
@@ -204,12 +211,7 @@ struct _Edje_Color
 struct _Edje_Aspect_Prefer
 {
    FLOAT_T min, max;
-   enum {
-     EDJE_ASPECT_PREFER_NONE,
-     EDJE_ASPECT_PREFER_VERTICAL,
-     EDJE_ASPECT_PREFER_HORIZONTAL,
-     EDJE_ASPECT_PREFER_BOTH
-   } prefer;
+   Edje_Internal_Aspect prefer;
 };
 
 struct _Edje_Aspect
@@ -1034,9 +1036,10 @@ struct _Edje_Calc_Params
         Edje_Color     color2, color3; // 8
       } text; // 36
    } type; // 40
+   Edje_Internal_Aspect aspect; // 4
    unsigned char    visible : 1;
    unsigned char    smooth : 1; // 1
-}; // 96
+}; // 100
 
 struct _Edje_Real_Part_Set
 {