fix some min size calc and aspect calc issues.

SVN revision: 38994
This commit is contained in:
Carsten Haitzler 2009-02-11 11:48:15 +00:00
parent b70ae3c927
commit 6f2cb19f03
1 changed files with 181 additions and 177 deletions

View File

@ -391,188 +391,192 @@ _edje_part_recalc_single(Edje *ed,
} }
/* aspect */ /* aspect */
if ((params->h > 0) && if (((flags | ep->calculated) & FLAG_XY) == FLAG_XY)
(((flags | ep->calculated) & FLAG_XY) == FLAG_XY))
{ {
int apref; int apref = -10;
double aspect, amax, amin; double aspect, amax, amin;
double new_w = 0, new_h = 0, want_x, want_y, want_w, want_h; double new_w = 0, new_h = 0, want_x, want_y, want_w, want_h;
want_x = params->x; if (params->h <= 0) aspect = 999999.0;
want_w = new_w = params->w; else aspect = (double)params->w / (double)params->h;
amax = desc->aspect.max;
want_y = params->y; amin = desc->aspect.min;
want_h = new_h = params->h; if ((ep->swallow_params.aspect.w > 0) &&
(ep->swallow_params.aspect.h > 0))
aspect = (double)params->w / (double)params->h; amin = amax =
apref = desc->aspect.prefer; (double)ep->swallow_params.aspect.w /
amax = desc->aspect.max; (double)ep->swallow_params.aspect.h;
amin = desc->aspect.min; want_x = params->x;
if ((ep->swallow_params.aspect.w > 0) && want_w = new_w = params->w;
(ep->swallow_params.aspect.h > 0))
amin = amax = want_y = params->y;
(double)ep->swallow_params.aspect.w / want_h = new_h = params->h;
(double)ep->swallow_params.aspect.h;
if (ep->swallow_params.aspect.mode > EDJE_ASPECT_CONTROL_NONE) if ((amin > 0.0) && (amax > 0.0))
{ {
switch (ep->swallow_params.aspect.mode) apref = desc->aspect.prefer;
{ if (ep->swallow_params.aspect.mode > EDJE_ASPECT_CONTROL_NONE)
case EDJE_ASPECT_CONTROL_NEITHER: {
apref = EDJE_ASPECT_PREFER_NONE; switch (ep->swallow_params.aspect.mode)
break; {
case EDJE_ASPECT_CONTROL_HORIZONTAL: case EDJE_ASPECT_CONTROL_NEITHER:
apref = EDJE_ASPECT_PREFER_HORIZONTAL; apref = EDJE_ASPECT_PREFER_NONE;
break; break;
case EDJE_ASPECT_CONTROL_VERTICAL: case EDJE_ASPECT_CONTROL_HORIZONTAL:
apref = EDJE_ASPECT_PREFER_VERTICAL; apref = EDJE_ASPECT_PREFER_HORIZONTAL;
break; break;
case EDJE_ASPECT_CONTROL_BOTH: case EDJE_ASPECT_CONTROL_VERTICAL:
apref = EDJE_ASPECT_PREFER_BOTH; apref = EDJE_ASPECT_PREFER_VERTICAL;
break; break;
default: case EDJE_ASPECT_CONTROL_BOTH:
break; apref = EDJE_ASPECT_PREFER_BOTH;
} break;
} default:
break;
switch (apref) }
{ }
case EDJE_ASPECT_PREFER_NONE: switch (apref)
/* keep botth dimensions in check */ {
/* adjust for min aspect (width / height) */ case EDJE_ASPECT_PREFER_NONE:
if ((amin > 0.0) && (aspect < amin)) /* keep both dimensions in check */
{ /* adjust for min aspect (width / height) */
new_h = (params->w / amin); if ((amin > 0.0) && (aspect < amin))
new_w = (params->h * amin); {
} new_h = (params->w / amin);
/* adjust for max aspect (width / height) */ new_w = (params->h * amin);
if ((amax > 0.0) && (aspect > amax)) }
{ /* adjust for max aspect (width / height) */
new_h = (params->w / amax); if ((amax > 0.0) && (aspect > amax))
new_w = (params->h * amax); {
} new_h = (params->w / amax);
if ((amax > 0.0) && (new_w < params->w)) new_w = (params->h * amax);
{ }
new_w = params->w; if ((amax > 0.0) && (new_w < params->w))
new_h = params->w / amax; {
} new_w = params->w;
if ((amax > 0.0) && (new_h < params->h)) new_h = params->w / amax;
{ }
new_w = params->h * amax; if ((amax > 0.0) && (new_h < params->h))
new_h = params->h; {
} new_w = params->h * amax;
break; new_h = params->h;
/* prefer vertical size as determiner */ }
case EDJE_ASPECT_PREFER_VERTICAL: break;
/* keep both dimensions in check */ /* prefer vertical size as determiner */
/* adjust for max aspect (width / height) */ case EDJE_ASPECT_PREFER_VERTICAL:
if ((amax > 0.0) && (aspect > amax)) /* keep both dimensions in check */
new_w = (params->h * amax); /* adjust for max aspect (width / height) */
/* adjust for min aspect (width / height) */ if ((amax > 0.0) && (aspect > amax))
if ((amin > 0.0) && (aspect < amin)) new_w = (params->h * amax);
new_w = (params->h * amin); /* adjust for min aspect (width / height) */
break; if ((amin > 0.0) && (aspect < amin))
/* prefer horizontal size as determiner */ new_w = (params->h * amin);
case EDJE_ASPECT_PREFER_HORIZONTAL: break;
/* keep both dimensions in check */ /* prefer horizontal size as determiner */
/* adjust for max aspect (width / height) */ case EDJE_ASPECT_PREFER_HORIZONTAL:
if ((amax > 0.0) && (aspect > amax)) /* keep both dimensions in check */
new_h = (params->w / amax); /* adjust for max aspect (width / height) */
/* adjust for min aspect (width / height) */ if ((amax > 0.0) && (aspect > amax))
if ((amin > 0.0) && (aspect < amin)) new_h = (params->w / amax);
new_h = (params->w / amin); /* adjust for min aspect (width / height) */
break; if ((amin > 0.0) && (aspect < amin))
case EDJE_ASPECT_PREFER_BOTH: new_h = (params->w / amin);
/* keep both dimensions in check */ break;
/* adjust for max aspect (width / height) */ case EDJE_ASPECT_PREFER_BOTH:
if ((amax > 0.0) && (aspect > amax)) /* keep both dimensions in check */
{ /* adjust for max aspect (width / height) */
new_w = (params->h * amax); if ((amax > 0.0) && (aspect > amax))
new_h = (params->w / amax); {
} new_w = (params->h * amax);
/* adjust for min aspect (width / height) */ new_h = (params->w / amax);
if ((amin > 0.0) && (aspect < amin)) }
{ /* adjust for min aspect (width / height) */
new_w = (params->h * amin); if ((amin > 0.0) && (aspect < amin))
new_h = (params->w / amin); {
} new_w = (params->h * amin);
break; new_h = (params->w / amin);
} }
break;
if (!((amin > 0.0) && (amax > 0.0) && (apref == EDJE_ASPECT_PREFER_NONE))) default:
{ break;
if ((maxw >= 0) && (new_w > maxw)) new_w = maxw; }
if (new_w < minw) new_w = minw;
if (!((amin > 0.0) && (amax > 0.0) && (apref == EDJE_ASPECT_PREFER_NONE)))
if ((maxh >= 0) && (new_h > maxh)) new_h = maxh; {
if (new_h < minh) new_h = minh; if ((maxw >= 0) && (new_w > maxw)) new_w = maxw;
} if (new_w < minw) new_w = minw;
/* do real adjustment */ if ((maxh >= 0) && (new_h > maxh)) new_h = maxh;
if (apref == EDJE_ASPECT_PREFER_BOTH) if (new_h < minh) new_h = minh;
{ }
if (amin == 0.0) amin = amax;
if (amin != 0.0) /* do real adjustment */
{ if (apref == EDJE_ASPECT_PREFER_BOTH)
/* fix h and vary w */ {
if (new_w > params->w) if (amin == 0.0) amin = amax;
{ if (amin != 0.0)
// params->w = new_w; {
// EXCEEDS BOUNDS in W /* fix h and vary w */
new_h = (params->w / amin); if (new_w > params->w)
new_w = params->w; {
if (new_h > params->h) // params->w = new_w;
{ // EXCEEDS BOUNDS in W
new_h = params->h; new_h = (params->w / amin);
new_w = (params->h * amin); new_w = params->w;
} if (new_h > params->h)
} {
/* fix w and vary h */ new_h = params->h;
else new_w = (params->h * amin);
{ }
// params->h = new_h; }
// EXCEEDS BOUNDS in H /* fix w and vary h */
new_h = params->h; else
new_w = (params->h * amin); {
if (new_w > params->w) // params->h = new_h;
{ // EXCEEDS BOUNDS in H
new_h = (params->w / amin); new_h = params->h;
new_w = params->w; new_w = (params->h * amin);
} if (new_w > params->w)
} {
params->w = new_w; new_h = (params->w / amin);
params->h = new_h; new_w = params->w;
} }
} }
else params->w = new_w;
{ params->h = new_h;
if ((amin > 0.0) && (amax > 0.0) && (apref == EDJE_ASPECT_PREFER_NONE)) }
{ }
params->w = new_w; }
params->h = new_h; if (apref != EDJE_ASPECT_PREFER_BOTH)
} {
else if ((params->h - new_h) > (params->w - new_w)) if ((amin > 0.0) && (amax > 0.0) && (apref == EDJE_ASPECT_PREFER_NONE))
{ {
if (params->h < new_h) params->w = new_w;
params->h = new_h; params->h = new_h;
else if (params->h > new_h) }
params->h = new_h; else if ((params->h - new_h) > (params->w - new_w))
if (apref == EDJE_ASPECT_PREFER_VERTICAL) {
params->w = new_w; if (params->h < new_h)
} params->h = new_h;
else else if (params->h > new_h)
{ params->h = new_h;
if (params->w < new_w) if (apref == EDJE_ASPECT_PREFER_VERTICAL)
params->w = new_w; params->w = new_w;
else if (params->w > new_w) }
params->w = new_w; else
if (apref == EDJE_ASPECT_PREFER_HORIZONTAL) {
params->h = new_h; if (params->w < new_w)
} params->w = new_w;
} else if (params->w > new_w)
params->x = want_x + ((want_w - params->w) * desc->align.x); params->w = new_w;
params->y = want_y + ((want_h - params->h) * desc->align.y); if (apref == EDJE_ASPECT_PREFER_HORIZONTAL)
params->h = new_h;
}
}
params->x = want_x + ((want_w - params->w) * desc->align.x);
params->y = want_y + ((want_h - params->h) * desc->align.y);
} }
/* size step */ /* size step */
if (flags & FLAG_X) if (flags & FLAG_X)
{ {