diff options
author | Shinwoo Kim <cinoo.kim@samsung.com> | 2021-09-20 10:11:11 +0100 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2021-09-20 10:11:11 +0100 |
commit | 2bf995efa1f0719663fb7a5955dd4b78ff660afa (patch) | |
tree | 15205719cab985d0d31265a4e393453bb5e731fc /src/lib | |
parent | 7d434bdcc0fbc2286d25658038971be03587f0ea (diff) | |
download | efl-2bf995efa1f0719663fb7a5955dd4b78ff660afa.tar.gz |
evas_map: use source size for uv instead of proxy size
Summary:
Usually application sets uv point value using proxy object size.
if source object is bigger than proxy object, then only part of
source image is used for map, and it leads to unexpected result.
This patch is solving this problem make map use source object size
instead of proxy object size by comparing both size.
Test Plan:
[Samle Code]
{F4606414}
[Sample Image]
{F4606413}
[Before apply map]
{F4606418}
[After apply map WITHOUT patch]
{F4606416}
[After apply map WITH patch]
{F4606417}
Reviewers: raster, Hermet
Reviewed By: raster
Subscribers: cedric, #reviewers, #committers
Tags: #efl
Differential Revision: https://phab.enlightenment.org/D12292
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/evas/canvas/efl_canvas_proxy.c | 20 | ||||
-rw-r--r-- | src/lib/evas/canvas/evas_map.c | 10 | ||||
-rw-r--r-- | src/lib/evas/include/evas_private.h | 1 |
3 files changed, 29 insertions, 2 deletions
diff --git a/src/lib/evas/canvas/efl_canvas_proxy.c b/src/lib/evas/canvas/efl_canvas_proxy.c index d55cbc2c31..cf44e18c81 100644 --- a/src/lib/evas/canvas/efl_canvas_proxy.c +++ b/src/lib/evas/canvas/efl_canvas_proxy.c @@ -159,6 +159,26 @@ _efl_canvas_proxy_source_events_get(const Eo *eo_obj, void *_pd EINA_UNUSED) return _evas_image_proxy_source_events_get(eo_obj); } +void +_evas_image_proxy_source_scale_get(const Eo *eo_obj, double *sw, double *sh) +{ + *sw = 1.0; + *sh = 1.0; + Evas_Object_Protected_Data *source = NULL; + + Evas_Image_Data *o = efl_data_scope_get(eo_obj, EFL_CANVAS_IMAGE_INTERNAL_CLASS); + if (!o->cur->source) return; + + Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + source = efl_data_scope_get(o->cur->source, EFL_CANVAS_OBJECT_CLASS); + + if (obj->cur->geometry.w > 0) + *sw = (double) source->cur->geometry.w / obj->cur->geometry.w; + + if (obj->cur->geometry.h > 0) + *sh = (double) source->cur->geometry.h / obj->cur->geometry.h; +} + Evas_Object * _evas_object_image_source_get(Evas_Object *eo_obj) { diff --git a/src/lib/evas/canvas/evas_map.c b/src/lib/evas/canvas/evas_map.c index 4669595c7c..eaafa8ee72 100644 --- a/src/lib/evas/canvas/evas_map.c +++ b/src/lib/evas/canvas/evas_map.c @@ -1377,6 +1377,12 @@ evas_object_map_update(Evas_Object *eo_obj, pts[0].py = obj->map->cur.map->persp.py << FP; pts[0].foc = obj->map->cur.map->persp.foc << FP; pts[0].z0 = obj->map->cur.map->persp.z0 << FP; + + double uscale = 1.0, vscale = 1.0; + if (obj->is_image_object) + { + _evas_image_proxy_source_scale_get(eo_obj, &uscale, &vscale); + } // draw geom +x +y for (; p < p_end; p++, pt++) { @@ -1387,9 +1393,9 @@ evas_object_map_update(Evas_Object *eo_obj, pt->fy = p->y + (float) y; pt->fz = p->z; if ((uvw == 0) || (imagew == 0)) pt->u = 0; - else pt->u = ((lround(p->u) * imagew) / uvw) * FP1; + else pt->u = ((lround(p->u * uscale) * imagew) / uvw) * FP1; if ((uvh == 0) || (imageh == 0)) pt->v = 0; - else pt->v = ((lround(p->v) * imageh) / uvh) * FP1; + else pt->v = ((lround(p->v * vscale) * imageh) / uvh) * FP1; if (pt->u < 0) pt->u = 0; else if (pt->u > (imagew * FP1)) pt->u = (imagew * FP1); if (pt->v < 0) pt->v = 0; diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 65a22850a6..3af4addc57 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1196,6 +1196,7 @@ void evas_smart_cb_descriptions_fix(Evas_Smart_Cb_Description_Array *a) EINA_ARG Eina_Bool evas_smart_cb_descriptions_resize(Evas_Smart_Cb_Description_Array *a, unsigned int size) EINA_ARG_NONNULL(1); const Evas_Smart_Cb_Description *evas_smart_cb_description_find(const Evas_Smart_Cb_Description_Array *a, const char *name) EINA_ARG_NONNULL(1, 2) EINA_PURE; +void _evas_image_proxy_source_scale_get(const Eo *eo_obj, double *sw, double *sh); Evas_Object *_evas_object_image_source_get(Evas_Object *obj); Eina_Bool _evas_object_image_preloading_get(const Evas_Object *obj); Evas_Object *_evas_object_image_video_parent_get(Evas_Object *obj); |