mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-08 07:58:02 +02:00
Special case alpha values of 0 and 0xff. (fbCompositeSrc_8888x8888mmx): Add an MMX implementation for a common operation when using pixman.
Prototype for the new function. Call the new function where appropriate.
This commit is contained in:
parent
f5afeec18a
commit
d809e82980
4 changed files with 108 additions and 12 deletions
|
|
@ -1,3 +1,15 @@
|
|||
2005-08-18 Billy Biggs <vektor@dumbterm.net>
|
||||
|
||||
* src/fbmmx.c: (mmxCombineMaskU), (mmxCombineOverU): Special case
|
||||
alpha values of 0 and 0xff.
|
||||
(fbCompositeSrc_8888x8888mmx): Add an MMX implementation for
|
||||
a common operation when using pixman.
|
||||
|
||||
* src/fbmmx.h: Prototype for the new function.
|
||||
|
||||
* src/fbpict.c: (fbComposite): Call the new function where
|
||||
appropriate.
|
||||
|
||||
2005-08-18 Billy Biggs <vektor@dumbterm.net>
|
||||
|
||||
* src/fbcompose.c: (fbFetchTransformed): Special case projective
|
||||
|
|
|
|||
|
|
@ -374,11 +374,17 @@ mmxCombineMaskU (CARD32 *src, const CARD32 *mask, int width)
|
|||
{
|
||||
const CARD32 *end = mask + width;
|
||||
while (mask < end) {
|
||||
__m64 a = load8888(*mask);
|
||||
__m64 s = load8888(*src);
|
||||
a = expand_alpha(a);
|
||||
s = pix_multiply(s, a);
|
||||
*src = store8888(s);
|
||||
CARD32 mmask = *mask;
|
||||
CARD32 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;
|
||||
}
|
||||
|
|
@ -392,10 +398,16 @@ mmxCombineOverU (CARD32 *dest, const CARD32 *src, int width)
|
|||
const CARD32 *end = dest + width;
|
||||
|
||||
while (dest < end) {
|
||||
__m64 s, sa;
|
||||
s = load8888(*src);
|
||||
sa = expand_alpha(s);
|
||||
*dest = store8888(over(s, sa, load8888(*dest)));
|
||||
CARD32 ssrc = *src;
|
||||
CARD32 a = ssrc >> 24;
|
||||
if (a == 0xff) {
|
||||
*dest = ssrc;
|
||||
} else if (a) {
|
||||
__m64 s, sa;
|
||||
s = load8888(ssrc);
|
||||
sa = expand_alpha(s);
|
||||
*dest = store8888(over(s, sa, load8888(*dest)));
|
||||
}
|
||||
++dest;
|
||||
++src;
|
||||
}
|
||||
|
|
@ -1338,6 +1350,56 @@ fbCompositeSrc_x888x8x8888mmx (pixman_operator_t op,
|
|||
_mm_empty();
|
||||
}
|
||||
|
||||
void
|
||||
fbCompositeSrc_8888x8888mmx (pixman_operator_t op,
|
||||
PicturePtr pSrc,
|
||||
PicturePtr pMask,
|
||||
PicturePtr pDst,
|
||||
INT16 xSrc,
|
||||
INT16 ySrc,
|
||||
INT16 xMask,
|
||||
INT16 yMask,
|
||||
INT16 xDst,
|
||||
INT16 yDst,
|
||||
CARD16 width,
|
||||
CARD16 height)
|
||||
{
|
||||
CARD32 *dstLine, *dst;
|
||||
CARD32 *srcLine, *src, s;
|
||||
FbStride dstStride, srcStride;
|
||||
CARD8 a;
|
||||
CARD16 w;
|
||||
|
||||
fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
|
||||
fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
|
||||
|
||||
while (height--)
|
||||
{
|
||||
dst = dstLine;
|
||||
dstLine += dstStride;
|
||||
src = srcLine;
|
||||
srcLine += srcStride;
|
||||
w = width;
|
||||
|
||||
while (w--)
|
||||
{
|
||||
s = *src++;
|
||||
a = s >> 24;
|
||||
if (a == 0xff)
|
||||
*dst = s;
|
||||
else if (a) {
|
||||
__m64 ms, sa;
|
||||
ms = load8888(s);
|
||||
sa = expand_alpha(ms);
|
||||
*dst = store8888(over(ms, sa, load8888(*dst)));
|
||||
}
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
_mm_empty();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
fbCompositeSolidMask_nx8x8888mmx (pixman_operator_t op,
|
||||
PicturePtr pSrc,
|
||||
|
|
|
|||
|
|
@ -198,6 +198,18 @@ void fbCompositeSrc_8888x8x8888mmx (pixman_operator_t op,
|
|||
INT16 yDst,
|
||||
CARD16 width,
|
||||
CARD16 height);
|
||||
void fbCompositeSrc_8888x8888mmx (pixman_operator_t op,
|
||||
PicturePtr pSrc,
|
||||
PicturePtr pMask,
|
||||
PicturePtr pDst,
|
||||
INT16 xSrc,
|
||||
INT16 ySrc,
|
||||
INT16 xMask,
|
||||
INT16 yMask,
|
||||
INT16 xDst,
|
||||
INT16 yDst,
|
||||
CARD16 width,
|
||||
CARD16 height);
|
||||
Bool fbCopyAreammx (FbPixels *pSrc,
|
||||
FbPixels *pDst,
|
||||
int src_x,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* $Id: fbpict.c,v 1.2 2005-08-18 13:01:45 vektor Exp $
|
||||
* $Id: fbpict.c,v 1.3 2005-08-19 02:13:07 vektor Exp $
|
||||
*
|
||||
* Copyright © 2000 SuSE, Inc.
|
||||
*
|
||||
|
|
@ -1693,7 +1693,12 @@ pixman_composite (pixman_operator_t op,
|
|||
switch (pDst->format_code) {
|
||||
case PICT_a8r8g8b8:
|
||||
case PICT_x8r8g8b8:
|
||||
func = fbCompositeSrc_8888x8888;
|
||||
#ifdef USE_MMX
|
||||
if (fbHaveMMX())
|
||||
func = fbCompositeSrc_8888x8888mmx;
|
||||
else
|
||||
#endif
|
||||
func = fbCompositeSrc_8888x8888;
|
||||
break;
|
||||
case PICT_r8g8b8:
|
||||
func = fbCompositeSrc_8888x0888;
|
||||
|
|
@ -1707,7 +1712,12 @@ pixman_composite (pixman_operator_t op,
|
|||
switch (pDst->format_code) {
|
||||
case PICT_a8b8g8r8:
|
||||
case PICT_x8b8g8r8:
|
||||
func = fbCompositeSrc_8888x8888;
|
||||
#ifdef USE_MMX
|
||||
if (fbHaveMMX())
|
||||
func = fbCompositeSrc_8888x8888mmx;
|
||||
else
|
||||
#endif
|
||||
func = fbCompositeSrc_8888x8888;
|
||||
break;
|
||||
case PICT_b8g8r8:
|
||||
func = fbCompositeSrc_8888x0888;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue