/*
- * Combine src and mask
- */
-FASTCALL static void
-pixman_fbCombineMaskU (comp4_t *src, const comp4_t *mask, int width)
-{
- int i;
- for (i = 0; i < width; ++i) {
- comp4_t a = *(mask + i) >> A_SHIFT;
- comp4_t s = *(src + i);
- FbByteMul(s, a);
- *(src + i) = s;
- }
-}
-
-/*
* All of the composing functions
*/
FbComposeFunctions pixman_composeFunctions = {
pixman_fbCombineFuncU,
- pixman_fbCombineFuncC,
- pixman_fbCombineMaskU
+ pixman_fbCombineFuncC,
};
}
}
+
+
#define WRITE_ACCESS(f) ((image->common.write_func)? f##_accessors : f)
static void
/* --------------- MMX code patch for fbcompose.c --------------------- */
-static FASTCALL void
-mmxCombineMaskU (uint32_t *src, const uint32_t *mask, int width)
-{
- const uint32_t *end = mask + width;
- while (mask < end) {
- uint32_t mmask = *mask;
- uint32_t maska = mmask >> 24;
- if (maska == 0) {
- *src = 0;
- } else if (maska != 0xff) {
- __m64 a = load8888(mmask);
- __m64 s = load8888(*src);
- a = expand_alpha(a);
- s = pix_multiply(s, a);
- *src = store8888(s);
- }
- ++src;
- ++mask;
- }
- _mm_empty();
-}
-
static force_inline uint32_t
combine (const uint32_t *src, const uint32_t *mask)
{
pixman_composeFunctions.combineC[PIXMAN_OP_ATOP_REVERSE] = mmxCombineAtopReverseC;
pixman_composeFunctions.combineC[PIXMAN_OP_XOR] = mmxCombineXorC;
pixman_composeFunctions.combineC[PIXMAN_OP_ADD] = mmxCombineAddC;
-
- pixman_composeFunctions.combineMaskU = mmxCombineMaskU;
}
initialized = TRUE;
*/
#define FASTCALL
-typedef FASTCALL void (*CombineMask32) (uint32_t *src, const uint32_t *mask, int width);
typedef FASTCALL void (*CombineFunc32) (uint32_t *dest, const uint32_t *src, const uint32_t *mask, int width);
typedef FASTCALL void (*fetchProc32)(bits_image_t *pict, int x, int y, int width,
uint32_t *buffer);
typedef struct _FbComposeFunctions32 {
CombineFunc32 *combineU;
CombineFunc32 *combineC;
- CombineMask32 combineMaskU;
} FbComposeFunctions32;
typedef struct _FbComposeFunctions64 {
/* SSE2 code patch for fbcompose.c */
static FASTCALL void
-sse2CombineMaskU (uint32_t *dst, const uint32_t *src, int width)
-{
- coreCombineReverseInUsse2 (dst, src, NULL, width);
- _mm_empty();
-}
-
-static FASTCALL void
sse2CombineOverU (uint32_t *dst, const uint32_t *src, const uint32_t *mask, int width)
{
coreCombineOverUsse2 (dst, src, mask, width);
pixman_composeFunctions.combineC[PIXMAN_OP_XOR] = sse2CombineXorC;
pixman_composeFunctions.combineC[PIXMAN_OP_ADD] = sse2CombineAddC;
- pixman_composeFunctions.combineMaskU = sse2CombineMaskU;
-
_mm_empty();
}
vec_st ((vector unsigned int) tmp1, 0, dest );
static FASTCALL void
-vmxCombineMaskU (uint32_t *src, const uint32_t *msk, int width)
-{
- int i;
- vector unsigned int vsrc, vmsk;
- vector unsigned char tmp1, tmp2, tmp3, tmp4, edges,
- src_mask, msk_mask, store_mask;
-
- COMPUTE_SHIFT_MASKS(src, msk)
-
- /* printf ("%s\n",__PRETTY_FUNCTION__); */
- for (i = width/4; i > 0; i--) {
-
- LOAD_VECTORS(src, msk)
-
- vsrc = pix_multiply (vsrc, splat_alpha (vmsk));
-
- STORE_VECTOR(src)
-
- msk+=4;
- src+=4;
- }
-
- for (i = width%4; --i >= 0;) {
- uint32_t a = msk[i] >> 24;
- uint32_t s = src[i];
- FbByteMul (s, a);
- src[i] = s;
- }
-}
-
-static FASTCALL void
vmxCombineOverU (uint32_t *dest, const uint32_t *src, int width)
{
int i;
pixman_composeFunctions.combineC[PIXMAN_OP_ATOP_REVERSE] = vmxCombineAtopReverseC;
pixman_composeFunctions.combineC[PIXMAN_OP_XOR] = vmxCombineXorC;
pixman_composeFunctions.combineC[PIXMAN_OP_ADD] = vmxCombineAddC;
-
- pixman_composeFunctions.combineMaskU = vmxCombineMaskU;
}
}