Revert various fast path functions to their pre-pixman-merge state
since they fail rendercheck. Remove their associated macros. See bug 10903.
This commit is contained in:
parent
1568b6b6a0
commit
3da842bf93
557
fb/fbpict.c
557
fb/fbpict.c
|
@ -78,64 +78,6 @@ fbIn (CARD32 x, CARD8 y)
|
||||||
return m|n|o|p;
|
return m|n|o|p;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define genericCombine24(a,b,c,d) (((a)*(c)+(b)*(d)))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This macro does src IN mask OVER dst when src and dst are 0888.
|
|
||||||
* If src has alpha, this will not work
|
|
||||||
*/
|
|
||||||
#define inOver0888(alpha, source, destval, dest) { \
|
|
||||||
CARD32 dstrb=destval&0xFF00FF; CARD32 dstag=(destval>>8)&0xFF00FF; \
|
|
||||||
CARD32 drb=((source&0xFF00FF)-dstrb)*alpha; CARD32 dag=(((source>>8)&0xFF00FF)-dstag)*alpha; \
|
|
||||||
WRITE(dest, ((((drb>>8) + dstrb) & 0x00FF00FF) | ((((dag>>8) + dstag) << 8) & 0xFF00FF00))); \
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This macro does src IN mask OVER dst when src and dst are 0565 and
|
|
||||||
* mask is a 5-bit alpha value. Again, if src has alpha, this will not
|
|
||||||
* work.
|
|
||||||
*/
|
|
||||||
#define inOver0565(alpha, source, destval, dest) { \
|
|
||||||
CARD16 dstrb = destval & 0xf81f; CARD16 dstg = destval & 0x7e0; \
|
|
||||||
CARD32 drb = ((source&0xf81f)-dstrb)*alpha; CARD32 dg=((source & 0x7e0)-dstg)*alpha; \
|
|
||||||
WRITE(dest, ((((drb>>5) + dstrb)&0xf81f) | (((dg>>5) + dstg) & 0x7e0))); \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define inOver2x0565(alpha, source, destval, dest) { \
|
|
||||||
CARD32 dstrb = destval & 0x07e0f81f; CARD32 dstg = (destval & 0xf81f07e0)>>5; \
|
|
||||||
CARD32 drb = ((source&0x07e0f81f)-dstrb)*alpha; CARD32 dg=(((source & 0xf81f07e0)>>5)-dstg)*alpha; \
|
|
||||||
WRITE(dest, ((((drb>>5) + dstrb)&0x07e0f81f) | ((((dg>>5) + dstg)<<5) & 0xf81f07e0))); \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if IMAGE_BYTE_ORDER == LSBFirst
|
|
||||||
#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(long)where; \
|
|
||||||
temp=count&3; \
|
|
||||||
where-=temp; \
|
|
||||||
workingWhere=(CARD32 *)where; \
|
|
||||||
workingVal=READ(workingWhere++); \
|
|
||||||
count=4-temp; \
|
|
||||||
workingVal>>=(8*temp)
|
|
||||||
#define readPacked(where,x,y,z) {if(!(x)) { (x)=4; y = READ(z++); } where=(y)&0xff; (y)>>=8; (x)--;}
|
|
||||||
#define readPackedSource(where) readPacked(where,ws,workingSource,wsrc)
|
|
||||||
#define readPackedDest(where) readPacked(where,wd,workingiDest,widst)
|
|
||||||
#define writePacked(what) workingoDest>>=8; workingoDest|=(what<<24); ww--; if(!ww) { ww=4; WRITE (wodst++, workingoDest); }
|
|
||||||
#else
|
|
||||||
#warning "I havn't tested fbCompositeTrans_0888xnx0888() on big endian yet!"
|
|
||||||
#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(long)where; \
|
|
||||||
temp=count&3; \
|
|
||||||
where-=temp; \
|
|
||||||
workingWhere=(CARD32 *)where; \
|
|
||||||
workingVal=READ(workingWhere++); \
|
|
||||||
count=4-temp; \
|
|
||||||
workingVal<<=(8*temp)
|
|
||||||
#define readPacked(where,x,y,z) {if(!(x)) { (x)=4; y = READ(z++); } where=(y)>>24; (y)<<=8; (x)--;}
|
|
||||||
#define readPackedSource(where) readPacked(where,ws,workingSource,wsrc)
|
|
||||||
#define readPackedDest(where) readPacked(where,wd,workingiDest,widst)
|
|
||||||
#define writePacked(what) workingoDest<<=8; workingoDest|=what; ww--; if(!ww) { ww=4; WRITE(wodst++, workingoDest); }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Naming convention:
|
* Naming convention:
|
||||||
*
|
*
|
||||||
|
@ -279,7 +221,6 @@ fbCompositeSolidMask_nx8888x8888C (CARD8 op,
|
||||||
fbFinishAccess (pDst->pDrawable);
|
fbFinishAccess (pDst->pDrawable);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define srcAlphaCombine24(a,b) genericCombine24(a,b,srca,srcia)
|
|
||||||
void
|
void
|
||||||
fbCompositeSolidMask_nx8x0888 (CARD8 op,
|
fbCompositeSolidMask_nx8x0888 (CARD8 op,
|
||||||
PicturePtr pSrc,
|
PicturePtr pSrc,
|
||||||
|
@ -294,86 +235,53 @@ fbCompositeSolidMask_nx8x0888 (CARD8 op,
|
||||||
CARD16 width,
|
CARD16 width,
|
||||||
CARD16 height)
|
CARD16 height)
|
||||||
{
|
{
|
||||||
CARD32 src, srca, srcia;
|
CARD32 src, srca;
|
||||||
CARD8 *dstLine, *dst, *edst;
|
CARD8 *dstLine, *dst;
|
||||||
|
CARD32 d;
|
||||||
CARD8 *maskLine, *mask, m;
|
CARD8 *maskLine, *mask, m;
|
||||||
FbStride dstStride, maskStride;
|
FbStride dstStride, maskStride;
|
||||||
CARD16 w;
|
CARD16 w;
|
||||||
CARD32 rs,gs,bs,rd,gd,bd;
|
|
||||||
|
|
||||||
fbComposeGetSolid(pSrc, src, pDst->format);
|
fbComposeGetSolid(pSrc, src, pDst->format);
|
||||||
|
|
||||||
srca = src >> 24;
|
srca = src >> 24;
|
||||||
srcia = 255-srca;
|
|
||||||
if (src == 0)
|
if (src == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rs=src&0xff;
|
|
||||||
gs=(src>>8)&0xff;
|
|
||||||
bs=(src>>16)&0xff;
|
|
||||||
|
|
||||||
fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3);
|
fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3);
|
||||||
fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
|
fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
|
||||||
|
|
||||||
while (height--)
|
while (height--)
|
||||||
{
|
{
|
||||||
/* fixme: cleanup unused */
|
dst = dstLine;
|
||||||
unsigned long wt, wd;
|
|
||||||
CARD32 workingiDest;
|
|
||||||
CARD32 *widst;
|
|
||||||
|
|
||||||
edst = dst = dstLine;
|
|
||||||
dstLine += dstStride;
|
dstLine += dstStride;
|
||||||
mask = maskLine;
|
mask = maskLine;
|
||||||
maskLine += maskStride;
|
maskLine += maskStride;
|
||||||
w = width;
|
w = width;
|
||||||
|
|
||||||
#ifndef NO_MASKED_PACKED_READ
|
|
||||||
setupPackedReader(wd,wt,edst,widst,workingiDest);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (w--)
|
while (w--)
|
||||||
{
|
{
|
||||||
#ifndef NO_MASKED_PACKED_READ
|
|
||||||
readPackedDest(rd);
|
|
||||||
readPackedDest(gd);
|
|
||||||
readPackedDest(bd);
|
|
||||||
#else
|
|
||||||
rd = READ(edst++);
|
|
||||||
gd = READ(edst++);
|
|
||||||
bd = READ(edst++);
|
|
||||||
#endif
|
|
||||||
m = READ(mask++);
|
m = READ(mask++);
|
||||||
if (m == 0xff)
|
if (m == 0xff)
|
||||||
{
|
{
|
||||||
if (srca == 0xff)
|
if (srca == 0xff)
|
||||||
{
|
d = src;
|
||||||
WRITE(dst++, rs);
|
|
||||||
WRITE(dst++, gs);
|
|
||||||
WRITE(dst++, bs);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WRITE(dst++, (srcAlphaCombine24(rs, rd)>>8));
|
d = Fetch24(dst);
|
||||||
WRITE(dst++, (srcAlphaCombine24(gs, gd)>>8));
|
d = fbOver24 (src, d);
|
||||||
WRITE(dst++, (srcAlphaCombine24(bs, bd)>>8));
|
|
||||||
}
|
}
|
||||||
|
Store24(dst,d);
|
||||||
}
|
}
|
||||||
else if (m)
|
else if (m)
|
||||||
{
|
{
|
||||||
int na=(srca*(int)m)>>8;
|
d = fbOver24 (fbIn(src,m), Fetch24(dst));
|
||||||
int nia=255-na;
|
Store24(dst,d);
|
||||||
WRITE(dst++, (genericCombine24(rs, rd, na, nia)>>8));
|
|
||||||
WRITE(dst++, (genericCombine24(gs, gd, na, nia)>>8));
|
|
||||||
WRITE(dst++, (genericCombine24(bs, bd, na, nia)>>8));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dst+=3;
|
|
||||||
}
|
}
|
||||||
|
dst += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fbFinishAccess (pMask->pDrawable);
|
fbFinishAccess (pMask->pDrawable);
|
||||||
fbFinishAccess (pDst->pDrawable);
|
fbFinishAccess (pDst->pDrawable);
|
||||||
}
|
}
|
||||||
|
@ -392,26 +300,22 @@ fbCompositeSolidMask_nx8x0565 (CARD8 op,
|
||||||
CARD16 width,
|
CARD16 width,
|
||||||
CARD16 height)
|
CARD16 height)
|
||||||
{
|
{
|
||||||
CARD32 src, srca8, srca5;
|
CARD32 src, srca;
|
||||||
CARD16 *dstLine, *dst;
|
CARD16 *dstLine, *dst;
|
||||||
CARD16 d;
|
CARD32 d;
|
||||||
CARD32 t;
|
|
||||||
CARD8 *maskLine, *mask, m;
|
CARD8 *maskLine, *mask, m;
|
||||||
FbStride dstStride, maskStride;
|
FbStride dstStride, maskStride;
|
||||||
CARD16 w,src16;
|
CARD16 w;
|
||||||
|
|
||||||
fbComposeGetSolid(pSrc, src, pDst->format);
|
fbComposeGetSolid(pSrc, src, pDst->format);
|
||||||
|
|
||||||
|
srca = src >> 24;
|
||||||
if (src == 0)
|
if (src == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
srca8 = (src >> 24);
|
|
||||||
srca5 = (srca8 >> 3);
|
|
||||||
src16 = cvt8888to0565(src);
|
|
||||||
|
|
||||||
fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
|
fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
|
||||||
fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
|
fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
|
||||||
|
|
||||||
while (height--)
|
while (height--)
|
||||||
{
|
{
|
||||||
dst = dstLine;
|
dst = dstLine;
|
||||||
|
@ -419,123 +323,35 @@ fbCompositeSolidMask_nx8x0565 (CARD8 op,
|
||||||
mask = maskLine;
|
mask = maskLine;
|
||||||
maskLine += maskStride;
|
maskLine += maskStride;
|
||||||
w = width;
|
w = width;
|
||||||
|
|
||||||
while (w--)
|
while (w--)
|
||||||
{
|
{
|
||||||
m = READ(mask++);
|
m = READ(mask++);
|
||||||
if (m == 0)
|
if (m == 0xff)
|
||||||
dst++;
|
|
||||||
else if (srca5 == (0xff >> 3))
|
|
||||||
{
|
{
|
||||||
if (m == 0xff)
|
if (srca == 0xff)
|
||||||
WRITE(dst++, src16);
|
d = src;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
d = READ(dst);
|
d = READ(dst);
|
||||||
m >>= 3;
|
d = fbOver24 (src, cvt0565to0888(d));
|
||||||
inOver0565 (m, src16, d, dst++);
|
}
|
||||||
}
|
WRITE(dst, cvt8888to0565(d));
|
||||||
}
|
}
|
||||||
else
|
else if (m)
|
||||||
{
|
{
|
||||||
d = READ(dst);
|
d = READ(dst);
|
||||||
if (m == 0xff)
|
d = fbOver24 (fbIn(src,m), cvt0565to0888(d));
|
||||||
{
|
WRITE(dst, cvt8888to0565(d));
|
||||||
t = fbOver24 (src, cvt0565to0888 (d));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
t = fbIn (src, m);
|
|
||||||
t = fbOver (t, cvt0565to0888 (d));
|
|
||||||
}
|
|
||||||
WRITE(dst++, cvt8888to0565 (t));
|
|
||||||
}
|
}
|
||||||
|
dst++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fbFinishAccess (pMask->pDrawable);
|
fbFinishAccess (pMask->pDrawable);
|
||||||
fbFinishAccess (pDst->pDrawable);
|
fbFinishAccess (pDst->pDrawable);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
fbCompositeSolidMask_nx8888x0565 (CARD8 op,
|
|
||||||
PicturePtr pSrc,
|
|
||||||
PicturePtr pMask,
|
|
||||||
PicturePtr pDst,
|
|
||||||
INT16 xSrc,
|
|
||||||
INT16 ySrc,
|
|
||||||
INT16 xMask,
|
|
||||||
INT16 yMask,
|
|
||||||
INT16 xDst,
|
|
||||||
INT16 yDst,
|
|
||||||
CARD16 width,
|
|
||||||
CARD16 height)
|
|
||||||
{
|
|
||||||
CARD32 src, srca8, srca5;
|
|
||||||
CARD16 *dstLine, *dst;
|
|
||||||
CARD16 d;
|
|
||||||
CARD32 *maskLine, *mask;
|
|
||||||
CARD32 t;
|
|
||||||
CARD8 m;
|
|
||||||
FbStride dstStride, maskStride;
|
|
||||||
CARD16 w, src16;
|
|
||||||
|
|
||||||
fbComposeGetSolid(pSrc, src, pDst->format);
|
|
||||||
|
|
||||||
if (src == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
srca8 = src >> 24;
|
|
||||||
srca5 = srca8 >> 3;
|
|
||||||
src16 = cvt8888to0565(src);
|
|
||||||
|
|
||||||
fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
|
|
||||||
fbComposeGetStart (pMask, xMask, yMask, CARD32, maskStride, maskLine, 1);
|
|
||||||
|
|
||||||
while (height--)
|
|
||||||
{
|
|
||||||
dst = dstLine;
|
|
||||||
dstLine += dstStride;
|
|
||||||
mask = maskLine;
|
|
||||||
maskLine += maskStride;
|
|
||||||
w = width;
|
|
||||||
|
|
||||||
while (w--)
|
|
||||||
{
|
|
||||||
m = READ(mask++) >> 24;
|
|
||||||
if (m == 0)
|
|
||||||
dst++;
|
|
||||||
else if (srca5 == (0xff >> 3))
|
|
||||||
{
|
|
||||||
if (m == 0xff)
|
|
||||||
WRITE(dst++, src16);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
d = READ(dst);
|
|
||||||
m >>= 3;
|
|
||||||
inOver0565 (m, src16, d, dst++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (m == 0xff)
|
|
||||||
{
|
|
||||||
d = READ(dst);
|
|
||||||
t = fbOver24 (src, cvt0565to0888 (d));
|
|
||||||
WRITE(dst++, cvt8888to0565 (t));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
d = READ(dst);
|
|
||||||
t = fbIn (src, m);
|
|
||||||
t = fbOver (t, cvt0565to0888 (d));
|
|
||||||
WRITE(dst++, cvt8888to0565 (t));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
fbCompositeSolidMask_nx8888x0565C (CARD8 op,
|
fbCompositeSolidMask_nx8888x0565C (CARD8 op,
|
||||||
PicturePtr pSrc,
|
PicturePtr pSrc,
|
||||||
|
@ -1060,295 +876,6 @@ fbCompositeSrcSrc_nxn (CARD8 op,
|
||||||
CARD16 width,
|
CARD16 width,
|
||||||
CARD16 height);
|
CARD16 height);
|
||||||
|
|
||||||
static void
|
|
||||||
fbCompositeTrans_0565xnx0565(CARD8 op,
|
|
||||||
PicturePtr pSrc,
|
|
||||||
PicturePtr pMask,
|
|
||||||
PicturePtr pDst,
|
|
||||||
INT16 xSrc,
|
|
||||||
INT16 ySrc,
|
|
||||||
INT16 xMask,
|
|
||||||
INT16 yMask,
|
|
||||||
INT16 xDst,
|
|
||||||
INT16 yDst,
|
|
||||||
CARD16 width,
|
|
||||||
CARD16 height)
|
|
||||||
{
|
|
||||||
CARD16 *dstLine, *dst;
|
|
||||||
CARD16 *srcLine, *src;
|
|
||||||
FbStride dstStride, srcStride;
|
|
||||||
CARD16 w;
|
|
||||||
FbBits mask;
|
|
||||||
CARD8 maskAlpha;
|
|
||||||
CARD16 s_16, d_16;
|
|
||||||
CARD32 s_32, d_32;
|
|
||||||
|
|
||||||
fbComposeGetSolid (pMask, mask, pDst->format);
|
|
||||||
maskAlpha = mask >> 27;
|
|
||||||
|
|
||||||
if (!maskAlpha)
|
|
||||||
return;
|
|
||||||
if (maskAlpha == 0xff)
|
|
||||||
{
|
|
||||||
fbCompositeSrcSrc_nxn (PictOpSrc, pSrc, pMask, pDst,
|
|
||||||
xSrc, ySrc, xMask, yMask, xDst, yDst,
|
|
||||||
width, height);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fbComposeGetStart (pSrc, xSrc, ySrc, CARD16, srcStride, srcLine, 1);
|
|
||||||
fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
|
|
||||||
|
|
||||||
while (height--)
|
|
||||||
{
|
|
||||||
CARD32 *isrc, *idst;
|
|
||||||
dst = dstLine;
|
|
||||||
dstLine += dstStride;
|
|
||||||
src = srcLine;
|
|
||||||
srcLine += srcStride;
|
|
||||||
w = width;
|
|
||||||
|
|
||||||
if(((long)src&1)==1)
|
|
||||||
{
|
|
||||||
s_16 = READ(src++);
|
|
||||||
d_16 = READ(dst);
|
|
||||||
inOver0565(maskAlpha, s_16, d_16, dst++);
|
|
||||||
w--;
|
|
||||||
}
|
|
||||||
isrc=(CARD32 *)src;
|
|
||||||
if(((long)dst&1)==0)
|
|
||||||
{
|
|
||||||
idst=(CARD32 *)dst;
|
|
||||||
while (w>1)
|
|
||||||
{
|
|
||||||
s_32 = READ(isrc++);
|
|
||||||
d_32 = READ(idst);
|
|
||||||
inOver2x0565(maskAlpha, s_32, d_32, idst++);
|
|
||||||
w-=2;
|
|
||||||
}
|
|
||||||
dst=(CARD16 *)idst;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while (w > 1)
|
|
||||||
{
|
|
||||||
s_32 = READ(isrc++);
|
|
||||||
#if IMAGE_BYTE_ORDER == LSBFirst
|
|
||||||
s_16=s_32&0xffff;
|
|
||||||
#else
|
|
||||||
s_16=s_32>>16;
|
|
||||||
#endif
|
|
||||||
d_16 = READ(dst);
|
|
||||||
inOver0565 (maskAlpha, s_16, d_16, dst++);
|
|
||||||
#if IMAGE_BYTE_ORDER == LSBFirst
|
|
||||||
s_16=s_32>>16;
|
|
||||||
#else
|
|
||||||
s_16=s_32&0xffff;
|
|
||||||
#endif
|
|
||||||
d_16 = READ(dst);
|
|
||||||
inOver0565(maskAlpha, s_16, d_16, dst++);
|
|
||||||
w-=2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
src=(CARD16 *)isrc;
|
|
||||||
if(w!=0)
|
|
||||||
{
|
|
||||||
s_16 = READ(src);
|
|
||||||
d_16 = READ(dst);
|
|
||||||
inOver0565(maskAlpha, s_16, d_16, dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fbFinishAccess (pSrc->pDrawable);
|
|
||||||
fbFinishAccess (pDst->pDrawable);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* macros for "i can't believe it's not fast" packed pixel handling */
|
|
||||||
#define alphamaskCombine24(a,b) genericCombine24(a,b,maskAlpha,maskiAlpha)
|
|
||||||
|
|
||||||
static void
|
|
||||||
fbCompositeTrans_0888xnx0888(CARD8 op,
|
|
||||||
PicturePtr pSrc,
|
|
||||||
PicturePtr pMask,
|
|
||||||
PicturePtr pDst,
|
|
||||||
INT16 xSrc,
|
|
||||||
INT16 ySrc,
|
|
||||||
INT16 xMask,
|
|
||||||
INT16 yMask,
|
|
||||||
INT16 xDst,
|
|
||||||
INT16 yDst,
|
|
||||||
CARD16 width,
|
|
||||||
CARD16 height)
|
|
||||||
{
|
|
||||||
CARD8 *dstLine, *dst,*idst;
|
|
||||||
CARD8 *srcLine, *src;
|
|
||||||
FbStride dstStride, srcStride;
|
|
||||||
CARD16 w;
|
|
||||||
FbBits mask;
|
|
||||||
CARD16 maskAlpha,maskiAlpha;
|
|
||||||
|
|
||||||
fbComposeGetSolid (pMask, mask, pDst->format);
|
|
||||||
maskAlpha = mask >> 24;
|
|
||||||
maskiAlpha= 255-maskAlpha;
|
|
||||||
|
|
||||||
if (!maskAlpha)
|
|
||||||
return;
|
|
||||||
/*
|
|
||||||
if (maskAlpha == 0xff)
|
|
||||||
{
|
|
||||||
fbCompositeSrc_0888x0888 (op, pSrc, pMask, pDst,
|
|
||||||
xSrc, ySrc, xMask, yMask, xDst, yDst,
|
|
||||||
width, height);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
fbComposeGetStart (pSrc, xSrc, ySrc, CARD8, srcStride, srcLine, 3);
|
|
||||||
fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3);
|
|
||||||
|
|
||||||
{
|
|
||||||
unsigned long ws,wt;
|
|
||||||
CARD32 workingSource;
|
|
||||||
CARD32 *wsrc, *wdst, *widst;
|
|
||||||
CARD32 rs, rd, nd;
|
|
||||||
CARD8 *isrc;
|
|
||||||
|
|
||||||
|
|
||||||
/* are xSrc and xDst at the same alignment? if not, we need to be complicated :) */
|
|
||||||
/* if(0==0) */
|
|
||||||
if ((((xSrc * 3) & 3) != ((xDst * 3) & 3)) ||
|
|
||||||
((srcStride & 3) != (dstStride & 3)))
|
|
||||||
{
|
|
||||||
while (height--)
|
|
||||||
{
|
|
||||||
dst = dstLine;
|
|
||||||
dstLine += dstStride;
|
|
||||||
isrc = src = srcLine;
|
|
||||||
srcLine += srcStride;
|
|
||||||
w = width*3;
|
|
||||||
|
|
||||||
setupPackedReader(ws,wt,isrc,wsrc,workingSource);
|
|
||||||
|
|
||||||
/* get to word aligned */
|
|
||||||
switch(~(long)dst&3)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
readPackedSource(rs);
|
|
||||||
/* *dst++=alphamaskCombine24(rs, *dst)>>8; */
|
|
||||||
rd = READ(dst); /* make gcc happy. hope it doens't cost us too much performance*/
|
|
||||||
WRITE(dst++, alphamaskCombine24(rs, rd) >> 8);
|
|
||||||
w--; if(w==0) break;
|
|
||||||
case 2:
|
|
||||||
readPackedSource(rs);
|
|
||||||
rd = READ(dst);
|
|
||||||
WRITE(dst++, alphamaskCombine24(rs, rd) >> 8);
|
|
||||||
w--; if(w==0) break;
|
|
||||||
case 3:
|
|
||||||
readPackedSource(rs);
|
|
||||||
rd = READ(dst);
|
|
||||||
WRITE(dst++,alphamaskCombine24(rs, rd) >> 8);
|
|
||||||
w--; if(w==0) break;
|
|
||||||
}
|
|
||||||
wdst=(CARD32 *)dst;
|
|
||||||
while (w>3)
|
|
||||||
{
|
|
||||||
rs=READ(wsrc++);
|
|
||||||
/* FIXME: write a special readPackedWord macro, which knows how to
|
|
||||||
* halfword combine
|
|
||||||
*/
|
|
||||||
#if IMAGE_BYTE_ORDER == LSBFirst
|
|
||||||
rd=READ(wdst);
|
|
||||||
readPackedSource(nd);
|
|
||||||
readPackedSource(rs);
|
|
||||||
nd|=rs<<8;
|
|
||||||
readPackedSource(rs);
|
|
||||||
nd|=rs<<16;
|
|
||||||
readPackedSource(rs);
|
|
||||||
nd|=rs<<24;
|
|
||||||
#else
|
|
||||||
readPackedSource(nd);
|
|
||||||
nd<<=24;
|
|
||||||
readPackedSource(rs);
|
|
||||||
nd|=rs<<16;
|
|
||||||
readPackedSource(rs);
|
|
||||||
nd|=rs<<8;
|
|
||||||
readPackedSource(rs);
|
|
||||||
nd|=rs;
|
|
||||||
#endif
|
|
||||||
inOver0888(maskAlpha, nd, rd, wdst++);
|
|
||||||
w-=4;
|
|
||||||
}
|
|
||||||
src=(CARD8 *)wdst;
|
|
||||||
switch(w)
|
|
||||||
{
|
|
||||||
case 3:
|
|
||||||
readPackedSource(rs);
|
|
||||||
rd=READ(dst);
|
|
||||||
WRITE(dst++,alphamaskCombine24(rs, rd)>>8);
|
|
||||||
case 2:
|
|
||||||
readPackedSource(rs);
|
|
||||||
rd = READ(dst);
|
|
||||||
WRITE(dst++, alphamaskCombine24(rs, rd)>>8);
|
|
||||||
case 1:
|
|
||||||
readPackedSource(rs);
|
|
||||||
rd = READ(dst);
|
|
||||||
WRITE(dst++, alphamaskCombine24(rs, rd)>>8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while (height--)
|
|
||||||
{
|
|
||||||
idst=dst = dstLine;
|
|
||||||
dstLine += dstStride;
|
|
||||||
src = srcLine;
|
|
||||||
srcLine += srcStride;
|
|
||||||
w = width*3;
|
|
||||||
/* get to word aligned */
|
|
||||||
switch(~(long)src&3)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
|
|
||||||
WRITE(dst++, rd);
|
|
||||||
w--; if(w==0) break;
|
|
||||||
case 2:
|
|
||||||
rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
|
|
||||||
WRITE(dst++, rd);
|
|
||||||
w--; if(w==0) break;
|
|
||||||
case 3:
|
|
||||||
rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
|
|
||||||
WRITE(dst++, rd);
|
|
||||||
w--; if(w==0) break;
|
|
||||||
}
|
|
||||||
wsrc=(CARD32 *)src;
|
|
||||||
widst=(CARD32 *)dst;
|
|
||||||
while(w>3)
|
|
||||||
{
|
|
||||||
rs = READ(wsrc++);
|
|
||||||
rd = READ(widst);
|
|
||||||
inOver0888 (maskAlpha, rs, rd, widst++);
|
|
||||||
w-=4;
|
|
||||||
}
|
|
||||||
src=(CARD8 *)wsrc;
|
|
||||||
dst=(CARD8 *)widst;
|
|
||||||
switch(w)
|
|
||||||
{
|
|
||||||
case 3:
|
|
||||||
rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
|
|
||||||
WRITE(dst++, rd);
|
|
||||||
case 2:
|
|
||||||
rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
|
|
||||||
WRITE(dst++, rd);
|
|
||||||
case 1:
|
|
||||||
rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
|
|
||||||
WRITE(dst++, rd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Simple bitblt
|
* Simple bitblt
|
||||||
*/
|
*/
|
||||||
|
@ -1687,6 +1214,7 @@ fbComposite (CARD8 op,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch (pDst->format) {
|
switch (pDst->format) {
|
||||||
|
@ -1697,6 +1225,7 @@ fbComposite (CARD8 op,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case PICT_a8b8g8r8:
|
case PICT_a8b8g8r8:
|
||||||
if (pMask->componentAlpha) {
|
if (pMask->componentAlpha) {
|
||||||
|
@ -1722,6 +1251,7 @@ fbComposite (CARD8 op,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch (pDst->format) {
|
switch (pDst->format) {
|
||||||
|
@ -1732,6 +1262,7 @@ fbComposite (CARD8 op,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case PICT_a1:
|
case PICT_a1:
|
||||||
switch (pDst->format) {
|
switch (pDst->format) {
|
||||||
|
@ -1833,16 +1364,6 @@ fbComposite (CARD8 op,
|
||||||
pMask->pDrawable->height == 1)
|
pMask->pDrawable->height == 1)
|
||||||
{
|
{
|
||||||
switch (pSrc->format) {
|
switch (pSrc->format) {
|
||||||
case PICT_r5g6b5:
|
|
||||||
case PICT_b5g6r5:
|
|
||||||
if (pDst->format == pSrc->format)
|
|
||||||
func = fbCompositeTrans_0565xnx0565;
|
|
||||||
break;
|
|
||||||
case PICT_r8g8b8:
|
|
||||||
case PICT_b8g8r8:
|
|
||||||
if (pDst->format == pSrc->format)
|
|
||||||
func = fbCompositeTrans_0888xnx0888;
|
|
||||||
break;
|
|
||||||
#ifdef USE_MMX
|
#ifdef USE_MMX
|
||||||
case PICT_x8r8g8b8:
|
case PICT_x8r8g8b8:
|
||||||
if ((pDst->format == PICT_a8r8g8b8 ||
|
if ((pDst->format == PICT_a8r8g8b8 ||
|
||||||
|
|
Loading…
Reference in New Issue