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:
Carsten Haitzler 2005-12-11 04:55:20 +00:00
parent e270ac86eb
commit a0ceee8b51
7 changed files with 1029 additions and 2877 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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);