edje_calc: add rounding pixel calculation for transition.

Summary: when transition animation is working, sometimes one pixels loss occurs.

Reviewers: cedric, woohyun, jpeg, raster

Subscribers: jpeg

Differential Revision: https://phab.enlightenment.org/D4341
This commit is contained in:
Hosang Kim 2016-10-11 21:11:14 +09:00 committed by Hermet Park
parent 9450c1ec7b
commit 304ca158be
1 changed files with 58 additions and 48 deletions

View File

@ -2540,6 +2540,61 @@ _edje_filter_get(Edje *ed, Edje_Part_Description_Spec_Filter *filter)
return filter->code;
}
static void
_edje_part_pixel_adjust(Edje *ed,
Edje_Real_Part *ep,
Edje_Calc_Params *params)
{
/* Adjust rounding to not loose one pixels compared to float
information only when rendering to avoid infinite adjustement
when doing min restricted calc */
if (ABS(params->final.x) + params->final.w < TO_INT(ADD(ABS(params->eval.x), params->eval.w)))
{
if (!ed->calc_only)
{
params->final.w += 1;
}
else
{
ep->invalidate = EINA_TRUE;
}
}
else if (ABS(params->final.x) + params->final.w > TO_INT(ADD(ABS(params->eval.x), params->eval.w)))
{
if (!ed->calc_only)
{
params->final.w -= 1;
}
else
{
ep->invalidate = EINA_TRUE;
}
}
if (ABS(params->final.y) + params->final.h < TO_INT(ADD(ABS(params->eval.y), params->eval.h)))
{
if (!ed->calc_only)
{
params->final.h += 1;
}
else
{
ep->invalidate = EINA_TRUE;
}
}
else if (ABS(params->final.y) + params->final.h > TO_INT(ADD(ABS(params->eval.y), params->eval.h)))
{
if (!ed->calc_only)
{
params->final.h -= 1;
}
else
{
ep->invalidate = EINA_TRUE;
}
}
}
static void
_edje_part_recalc_single_filter(Edje *ed,
Edje_Real_Part *ep,
@ -3079,54 +3134,7 @@ _edje_part_recalc_single(Edje *ed,
params->final.w = TO_INT(params->eval.w);
params->final.h = TO_INT(params->eval.h);
/* Adjust rounding to not loose one pixels compared to float
information only when rendering to avoid infinite adjustement
when doing min restricted calc */
if (ABS(params->final.x) + params->final.w < TO_INT(ADD(ABS(params->eval.x), params->eval.w)))
{
if (!ed->calc_only)
{
params->final.w += 1;
}
else
{
ep->invalidate = EINA_TRUE;
}
}
else if (ABS(params->final.x) + params->final.w > TO_INT(ADD(ABS(params->eval.x), params->eval.w)))
{
if (!ed->calc_only)
{
params->final.w -= 1;
}
else
{
ep->invalidate = EINA_TRUE;
}
}
if (ABS(params->final.y) + params->final.h < TO_INT(ADD(ABS(params->eval.y), params->eval.h)))
{
if (!ed->calc_only)
{
params->final.h += 1;
}
else
{
ep->invalidate = EINA_TRUE;
}
}
else if (ABS(params->final.y) + params->final.h > TO_INT(ADD(ABS(params->eval.y), params->eval.h)))
{
if (!ed->calc_only)
{
params->final.h -= 1;
}
else
{
ep->invalidate = EINA_TRUE;
}
}
_edje_part_pixel_adjust(ed, ep, params);
/* fill */
if (ep->part->type == EDJE_PART_TYPE_IMAGE)
_edje_part_recalc_single_fill(ep, &((Edje_Part_Description_Image *)desc)->image.fill, params);
@ -4475,6 +4483,8 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
p3->req.w = INTP(p1->req.w, p2->req.w, pos);
p3->req.h = INTP(p1->req.h, p2->req.h, pos);
_edje_part_pixel_adjust(ed, ep, p3);
if (ep->part->dragable.x)
{
_edje_calc_params_need_ext(p3);