From 6149240f586c7df1a0db152aef9e917097197bf8 Mon Sep 17 00:00:00 2001 From: Joogab Yun Date: Fri, 1 Sep 2017 16:01:19 +0900 Subject: [PATCH] [evas_gl] 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. Change-Id: I0439037ef8480b7eae58018cb5517724a12b6877 --- src/Makefile_Evas.am | 6 +- src/modules/evas/engines/gl_generic/evas_engine.c | 98 ++++++++++++++++------ .../evas/engines/software_generic/evas_engine.c | 15 ++-- .../evas/engines/software_generic/evas_engine.h | 39 +++++++++ 4 files changed, 125 insertions(+), 33 deletions(-) create mode 100644 src/modules/evas/engines/software_generic/evas_engine.h diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index c4d7320..3e03a29 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -579,7 +579,8 @@ modules/evas/engines/software_generic/evas_engine.c \ modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h \ modules/evas/engines/software_generic/evas_native_tbm.c \ modules/evas/engines/software_generic/ector_surface.c \ -modules/evas/engines/software_generic/evas_native_common.h +modules/evas/engines/software_generic/evas_native_common.h \ +modules/evas/engines/software_generic/evas_engine.h \ lib_evas_libevas_la_LIBADD += else enginesoftwaregenericpkgdir = $(libdir)/evas/modules/engines/software_generic/$(MODULE_ARCH) @@ -594,7 +595,8 @@ modules_evas_engines_software_generic_module_la_SOURCES = \ modules/evas/engines/software_generic/evas_engine.c \ modules/evas/engines/software_generic/Evas_Engine_Software_Generic.h \ modules/evas/engines/software_generic/evas_native_tbm.c \ -modules/evas/engines/software_generic/evas_native_common.h +modules/evas/engines/software_generic/evas_native_common.h \ +modules/evas/engines/software_generic/evas_engine.h modules_evas_engines_software_generic_module_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl \ -I$(top_srcdir)/src/lib/evas/include \ -I$(top_srcdir)/src/lib/evas/cserve2 \ diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index cb9466b..8c14881 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -15,6 +15,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" @@ -675,7 +676,7 @@ _rotate_image_data(Render_Engine_GL_Generic *re, Evas_GL_Image *im1) evas_common_draw_context_free(dc); // Reverts to the previous target surface. - evas_gl_common_context_target_surface_set(gl_context, im1); + evas_gl_common_context_target_surface_set(gl_context, im1); // flush everything eng_gl_surface_lock(re, im2); @@ -695,6 +696,8 @@ _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); + + return im2; } @@ -1001,6 +1004,8 @@ eng_image_orient_set(void *data, void *image, Evas_Image_Orient orient) Render_Engine_GL_Generic *re = data; Evas_GL_Image *im; Evas_GL_Image *im_new = NULL; + void *pixels_in = NULL; + void *pixels_out = NULL; if (!image) return NULL; im = image; @@ -1023,33 +1028,73 @@ eng_image_orient_set(void *data, void *image, Evas_Image_Orient orient) } evas_gl_common_image_alloc_ensure(im); - 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); + // 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: + _image_rotate_270(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); + break; + case EVAS_IMAGE_ORIENT_270: + _image_rotate_90(pixels_out, pixels_in, im->w, im->h); + break; + case EVAS_IMAGE_FLIP_HORIZONTAL: + _image_flip_horizontal(pixels_out, pixels_in, im->w, im->h); + break; + case EVAS_IMAGE_FLIP_VERTICAL: + _image_flip_vertical(pixels_out, pixels_in, im->w, im->h); + break; + case EVAS_IMAGE_FLIP_TRANSPOSE: + _image_flip_transpose(pixels_out, pixels_in, im->w, im->h); + break; + case EVAS_IMAGE_FLIP_TRANSVERSE: + _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); + } } if (!im_new) return im; - // If the image has already been rotated because of evas_object_image_data_get() - // undo the previous orientation - if (im->rotated_orient) - { - Evas_GL_Image *im_rotated_new = NULL; - switch(im->rotated_orient) - { - case EVAS_IMAGE_ORIENT_90: - im_new->orient = EVAS_IMAGE_ORIENT_270; - break; - case EVAS_IMAGE_ORIENT_270: - im_new->orient = EVAS_IMAGE_ORIENT_90; - break; - default: - im_new->orient = im->rotated_orient; - break; - } - im_rotated_new = _rotate_image_data(data, im_new); - evas_gl_common_image_free(im_new); - im_new = im_rotated_new; - im_new->rotated_orient = EVAS_IMAGE_ORIENT_NONE; - } im_new->load_opts = im->load_opts; im_new->scaled = im->scaled; @@ -1063,9 +1108,14 @@ eng_image_orient_set(void *data, void *image, Evas_Image_Orient orient) im_new->cached = EINA_FALSE; im_new->orient = orient; + 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 96285ec..3d9fe74 100644 --- 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 @@ -1393,7 +1394,7 @@ eng_image_data_put(void *data, void *image, DATA32 *image_data) return im; } -static void +EAPI void _image_flip_horizontal(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { @@ -1417,7 +1418,7 @@ _image_flip_horizontal(DATA32 *pixels_out, const DATA32 *pixels_in, } } -static void +EAPI void _image_flip_vertical(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { @@ -1441,7 +1442,7 @@ _image_flip_vertical(DATA32 *pixels_out, const DATA32 *pixels_in, } } -static void +EAPI void _image_rotate_180(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { @@ -1463,7 +1464,7 @@ _image_rotate_180(DATA32 *pixels_out, const DATA32 *pixels_in, } } -static void +EAPI void _image_rotate_90(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { int x, y, xx, yy, xx2, yy2; @@ -1494,7 +1495,7 @@ _image_rotate_90(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) } } -static void +EAPI void _image_rotate_270(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { int x, y, xx, yy, xx2, yy2; @@ -1525,7 +1526,7 @@ _image_rotate_270(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) } } -static void +EAPI void _image_flip_transpose(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { @@ -1548,7 +1549,7 @@ _image_flip_transpose(DATA32 *pixels_out, const DATA32 *pixels_in, } } -static void +EAPI void _image_flip_transverse(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih) { 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 100644 index 0000000..05200c3 --- /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 */ + + +EAPI void _image_flip_horizontal(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _image_flip_vertical(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _image_rotate_180(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _image_rotate_90(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _image_rotate_270(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _image_flip_transpose(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); +EAPI void _image_flip_transverse(DATA32 *pixels_out, const DATA32 *pixels_in, int iw, int ih); + +#endif //_EVAS_ENGINE_H -- 2.7.4