2002-11-08 00:02:15 -08:00
|
|
|
#include "evas_common.h"
|
|
|
|
|
|
|
|
#ifdef BUILD_MMX
|
|
|
|
#include "evas_mmx.h"
|
|
|
|
#endif
|
|
|
|
|
2003-05-11 19:26:27 -07:00
|
|
|
extern DATA8 _evas_pow_lut[256][256];
|
|
|
|
extern const DATA16 _evas_const_c1[4];
|
2002-11-08 00:02:15 -08:00
|
|
|
|
|
|
|
#ifdef BUILD_C
|
|
|
|
void
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_blend_pixels_rgba_to_rgb_c(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
|
|
|
|
if (A_VAL(src_ptr)) /* hmmm - do we need this? */
|
|
|
|
{
|
|
|
|
BLEND_COLOR(A_VAL(src_ptr), R_VAL(dst_ptr),
|
|
|
|
R_VAL(src_ptr), R_VAL(dst_ptr),
|
|
|
|
tmp);
|
|
|
|
BLEND_COLOR(A_VAL(src_ptr), G_VAL(dst_ptr),
|
|
|
|
G_VAL(src_ptr), G_VAL(dst_ptr),
|
|
|
|
tmp);
|
|
|
|
BLEND_COLOR(A_VAL(src_ptr), B_VAL(dst_ptr),
|
|
|
|
B_VAL(src_ptr), B_VAL(dst_ptr),
|
|
|
|
tmp);
|
|
|
|
}
|
|
|
|
src_ptr++;
|
|
|
|
dst_ptr++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef BUILD_MMX
|
|
|
|
void
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_blend_pixels_rgba_to_rgb_mmx(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr;
|
|
|
|
|
|
|
|
src_ptr = src;
|
|
|
|
dst_ptr = dst;
|
|
|
|
dst_end_ptr = dst + len;
|
|
|
|
|
|
|
|
pxor_r2r(mm4, mm4);
|
2003-05-11 19:26:27 -07:00
|
|
|
movq_m2r(*_evas_const_c1, mm5);
|
2002-11-08 00:02:15 -08:00
|
|
|
|
|
|
|
while (dst_ptr < dst_end_ptr)
|
|
|
|
{
|
|
|
|
movd_m2r(src_ptr[0], mm1);
|
|
|
|
movd_m2r(dst_ptr[0], mm2);
|
|
|
|
|
|
|
|
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(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]);
|
|
|
|
|
|
|
|
src_ptr++;
|
|
|
|
dst_ptr++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_blend_pixels_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
|
|
|
|
if (A_VAL(src_ptr)) /* hmmm - do we need this? */
|
|
|
|
{
|
2003-05-11 19:26:27 -07:00
|
|
|
a = _evas_pow_lut[A_VAL(src_ptr)][A_VAL(dst_ptr)];
|
2002-11-08 00:02:15 -08:00
|
|
|
|
|
|
|
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);
|
|
|
|
A_VAL(dst_ptr) = A_VAL(dst_ptr) + ((A_VAL(src_ptr) * (255 - A_VAL(dst_ptr))) / 255);
|
|
|
|
}
|
|
|
|
src_ptr++;
|
|
|
|
dst_ptr++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************/
|
|
|
|
|
|
|
|
#ifdef BUILD_C
|
|
|
|
void
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_copy_pixels_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
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
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_copy_pixels_rgba_to_rgba_mmx(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
|
2003-02-26 16:07:46 -08:00
|
|
|
int src_align;
|
|
|
|
int dst_align;
|
|
|
|
|
2003-09-10 01:52:18 -07:00
|
|
|
src_align = (int)src & 0x3f; /* 64 byte alignment */
|
|
|
|
dst_align = (int)dst & 0x3f; /* 64 byte alignment */
|
|
|
|
if ((src_align != 0) &&
|
|
|
|
(!(src_align & 0x3)) &&
|
|
|
|
(src_align == dst_align))
|
2003-02-26 16:07:46 -08:00
|
|
|
{
|
2003-09-10 01:52:18 -07:00
|
|
|
while ((src_align > 0) && (len > 0))
|
|
|
|
{
|
|
|
|
*dst = *src;
|
|
|
|
dst++;
|
|
|
|
src++;
|
|
|
|
len--;
|
|
|
|
src_align -= sizeof(DATA32);
|
|
|
|
}
|
2003-02-26 16:07:46 -08:00
|
|
|
}
|
2003-09-10 01:52:18 -07:00
|
|
|
else
|
2003-02-26 16:07:46 -08:00
|
|
|
{
|
|
|
|
#ifdef BUILD_C
|
|
|
|
evas_common_copy_pixels_rgba_to_rgba_c(src, dst, len);
|
|
|
|
#endif
|
|
|
|
return;
|
|
|
|
}
|
2002-11-08 00:02:15 -08:00
|
|
|
src_ptr = src;
|
|
|
|
dst_ptr = dst;
|
|
|
|
dst_end_ptr = dst + len;
|
|
|
|
dst_end_ptr_pre = dst + ((len / 10) * 10);
|
2003-02-26 16:07:46 -08:00
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
while (dst_ptr < dst_end_ptr_pre)
|
|
|
|
{
|
|
|
|
MOVE_10DWORDS_MMX(src_ptr, dst_ptr);
|
|
|
|
src_ptr+=10;
|
|
|
|
dst_ptr+=10;
|
|
|
|
}
|
|
|
|
while (dst_ptr < dst_end_ptr)
|
|
|
|
{
|
|
|
|
*dst_ptr = *src_ptr;
|
|
|
|
src_ptr++;
|
|
|
|
dst_ptr++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2003-09-10 01:52:18 -07:00
|
|
|
#ifdef BUILD_MMX
|
|
|
|
void
|
|
|
|
evas_common_copy_pixels_rgba_to_rgba_mmx2(DATA32 *src, DATA32 *dst, int len)
|
|
|
|
{
|
|
|
|
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
|
|
|
|
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 != 0) &&
|
|
|
|
(!(src_align & 0x3)) &&
|
|
|
|
(src_align == dst_align))
|
|
|
|
{
|
|
|
|
while ((src_align > 0) && (len > 0))
|
|
|
|
{
|
|
|
|
*dst = *src;
|
|
|
|
dst++;
|
|
|
|
src++;
|
|
|
|
len--;
|
|
|
|
src_align -= sizeof(DATA32);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
#ifdef BUILD_C
|
|
|
|
evas_common_copy_pixels_rgba_to_rgba_c(src, dst, len);
|
|
|
|
#endif
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
MOVE_16DWORDS_MMX2(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
|
|
|
|
|
2002-11-08 00:02:15 -08:00
|
|
|
#ifdef BUILD_SSE
|
|
|
|
void
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_copy_pixels_rgba_to_rgba_sse(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
|
2003-02-26 16:07:46 -08:00
|
|
|
int src_align;
|
|
|
|
int dst_align;
|
|
|
|
|
2003-09-10 01:52:18 -07:00
|
|
|
src_align = (int)src & 0x3f; /* 64 byte alignment */
|
|
|
|
dst_align = (int)dst & 0x3f; /* 64 byte alignment */
|
|
|
|
if ((src_align != 0) &&
|
|
|
|
(!(src_align & 0x3)) &&
|
|
|
|
(src_align == dst_align))
|
2003-02-26 16:07:46 -08:00
|
|
|
{
|
2003-09-10 01:52:18 -07:00
|
|
|
while ((src_align > 0) && (len > 0))
|
|
|
|
{
|
|
|
|
*dst = *src;
|
|
|
|
dst++;
|
|
|
|
src++;
|
|
|
|
len--;
|
|
|
|
src_align -= sizeof(DATA32);
|
|
|
|
}
|
2003-02-26 16:07:46 -08:00
|
|
|
}
|
2003-09-10 01:52:18 -07:00
|
|
|
else
|
2003-02-26 16:07:46 -08:00
|
|
|
{
|
|
|
|
#ifdef BUILD_C
|
|
|
|
evas_common_copy_pixels_rgba_to_rgba_c(src, dst, len);
|
|
|
|
#endif
|
|
|
|
return;
|
|
|
|
}
|
2002-11-08 00:02:15 -08:00
|
|
|
|
|
|
|
src_ptr = src;
|
|
|
|
dst_ptr = dst;
|
|
|
|
dst_end_ptr = dst + len;
|
|
|
|
dst_end_ptr_pre = dst + ((len / 10) * 10);
|
|
|
|
|
|
|
|
while (dst_ptr < dst_end_ptr_pre)
|
|
|
|
{
|
|
|
|
prefetch(&src_ptr[128]);
|
|
|
|
prefetch(&dst_ptr[128]);
|
|
|
|
MOVE_10DWORDS_MMX(src_ptr, dst_ptr);
|
|
|
|
src_ptr+=10;
|
|
|
|
dst_ptr+=10;
|
|
|
|
}
|
|
|
|
while (dst_ptr < dst_end_ptr)
|
|
|
|
{
|
|
|
|
*dst_ptr = *src_ptr;
|
|
|
|
src_ptr++;
|
|
|
|
dst_ptr++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_copy_pixels_rgb_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
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
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_copy_pixels_rev_rgba_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
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
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_copy_pixels_rev_rgba_to_rgba_mmx(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
|
|
|
|
|
|
|
|
src_ptr = src + len - 10;
|
|
|
|
dst_ptr = dst + len - 10;
|
|
|
|
dst_end_ptr = dst;
|
|
|
|
dst_end_ptr_pre = dst + len - ((len / 10) * 10);
|
|
|
|
|
|
|
|
if (len >= 10)
|
|
|
|
{
|
|
|
|
while (dst_ptr >= dst_end_ptr_pre)
|
|
|
|
{
|
|
|
|
MOVE_10DWORDS_MMX(src_ptr, dst_ptr);
|
|
|
|
src_ptr-=10;
|
|
|
|
dst_ptr-=10;
|
|
|
|
}
|
|
|
|
src_ptr+=9;
|
|
|
|
dst_ptr+=9;
|
|
|
|
while (dst_ptr >= dst_end_ptr)
|
|
|
|
{
|
|
|
|
*dst_ptr = *src_ptr;
|
|
|
|
src_ptr--;
|
|
|
|
dst_ptr--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
src_ptr = src + len - 1;
|
|
|
|
dst_ptr = dst + len - 1;
|
|
|
|
while (dst_ptr >= dst_end_ptr)
|
|
|
|
{
|
|
|
|
*dst_ptr = *src_ptr;
|
|
|
|
src_ptr--;
|
|
|
|
dst_ptr--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef BUILD_SSE
|
|
|
|
void
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_copy_pixels_rev_rgba_to_rgba_sse(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
DATA32 *src_ptr, *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre;
|
|
|
|
|
|
|
|
src_ptr = src + len - 10;
|
|
|
|
dst_ptr = dst + len - 10;
|
|
|
|
dst_end_ptr = dst;
|
|
|
|
dst_end_ptr_pre = dst + len - ((len / 10) * 10);
|
|
|
|
|
|
|
|
if (len >= 10)
|
|
|
|
{
|
|
|
|
while (dst_ptr >= dst_end_ptr_pre)
|
|
|
|
{
|
|
|
|
prefetch(&src_ptr[-128]);
|
|
|
|
prefetch(&dst_ptr[-128]);
|
|
|
|
MOVE_10DWORDS_MMX(src_ptr, dst_ptr);
|
|
|
|
src_ptr-=10;
|
|
|
|
dst_ptr-=10;
|
|
|
|
}
|
|
|
|
src_ptr+=9;
|
|
|
|
dst_ptr+=9;
|
|
|
|
while (dst_ptr >= dst_end_ptr)
|
|
|
|
{
|
|
|
|
*dst_ptr = *src_ptr;
|
|
|
|
src_ptr--;
|
|
|
|
dst_ptr--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
src_ptr = src + len - 1;
|
|
|
|
dst_ptr = dst + len - 1;
|
|
|
|
while (dst_ptr >= dst_end_ptr)
|
|
|
|
{
|
|
|
|
*dst_ptr = *src_ptr;
|
|
|
|
src_ptr--;
|
|
|
|
dst_ptr--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_copy_pixels_rev_rgb_to_rgba_c(DATA32 *src, DATA32 *dst, int len)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
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 | PIXEL_SOLID_ALPHA;
|
|
|
|
src_ptr--;
|
|
|
|
dst_ptr--;
|
|
|
|
}
|
|
|
|
}
|