edje_calc: make INTP use TO_INT_ROUND

Summary:
The edje_part_recalc calculates next postion(p3).
Please refer to following line.

   p3->final.y = INTP(p1->final.y, p2->final.y, pos);

If the condition is as blow, then p3->final.y becomes -50 only if pos is 1.0.
Because INP uses TO_INT not TO_INT_ROUND.

   p1->final.y == -32
   p2->final.y == -50

So we had nonsmooth ending of transition.

Test Plan:
Sample application to check this issue. Please look carefully when the rect moves from bottom to top.

{F3627740}

{F3627739}

Reviewers: cedric, Hermet, jypark

Reviewed By: Hermet

Subscribers: zmike, akanad, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D7842
This commit is contained in:
Shinwoo Kim 2019-03-08 13:28:21 +09:00 committed by Hermet Park
parent 97416e9996
commit be00af9bc3
2 changed files with 30 additions and 11 deletions

View File

@ -2397,12 +2397,29 @@ _edje_filter_get(Edje *ed, Edje_Part_Description_Spec_Filter *filter)
static void static void
_edje_part_pixel_adjust(Edje *ed, _edje_part_pixel_adjust(Edje *ed,
Edje_Real_Part *ep, Edje_Real_Part *ep,
Edje_Calc_Params *params) Edje_Calc_Params *params,
Eina_Bool round)
{ {
int xw, yh, fxw, fyh;
xw = ABS(params->final.x) + params->final.w;
yh = ABS(params->final.y) + params->final.h;
if (round)
{
fxw = TO_INT_ROUND(ADD(ABS(params->eval.x), params->eval.w));
fyh = TO_INT_ROUND(ADD(ABS(params->eval.y), params->eval.h));
}
else
{
fxw = TO_INT(ADD(ABS(params->eval.x), params->eval.w));
fyh = TO_INT(ADD(ABS(params->eval.y), params->eval.h));
}
/* Adjust rounding to not loose one pixels compared to float /* Adjust rounding to not loose one pixels compared to float
information only when rendering to avoid infinite adjustement information only when rendering to avoid infinite adjustement
when doing min restricted calc */ when doing min restricted calc */
if (ABS(params->final.x) + params->final.w < TO_INT(ADD(ABS(params->eval.x), params->eval.w))) if (xw < fxw)
{ {
if (!ed->calc_only) if (!ed->calc_only)
{ {
@ -2413,7 +2430,7 @@ _edje_part_pixel_adjust(Edje *ed,
ep->invalidate = EINA_TRUE; ep->invalidate = EINA_TRUE;
} }
} }
else if (ABS(params->final.x) + params->final.w > TO_INT(ADD(ABS(params->eval.x), params->eval.w))) else if (xw > fxw)
{ {
if (!ed->calc_only) if (!ed->calc_only)
{ {
@ -2424,7 +2441,8 @@ _edje_part_pixel_adjust(Edje *ed,
ep->invalidate = EINA_TRUE; ep->invalidate = EINA_TRUE;
} }
} }
if (ABS(params->final.y) + params->final.h < TO_INT(ADD(ABS(params->eval.y), params->eval.h)))
if (yh < fyh)
{ {
if (!ed->calc_only) if (!ed->calc_only)
{ {
@ -2435,7 +2453,7 @@ _edje_part_pixel_adjust(Edje *ed,
ep->invalidate = EINA_TRUE; ep->invalidate = EINA_TRUE;
} }
} }
else if (ABS(params->final.y) + params->final.h > TO_INT(ADD(ABS(params->eval.y), params->eval.h))) else if (yh > fyh)
{ {
if (!ed->calc_only) if (!ed->calc_only)
{ {
@ -2449,7 +2467,6 @@ _edje_part_pixel_adjust(Edje *ed,
if (params->final.w < 0 || params->final.h < 0) if (params->final.w < 0 || params->final.h < 0)
ERR("The params final size became negative"); ERR("The params final size became negative");
} }
static void static void
@ -2994,7 +3011,7 @@ _edje_part_recalc_single(Edje *ed,
params->final.w = TO_INT(params->eval.w); params->final.w = TO_INT(params->eval.w);
params->final.h = TO_INT(params->eval.h); params->final.h = TO_INT(params->eval.h);
_edje_part_pixel_adjust(ed, ep, params); _edje_part_pixel_adjust(ed, ep, params, EINA_FALSE);
/* fill */ /* fill */
if (ep->part->type == EDJE_PART_TYPE_IMAGE) if (ep->part->type == EDJE_PART_TYPE_IMAGE)
_edje_part_recalc_single_fill(ep, &((Edje_Part_Description_Image *)desc)->image.fill, params); _edje_part_recalc_single_fill(ep, &((Edje_Part_Description_Image *)desc)->image.fill, params);
@ -3456,7 +3473,7 @@ _edje_physics_body_add(Edje *ed, Edje_Real_Part *rp, EPhysics_World *world)
? (_x1) \ ? (_x1) \
: ADD(_x1, MUL(_p, SUB(_x2, _x1)))); : ADD(_x1, MUL(_p, SUB(_x2, _x1))));
#define INTP(_x1, _x2, _p) TO_INT(FINTP(_x1, _x2, _p)) #define INTP(_x1, _x2, _p) TO_INT_ROUND(FINTP(_x1, _x2, _p))
static void static void
_map_colors_free(Edje_Calc_Params *pf) _map_colors_free(Edje_Calc_Params *pf)
@ -4343,7 +4360,7 @@ _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.w = INTP(p1->req.w, p2->req.w, pos);
p3->req.h = INTP(p1->req.h, p2->req.h, pos); p3->req.h = INTP(p1->req.h, p2->req.h, pos);
_edje_part_pixel_adjust(ed, ep, p3); _edje_part_pixel_adjust(ed, ep, p3, EINA_TRUE);
if (ep->part->dragable.x) if (ep->part->dragable.x)
{ {

View File

@ -155,7 +155,9 @@ EAPI extern int _edje_default_log_dom ;
#define FROM_DOUBLE(a) eina_f32p32_double_from(a) #define FROM_DOUBLE(a) eina_f32p32_double_from(a)
#define FROM_INT(a) eina_f32p32_int_from(a) #define FROM_INT(a) eina_f32p32_int_from(a)
#define TO_INT(a) eina_f32p32_int_to(a) #define TO_INT(a) eina_f32p32_int_to(a)
#define TO_INT_ROUND(a) eina_f32p32_int_to(ADD(a, FROM_DOUBLE(0.5))) #define TO_INT_ROUND(a) (((a) >= 0.0) \
? eina_f32p32_int_to(ADD(a, FROM_DOUBLE(0.5)) \
: eina_f32p32_int_to(ADD(a, FROM_DOUBLE(-0.5))
#define ZERO 0 #define ZERO 0
#define COS(a) eina_f32p32_cos(a) #define COS(a) eina_f32p32_cos(a)
#define SIN(a) eina_f32p32_sin(a) #define SIN(a) eina_f32p32_sin(a)
@ -178,7 +180,7 @@ EAPI extern int _edje_default_log_dom ;
#define FROM_DOUBLE(a) (a) #define FROM_DOUBLE(a) (a)
#define FROM_INT(a) (double)(a) #define FROM_INT(a) (double)(a)
#define TO_INT(a) (int)(a) #define TO_INT(a) (int)(a)
#define TO_INT_ROUND(a) (int)(a + 0.5) #define TO_INT_ROUND(a) (((a) >= 0.0) ? (int)(a + 0.5) : (int)(a - 0.5))
#define ZERO 0.0 #define ZERO 0.0
#define COS(a) cos(a) #define COS(a) cos(a)
#define SIN(a) sin(a) #define SIN(a) sin(a)