From eb7071078a2b958a78dc4e00392ee32cd55b940d Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 21 Mar 2014 11:53:57 +0900 Subject: [PATCH] evas: handle premultiplying of AGRY88. --- src/lib/evas/common/evas_convert_color.c | 20 ++++++++++++++++++++ src/lib/evas/common/evas_convert_color.h | 1 + src/lib/evas/common/evas_image_main.c | 10 +++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/lib/evas/common/evas_convert_color.c b/src/lib/evas/common/evas_convert_color.c index 34bb978d81..3399443e44 100644 --- a/src/lib/evas/common/evas_convert_color.c +++ b/src/lib/evas/common/evas_convert_color.c @@ -1,6 +1,26 @@ #include "evas_common_private.h" #include "evas_convert_color.h" +EAPI DATA32 +evas_common_convert_ag_premul(DATA16 *data, unsigned int len) +{ + DATA16 *de = data + len; + DATA32 nas = 0; + + while (data < de) + { + DATA16 a = 1 + ((*data >> 8) & 0xff); + + *data = (*data & 0xff00) | + ((((*data & 0xff) * a) >> 8) & 0xff); + data++; + + if ((a == 1) || (a == 256)) + nas++; + } + + return nas; +} EAPI DATA32 evas_common_convert_argb_premul(DATA32 *data, unsigned int len) diff --git a/src/lib/evas/common/evas_convert_color.h b/src/lib/evas/common/evas_convert_color.h index 0224879edd..c3c07a3ca9 100644 --- a/src/lib/evas/common/evas_convert_color.h +++ b/src/lib/evas/common/evas_convert_color.h @@ -2,6 +2,7 @@ #define _EVAS_CONVERT_COLOR_H +EAPI DATA32 evas_common_convert_ag_premul (DATA16 *data, unsigned int len); EAPI DATA32 evas_common_convert_argb_premul (DATA32 *src, unsigned int len); EAPI void evas_common_convert_argb_unpremul (DATA32 *src, unsigned int len); EAPI void evas_common_convert_color_argb_premul (int a, int *r, int *g, int *b); diff --git a/src/lib/evas/common/evas_image_main.c b/src/lib/evas/common/evas_image_main.c index f4302b18b2..7770c90fab 100644 --- a/src/lib/evas/common/evas_image_main.c +++ b/src/lib/evas/common/evas_image_main.c @@ -998,7 +998,15 @@ evas_common_image_premul(Image_Entry *ie) if (!evas_cache_image_pixels(ie)) return; if (!ie->flags.alpha) return; - nas = evas_common_convert_argb_premul(evas_cache_image_pixels(ie), ie->w * ie->h); + switch (ie->space) + { + case EVAS_COLORSPACE_ARGB8888: + nas = evas_common_convert_argb_premul(evas_cache_image_pixels(ie), ie->w * ie->h); + break; + case EVAS_COLORSPACE_AGRY88: + nas = evas_common_convert_ag_premul((void*) evas_cache_image_pixels(ie), ie->w * ie->h); + default: return; + } if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h)) ie->flags.alpha_sparse = 1; }