From 2ac9e788c689f2ca850d373a19a9e85237198573 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Tue, 29 Dec 2015 22:01:16 +0900 Subject: [PATCH] Evas: Implement ARGY88 and GRY8 conversion to ARGB8888 This is adding support for a deprecated function, but apparently it is used. Also, remove crazy abort() inside the data_put function. Fixes T2991 --- src/lib/evas/canvas/evas_object_image.c | 16 ++++ src/lib/evas/common/evas_convert_colorspace.c | 86 ++++++++++++++++++- src/lib/evas/common/evas_convert_colorspace.h | 2 + .../evas/engines/gl_generic/evas_engine.c | 6 +- 4 files changed, 106 insertions(+), 4 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index b4a8f19992..fecffe6fda 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -4709,6 +4709,22 @@ evas_object_image_data_convert_internal(Evas_Image_Data *o, void *data, Evas_Col o->cur->image.h, to_cspace); break; + case EVAS_COLORSPACE_AGRY88: + out = evas_common_convert_agry88_to(data, + o->cur->image.w, + o->cur->image.h, + o->cur->image.stride, + o->cur->has_alpha, + to_cspace); + break; + case EVAS_COLORSPACE_GRY8: + out = evas_common_convert_gry8_to(data, + o->cur->image.w, + o->cur->image.h, + o->cur->image.stride, + o->cur->has_alpha, + to_cspace); + break; default: WRN("unknow colorspace: %i\n", o->cur->cspace); break; diff --git a/src/lib/evas/common/evas_convert_colorspace.c b/src/lib/evas/common/evas_convert_colorspace.c index 0536380897..afbac8f884 100644 --- a/src/lib/evas/common/evas_convert_colorspace.c +++ b/src/lib/evas/common/evas_convert_colorspace.c @@ -46,6 +46,90 @@ evas_common_convert_rgb565_a5p_to_argb8888(void *data, int w, int h, int stride, return ret; } +static inline void * +evas_common_convert_agry88_to_argb8888(const void *data, int w, int h, int stride, Eina_Bool has_alpha) +{ + const DATA16 *src, *end; + DATA32 *ret, *dst; + + src = data; + end = src + ((stride >> 1) * h); + ret = malloc(w * h * sizeof(DATA32)); + dst = ret; + + if (has_alpha) + { + for (; src < end; src++, dst++) + { + int c = (*src) & 0xFF; + *dst = ARGB_JOIN((*src >> 8), c, c, c); + } + } + else + { + for (; src < end; src++, dst++) + { + int c = (*src) & 0xFF; + *dst = ARGB_JOIN(0xFF, c, c, c); + } + } + + return ret; +} + +void * +evas_common_convert_agry88_to(const void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace) +{ + switch (cspace) { + case EVAS_COLORSPACE_ARGB8888: + return evas_common_convert_agry88_to_argb8888(data, w, h, stride, has_alpha); + default: + return NULL; + } +} + +static inline void * +evas_common_convert_gry8_to_argb8888(const void *data, int w, int h, int stride, Eina_Bool has_alpha) +{ + const DATA8 *src, *end; + DATA32 *ret, *dst; + + src = data; + end = src + (stride * h); + ret = malloc(w * h * sizeof(DATA32)); + dst = ret; + + if (has_alpha) + { + for (; src < end; src++, dst++) + { + int c = (*src) & 0xFF; + *dst = ARGB_JOIN(c, c, c, c); + } + } + else + { + for (; src < end; src++, dst++) + { + int c = (*src) & 0xFF; + *dst = ARGB_JOIN(0xFF, c, c, c); + } + } + + return ret; +} + +void * +evas_common_convert_gry8_to(const void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace) +{ + switch (cspace) { + case EVAS_COLORSPACE_ARGB8888: + return evas_common_convert_gry8_to_argb8888(data, w, h, stride, has_alpha); + default: + return NULL; + } +} + static inline void * evas_common_convert_argb8888_to_a8(void *data, int w, int h, int stride, Eina_Bool has_alpha) { @@ -68,8 +152,6 @@ evas_common_convert_argb8888_to_a8(void *data, int w, int h, int stride, Eina_Bo return ret; } - - EAPI void * evas_common_convert_argb8888_to(void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace) { diff --git a/src/lib/evas/common/evas_convert_colorspace.h b/src/lib/evas/common/evas_convert_colorspace.h index f3bec7862e..51a94f9aeb 100644 --- a/src/lib/evas/common/evas_convert_colorspace.h +++ b/src/lib/evas/common/evas_convert_colorspace.h @@ -8,5 +8,7 @@ EAPI void *evas_common_convert_yuv_422P_601_to(void *data, int w, int h, Evas_Co EAPI void *evas_common_convert_yuv_422_601_to (void *data, int w, int h, Evas_Colorspace cspace); EAPI void *evas_common_convert_yuv_420_601_to (void *data, int w, int h, Evas_Colorspace cspace); EAPI void *evas_common_convert_yuv_420T_601_to(void *data, int w, int h, Evas_Colorspace cspace); +void *evas_common_convert_agry88_to(const void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace); +void *evas_common_convert_gry8_to(const void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace); #endif /* _EVAS_CONVERT_COLORSPACE_H */ diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index 4a06285b0e..c462225056 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -970,6 +970,8 @@ eng_image_data_put(void *data, void *image, DATA32 *image_data) switch (im->cs.space) { case EVAS_COLORSPACE_ARGB8888: + case EVAS_COLORSPACE_AGRY88: + case EVAS_COLORSPACE_GRY8: if ((!im->im) || (image_data != im->im->image.data)) { im2 = eng_image_new_from_data(data, im->w, im->h, image_data, @@ -997,8 +999,8 @@ eng_image_data_put(void *data, void *image, DATA32 *image_data) evas_gl_common_image_dirty(im, 0, 0, 0, 0); break; default: - abort(); - break; + ERR("colorspace %d is not supported here", im->cs.space); + return NULL; } return im; }