efl/src/bin/evas/evas_cserve2_utils.c

59 lines
1.2 KiB
C

#include "evas_cserve2_slave.h"
static unsigned int
evas_cserve2_convert_argb_premul(unsigned int *data, unsigned int len)
{
unsigned int *de = data + len;
unsigned int nas = 0;
while (data < de)
{
unsigned int a = 1 + (*data >> 24);
*data = (*data & 0xff000000) +
(((((*data) >> 8) & 0xff) * a) & 0xff00) +
(((((*data) & 0x00ff00ff) * a) >> 8) & 0x00ff00ff);
data++;
if ((a == 1) || (a == 256))
nas++;
}
return nas;
}
EAPI void
evas_cserve2_image_premul(Evas_Img_Load_Params *ilp)
{
unsigned int nas;
if (!ilp->alpha) return;
nas = evas_cserve2_convert_argb_premul(ilp->buffer, ilp->w * ilp->h);
if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ilp->w * ilp->h))
ilp->alpha_sparse = EINA_TRUE;
}
EAPI void
evas_cserve2_imave_alpha_sparse_set(Evas_Img_Load_Params *ilp)
{
unsigned int *s, *se;
unsigned int nas = 0;
unsigned int len = ilp->w * ilp->h;
if (!ilp->alpha) return;
s = ilp->buffer;
se = s + len;
while (s < se)
{
unsigned int p = *s & 0xff000000;
if (!p || (p == 0xff000000))
nas++;
s++;
}
if ((ALPHA_SPARSE_INV_FRACTION * nas) >= len)
ilp->alpha_sparse = EINA_TRUE;
}