59 lines
1.2 KiB
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;
|
|
}
|