From: Joogab Yun Date: Wed, 15 Nov 2017 07:56:36 +0000 (+0900) Subject: [evas_gl] change oreint_set() / data_set() / data_get() like sw backend X-Git-Tag: submit/sandbox/upgrade/efl120/20180319.053334~959 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0abf1eee0a7622b95cebcca8bd3d3f9b759599b5;p=platform%2Fupstream%2Fefl.git [evas_gl] change oreint_set() / data_set() / data_get() like sw backend 1. change rotate_image_data() like sw backend 2. evas: returns the image.data with orient applied - after the evas_object_orient_set(), it should have a rotated buffer that was rotated image when evas_object_data_get() 3. fixed image corruption issue - repeating evas_object_image_orient_set() and evas_object_imgae_data_get() breaks the image. so I modify the image rotated part like sw backend. 4. save the orient value when doing image_data_get() - (1) evas_object_orient_set(image1, 90) (2) buffer = evas_object_image_data_get(image1); (3) evas_object_image_data_set(image2, buffer); we need an orient value of image1 for image2, so we keep orient value of image1 at image_data_get() Change-Id: I4de8f9b9c3636d087da4eadf44962383587397be --- diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index 09903d8..dcfac9e 100755 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -744,6 +744,7 @@ $(evas_software_generic_eolian_h) if EVAS_STATIC_BUILD_SOFTWARE_GENERIC lib_evas_libevas_la_SOURCES += \ modules/evas/engines/software_generic/evas_engine.c \ +modules/evas/engines/software_generic/evas_engine.h \ modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h \ modules/evas/engines/software_generic/Evas_Engine_Software_Shared.h \ modules/evas/engines/software_generic/evas_native_tbm.c \ @@ -766,6 +767,7 @@ $(install_enginesoftwaregenericpkgLTLIBRARIES): install-libLTLIBRARIES modules_evas_engines_software_generic_module_la_SOURCES = \ modules/evas/engines/software_generic/evas_engine.c \ +modules/evas/engines/software_generic/evas_engine.h \ modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h \ modules/evas/engines/software_generic/Evas_Engine_Software_Shared.h \ modules/evas/engines/software_generic/evas_native_tbm.c \ diff --git a/src/lib/evas/canvas/evas_image_legacy.c b/src/lib/evas/canvas/evas_image_legacy.c old mode 100644 new mode 100755 index 7d19b8b..8feb559 --- a/src/lib/evas/canvas/evas_image_legacy.c +++ b/src/lib/evas/canvas/evas_image_legacy.c @@ -702,6 +702,8 @@ evas_object_image_data_get(const Eo *eo_obj, Eina_Bool for_writing) /* if we fail to get engine_data, we have to return NULL */ if (!pixels || !data) goto error; + // TIZEN_ONLY(20171114) : image orient +/* if (!tofree) { o->engine_data = pixels; @@ -738,7 +740,38 @@ evas_object_image_data_get(const Eo *eo_obj, Eina_Bool for_writing) if (!eina_hash_add(hash, data, px_entry)) goto error; } +*/ + + // TIZEN_ONLY(20171114) : image orient + if (tofree) + { + ENFN->image_free(ENC, o->engine_data); + o->engine_data = pixels; + + if (ENFN->image_scale_hint_set) + ENFN->image_scale_hint_set(ENC, o->engine_data, o->scale_hint); + if (ENFN->image_content_hint_set) + ENFN->image_content_hint_set(ENC, o->engine_data, o->content_hint); + + } + else + { + o->engine_data = pixels; + } + + if (ENFN->image_stride_get) + ENFN->image_stride_get(ENC, o->engine_data, &stride); + else + stride = o->cur->image.w * 4; + + if (o->cur->image.stride != stride) + { + EINA_COW_IMAGE_STATE_WRITE_BEGIN(o, state_write) + state_write->image.stride = stride; + EINA_COW_IMAGE_STATE_WRITE_END(o, state_write); + } + o->pixels_checked_out++; if (for_writing) { o->written = EINA_TRUE; diff --git a/src/modules/evas/engines/gl_common/evas_gl_common.h b/src/modules/evas/engines/gl_common/evas_gl_common.h index 56f5b2a..a68ea82 100755 --- a/src/modules/evas/engines/gl_common/evas_gl_common.h +++ b/src/modules/evas/engines/gl_common/evas_gl_common.h @@ -491,6 +491,7 @@ struct _Evas_GL_Image Eina_Inlist *maps; /* Evas_GL_Image_Data_Map */ Evas_Image_Orient orient; + Evas_Image_Orient rotated_orient; // TIZEN_ONLY(20171114) : image orient int scale_hint, content_hint; int csize; diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index ad97d0e..33e905f 100755 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -16,6 +16,7 @@ #include "../gl_common/evas_gl_common.h" #include "Evas_Engine_GL_Generic.h" +#include "../software_generic/evas_engine.h" #ifdef EVAS_CSERVE2 #include "evas_cs2_private.h" @@ -706,7 +707,10 @@ _rotate_image_data(Render_Engine_GL_Generic *re, Evas_GL_Image *im1) Evas_Engine_GL_Context *gl_context; RGBA_Draw_Context *dc; int w, h; + void *pixels_in = NULL; + void *pixels_out = NULL; + if (!im1->im) return NULL; w = im1->w; h = im1->h; @@ -720,6 +724,8 @@ _rotate_image_data(Render_Engine_GL_Generic *re, Evas_GL_Image *im1) h = im1->w; } + // TIZEN_ONLY(20171114) : image orient + /* if ((w * h) <= 0) return NULL; alpha = eng_image_alpha_get(re, im1); @@ -755,6 +761,52 @@ _rotate_image_data(Render_Engine_GL_Generic *re, Evas_GL_Image *im1) EVAS_COLORSPACE_ARGB8888, im2->im->image.data); eng_gl_surface_unlock(re, im2); + */ + + // TIZEN_ONLY(20171114) : image orient + im2 = evas_gl_common_image_new_from_copied_data(gl_context, w, h, im1->im->image.data, alpha, im1->cs.space); + if (!im2 || !im2->im) return NULL; + im2->rotated_orient = im1->orient; + + pixels_in = im1->im->image.data; + pixels_out = im2->im->image.data; + + if (!pixels_out || !pixels_in) { + return NULL; + } + + + switch(im1->orient) + { + case EVAS_IMAGE_ORIENT_0: + memcpy(pixels_out, pixels_in, sizeof (unsigned int) * im1->w * im1->h); + break; + case EVAS_IMAGE_ORIENT_90: + _evas_image_rotate_90(pixels_out, pixels_in, im1->w, im1->h); + break; + case EVAS_IMAGE_ORIENT_180: + _evas_image_rotate_180(pixels_out, pixels_in, im1->w, im1->h); + break; + case EVAS_IMAGE_ORIENT_270: + _evas_image_rotate_270(pixels_out, pixels_in, im1->w, im1->h); + break; + case EVAS_IMAGE_FLIP_HORIZONTAL: + _evas_image_flip_horizontal(pixels_out, pixels_in, im1->w, im1->h); + break; + case EVAS_IMAGE_FLIP_VERTICAL: + _evas_image_flip_vertical(pixels_out, pixels_in, im1->w, im1->h); + break; + case EVAS_IMAGE_FLIP_TRANSPOSE: + _evas_image_flip_transpose(pixels_out, pixels_in, im1->w, im1->h); + break; + case EVAS_IMAGE_FLIP_TRANSVERSE: + _evas_image_flip_transverse(pixels_out, pixels_in, im1->w, im1->h); + break; + default: + ERR("Wrong orient value"); + return NULL; + } + return im2; } @@ -1083,18 +1135,99 @@ eng_image_data_put(void *engine, void *image, DATA32 *image_data) static void * eng_image_orient_set(void *engine, void *image, Evas_Image_Orient orient) { + Render_Engine_GL_Generic *re = engine; Evas_GL_Image *im; - Evas_GL_Image *im_new; + Evas_GL_Image *im_new = NULL; + void *pixels_in = NULL; + void *pixels_out = NULL; if (!image) return NULL; im = image; - if (im->orient == orient) return image; + if (im->orient == orient && !im->rotated_orient) return image; gl_generic_window_find(engine); evas_gl_common_image_update(im->gc, im); - im_new = evas_gl_common_image_new(im->gc, im->w, im->h, im->alpha, im->cs.space); + // TIZEN_ONLY(20171114) : image orient + if (im->im) + { + if (!im->im->image.data) + { +#ifdef EVAS_CSERVE2 + if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->im->cache_entry)) + evas_cache2_image_load_data(&im->im->cache_entry); + else +#endif + evas_cache_image_load_data(&im->im->cache_entry); + } + evas_gl_common_image_alloc_ensure(im); + + // If the image has already been rotated because of evas_object_image_data_get() + // undo the previous orientation + if (im->rotated_orient) + { + int w, h; + w = im->w; + h = im->h; + + if (im->rotated_orient == EVAS_IMAGE_ORIENT_90 || + im->rotated_orient == EVAS_IMAGE_ORIENT_270 || + im->rotated_orient == EVAS_IMAGE_FLIP_TRANSPOSE || + im->rotated_orient == EVAS_IMAGE_FLIP_TRANSVERSE) + { + w = im->h; + h = im->w; + } + + im_new = evas_gl_common_image_new_from_copied_data(im->gc, w, h, im->im->image.data, im->alpha, im->cs.space); + if (!im_new) return im; + + pixels_in = im->im->image.data; + pixels_out = im_new->im->image.data; + + if (!pixels_out || !pixels_in) { + ERR("evas_test !pixels_out || !pixels_in goto error"); + goto on_error; + } + + switch(im->rotated_orient) + { + case EVAS_IMAGE_ORIENT_0: + memcpy(pixels_out, pixels_in, sizeof (unsigned int) * im->w * im->h); + break; + case EVAS_IMAGE_ORIENT_90: + _evas_image_rotate_270(pixels_out, pixels_in, im->w, im->h); + break; + case EVAS_IMAGE_ORIENT_180: + _evas_image_rotate_180(pixels_out, pixels_in, im->w, im->h); + break; + case EVAS_IMAGE_ORIENT_270: + _evas_image_rotate_90(pixels_out, pixels_in, im->w, im->h); + break; + case EVAS_IMAGE_FLIP_HORIZONTAL: + _evas_image_flip_horizontal(pixels_out, pixels_in, im->w, im->h); + break; + case EVAS_IMAGE_FLIP_VERTICAL: + _evas_image_flip_vertical(pixels_out, pixels_in, im->w, im->h); + break; + case EVAS_IMAGE_FLIP_TRANSPOSE: + _evas_image_flip_transpose(pixels_out, pixels_in, im->w, im->h); + break; + case EVAS_IMAGE_FLIP_TRANSVERSE: + _evas_image_flip_transverse(pixels_out, pixels_in, im->w, im->h); + break; + default: + ERR("Wrong orient value"); + goto on_error; + } + } + else + { + im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->w, im->h, im->im->image.data, im->alpha, im->cs.space); + } + } // TIZEN_ONLY(20171114) : image orient + if (!im_new) return im; im_new->load_opts = im->load_opts; @@ -1109,12 +1242,14 @@ eng_image_orient_set(void *engine, void *image, Evas_Image_Orient orient) im_new->cached = EINA_FALSE; im_new->orient = orient; - im_new->tex = im->tex; - im_new->tex->references++; - im_new->tex->pt->references++; + im_new->rotated_orient = EVAS_IMAGE_ORIENT_NONE; evas_gl_common_image_free(im); return im_new; + +on_error: + evas_gl_common_image_free(im_new); + return im; } static Evas_Image_Orient diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 8d66d55..74a4dc2 100755 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -1,6 +1,7 @@ #include "evas_common_private.h" /* Also includes international specific stuff */ #include "evas_private.h" #include "evas_blend_private.h" +#include "evas_engine.h" #ifdef EVAS_CSERVE2 #include "evas_cs2_private.h" #endif @@ -1958,8 +1959,8 @@ eng_image_surface_noscale_new(void *engdata, int w, int h, int alpha) return eng_image_map_surface_new(engdata, w, h, alpha); } -static void -_image_flip_horizontal(DATA32 *pixels_out, const DATA32 *pixels_in, +EAPI void +_evas_image_flip_horizontal(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { const unsigned int *pi1, *pi2; @@ -1982,8 +1983,8 @@ _image_flip_horizontal(DATA32 *pixels_out, const DATA32 *pixels_in, } } -static void -_image_flip_vertical(DATA32 *pixels_out, const DATA32 *pixels_in, +EAPI void +_evas_image_flip_vertical(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { const unsigned int *pi1, *pi2; @@ -2006,8 +2007,8 @@ _image_flip_vertical(DATA32 *pixels_out, const DATA32 *pixels_in, } } -static void -_image_rotate_180(DATA32 *pixels_out, const DATA32 *pixels_in, +EAPI void +_evas_image_rotate_180(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { const unsigned int *pi1, *pi2; @@ -2028,8 +2029,8 @@ _image_rotate_180(DATA32 *pixels_out, const DATA32 *pixels_in, } } -static void -_image_rotate_90(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) +EAPI void +_evas_image_rotate_90(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { int x, y, xx, yy, xx2, yy2; @@ -2059,8 +2060,8 @@ _image_rotate_90(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) } } -static void -_image_rotate_270(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) +EAPI void +_evas_image_rotate_270(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { int x, y, xx, yy, xx2, yy2; @@ -2090,8 +2091,8 @@ _image_rotate_270(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) } } -static void -_image_flip_transpose(DATA32 *pixels_out, const DATA32 *pixels_in, +EAPI void +_evas_image_flip_transpose(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { int x, y; @@ -2113,8 +2114,8 @@ _image_flip_transpose(DATA32 *pixels_out, const DATA32 *pixels_in, } } -static void -_image_flip_transverse(DATA32 *pixels_out, const DATA32 *pixels_in, +EAPI void +_evas_image_flip_transverse(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { int x, y; @@ -2206,13 +2207,13 @@ eng_image_orient_set(void *data EINA_UNUSED, void *image, Evas_Image_Orient orie ERR("You shouldn't get this message, wrong orient value"); goto on_error; case EVAS_IMAGE_ORIENT_90: - _image_rotate_90(pixels_out, pixels_in, im->w, im->h); + _evas_image_rotate_90(pixels_out, pixels_in, im->w, im->h); break; case EVAS_IMAGE_ORIENT_180: - _image_rotate_180(pixels_out, pixels_in, im->w, im->h); + _evas_image_rotate_180(pixels_out, pixels_in, im->w, im->h); break; case EVAS_IMAGE_ORIENT_270: - _image_rotate_270(pixels_out, pixels_in, im->w, im->h); + _evas_image_rotate_270(pixels_out, pixels_in, im->w, im->h); break; default: ERR("Wrong orient value"); @@ -2225,7 +2226,7 @@ eng_image_orient_set(void *data EINA_UNUSED, void *image, Evas_Image_Orient orie (orient == EVAS_IMAGE_ORIENT_NONE))) { // flip horizontally to get the new orientation - _image_flip_horizontal(pixels_out, pixels_in, im->w, im->h); + _evas_image_flip_horizontal(pixels_out, pixels_in, im->w, im->h); } else if (((im->orient == EVAS_IMAGE_ORIENT_NONE) && (orient == EVAS_IMAGE_FLIP_VERTICAL)) || @@ -2233,7 +2234,7 @@ eng_image_orient_set(void *data EINA_UNUSED, void *image, Evas_Image_Orient orie (orient == EVAS_IMAGE_ORIENT_NONE))) { // flip vertically to get the new orientation - _image_flip_vertical(pixels_out, pixels_in, im->w, im->h); + _evas_image_flip_vertical(pixels_out, pixels_in, im->w, im->h); } else { @@ -2252,25 +2253,25 @@ eng_image_orient_set(void *data EINA_UNUSED, void *image, Evas_Image_Orient orie memcpy(pixels_tmp, pixels_in, sizeof (unsigned int) * w * h); break; case EVAS_IMAGE_ORIENT_90: - _image_rotate_270(pixels_tmp, pixels_in, im->w, im->h); + _evas_image_rotate_270(pixels_tmp, pixels_in, im->w, im->h); break; case EVAS_IMAGE_ORIENT_180: - _image_rotate_180(pixels_tmp, pixels_in, im->w, im->h); + _evas_image_rotate_180(pixels_tmp, pixels_in, im->w, im->h); break; case EVAS_IMAGE_ORIENT_270: - _image_rotate_90(pixels_tmp, pixels_in, im->w, im->h); + _evas_image_rotate_90(pixels_tmp, pixels_in, im->w, im->h); break; case EVAS_IMAGE_FLIP_HORIZONTAL: - _image_flip_horizontal(pixels_tmp, pixels_in, im->w, im->h); + _evas_image_flip_horizontal(pixels_tmp, pixels_in, im->w, im->h); break; case EVAS_IMAGE_FLIP_VERTICAL: - _image_flip_vertical(pixels_tmp, pixels_in, im->w, im->h); + _evas_image_flip_vertical(pixels_tmp, pixels_in, im->w, im->h); break; case EVAS_IMAGE_FLIP_TRANSPOSE: - _image_flip_transpose(pixels_tmp, pixels_in, im->w, im->h); + _evas_image_flip_transpose(pixels_tmp, pixels_in, im->w, im->h); break; case EVAS_IMAGE_FLIP_TRANSVERSE: - _image_flip_transverse(pixels_tmp, pixels_in, im->w, im->h); + _evas_image_flip_transverse(pixels_tmp, pixels_in, im->w, im->h); break; default: ERR("Wrong orient value"); @@ -2286,25 +2287,25 @@ eng_image_orient_set(void *data EINA_UNUSED, void *image, Evas_Image_Orient orie memcpy(pixels_out, pixels_tmp, sizeof (unsigned int) * w * h); break; case EVAS_IMAGE_ORIENT_90: - _image_rotate_90(pixels_out, pixels_tmp, tw, th); + _evas_image_rotate_90(pixels_out, pixels_tmp, tw, th); break; case EVAS_IMAGE_ORIENT_180: - _image_rotate_180(pixels_out, pixels_tmp, tw, th); + _evas_image_rotate_180(pixels_out, pixels_tmp, tw, th); break; case EVAS_IMAGE_ORIENT_270: - _image_rotate_270(pixels_out, pixels_tmp, tw, th); + _evas_image_rotate_270(pixels_out, pixels_tmp, tw, th); break; case EVAS_IMAGE_FLIP_HORIZONTAL: - _image_flip_horizontal(pixels_out, pixels_tmp, tw, th); + _evas_image_flip_horizontal(pixels_out, pixels_tmp, tw, th); break; case EVAS_IMAGE_FLIP_VERTICAL: - _image_flip_vertical(pixels_out, pixels_tmp, tw, th); + _evas_image_flip_vertical(pixels_out, pixels_tmp, tw, th); break; case EVAS_IMAGE_FLIP_TRANSPOSE: - _image_flip_transpose(pixels_out, pixels_tmp, tw, th); + _evas_image_flip_transpose(pixels_out, pixels_tmp, tw, th); break; case EVAS_IMAGE_FLIP_TRANSVERSE: - _image_flip_transverse(pixels_out, pixels_tmp, tw, th); + _evas_image_flip_transverse(pixels_out, pixels_tmp, tw, th); break; } diff --git a/src/modules/evas/engines/software_generic/evas_engine.h b/src/modules/evas/engines/software_generic/evas_engine.h new file mode 100755 index 0000000..b956ee8 --- /dev/null +++ b/src/modules/evas/engines/software_generic/evas_engine.h @@ -0,0 +1,39 @@ +#ifndef _EVAS_ENGINE_H +# define _EVAS_ENGINE_H + +#ifdef EAPI +# undef EAPI +#endif + +#ifdef _WIN32 +# ifdef EFL_EVAS_BUILD +# ifdef DLL_EXPORT +# define EAPI __declspec(dllexport) +# else +# define EAPI +# endif /* ! DLL_EXPORT */ +# else +# define EAPI __declspec(dllimport) +# endif /* ! EFL_EVAS_BUILD */ +#else +# ifdef __GNUC__ +# if __GNUC__ >= 4 +# define EAPI __attribute__ ((visibility("default"))) +# else +# define EAPI +# endif +# else +# define EAPI +# endif +#endif /* ! _WIN32 */ + +// TIZEN_ONLY(20171114) : image orient +EAPI void _evas_image_flip_horizontal(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _evas_image_flip_vertical(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _evas_image_rotate_180(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _evas_image_rotate_90(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _evas_image_rotate_270(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _evas_image_flip_transpose(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _evas_image_flip_transverse(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); + +#endif //_EVAS_ENGINE_H