From d1203fc0caaa2ad4a7cf59fe0f6097a270629c2d Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 14 Sep 2010 15:36:16 +0000 Subject: [PATCH] * edje: fix edje use of aspect when constrained by min or max. 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. SVN revision: 52244 --- legacy/edje/src/lib/edje_calc.c | 150 +++++++++++++++++++++-------- legacy/edje/src/lib/edje_private.h | 17 ++-- 2 files changed, 122 insertions(+), 45 deletions(-) diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index 0282dc36c0..9d232c4f0b 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -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 @@ -953,32 +955,81 @@ _edje_part_recalc_single_text(FLOAT_T sc, params->type.text.size = size; } +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, ¶ms->x, ¶ms->w, minw); + _edje_part_recalc_single_min_length(desc->align.y, ¶ms->y, ¶ms->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) + int tmp; + int w; + int h; + + w = params->w ? params->w : 99999; + h = params->h ? params->h : 99999; + + switch (params->aspect) { - 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) - { - 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, ¶ms->x, ¶ms->w, maxw); + _edje_part_recalc_single_max_length(desc->align.y, ¶ms->y, ¶ms->h, maxh); } static void diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 37e4c5849e..423c6e0241 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -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 {