i have to back out all of jose's blend changes - musch faster than
debugging/fixing and likely int he end the exact same result of fixing them. yes - we lose performance - but it actually is correct now :) if we want to do such radical changes- i sugegst moving to premultiplied alpha and makign a tonne of externally tested routines in a test harness first to compare correctness and speed in an isolated environment. SVN revision: 18947
This commit is contained in:
parent
e270ac86eb
commit
a0ceee8b51
|
@ -4,620 +4,179 @@
|
|||
#include "evas_mmx.h"
|
||||
#endif
|
||||
|
||||
// extern DATA8 *_evas_pow_lut;
|
||||
extern const DATA8 _evas_pow_lut[65536];
|
||||
extern const DATA16 _evas_const_c1[4];
|
||||
|
||||
#ifdef BUILD_C
|
||||
void
|
||||
evas_common_blend_alpha_color_rgba_to_rgba_c (DATA8 *mask, DATA32 *dst, int len, DATA32 col)
|
||||
evas_common_blend_alpha_color_rgba_to_rgb_c (DATA8 *src, DATA32 *dst, int len, DATA32 col)
|
||||
{
|
||||
DATA32 *dst_end = dst + len, ca = A_VAL(&col);
|
||||
DATA8 *src_ptr;
|
||||
DATA32 *dst_ptr, *dst_end_ptr;
|
||||
|
||||
ca += ca >> 7;
|
||||
mask--; dst--;
|
||||
while (++mask, ++dst < dst_end)
|
||||
src_ptr = src;
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
if (A_VAL(&col) == 0) return;
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
DATA32 a = *mask;
|
||||
DATA32 tmp;
|
||||
DATA8 aa;
|
||||
|
||||
switch (a)
|
||||
aa = (((*src_ptr) +1) * A_VAL(&col)) >> 8;
|
||||
switch (aa)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
break;
|
||||
case 255:
|
||||
{
|
||||
DATA32 da = A_VAL(dst);
|
||||
|
||||
switch(da)
|
||||
{
|
||||
case 0:
|
||||
*dst = col;
|
||||
break;
|
||||
case 255:
|
||||
*dst += RGB_JOIN( ((R_VAL(&col) - R_VAL(dst)) * ca) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * ca) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * ca) >> 8 );
|
||||
break;
|
||||
default:
|
||||
da = _evas_pow_lut[(A_VAL(&col) << 8) | da];
|
||||
da += da >> 7;
|
||||
*dst += ARGB_JOIN( ((255 - A_VAL(dst)) * ca) >> 8,
|
||||
((R_VAL(&col) - R_VAL(dst)) * da) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * da) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * da) >> 8 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
*dst_ptr = col;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
DATA32 da = A_VAL(dst);
|
||||
|
||||
a = (a * ca) >> 8;
|
||||
switch(da)
|
||||
{
|
||||
case 0:
|
||||
*dst = (col & 0x00ffffff) | (a << 24);
|
||||
break;
|
||||
case 255:
|
||||
a += a >> 7;
|
||||
*dst += RGB_JOIN( ((R_VAL(&col) - R_VAL(dst)) * a) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * a) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * a) >> 8 );
|
||||
break;
|
||||
default:
|
||||
da = _evas_pow_lut[(a << 8) | da];
|
||||
da += da >> 7; a += a >> 7;
|
||||
*dst += ARGB_JOIN( ((255 - A_VAL(dst)) * a) >> 8,
|
||||
((R_VAL(&col) - R_VAL(dst)) * da) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * da) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * da) >> 8 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_blend_alpha_color_rgb_to_rgba_c (DATA8 *mask, DATA32 *dst, int len, DATA32 col)
|
||||
{
|
||||
DATA32 *dst_end = dst + len;
|
||||
|
||||
mask--; dst--;
|
||||
while (++mask, ++dst < dst_end)
|
||||
{
|
||||
DATA32 a = *mask;
|
||||
|
||||
switch (a)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
*dst = col;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
DATA32 da = A_VAL(dst);
|
||||
|
||||
switch(da)
|
||||
{
|
||||
case 0:
|
||||
*dst = (col & 0x00ffffff) | (a << 24);
|
||||
break;
|
||||
case 255:
|
||||
a += a >> 7;
|
||||
*dst += RGB_JOIN( ((R_VAL(&col) - R_VAL(dst)) * a) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * a) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * a) >> 8 );
|
||||
break;
|
||||
default:
|
||||
da = _evas_pow_lut[(a << 8) | da];
|
||||
da += da >> 7; a += a >> 7;
|
||||
*dst += ARGB_JOIN( ((255 - A_VAL(dst)) * a) >> 8,
|
||||
((R_VAL(&col) - R_VAL(dst)) * da) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * da) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * da) >> 8 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_blend_alpha_color_rgba_to_rgb_c (DATA8 *mask, DATA32 *dst, int len, DATA32 col)
|
||||
{
|
||||
DATA32 *dst_end = dst + len, ca = A_VAL(&col);
|
||||
|
||||
ca += ca >> 7;
|
||||
mask--; dst--;
|
||||
while (++mask, ++dst < dst_end)
|
||||
{
|
||||
DATA32 a = *mask;
|
||||
|
||||
switch (a)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
*dst += RGB_JOIN( ((R_VAL(&col) - R_VAL(dst)) * ca) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * ca) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * ca) >> 8 );
|
||||
break;
|
||||
default:
|
||||
a = (a * ca) >> 8;
|
||||
a += a >> 7;
|
||||
*dst += RGB_JOIN( ((R_VAL(&col) - R_VAL(dst)) * a) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * a) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * a) >> 8 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_blend_alpha_color_rgb_to_rgb_c (DATA8 *mask, DATA32 *dst, int len, DATA32 col)
|
||||
{
|
||||
DATA32 *dst_end = dst + len;
|
||||
|
||||
mask--; dst--;
|
||||
while (++mask, ++dst < dst_end)
|
||||
{
|
||||
DATA32 a = *mask;
|
||||
|
||||
switch (a)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
*dst = (*dst | 0x00ffffff) & col;
|
||||
break;
|
||||
default:
|
||||
a += a >> 7;
|
||||
*dst += RGB_JOIN( ((R_VAL(&col) - R_VAL(dst)) * a) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * a) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * a) >> 8 );
|
||||
break;
|
||||
BLEND_ALPHA_SETUP(aa, tmp);
|
||||
BLEND_COLOR(aa, R_VAL(dst_ptr),
|
||||
R_VAL(&col), R_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_COLOR(aa, G_VAL(dst_ptr),
|
||||
G_VAL(&col), G_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_COLOR(aa, B_VAL(dst_ptr),
|
||||
B_VAL(&col), B_VAL(dst_ptr),
|
||||
tmp);
|
||||
break;
|
||||
}
|
||||
src_ptr++;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ************************************************************************** */
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
void
|
||||
evas_common_blend_alpha_color_rgba_to_rgba_mmx (DATA8 *mask, DATA32 *dst, int len, DATA32 col)
|
||||
evas_common_blend_alpha_color_rgba_to_rgb_mmx (DATA8 *src, DATA32 *dst, int len, DATA32 col)
|
||||
{
|
||||
DATA32 *dst_end = dst + len;
|
||||
DATA8 *src_ptr;
|
||||
DATA32 *dst_ptr, *dst_end_ptr;
|
||||
|
||||
pxor_r2r(mm0, mm0);
|
||||
movq_m2r(*_evas_const_c1, mm6);
|
||||
if (A_VAL(&col) == 0) return;
|
||||
|
||||
movd_m2r(col, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
punpckhwd_r2r(mm3, mm3);
|
||||
punpckhdq_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
psrlq_i2r(16, mm3);
|
||||
src_ptr = src;
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
movq_r2r(mm3, mm5);
|
||||
|
||||
len = A_VAL(&col);
|
||||
col |= 0xff000000;
|
||||
pxor_r2r(mm6, mm6);
|
||||
movd_m2r(col, mm1);
|
||||
punpcklbw_r2r(mm0, mm1);
|
||||
A_VAL(&col) = len;
|
||||
punpcklbw_r2r(mm1, mm6);
|
||||
psrlw_i2r(8, mm6);
|
||||
movq_m2r(*_evas_const_c1, mm5);
|
||||
paddw_r2r(mm5, mm6);
|
||||
|
||||
mask--; dst--;
|
||||
while (++mask, ++dst < dst_end)
|
||||
pxor_r2r(mm4, mm4);
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
DATA32 a = *mask;
|
||||
DATA32 tmp;
|
||||
DATA8 aa;
|
||||
|
||||
switch (a)
|
||||
aa = (((*src_ptr) +1) * A_VAL(&col)) >> 8;
|
||||
switch (aa)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
break;
|
||||
case 255:
|
||||
{
|
||||
DATA32 da = A_VAL(dst);
|
||||
|
||||
switch(da)
|
||||
{
|
||||
case 0:
|
||||
*dst = col;
|
||||
break;
|
||||
case 255:
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
movq_r2r(mm1, mm3);
|
||||
psubw_r2r(mm2, mm3);
|
||||
psllw_i2r(1, mm3);
|
||||
paddw_r2r(mm6, mm3);
|
||||
pmulhw_r2r(mm5, mm3);
|
||||
paddw_r2r(mm3, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
default:
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
da = _evas_pow_lut[(A_VAL(&col) << 8) + da];
|
||||
da = ARGB_JOIN(A_VAL(&col), da, da, da);
|
||||
movd_m2r(da, mm3);
|
||||
punpcklbw_r2r(mm3, mm3); // mm3 = [AA][dAdA][dAdA][dAdA]
|
||||
psrlw_i2r(1, mm3);
|
||||
|
||||
movq_r2r(mm1, mm4);
|
||||
psubw_r2r(mm2, mm4);
|
||||
psllw_i2r(1, mm4);
|
||||
paddw_r2r(mm6, mm4);
|
||||
|
||||
pmulhw_r2r(mm3, mm4);
|
||||
paddw_r2r(mm4, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
*dst_ptr = col;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
DATA32 da = A_VAL(dst);
|
||||
tmp = 0xffffff;
|
||||
A_VAL(&tmp) = *src_ptr;
|
||||
|
||||
a = RGB_JOIN(a,a,a);
|
||||
movd_m2r(a, mm3);
|
||||
punpcklbw_r2r(mm0, mm3);
|
||||
psllw_i2r(1, mm3);
|
||||
paddw_r2r(mm6, mm3);
|
||||
pmulhw_r2r(mm5, mm3);
|
||||
|
||||
packuswb_r2r(mm0, mm3);
|
||||
movd_r2m(mm3, a);
|
||||
a &= 0xff;
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
|
||||
switch(da)
|
||||
{
|
||||
case 0:
|
||||
*dst = (col & 0x00ffffff) | (a << 24);
|
||||
break;
|
||||
case 255:
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
movd_m2r(tmp, mm1);
|
||||
|
||||
movq_r2r(mm1, mm4);
|
||||
psubw_r2r(mm2, mm4);
|
||||
psllw_i2r(1, mm4);
|
||||
paddw_r2r(mm6, mm4);
|
||||
|
||||
pmulhw_r2r(mm3, mm4);
|
||||
paddw_r2r(mm4, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
/* this could be more optimial.. but it beats the c code by almost */
|
||||
/* double */
|
||||
pxor_r2r(mm7, mm7);
|
||||
punpcklbw_r2r(mm1, mm7);
|
||||
psrlw_i2r(8, mm7);
|
||||
pmullw_r2r(mm6, mm7);
|
||||
psrlw_i2r(8, mm7);
|
||||
packuswb_r2r(mm7, mm7);
|
||||
movq_r2r(mm7, mm1);
|
||||
/* and back to our normal programming... */
|
||||
movd_m2r(dst_ptr[0], mm2);
|
||||
|
||||
break;
|
||||
default:
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
movq_r2r(mm1, mm3);
|
||||
|
||||
da = _evas_pow_lut[(a << 8) + da];
|
||||
da = ARGB_JOIN(a, da, da, da);
|
||||
movd_m2r(da, mm3);
|
||||
punpcklbw_r2r(mm3, mm3); // mm3 = [AA][dAdA][dAdA][dAdA]
|
||||
psrlw_i2r(1, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
punpckhwd_r2r(mm3, mm3);
|
||||
punpckhdq_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
|
||||
movq_r2r(mm1, mm4);
|
||||
psubw_r2r(mm2, mm4);
|
||||
psllw_i2r(1, mm4);
|
||||
paddw_r2r(mm6, mm4);
|
||||
|
||||
pmulhw_r2r(mm3, mm4);
|
||||
paddw_r2r(mm4, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
// psrlq_i2r(16, mm3);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
punpcklbw_r2r(mm4, mm1);
|
||||
punpcklbw_r2r(mm4, mm2);
|
||||
|
||||
psubw_r2r(mm2, mm1);
|
||||
psllw_i2r(1, mm1);
|
||||
paddw_r2r(mm5, mm1);
|
||||
pmulhw_r2r(mm3, mm1);
|
||||
paddw_r2r(mm1, mm2);
|
||||
|
||||
packuswb_r2r(mm4, mm2);
|
||||
movd_r2m(mm2, dst_ptr[0]);
|
||||
break;
|
||||
}
|
||||
src_ptr++;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
evas_common_blend_alpha_color_rgb_to_rgba_mmx (DATA8 *mask, DATA32 *dst, int len, DATA32 col)
|
||||
evas_common_blend_alpha_color_rgba_to_rgba_c (DATA8 *src, DATA32 *dst, int len, DATA32 col)
|
||||
{
|
||||
DATA32 *dst_end = dst + len;
|
||||
DATA8 *src_ptr;
|
||||
DATA32 *dst_ptr, *dst_end_ptr;
|
||||
|
||||
pxor_r2r(mm0, mm0);
|
||||
movq_m2r(*_evas_const_c1, mm6);
|
||||
if (A_VAL(&col) == 0) return;
|
||||
|
||||
movd_m2r(col, mm1);
|
||||
punpcklbw_r2r(mm0, mm1);
|
||||
src_ptr = src;
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
mask--; dst--;
|
||||
while (++mask, ++dst < dst_end)
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
DATA32 a = *mask;
|
||||
DATA32 tmp;
|
||||
DATA8 a, aa;
|
||||
|
||||
switch (a)
|
||||
aa = (((*src_ptr) + 1) * A_VAL(&col)) >> 8;
|
||||
switch (aa)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
break;
|
||||
case 255:
|
||||
*dst = col;
|
||||
break;
|
||||
*dst_ptr = col;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
DATA32 da = A_VAL(dst);
|
||||
|
||||
switch(da)
|
||||
{
|
||||
case 0:
|
||||
*dst = (col & 0x00ffffff) | (a << 24);
|
||||
break;
|
||||
case 255:
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
a = a << 24;
|
||||
movd_m2r(a, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
punpckhwd_r2r(mm3, mm3);
|
||||
punpckhdq_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
|
||||
movq_r2r(mm1, mm4);
|
||||
psubw_r2r(mm2, mm4);
|
||||
psllw_i2r(1, mm4);
|
||||
paddw_r2r(mm6, mm4);
|
||||
|
||||
pmulhw_r2r(mm3, mm4);
|
||||
paddw_r2r(mm4, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
default:
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
da = _evas_pow_lut[(a << 8) + da];
|
||||
da = ARGB_JOIN(a, da, da, da);
|
||||
movd_m2r(da, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
|
||||
movq_r2r(mm1, mm4);
|
||||
psubw_r2r(mm2, mm4);
|
||||
psllw_i2r(1, mm4);
|
||||
paddw_r2r(mm6, mm4);
|
||||
|
||||
pmulhw_r2r(mm3, mm4);
|
||||
paddw_r2r(mm4, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
BLEND_ADST_ALPHA_SETUP(aa, tmp);
|
||||
a = _evas_pow_lut[(aa << 8) | A_VAL(dst_ptr)];
|
||||
BLEND_ADST_COLOR(aa, A_VAL(dst_ptr),
|
||||
255, A_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_ADST_ALPHA_SETUP(a, tmp);
|
||||
BLEND_ADST_COLOR(a, R_VAL(dst_ptr),
|
||||
R_VAL(&col), R_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_ADST_COLOR(a, G_VAL(dst_ptr),
|
||||
G_VAL(&col), G_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_ADST_COLOR(a, B_VAL(dst_ptr),
|
||||
B_VAL(&col), B_VAL(dst_ptr),
|
||||
tmp);
|
||||
break;
|
||||
}
|
||||
src_ptr++;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_blend_alpha_color_rgba_to_rgb_mmx (DATA8 *mask, DATA32 *dst, int len, DATA32 col)
|
||||
{
|
||||
DATA32 *dst_end = dst + len;
|
||||
|
||||
pxor_r2r(mm0, mm0);
|
||||
movq_m2r(*_evas_const_c1, mm6);
|
||||
|
||||
movd_m2r(col, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
punpckhwd_r2r(mm3, mm3);
|
||||
punpckhdq_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
psrlq_i2r(16, mm3);
|
||||
|
||||
movq_r2r(mm3, mm5);
|
||||
|
||||
col |= 0xff000000;
|
||||
movd_m2r(col, mm1);
|
||||
punpcklbw_r2r(mm0, mm1);
|
||||
|
||||
mask--; dst--;
|
||||
while (++mask, ++dst < dst_end)
|
||||
{
|
||||
DATA32 a = *mask;
|
||||
|
||||
switch (a)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
movq_r2r(mm1, mm3);
|
||||
psubw_r2r(mm2, mm3); // mm3 = [A-a][R-r][G-g][B-b]
|
||||
psllw_i2r(1, mm3); // mm3 = [A*2][R*2][G*2][B*2]
|
||||
paddw_r2r(mm6, mm3); // mm3 = [A+1][R+1][G+1][B+1]
|
||||
pmulhw_r2r(mm5, mm3); // mm3 = [A*0][(R*AA)>>16][(G*AA)>>16][(B*AA)>>16]
|
||||
paddw_r2r(mm3, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
default:
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
a = RGB_JOIN(a,a,a);
|
||||
movd_m2r(a, mm3);
|
||||
punpcklbw_r2r(mm0, mm3);
|
||||
psllw_i2r(1, mm3);
|
||||
paddw_r2r(mm6, mm3);
|
||||
pmulhw_r2r(mm5, mm3);
|
||||
|
||||
packuswb_r2r(mm0, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
|
||||
movq_r2r(mm1, mm4);
|
||||
psubw_r2r(mm2, mm4);
|
||||
psllw_i2r(1, mm4);
|
||||
paddw_r2r(mm6, mm4);
|
||||
|
||||
pmulhw_r2r(mm3, mm4);
|
||||
paddw_r2r(mm4, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_blend_alpha_color_rgb_to_rgb_mmx (DATA8 *mask, DATA32 *dst, int len, DATA32 col)
|
||||
{
|
||||
DATA32 *dst_end = dst + len;
|
||||
|
||||
pxor_r2r(mm0, mm0);
|
||||
movq_m2r(*_evas_const_c1, mm6);
|
||||
|
||||
col &= 0x00ffffff;
|
||||
movd_m2r(col, mm1);
|
||||
punpcklbw_r2r(mm0, mm1);
|
||||
|
||||
mask--; dst--;
|
||||
while (++mask, ++dst < dst_end)
|
||||
{
|
||||
DATA32 a = *mask;
|
||||
|
||||
switch (a)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
*dst = (*dst & 0xff000000) | col;
|
||||
break;
|
||||
default:
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
a = a << 24;
|
||||
movd_m2r(a, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
punpckhwd_r2r(mm3, mm3);
|
||||
punpckhdq_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
// psrlq_i2r(16, mm3);
|
||||
|
||||
movq_r2r(mm1, mm4);
|
||||
psubw_r2r(mm2, mm4);
|
||||
psllw_i2r(1, mm4);
|
||||
paddw_r2r(mm6, mm4);
|
||||
|
||||
pmulhw_r2r(mm3, mm4);
|
||||
paddw_r2r(mm4, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ************************************************************************** */
|
||||
|
||||
static void
|
||||
evas_common_blend_alpha_color_nothing (DATA8 *mask, DATA32 *dst, int len, DATA32 col)
|
||||
{
|
||||
}
|
||||
/* ************************************************************************** */
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
static Gfx_Func_Blend_Src_Alpha_Mul_Dst
|
||||
evas_common_gfx_func_blend_alpha_col_get_mmx(DATA32 col, RGBA_Image *dst)
|
||||
{
|
||||
if (A_VAL(&col) < 255)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_alpha_color_rgba_to_rgba_mmx;
|
||||
}
|
||||
return evas_common_blend_alpha_color_rgba_to_rgb_mmx;
|
||||
}
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_alpha_color_rgb_to_rgba_mmx;
|
||||
}
|
||||
return evas_common_blend_alpha_color_rgb_to_rgb_mmx;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_C
|
||||
static Gfx_Func_Blend_Src_Alpha_Mul_Dst
|
||||
evas_common_gfx_func_blend_alpha_col_get_c(DATA32 col, RGBA_Image *dst)
|
||||
{
|
||||
if (A_VAL(&col) < 255)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_alpha_color_rgba_to_rgba_c;
|
||||
}
|
||||
return evas_common_blend_alpha_color_rgba_to_rgb_c;
|
||||
}
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_alpha_color_rgb_to_rgba_c;
|
||||
}
|
||||
return evas_common_blend_alpha_color_rgb_to_rgb_c;
|
||||
}
|
||||
#endif
|
||||
|
||||
Gfx_Func_Blend_Src_Alpha_Mul_Dst
|
||||
evas_common_draw_func_blend_alpha_get (DATA32 col, RGBA_Image *dst)
|
||||
{
|
||||
Gfx_Func_Blend_Src_Alpha_Mul_Dst func = NULL;
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
{
|
||||
func = evas_common_gfx_func_blend_alpha_col_get_mmx(col, dst);
|
||||
if (func) return func;
|
||||
}
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
func = evas_common_gfx_func_blend_alpha_col_get_c(col, dst);
|
||||
if (func) return func;
|
||||
#endif
|
||||
return evas_common_blend_alpha_color_nothing;
|
||||
}
|
||||
|
||||
|
|
|
@ -4,233 +4,151 @@
|
|||
#include "evas_mmx.h"
|
||||
#endif
|
||||
|
||||
// extern DATA8 *_evas_pow_lut;
|
||||
extern const DATA8 _evas_pow_lut[65536];
|
||||
extern const DATA8 _evas_pow_lut[65536];
|
||||
extern const DATA16 _evas_const_c1[4];
|
||||
|
||||
#ifdef BUILD_C
|
||||
void
|
||||
evas_common_blend_color_rgba_to_rgba_c(DATA32 col, DATA32 *dst, int len)
|
||||
evas_common_blend_color_rgba_to_rgb_c(DATA32 src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end = dst + len, ca = A_VAL(&col);
|
||||
DATA32 *dst_ptr, *dst_end_ptr;
|
||||
|
||||
ca += ca >> 7;
|
||||
while (dst < dst_end)
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
DATA32 da;
|
||||
|
||||
da = A_VAL(dst);
|
||||
switch (da)
|
||||
{
|
||||
case 0:
|
||||
*dst = col;
|
||||
break;
|
||||
case 255:
|
||||
*dst += RGB_JOIN( ((R_VAL(&col) - R_VAL(dst)) * ca) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * ca) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * ca) >> 8 );
|
||||
break;
|
||||
default:
|
||||
da = _evas_pow_lut[(A_VAL(&col) << 8) | da];
|
||||
da += da >> 7;
|
||||
*dst += ARGB_JOIN( ((255 - A_VAL(dst)) * ca) >> 8,
|
||||
((R_VAL(&col) - R_VAL(dst)) * da) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * da) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * da) >> 8 );
|
||||
break;
|
||||
}
|
||||
dst++;
|
||||
DATA32 tmp;
|
||||
|
||||
BLEND_ALPHA_SETUP(A_VAL(&src), tmp);
|
||||
BLEND_COLOR(A_VAL(&src), R_VAL(dst_ptr),
|
||||
R_VAL(&src), R_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_COLOR(A_VAL(&src), G_VAL(dst_ptr),
|
||||
G_VAL(&src), G_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_COLOR(A_VAL(&src), B_VAL(dst_ptr),
|
||||
B_VAL(&src), B_VAL(dst_ptr),
|
||||
tmp);
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
void
|
||||
evas_common_blend_color_rgba_to_rgb_c(DATA32 col, DATA32 *dst, int len)
|
||||
evas_common_blend_color_rgba_to_rgb_mmx(DATA32 src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end, ca;
|
||||
|
||||
dst_end = dst + len;
|
||||
ca = A_VAL(&col);
|
||||
ca += ca >> 7;
|
||||
while (dst < dst_end)
|
||||
{
|
||||
*dst += RGB_JOIN(((R_VAL(&col) - R_VAL(dst)) * ca) >> 8,
|
||||
((G_VAL(&col) - G_VAL(dst)) * ca) >> 8,
|
||||
((B_VAL(&col) - B_VAL(dst)) * ca) >> 8 );
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
DATA32 *dst_ptr, *dst_end_ptr;
|
||||
|
||||
void
|
||||
evas_common_copy_color_rgba_to_rgba_c(DATA32 col, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
|
||||
dst_end = dst + len;
|
||||
while (dst < dst_end)
|
||||
{
|
||||
*dst = col;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
void
|
||||
evas_common_copy_color_rgb_to_rgba_c(DATA32 col, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
|
||||
dst_end = dst + len;
|
||||
col |= PIXEL_SOLID_ALPHA;
|
||||
while (dst < dst_end)
|
||||
{
|
||||
*dst = col;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
pxor_r2r(mm4, mm4);
|
||||
movq_m2r(*_evas_const_c1, mm5);
|
||||
|
||||
void
|
||||
evas_common_copy_color_rgb_to_rgb_c(DATA32 col, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
movd_m2r(src, mm6);
|
||||
|
||||
dst_end = dst + len;
|
||||
while (dst < dst_end)
|
||||
movq_r2r(mm6, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
punpckhwd_r2r(mm3, mm3);
|
||||
punpckhdq_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
|
||||
// psrlq_i2r(16, mm3);
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
*dst = col & (*dst | 0x00ffffff);
|
||||
dst++;
|
||||
movq_r2r(mm6, mm1);
|
||||
|
||||
movd_m2r(dst_ptr[0], mm2);
|
||||
|
||||
punpcklbw_r2r(mm4, mm1);
|
||||
punpcklbw_r2r(mm4, mm2);
|
||||
|
||||
psubw_r2r(mm2, mm1);
|
||||
psllw_i2r(1, mm1);
|
||||
paddw_r2r(mm5, mm1);
|
||||
pmulhw_r2r(mm3, mm1);
|
||||
paddw_r2r(mm1, mm2);
|
||||
|
||||
packuswb_r2r(mm4, mm2);
|
||||
movd_r2m(mm2, dst_ptr[0]);
|
||||
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void
|
||||
evas_common_blend_color_rgba_to_rgba_c(DATA32 src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_ptr, *dst_end_ptr;
|
||||
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
DATA32 tmp;
|
||||
DATA8 a;
|
||||
|
||||
BLEND_ADST_ALPHA_SETUP(A_VAL(&src), tmp);
|
||||
a = _evas_pow_lut[(A_VAL(&src) << 8) | A_VAL(dst_ptr)];
|
||||
BLEND_ADST_COLOR(A_VAL(&src), A_VAL(dst_ptr),
|
||||
255, A_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_ADST_ALPHA_SETUP(a, tmp);
|
||||
BLEND_ADST_COLOR(a, R_VAL(dst_ptr),
|
||||
R_VAL(&src), R_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_ADST_COLOR(a, G_VAL(dst_ptr),
|
||||
G_VAL(&src), G_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_ADST_COLOR(a, B_VAL(dst_ptr),
|
||||
B_VAL(&src), B_VAL(dst_ptr),
|
||||
tmp);
|
||||
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef BUILD_C
|
||||
void
|
||||
evas_common_copy_color_rgba_to_rgba_c(DATA32 src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_ptr, *dst_end_ptr;
|
||||
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = src;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
void
|
||||
evas_common_blend_color_rgba_to_rgba_mmx(DATA32 col, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
|
||||
dst_end = dst + len;
|
||||
pxor_r2r(mm0, mm0);
|
||||
movq_m2r(*_evas_const_c1, mm6);
|
||||
|
||||
movd_m2r(col, mm3);
|
||||
movd_m2r(col, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
punpckhwd_r2r(mm3, mm3);
|
||||
punpckhdq_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
psrlq_i2r(16, mm3);
|
||||
|
||||
movq_r2r(mm3, mm5);
|
||||
|
||||
len = A_VAL(&col);
|
||||
col |= 0xff000000;
|
||||
movd_m2r(col, mm1);
|
||||
punpcklbw_r2r(mm0, mm1);
|
||||
A_VAL(&col) = len;
|
||||
|
||||
while (dst < dst_end)
|
||||
{
|
||||
DATA32 da = A_VAL(dst);
|
||||
|
||||
switch(da)
|
||||
{
|
||||
case 0:
|
||||
*dst = col;
|
||||
break;
|
||||
case 255:
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
movq_r2r(mm1, mm3);
|
||||
psubw_r2r(mm2, mm3);
|
||||
psllw_i2r(1, mm3);
|
||||
paddw_r2r(mm6, mm3);
|
||||
pmulhw_r2r(mm5, mm3);
|
||||
paddw_r2r(mm3, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
default:
|
||||
da = _evas_pow_lut[(A_VAL(&col) << 8) + da];
|
||||
da = ARGB_JOIN(A_VAL(&col), da, da, da);
|
||||
movd_m2r(da, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
|
||||
movq_r2r(mm1, mm4);
|
||||
psubw_r2r(mm2, mm4);
|
||||
psllw_i2r(1, mm4);
|
||||
paddw_r2r(mm6, mm4);
|
||||
|
||||
pmulhw_r2r(mm3, mm4);
|
||||
paddw_r2r(mm4, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
}
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_blend_color_rgba_to_rgb_mmx(DATA32 col, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
|
||||
dst_end = dst + len;
|
||||
pxor_r2r(mm0, mm0);
|
||||
movq_m2r(*_evas_const_c1, mm6);
|
||||
|
||||
movd_m2r(col, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
punpckhwd_r2r(mm3, mm3);
|
||||
punpckhdq_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
psrlq_i2r(16, mm3);
|
||||
|
||||
movq_r2r(mm3, mm5);
|
||||
|
||||
col |= 0xff000000;
|
||||
movd_m2r(col, mm1);
|
||||
punpcklbw_r2r(mm0, mm1);
|
||||
|
||||
while (dst < dst_end)
|
||||
{
|
||||
movd_m2r(*dst, mm2);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
movq_r2r(mm1, mm3);
|
||||
psubw_r2r(mm2, mm3);
|
||||
psllw_i2r(1, mm3);
|
||||
paddw_r2r(mm6, mm3);
|
||||
pmulhw_r2r(mm5, mm3);
|
||||
paddw_r2r(mm3, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_copy_color_rgba_to_rgba_mmx(DATA32 col, DATA32 *dst, int len)
|
||||
evas_common_copy_color_rgba_to_rgba_mmx(DATA32 src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
|
||||
|
||||
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
dst_end_ptr_pre = dst + ((len / 10) * 10);
|
||||
|
||||
movd_m2r(col, mm0);
|
||||
movd_m2r(col, mm1);
|
||||
movd_m2r(src, mm0);
|
||||
movd_m2r(src, mm1);
|
||||
psllq_i2r(32, mm0);
|
||||
por_r2r(mm1, mm0);
|
||||
|
||||
|
||||
while (dst_ptr < dst_end_ptr_pre)
|
||||
{
|
||||
movq_r2m(mm0, dst_ptr[0]);
|
||||
|
@ -242,32 +160,27 @@ evas_common_copy_color_rgba_to_rgba_mmx(DATA32 col, DATA32 *dst, int len)
|
|||
}
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = col;
|
||||
*dst_ptr = src;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
#define evas_common_copy_color_rgb_to_rgb_mmx evas_common_copy_color_rgba_to_rgba_mmx
|
||||
#define evas_common_copy_color_rgb_to_rgba_mmx evas_common_copy_color_rgba_to_rgba_mmx
|
||||
#endif
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef BUILD_SSE
|
||||
void
|
||||
evas_common_copy_color_rgba_to_rgba_sse(DATA32 col, DATA32 *dst, int len)
|
||||
evas_common_copy_color_rgba_to_rgba_sse(DATA32 src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
|
||||
|
||||
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
dst_end_ptr_pre = dst + ((len / 10) * 10);
|
||||
|
||||
movd_m2r(col, mm0);
|
||||
movd_m2r(col, mm1);
|
||||
movd_m2r(src, mm0);
|
||||
movd_m2r(src, mm1);
|
||||
psllq_i2r(32, mm0);
|
||||
por_r2r(mm1, mm0);
|
||||
|
||||
|
||||
while (dst_ptr < dst_end_ptr_pre)
|
||||
{
|
||||
prefetch(&dst_ptr[128]);
|
||||
|
@ -280,104 +193,27 @@ evas_common_copy_color_rgba_to_rgba_sse(DATA32 col, DATA32 *dst, int len)
|
|||
}
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = col;
|
||||
*dst_ptr = src;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
#define evas_common_blend_color_rgba_to_rgba_sse NULL
|
||||
#define evas_common_blend_color_rgba_to_rgb_sse NULL
|
||||
#define evas_common_copy_color_rgb_to_rgb_sse evas_common_copy_color_rgba_to_rgba_sse
|
||||
#define evas_common_copy_color_rgb_to_rgba_sse evas_common_copy_color_rgba_to_rgba_sse
|
||||
#endif
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
static void
|
||||
evas_common_blend_color_nothing(DATA32 col, DATA32 *dst, int len)
|
||||
void
|
||||
evas_common_copy_color_rgb_to_rgba_c(DATA32 src, DATA32 *dst, int len)
|
||||
{
|
||||
}
|
||||
DATA32 *dst_ptr, *dst_end_ptr;
|
||||
|
||||
/****************************************************************************/
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
#ifdef BUILD_SSE
|
||||
static Gfx_Func_Blend_Color_Dst
|
||||
evas_common_gfx_func_blend_col_get_sse(DATA32 col, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
if (A_VAL(&col) < 255)
|
||||
src |= PIXEL_SOLID_ALPHA;
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
return evas_common_blend_color_rgba_to_rgba_sse;
|
||||
return evas_common_blend_color_rgba_to_rgb_sse;
|
||||
*dst_ptr = src;
|
||||
dst_ptr++;
|
||||
}
|
||||
if (pixels <= 65536) return NULL;
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
return evas_common_copy_color_rgb_to_rgba_sse;
|
||||
return evas_common_copy_color_rgb_to_rgb_sse;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
static Gfx_Func_Blend_Color_Dst
|
||||
evas_common_gfx_func_blend_col_get_mmx(DATA32 col, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
if (A_VAL(&col) < 255)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_color_rgba_to_rgba_mmx;
|
||||
}
|
||||
return evas_common_blend_color_rgba_to_rgb_mmx;
|
||||
}
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
return evas_common_copy_color_rgb_to_rgba_mmx;
|
||||
return evas_common_copy_color_rgb_to_rgb_mmx;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_C
|
||||
static Gfx_Func_Blend_Color_Dst
|
||||
evas_common_gfx_func_blend_col_get_c(DATA32 col, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
if (A_VAL(&col) < 255)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_color_rgba_to_rgba_c;
|
||||
}
|
||||
return evas_common_blend_color_rgba_to_rgb_c;
|
||||
}
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
return evas_common_copy_color_rgb_to_rgba_c;
|
||||
return evas_common_copy_color_rgb_to_rgb_c;
|
||||
}
|
||||
#endif
|
||||
|
||||
Gfx_Func_Blend_Color_Dst
|
||||
evas_common_draw_func_blend_color_get (DATA32 col, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
Gfx_Func_Blend_Color_Dst func = NULL;
|
||||
|
||||
#ifdef BUILD_SSE
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_SSE))
|
||||
{
|
||||
func = evas_common_gfx_func_blend_col_get_sse(col, dst, pixels);
|
||||
if (func) return func;
|
||||
}
|
||||
#endif
|
||||
#ifdef BUILD_MMX
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
{
|
||||
func = evas_common_gfx_func_blend_col_get_mmx(col, dst, pixels);
|
||||
if (func) return func;
|
||||
}
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
func = evas_common_gfx_func_blend_col_get_c(col, dst, pixels);
|
||||
if (func) return func;
|
||||
#endif
|
||||
return evas_common_blend_color_nothing;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6,305 +6,171 @@
|
|||
|
||||
#define ALIGN_FIX
|
||||
|
||||
// extern DATA8 *_evas_pow_lut;
|
||||
extern const DATA8 _evas_pow_lut[65536];
|
||||
extern const DATA16 _evas_const_c1[4];
|
||||
|
||||
#ifdef BUILD_C
|
||||
void
|
||||
evas_common_blend_pixels_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
|
||||
dst_end = dst + len;
|
||||
while (dst < dst_end)
|
||||
{
|
||||
DATA32 a;
|
||||
|
||||
a = A_VAL(src);
|
||||
switch (a)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
*dst = *src;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
DATA32 da = A_VAL(dst);
|
||||
|
||||
switch(da)
|
||||
{
|
||||
case 0:
|
||||
*dst = *src;
|
||||
break;
|
||||
case 255:
|
||||
a += a >> 7;
|
||||
*dst += RGB_JOIN( ((R_VAL(src) - R_VAL(dst)) * a) >> 8,
|
||||
((G_VAL(src) - G_VAL(dst)) * a) >> 8,
|
||||
((B_VAL(src) - B_VAL(dst)) * a) >> 8 );
|
||||
break;
|
||||
default:
|
||||
da = _evas_pow_lut[(a << 8) + da];
|
||||
da += da >> 7; a += a >> 7;
|
||||
*dst += ARGB_JOIN( ((255 - A_VAL(dst)) * a) >> 8,
|
||||
((R_VAL(src) - R_VAL(dst)) * da) >> 8,
|
||||
((G_VAL(src) - G_VAL(dst)) * da) >> 8,
|
||||
((B_VAL(src) - B_VAL(dst)) * da) >> 8 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
src++;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_blend_pixels_rgba_to_rgb_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
|
||||
dst_end = dst + len;
|
||||
while (dst < dst_end)
|
||||
{
|
||||
DATA32 a;
|
||||
|
||||
a = A_VAL(src);
|
||||
switch (a)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
*dst = (*dst | 0x00ffffff) & (*src);
|
||||
break;
|
||||
default:
|
||||
a += a >> 7;
|
||||
*dst += RGB_JOIN( ((R_VAL(src) - R_VAL(dst)) * a) >> 8,
|
||||
((G_VAL(src) - G_VAL(dst)) * a) >> 8,
|
||||
((B_VAL(src) - B_VAL(dst)) * a) >> 8 );
|
||||
break;
|
||||
}
|
||||
dst++;
|
||||
src++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_copy_pixels_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
|
||||
dst_end = dst + len;
|
||||
while (dst < dst_end)
|
||||
{
|
||||
*dst = *src;
|
||||
dst++;
|
||||
src++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_copy_pixels_rgb_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
|
||||
dst_end = dst + len;
|
||||
while (dst < dst_end)
|
||||
{
|
||||
*dst = *src | PIXEL_SOLID_ALPHA;
|
||||
dst++;
|
||||
src++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_copy_pixels_rgb_to_rgb_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
|
||||
dst_end = dst + len;
|
||||
while (dst < dst_end)
|
||||
{
|
||||
*dst = (*src | PIXEL_SOLID_ALPHA) & (*dst | 0x00ffffff);
|
||||
dst++;
|
||||
src++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_copy_pixels_rev_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_start = dst;
|
||||
|
||||
src = src + len - 1;
|
||||
dst = dst + len - 1;
|
||||
|
||||
while (dst >= dst_start)
|
||||
{
|
||||
*dst = *src;
|
||||
dst--;
|
||||
src--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
evas_common_copy_pixels_rev_rgb_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
|
||||
|
||||
src_ptr = src + len - 1;
|
||||
dst_ptr = dst + len - 1;
|
||||
dst_end_ptr = dst;
|
||||
src_ptr = src;
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
while (dst_ptr >= dst_end_ptr)
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = *src_ptr | PIXEL_SOLID_ALPHA;
|
||||
src_ptr--;
|
||||
dst_ptr--;
|
||||
DATA32 tmp;
|
||||
DATA8 a;
|
||||
|
||||
a = A_VAL(src_ptr);
|
||||
|
||||
switch (a)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
*dst_ptr = *src_ptr;
|
||||
break;
|
||||
default:
|
||||
BLEND_ALPHA_SETUP(a, tmp);
|
||||
BLEND_COLOR(a, R_VAL(dst_ptr),
|
||||
R_VAL(src_ptr), R_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_COLOR(a, G_VAL(dst_ptr),
|
||||
G_VAL(src_ptr), G_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_COLOR(a, B_VAL(dst_ptr),
|
||||
B_VAL(src_ptr), B_VAL(dst_ptr),
|
||||
tmp);
|
||||
break;
|
||||
}
|
||||
src_ptr++;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
void
|
||||
evas_common_blend_pixels_rgba_to_rgba_mmx(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
DATA32 a, da;
|
||||
|
||||
dst_end = dst + len;
|
||||
pxor_r2r(mm0, mm0);
|
||||
movq_m2r(*_evas_const_c1, mm6);
|
||||
|
||||
while (dst < dst_end)
|
||||
{
|
||||
a = A_VAL(src);
|
||||
switch (a)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
*dst = *src;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
da = A_VAL(dst);
|
||||
switch(da)
|
||||
{
|
||||
case 0:
|
||||
*dst = *src;
|
||||
break;
|
||||
case 255:
|
||||
movd_m2r(*src, mm1); // mm1 = [ ][ ][AR][GB] (SRC)
|
||||
movd_m2r(*dst, mm2); // mm2 = [ ][ ][ar][gb] (DST)
|
||||
|
||||
movq_r2r(mm1, mm3);
|
||||
punpcklbw_r2r(mm3, mm3);
|
||||
punpckhwd_r2r(mm3, mm3);
|
||||
punpckhdq_r2r(mm3, mm3);
|
||||
psrlw_i2r(1, mm3);
|
||||
// psrlq_i2r(16, mm3);
|
||||
|
||||
punpcklbw_r2r(mm0, mm1);
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
psubw_r2r(mm2, mm1);
|
||||
psllw_i2r(1, mm1);
|
||||
paddw_r2r(mm6, mm1);
|
||||
pmulhw_r2r(mm3, mm1);
|
||||
paddw_r2r(mm1, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
default:
|
||||
da = _evas_pow_lut[(a << 8) + da];
|
||||
da = ARGB_JOIN(a, da, da, da);
|
||||
movd_m2r(da, mm3);
|
||||
punpcklbw_r2r(mm3, mm3); // mm3 = [AA][dAdA][dAdA][dAdA]
|
||||
psrlw_i2r(1, mm3); // mm3 = [AA/2][dAdA/2][dAdA/2][dAdA/2]
|
||||
|
||||
a = *src | 0xff000000;
|
||||
movd_m2r(a, mm1); // mm1 = [ ][ ][255R][GB] (SRC)
|
||||
punpcklbw_r2r(mm0, mm1);
|
||||
movd_m2r(*dst, mm2); // mm1 = [ ][ ][ar][gb] (DST)
|
||||
punpcklbw_r2r(mm0, mm2);
|
||||
|
||||
psubw_r2r(mm2, mm1);
|
||||
psllw_i2r(1, mm1);
|
||||
paddw_r2r(mm6, mm1);
|
||||
pmulhw_r2r(mm3, mm1);
|
||||
paddw_r2r(mm1, mm2);
|
||||
|
||||
packuswb_r2r(mm0, mm2);
|
||||
movd_r2m(mm2, *dst);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
src++;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_blend_pixels_rgba_to_rgb_mmx(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *dst_end;
|
||||
DATA32 a;
|
||||
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
|
||||
|
||||
dst_end = dst + len;
|
||||
pxor_r2r(mm0, mm0);
|
||||
movq_m2r(*_evas_const_c1, mm6);
|
||||
src_ptr = src;
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
while (dst < dst_end)
|
||||
pxor_r2r(mm4, mm4);
|
||||
movq_m2r(*_evas_const_c1, mm5);
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
a = A_VAL(src);
|
||||
switch (a)
|
||||
switch (A_VAL(src_ptr))
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
*dst = (*dst | 0x00ffffff) & (*src);
|
||||
*dst_ptr = *src_ptr;
|
||||
break;
|
||||
default:
|
||||
movd_m2r(*src, mm1); // mm1 = [ ][ ][AR][GB] (SRC)
|
||||
movd_m2r(*dst, mm2); // mm2 = [ ][ ][ar][gb] (DST)
|
||||
movd_m2r(src_ptr[0], mm1); // mm1 = [ ][ ][AR][GB] (SRC)
|
||||
movd_m2r(dst_ptr[0], mm2); // mm2 = [ ][ ][ar][gb] (DST)
|
||||
|
||||
movq_r2r(mm1, mm3); // mm3 = [ ][ ][AR][GB]
|
||||
punpcklbw_r2r(mm3, mm3); // mm3 = [AA][RR][GG][BB]
|
||||
punpckhwd_r2r(mm3, mm3); // mm3 = [AA][AA][RR][RR]
|
||||
punpckhdq_r2r(mm3, mm3); // mm3 = [AA][AA][AA][AA]
|
||||
psrlw_i2r(1, mm3); // mm3 = [AA/2][AA/2][AA/2][AA/2]
|
||||
|
||||
// psrlq_i2r(16, mm3); // mm3 = [00][AA/2][AA/2][AA/2]
|
||||
|
||||
punpcklbw_r2r(mm0, mm1); // mm1 = [0A][0R][0G][0B]
|
||||
punpcklbw_r2r(mm0, mm2); // mm2 = [0a][0r][0g][0b]
|
||||
punpcklbw_r2r(mm4, mm1); // mm1 = [0A][0R][0G][0B]
|
||||
punpcklbw_r2r(mm4, mm2); // mm2 = [0a][0r][0g][0b]
|
||||
|
||||
psubw_r2r(mm2, mm1); // mm1 = [A-a][R-r][G-g][B-b]
|
||||
psllw_i2r(1, mm1); // mm1 = [A*2][R*2][G*2][B*2]
|
||||
paddw_r2r(mm6, mm1); // mm1 = [A+1][R+1][G+1][B+1]
|
||||
paddw_r2r(mm5, mm1); // mm1 = [A+1][R+1][G+1][B+1]
|
||||
pmulhw_r2r(mm3, mm1); // mm1 = [A*0][(R*AA)>>16][(G*AA)>>16][(B*AA)>>16]
|
||||
paddw_r2r(mm1, mm2); // mm2 = [0a][R-r][G-g][B-b]
|
||||
|
||||
packuswb_r2r(mm0, mm2); // mm2 = [ ][ ][AR][GB]
|
||||
movd_r2m(mm2, *dst); // DST = mm2
|
||||
|
||||
packuswb_r2r(mm4, mm2); // mm2 = [ ][ ][AR][GB]
|
||||
movd_r2m(mm2, dst_ptr[0]); // DST = mm2
|
||||
break;
|
||||
}
|
||||
src++;
|
||||
dst++;
|
||||
src_ptr++;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
evas_common_blend_pixels_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
|
||||
|
||||
src_ptr = src;
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
DATA32 tmp;
|
||||
DATA8 a, aa;
|
||||
|
||||
aa = A_VAL(src_ptr);
|
||||
switch (aa)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 255:
|
||||
*dst_ptr = *src_ptr;
|
||||
break;
|
||||
default:
|
||||
BLEND_ADST_ALPHA_SETUP(aa, tmp);
|
||||
a = _evas_pow_lut[(aa << 8) | A_VAL(dst_ptr)];
|
||||
BLEND_ADST_COLOR(aa, A_VAL(dst_ptr),
|
||||
255, A_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_ADST_ALPHA_SETUP(a, tmp);
|
||||
BLEND_ADST_COLOR(a, R_VAL(dst_ptr),
|
||||
R_VAL(src_ptr), R_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_ADST_COLOR(a, G_VAL(dst_ptr),
|
||||
G_VAL(src_ptr), G_VAL(dst_ptr),
|
||||
tmp);
|
||||
BLEND_ADST_COLOR(a, B_VAL(dst_ptr),
|
||||
B_VAL(src_ptr), B_VAL(dst_ptr),
|
||||
tmp);
|
||||
}
|
||||
src_ptr++;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef BUILD_C
|
||||
void
|
||||
evas_common_copy_pixels_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
|
||||
|
||||
src_ptr = src;
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = *src_ptr;
|
||||
src_ptr++;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
void
|
||||
evas_common_copy_pixels_rgba_to_rgba_mmx(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
|
@ -353,7 +219,9 @@ evas_common_copy_pixels_rgba_to_rgba_mmx(DATA32 *src, DATA32 *dst, int len)
|
|||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
void
|
||||
evas_common_copy_pixels_rgba_to_rgba_mmx2(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
|
@ -402,7 +270,99 @@ evas_common_copy_pixels_rgba_to_rgba_mmx2(DATA32 *src, DATA32 *dst, int len)
|
|||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_SSE
|
||||
void
|
||||
evas_common_copy_pixels_rgba_to_rgba_sse(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
|
||||
#ifdef ALIGN_FIX
|
||||
int src_align;
|
||||
int dst_align;
|
||||
|
||||
src_align = (int)src & 0x3f; /* 64 byte alignment */
|
||||
dst_align = (int)dst & 0x3f; /* 64 byte alignment */
|
||||
|
||||
if ((src_align != dst_align) ||
|
||||
((src_align & 0x3) != 0))
|
||||
{
|
||||
#ifdef BUILD_C
|
||||
evas_common_copy_pixels_rgba_to_rgba_c(src, dst, len);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
while ((src_align > 0) && (len > 0))
|
||||
{
|
||||
*dst = *src;
|
||||
dst++;
|
||||
src++;
|
||||
len--;
|
||||
src_align -= sizeof(DATA32);
|
||||
}
|
||||
#endif /* ALIGN_FIX */
|
||||
|
||||
src_ptr = src;
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
dst_end_ptr_pre = dst + ((len / 16) * 16);
|
||||
|
||||
while (dst_ptr < dst_end_ptr_pre)
|
||||
{
|
||||
prefetch(&src_ptr[16]);
|
||||
MOVE_16DWORDS_MMX(src_ptr, dst_ptr);
|
||||
src_ptr+=16;
|
||||
dst_ptr+=16;
|
||||
}
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = *src_ptr;
|
||||
src_ptr++;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
evas_common_copy_pixels_rgb_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
|
||||
|
||||
src_ptr = src;
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = *src_ptr | PIXEL_SOLID_ALPHA;
|
||||
src_ptr++;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
#ifdef BUILD_C
|
||||
void
|
||||
evas_common_copy_pixels_rev_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
|
||||
|
||||
src_ptr = src + len - 1;
|
||||
dst_ptr = dst + len - 1;
|
||||
dst_end_ptr = dst;
|
||||
|
||||
while (dst_ptr >= dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = *src_ptr;
|
||||
src_ptr--;
|
||||
dst_ptr--;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
void
|
||||
evas_common_copy_pixels_rev_rgba_to_rgba_mmx(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
|
@ -433,7 +393,7 @@ evas_common_copy_pixels_rev_rgba_to_rgba_mmx(DATA32 *src, DATA32 *dst, int len)
|
|||
else
|
||||
{
|
||||
src_ptr = src + len - 1;
|
||||
dst_ptr = dst + len - 1;
|
||||
dst_ptr = dst + len - 1;
|
||||
while (dst_ptr >= dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = *src_ptr;
|
||||
|
@ -442,69 +402,9 @@ evas_common_copy_pixels_rev_rgba_to_rgba_mmx(DATA32 *src, DATA32 *dst, int len)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define evas_common_copy_pixels_rgb_to_rgb_mmx evas_common_copy_pixels_rgba_to_rgba_mmx
|
||||
#define evas_common_copy_pixels_rgb_to_rgba_mmx NULL
|
||||
|
||||
#define evas_common_copy_pixels_rgb_to_rgb_mmx2 evas_common_copy_pixels_rgba_to_rgba_mmx2
|
||||
#define evas_common_copy_pixels_rgb_to_rgba_mmx2 NULL
|
||||
#endif
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
|
||||
#ifdef BUILD_SSE
|
||||
void
|
||||
evas_common_copy_pixels_rgba_to_rgba_sse(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
|
||||
#ifdef ALIGN_FIX
|
||||
int src_align;
|
||||
int dst_align;
|
||||
|
||||
src_align = (int)src & 0x3f; /* 64 byte alignment */
|
||||
dst_align = (int)dst & 0x3f; /* 64 byte alignment */
|
||||
|
||||
if ((src_align != dst_align) ||
|
||||
((src_align & 0x3) != 0))
|
||||
{
|
||||
#ifdef BUILD_C
|
||||
evas_common_copy_pixels_rgba_to_rgba_c(src, dst, len);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
while ((src_align > 0) && (len > 0))
|
||||
{
|
||||
*dst = *src;
|
||||
dst++;
|
||||
src++;
|
||||
len--;
|
||||
src_align -= sizeof(DATA32);
|
||||
}
|
||||
#endif /* ALIGN_FIX */
|
||||
|
||||
src_ptr = src;
|
||||
dst_ptr = dst;
|
||||
dst_end_ptr = dst + len;
|
||||
dst_end_ptr_pre = dst + ((len / 16) * 16);
|
||||
|
||||
while (dst_ptr < dst_end_ptr_pre)
|
||||
{
|
||||
prefetch(&src_ptr[16]);
|
||||
MOVE_16DWORDS_MMX(src_ptr, dst_ptr);
|
||||
src_ptr+=16;
|
||||
dst_ptr+=16;
|
||||
}
|
||||
while (dst_ptr < dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = *src_ptr;
|
||||
src_ptr++;
|
||||
dst_ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
evas_common_copy_pixels_rev_rgba_to_rgba_sse(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
|
@ -536,7 +436,7 @@ evas_common_copy_pixels_rev_rgba_to_rgba_sse(DATA32 *src, DATA32 *dst, int len)
|
|||
else
|
||||
{
|
||||
src_ptr = src + len - 1;
|
||||
dst_ptr = dst + len - 1;
|
||||
dst_ptr = dst + len - 1;
|
||||
while (dst_ptr >= dst_end_ptr)
|
||||
{
|
||||
*dst_ptr = *src_ptr;
|
||||
|
@ -545,174 +445,21 @@ evas_common_copy_pixels_rev_rgba_to_rgba_sse(DATA32 *src, DATA32 *dst, int len)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define evas_common_blend_pixels_rgba_to_rgba_sse NULL
|
||||
#define evas_common_blend_pixels_rgba_to_rgb_sse NULL
|
||||
#define evas_common_copy_pixels_rgb_to_rgb_sse evas_common_copy_pixels_rgba_to_rgba_sse
|
||||
#define evas_common_copy_pixels_rgb_to_rgba_sse NULL
|
||||
#endif
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
static void
|
||||
evas_common_blend_pixels_nothing(DATA32 *src, DATA32 *dst, int len)
|
||||
void
|
||||
evas_common_copy_pixels_rev_rgb_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
}
|
||||
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
|
||||
|
||||
static void
|
||||
evas_common_copy_pixels_nothing(DATA32 *src, DATA32 *dst, int len)
|
||||
{
|
||||
}
|
||||
/****************************************************************************/
|
||||
src_ptr = src + len - 1;
|
||||
dst_ptr = dst + len - 1;
|
||||
dst_end_ptr = dst;
|
||||
|
||||
#ifdef BUILD_SSE
|
||||
static Gfx_Func_Blend_Src_Dst
|
||||
evas_common_gfx_func_blend_pixels_get_sse(RGBA_Image *src, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
if (src->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
while (dst_ptr >= dst_end_ptr)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
return evas_common_blend_pixels_rgba_to_rgba_sse;
|
||||
return evas_common_blend_pixels_rgba_to_rgb_sse;
|
||||
*dst_ptr = *src_ptr | PIXEL_SOLID_ALPHA;
|
||||
src_ptr--;
|
||||
dst_ptr--;
|
||||
}
|
||||
if (pixels <= (256 * 256))
|
||||
return NULL;
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
return evas_common_copy_pixels_rgb_to_rgba_sse;
|
||||
return evas_common_copy_pixels_rgb_to_rgb_sse;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
static Gfx_Func_Blend_Src_Dst
|
||||
evas_common_gfx_func_blend_pixels_get_mmx(RGBA_Image *src, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
if (src->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_pixels_rgba_to_rgba_mmx;
|
||||
}
|
||||
return evas_common_blend_pixels_rgba_to_rgb_mmx;
|
||||
}
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
return evas_common_copy_pixels_rgb_to_rgba_mmx;
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
|
||||
return evas_common_copy_pixels_rgb_to_rgb_mmx2;
|
||||
return evas_common_copy_pixels_rgb_to_rgb_mmx;
|
||||
pixels = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_C
|
||||
static Gfx_Func_Blend_Src_Dst
|
||||
evas_common_gfx_func_blend_pixels_get_c(RGBA_Image *src, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
if (src->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_pixels_rgba_to_rgba_c;
|
||||
}
|
||||
return evas_common_blend_pixels_rgba_to_rgb_c;
|
||||
}
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
return evas_common_copy_pixels_rgb_to_rgba_c;
|
||||
return evas_common_copy_pixels_rgb_to_rgb_c;
|
||||
pixels = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
Gfx_Func_Blend_Src_Dst
|
||||
evas_common_draw_func_blend_get (RGBA_Image *src, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
Gfx_Func_Blend_Src_Dst func = NULL;
|
||||
|
||||
#ifdef BUILD_SSE
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_SSE))
|
||||
{
|
||||
func = evas_common_gfx_func_blend_pixels_get_sse(src, dst, pixels);
|
||||
if (func) return func;
|
||||
}
|
||||
#endif
|
||||
#ifdef BUILD_MMX
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
{
|
||||
func = evas_common_gfx_func_blend_pixels_get_mmx(src, dst, pixels);
|
||||
if (func) return func;
|
||||
}
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
func = evas_common_gfx_func_blend_pixels_get_c(src, dst, pixels);
|
||||
if (func) return func;
|
||||
#endif
|
||||
return evas_common_blend_pixels_nothing;
|
||||
}
|
||||
|
||||
/* ********************************************* */
|
||||
|
||||
#ifdef BUILD_SSE
|
||||
static Gfx_Func_Blend_Src_Dst
|
||||
evas_common_gfx_func_copy_get_sse(int pixels, int reverse)
|
||||
{
|
||||
if (pixels <= (256 * 256))
|
||||
return NULL;
|
||||
if (reverse)
|
||||
return evas_common_copy_pixels_rev_rgba_to_rgba_sse;
|
||||
return evas_common_copy_pixels_rgba_to_rgba_sse;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_MMX
|
||||
static Gfx_Func_Blend_Src_Dst
|
||||
evas_common_gfx_func_copy_get_mmx(int pixels, int reverse)
|
||||
{
|
||||
if (reverse)
|
||||
return evas_common_copy_pixels_rev_rgba_to_rgba_mmx;
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
|
||||
return evas_common_copy_pixels_rgba_to_rgba_mmx2;
|
||||
return evas_common_copy_pixels_rgba_to_rgba_mmx;
|
||||
pixels = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_C
|
||||
static Gfx_Func_Blend_Src_Dst
|
||||
evas_common_gfx_func_copy_get_c(int pixels, int reverse)
|
||||
{
|
||||
if (reverse)
|
||||
return evas_common_copy_pixels_rev_rgba_to_rgba_c;
|
||||
return evas_common_copy_pixels_rgba_to_rgba_c;
|
||||
pixels = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Gfx_Func_Blend_Src_Dst
|
||||
evas_common_draw_func_copy_get(int pixels, int reverse)
|
||||
{
|
||||
Gfx_Func_Blend_Src_Dst func = NULL;
|
||||
|
||||
#ifdef BUILD_SSE
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_SSE))
|
||||
{
|
||||
func = evas_common_gfx_func_copy_get_sse(pixels, reverse);
|
||||
if (func) return func;
|
||||
}
|
||||
#endif
|
||||
#ifdef BUILD_MMX
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
{
|
||||
func = evas_common_gfx_func_copy_get_mmx(pixels, reverse);
|
||||
if (func) return func;
|
||||
}
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
func = evas_common_gfx_func_copy_get_c(pixels, reverse);
|
||||
if (func) return func;
|
||||
#endif
|
||||
return evas_common_copy_pixels_nothing;
|
||||
}
|
||||
|
||||
|
|
|
@ -578,6 +578,164 @@ evas_common_draw_context_set_color_interpolation(RGBA_Draw_Context *dc, int colo
|
|||
dc->interpolation.color_space = color_space;
|
||||
}
|
||||
|
||||
Gfx_Func_Blend_Src_Dst
|
||||
evas_common_draw_func_blend_get(RGBA_Image *src, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
if (src->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_pixels_rgba_to_rgba_c;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef BUILD_MMX
|
||||
# ifdef BUILD_C
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
# endif
|
||||
return evas_common_blend_pixels_rgba_to_rgb_mmx;
|
||||
# ifdef BUILD_C
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
return evas_common_blend_pixels_rgba_to_rgb_c;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
return evas_common_copy_pixels_rgb_to_rgba_c;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if 1
|
||||
|
||||
# ifdef BUILD_MMX
|
||||
# ifdef BUILD_C
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
|
||||
# endif
|
||||
return evas_common_copy_pixels_rgba_to_rgba_mmx2;
|
||||
# ifdef BUILD_SSE
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_SSE
|
||||
# ifdef BUILD_C
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 64 * 64))
|
||||
# endif
|
||||
return evas_common_copy_pixels_rgba_to_rgba_sse;
|
||||
# ifdef BUILD_MMX
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_MMX
|
||||
# ifdef BUILD_C
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
# endif
|
||||
return evas_common_copy_pixels_rgba_to_rgba_mmx;
|
||||
# ifdef BUILD_C
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
return evas_common_copy_pixels_rgba_to_rgba_c;
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
# ifdef BUILD_SSE
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 256 * 256))
|
||||
return evas_common_copy_pixels_rgba_to_rgba_sse;
|
||||
# ifdef BUILD_MMX
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_MMX
|
||||
# ifdef BUILD_C
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
|
||||
# endif
|
||||
return evas_common_copy_pixels_rgba_to_rgba_mmx2;
|
||||
# ifdef BUILD_C
|
||||
else if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
# endif
|
||||
return evas_common_copy_pixels_rgba_to_rgba_mmx;
|
||||
# ifdef BUILD_C
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
return evas_common_copy_pixels_rgba_to_rgba_c;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_pixels_rgba_to_rgba_c;
|
||||
pixels = 0;
|
||||
}
|
||||
|
||||
Gfx_Func_Blend_Color_Dst
|
||||
evas_common_draw_func_blend_color_get(DATA32 src, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
if (A_VAL(&src) != 0xff)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_color_rgba_to_rgba_c;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef BUILD_MMX
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
return evas_common_blend_color_rgba_to_rgb_mmx;
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
# ifdef BUILD_MMX
|
||||
else
|
||||
# endif
|
||||
return evas_common_blend_color_rgba_to_rgb_c;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_copy_color_rgb_to_rgba_c;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef BUILD_SSE
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 64 * 64))
|
||||
return evas_common_copy_color_rgba_to_rgba_sse;
|
||||
#endif
|
||||
#ifdef BUILD_MMX
|
||||
# ifdef BUILD_SSE
|
||||
else
|
||||
# endif
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
return evas_common_copy_color_rgba_to_rgba_mmx;
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
# ifdef BUILD_MMX
|
||||
else
|
||||
# endif
|
||||
return evas_common_copy_color_rgba_to_rgba_c;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_color_rgba_to_rgba_c;
|
||||
pixels = 0;
|
||||
}
|
||||
|
||||
Gfx_Func_Blend_Src_Cmod_Dst
|
||||
evas_common_draw_func_blend_cmod_get(RGBA_Image *src, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
|
@ -585,7 +743,7 @@ evas_common_draw_func_blend_cmod_get(RGBA_Image *src, RGBA_Image *dst, int pixel
|
|||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_pixels_cmod_rgba_to_rgba_c;
|
||||
}
|
||||
else
|
||||
|
@ -597,7 +755,7 @@ evas_common_draw_func_blend_cmod_get(RGBA_Image *src, RGBA_Image *dst, int pixel
|
|||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_copy_pixels_cmod_rgb_to_rgba_c;
|
||||
}
|
||||
else
|
||||
|
@ -605,9 +763,182 @@ evas_common_draw_func_blend_cmod_get(RGBA_Image *src, RGBA_Image *dst, int pixel
|
|||
return evas_common_copy_pixels_cmod_rgba_to_rgba_c;
|
||||
}
|
||||
}
|
||||
// evas_common_blend_init_evas_pow_lut();
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_pixels_cmod_rgba_to_rgba_c;
|
||||
pixels = 0;
|
||||
}
|
||||
|
||||
Gfx_Func_Blend_Src_Mul_Dst
|
||||
evas_common_draw_func_blend_mul_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels)
|
||||
{
|
||||
if (src->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_pixels_mul_color_rgba_to_rgba_c;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef BUILD_MMX
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
return evas_common_blend_pixels_mul_color_rgba_to_rgb_mmx;
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
# ifdef BUILD_MMX
|
||||
else
|
||||
# endif
|
||||
return evas_common_blend_pixels_mul_color_rgba_to_rgb_c;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_pixels_mul_color_rgba_to_rgba_c;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef BUILD_MMX
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
return evas_common_blend_pixels_mul_color_rgba_to_rgb_mmx;
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
# ifdef BUILD_MMX
|
||||
else
|
||||
# endif
|
||||
return evas_common_blend_pixels_mul_color_rgba_to_rgb_c;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_pixels_mul_color_rgba_to_rgba_c;
|
||||
col = 0;
|
||||
pixels = 0;
|
||||
}
|
||||
|
||||
Gfx_Func_Blend_Src_Alpha_Mul_Dst
|
||||
evas_common_draw_func_blend_alpha_get(RGBA_Image *dst)
|
||||
{
|
||||
if (dst->flags & RGBA_IMAGE_HAS_ALPHA)
|
||||
{
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
return evas_common_blend_alpha_color_rgba_to_rgba_c;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef BUILD_MMX
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
return evas_common_blend_alpha_color_rgba_to_rgb_mmx;
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
# ifdef BUILD_MMX
|
||||
else
|
||||
# endif
|
||||
return evas_common_blend_alpha_color_rgba_to_rgb_c;
|
||||
#endif
|
||||
}
|
||||
#ifdef BUILD_C
|
||||
return evas_common_blend_alpha_color_rgba_to_rgba_c;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
Gfx_Func_Blend_Src_Dst
|
||||
evas_common_draw_func_copy_get(int pixels, int reverse)
|
||||
{
|
||||
if (reverse)
|
||||
{
|
||||
#ifdef BUILD_SSE
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 256 * 256))
|
||||
return evas_common_copy_pixels_rev_rgba_to_rgba_sse;
|
||||
#endif
|
||||
#ifdef BUILD_MMX
|
||||
# ifdef BUILD_SSE
|
||||
else
|
||||
# endif
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
return evas_common_copy_pixels_rev_rgba_to_rgba_mmx;
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
# ifdef BUILD_MMX
|
||||
else
|
||||
# endif
|
||||
return evas_common_copy_pixels_rev_rgba_to_rgba_c;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#if 1
|
||||
|
||||
# ifdef BUILD_MMX
|
||||
# ifdef BUILD_C
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
|
||||
# endif
|
||||
return evas_common_copy_pixels_rgba_to_rgba_mmx2;
|
||||
# ifdef BUILD_SSE
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_SSE
|
||||
# ifdef BUILD_C
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 64 * 64))
|
||||
# endif
|
||||
return evas_common_copy_pixels_rgba_to_rgba_sse;
|
||||
# ifdef BUILD_MMX
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_MMX
|
||||
# ifdef BUILD_C
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
# endif
|
||||
return evas_common_copy_pixels_rgba_to_rgba_mmx;
|
||||
# ifdef BUILD_C
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
return evas_common_copy_pixels_rgba_to_rgba_c;
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
# ifdef BUILD_SSE
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 256 * 256))
|
||||
return evas_common_copy_pixels_rgba_to_rgba_sse;
|
||||
# ifdef BUILD_MMX
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_MMX
|
||||
# ifdef BUILD_C
|
||||
if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2))
|
||||
# endif
|
||||
return evas_common_copy_pixels_rgba_to_rgba_mmx2;
|
||||
# ifdef BUILD_C
|
||||
else if (evas_common_cpu_has_feature(CPU_FEATURE_MMX))
|
||||
# endif
|
||||
return evas_common_copy_pixels_rgba_to_rgba_mmx;
|
||||
# ifdef BUILD_C
|
||||
else
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BUILD_C
|
||||
return evas_common_copy_pixels_rgba_to_rgba_c;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
if (!_evas_pow_lut) evas_common_blend_init_evas_pow_lut();
|
||||
#ifdef BUILD_C
|
||||
return evas_common_copy_pixels_rgba_to_rgba_c;
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
pixels = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -120,7 +120,7 @@ evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int
|
|||
evas_common_font_size_use(fn);
|
||||
use_kerning = FT_HAS_KERNING(fi->src->ft.face);
|
||||
prev_index = 0;
|
||||
func = evas_common_draw_func_blend_alpha_get(dc->col.col, dst);
|
||||
func = evas_common_draw_func_blend_alpha_get(dst);
|
||||
for (c = 0, chr = 0; text[chr];)
|
||||
{
|
||||
FT_UInt index;
|
||||
|
|
|
@ -683,6 +683,10 @@ void evas_common_blend_pixels_cmod_rgba_to_rgba_c (DATA32 *src, DATA32 *ds
|
|||
void evas_common_copy_pixels_cmod_rgba_to_rgba_c (DATA32 *src, DATA32 *dst, int len, DATA8 *rmod, DATA8 *gmod, DATA8 *bmod, DATA8 *amod);
|
||||
void evas_common_copy_pixels_cmod_rgb_to_rgba_c (DATA32 *src, DATA32 *dst, int len, DATA8 *rmod, DATA8 *gmod, DATA8 *bmod, DATA8 *amod);
|
||||
|
||||
void evas_common_blend_pixels_mul_color_rgba_to_rgb_c (DATA32 *src, DATA32 *dst, int len, DATA32 mul_color);
|
||||
void evas_common_blend_pixels_mul_color_rgba_to_rgb_mmx (DATA32 *src, DATA32 *dst, int len, DATA32 mul_color);
|
||||
void evas_common_blend_pixels_mul_color_rgba_to_rgba_c (DATA32 *src, DATA32 *dst, int len, DATA32 mul_color);
|
||||
|
||||
void evas_common_blend_alpha_color_rgba_to_rgb_c (DATA8 *src, DATA32 *dst, int len, DATA32 col);
|
||||
void evas_common_blend_alpha_color_rgba_to_rgb_mmx (DATA8 *src, DATA32 *dst, int len, DATA32 col);
|
||||
void evas_common_blend_alpha_color_rgba_to_rgba_c (DATA8 *src, DATA32 *dst, int len, DATA32 col);
|
||||
|
@ -952,7 +956,7 @@ Gfx_Func_Blend_Src_Dst evas_common_draw_func_blend_get (RGBA_Ima
|
|||
Gfx_Func_Blend_Color_Dst evas_common_draw_func_blend_color_get (DATA32 src, RGBA_Image *dst, int pixels);
|
||||
Gfx_Func_Blend_Src_Cmod_Dst evas_common_draw_func_blend_cmod_get (RGBA_Image *src, RGBA_Image *dst, int pixels);
|
||||
Gfx_Func_Blend_Src_Mul_Dst evas_common_draw_func_blend_mul_get (RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
|
||||
Gfx_Func_Blend_Src_Alpha_Mul_Dst evas_common_draw_func_blend_alpha_get (DATA32 src, RGBA_Image *dst);
|
||||
Gfx_Func_Blend_Src_Alpha_Mul_Dst evas_common_draw_func_blend_alpha_get (RGBA_Image *dst);
|
||||
Gfx_Func_Blend_Src_Dst evas_common_draw_func_copy_get (int pixels, int reverse);
|
||||
|
||||
void evas_font_dir_cache_free(void);
|
||||
|
|
Loading…
Reference in New Issue