Use READ/WRITE macros for new functions introduced in previous commits.

This commit is contained in:
Soren Sandmann Pedersen 2007-04-24 19:02:44 -04:00
parent 7e16da7b78
commit 0a2fe443d2

View File

@ -100,7 +100,7 @@ fbIn (CARD32 x, CARD8 y)
#define inOver0888(alpha, source, destval, dest) { \ #define inOver0888(alpha, source, destval, dest) { \
CARD32 dstrb=destval&0xFF00FF; CARD32 dstag=(destval>>8)&0xFF00FF; \ CARD32 dstrb=destval&0xFF00FF; CARD32 dstag=(destval>>8)&0xFF00FF; \
CARD32 drb=((source&0xFF00FF)-dstrb)*alpha; CARD32 dag=(((source>>8)&0xFF00FF)-dstag)*alpha; \ CARD32 drb=((source&0xFF00FF)-dstrb)*alpha; CARD32 dag=(((source>>8)&0xFF00FF)-dstag)*alpha; \
dest =((((drb>>8) + dstrb) & 0x00FF00FF) | ((((dag>>8) + dstag) << 8) & 0xFF00FF00)); \ WRITE(dest, ((((drb>>8) + dstrb) & 0x00FF00FF) | ((((dag>>8) + dstag) << 8) & 0xFF00FF00))); \
} }
/* /*
@ -111,42 +111,42 @@ fbIn (CARD32 x, CARD8 y)
#define inOver0565(alpha, source, destval, dest) { \ #define inOver0565(alpha, source, destval, dest) { \
CARD16 dstrb = destval & 0xf81f; CARD16 dstg = destval & 0x7e0; \ CARD16 dstrb = destval & 0xf81f; CARD16 dstg = destval & 0x7e0; \
CARD32 drb = ((source&0xf81f)-dstrb)*alpha; CARD32 dg=((source & 0x7e0)-dstg)*alpha; \ CARD32 drb = ((source&0xf81f)-dstrb)*alpha; CARD32 dg=((source & 0x7e0)-dstg)*alpha; \
dest = ((((drb>>5) + dstrb)&0xf81f) | (((dg>>5) + dstg) & 0x7e0)); \ WRITE(dest, ((((drb>>5) + dstrb)&0xf81f) | (((dg>>5) + dstg) & 0x7e0))); \
} }
#define inOver2x0565(alpha, source, destval, dest) { \ #define inOver2x0565(alpha, source, destval, dest) { \
CARD32 dstrb = destval & 0x07e0f81f; CARD32 dstg = (destval & 0xf81f07e0)>>5; \ CARD32 dstrb = destval & 0x07e0f81f; CARD32 dstg = (destval & 0xf81f07e0)>>5; \
CARD32 drb = ((source&0x07e0f81f)-dstrb)*alpha; CARD32 dg=(((source & 0xf81f07e0)>>5)-dstg)*alpha; \ CARD32 drb = ((source&0x07e0f81f)-dstrb)*alpha; CARD32 dg=(((source & 0xf81f07e0)>>5)-dstg)*alpha; \
dest = ((((drb>>5) + dstrb)&0x07e0f81f) | ((((dg>>5) + dstg)<<5) & 0xf81f07e0)); \ WRITE(dest, ((((drb>>5) + dstrb)&0x07e0f81f) | ((((dg>>5) + dstg)<<5) & 0xf81f07e0))); \
} }
#if IMAGE_BYTE_ORDER == LSBFirst #if IMAGE_BYTE_ORDER == LSBFirst
#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \ #define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \
temp=count&3; \ temp=count&3; \
where-=temp; \ where-=temp; \
workingWhere=(CARD32 *)where; \ workingWhere=(CARD32 *)where; \
workingVal=*workingWhere++; \ workingVal=READ(workingWhere++); \
count=4-temp; \ count=4-temp; \
workingVal>>=(8*temp) workingVal>>=(8*temp)
#define readPacked(where,x,y,z) {if(!(x)) { (x)=4; y=*z++; } where=(y)&0xff; (y)>>=8; (x)--;} #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 readPackedSource(where) readPacked(where,ws,workingSource,wsrc)
#define readPackedDest(where) readPacked(where,wd,workingiDest,widst) #define readPackedDest(where) readPacked(where,wd,workingiDest,widst)
#define writePacked(what) workingoDest>>=8; workingoDest|=(what<<24); ww--; if(!ww) { ww=4; *wodst++=workingoDest; } #define writePacked(what) workingoDest>>=8; workingoDest|=(what<<24); ww--; if(!ww) { ww=4; WRITE (wodst++, workingoDest); }
#else #else
#warning "I havn't tested fbCompositeTrans_0888xnx0888() on big endian yet!" #warning "I havn't tested fbCompositeTrans_0888xnx0888() on big endian yet!"
#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \ #define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \
temp=count&3; \ temp=count&3; \
where-=temp; \ where-=temp; \
workingWhere=(CARD32 *)where; \ workingWhere=(CARD32 *)where; \
workingVal=*workingWhere++; \ workingVal=READ(workingWhere)++; \
count=4-temp; \ count=4-temp; \
workingVal<<=(8*temp) workingVal<<=(8*temp)
#define readPacked(where,x,y,z) {if(!(x)) { (x)=4; y=*z++; } where=(y)>>24; (y)<<=8; (x)--;} #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 readPackedSource(where) readPacked(where,ws,workingSource,wsrc)
#define readPackedDest(where) readPacked(where,wd,workingiDest,widst) #define readPackedDest(where) readPacked(where,wd,workingiDest,widst)
#define writePacked(what) workingoDest<<=8; workingoDest|=what; ww--; if(!ww) { ww=4; *wodst++=workingoDest; } #define writePacked(what) workingoDest<<=8; workingoDest|=what; ww--; if(!ww) { ww=4; WRITE(wodst++, workingoDest); }
#endif #endif
/* /*
@ -328,65 +328,65 @@ fbCompositeSolidMask_nx8x0888 (CARD8 op,
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 */ /* fixme: cleanup unused */
unsigned int wt,wd; unsigned int wt, wd;
CARD32 workingiDest; CARD32 workingiDest;
CARD32 *widst; CARD32 *widst;
edst=dst = dstLine; edst = dst = dstLine;
dstLine += dstStride; dstLine += dstStride;
mask = maskLine; mask = maskLine;
maskLine += maskStride; maskLine += maskStride;
w = width; w = width;
#ifndef NO_MASKED_PACKED_READ #ifndef NO_MASKED_PACKED_READ
setupPackedReader(wd,wt,edst,widst,workingiDest); setupPackedReader(wd,wt,edst,widst,workingiDest);
#endif #endif
while (w--) while (w--)
{ {
#ifndef NO_MASKED_PACKED_READ #ifndef NO_MASKED_PACKED_READ
readPackedDest(rd); readPackedDest(rd);
readPackedDest(gd); readPackedDest(gd);
readPackedDest(bd); readPackedDest(bd);
#else #else
rd= *edst++; rd = READ(edst++);
gd= *edst++; gd = READ(edst++);
bd= *edst++; bd = READ(edst++);
#endif #endif
m = *mask++; m = READ(mask++);
if (m == 0xff) if (m == 0xff)
{ {
if (srca == 0xff) if (srca == 0xff)
{ {
*dst++=rs; WRITE(dst++, rs);
*dst++=gs; WRITE(dst++, gs);
*dst++=bs; WRITE(dst++, bs);
}
else
{
*dst++=(srcAlphaCombine24(rs, rd)>>8);
*dst++=(srcAlphaCombine24(gs, gd)>>8);
*dst++=(srcAlphaCombine24(bs, bd)>>8);
}
}
else if (m)
{
int na=(srca*(int)m)>>8;
int nia=255-na;
*dst++=(genericCombine24(rs, rd, na, nia)>>8);
*dst++=(genericCombine24(gs, gd, na, nia)>>8);
*dst++=(genericCombine24(bs, bd, na, nia)>>8);
}
else
{
dst+=3;
}
} }
else
{
WRITE(dst++, (srcAlphaCombine24(rs, rd)>>8));
WRITE(dst++, (srcAlphaCombine24(gs, gd)>>8));
WRITE(dst++, (srcAlphaCombine24(bs, bd)>>8));
}
}
else if (m)
{
int na=(srca*(int)m)>>8;
int nia=255-na;
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;
}
} }
}
fbFinishAccess (pMask->pDrawable); fbFinishAccess (pMask->pDrawable);
fbFinishAccess (pDst->pDrawable); fbFinishAccess (pDst->pDrawable);
} }
@ -414,8 +414,6 @@ fbCompositeSolidMask_nx8x0565 (CARD8 op,
CARD16 w,src16; CARD16 w,src16;
fbComposeGetSolid(pSrc, src, pDst->format); fbComposeGetSolid(pSrc, src, pDst->format);
if (src == 0) if (src == 0)
return; return;
@ -437,23 +435,23 @@ fbCompositeSolidMask_nx8x0565 (CARD8 op,
while (w--) while (w--)
{ {
m = *mask++; m = READ(mask++);
if (m == 0) if (m == 0)
dst++; dst++;
else if (srca5 == (0xff >> 3)) else if (srca5 == (0xff >> 3))
{ {
if (m == 0xff) if (m == 0xff)
*dst++ = src16; WRITE(dst++, src16);
else else
{ {
d = *dst; d = READ(dst);
m >>= 3; m >>= 3;
inOver0565 (m, src16, d, *dst++); inOver0565 (m, src16, d, dst++);
} }
} }
else else
{ {
d = *dst; d = READ(dst);
if (m == 0xff) if (m == 0xff)
{ {
t = fbOver24 (src, cvt0565to0888 (d)); t = fbOver24 (src, cvt0565to0888 (d));
@ -463,7 +461,7 @@ fbCompositeSolidMask_nx8x0565 (CARD8 op,
t = fbIn (src, m); t = fbIn (src, m);
t = fbOver (t, cvt0565to0888 (d)); t = fbOver (t, cvt0565to0888 (d));
} }
*dst++ = cvt8888to0565 (t); WRITE(dst++, cvt8888to0565 (t));
} }
} }
} }
@ -517,34 +515,34 @@ fbCompositeSolidMask_nx8888x0565 (CARD8 op,
while (w--) while (w--)
{ {
m = *mask++ >> 24; m = READ(mask++) >> 24;
if (m == 0) if (m == 0)
dst++; dst++;
else if (srca5 == (0xff >> 3)) else if (srca5 == (0xff >> 3))
{ {
if (m == 0xff) if (m == 0xff)
*dst++ = src16; WRITE(dst++, src16);
else else
{ {
d = *dst; d = READ(dst);
m >>= 3; m >>= 3;
inOver0565 (m, src16, d, *dst++); inOver0565 (m, src16, d, dst++);
} }
} }
else else
{ {
if (m == 0xff) if (m == 0xff)
{ {
d = *dst; d = READ(dst);
t = fbOver24 (src, cvt0565to0888 (d)); t = fbOver24 (src, cvt0565to0888 (d));
*dst++ = cvt8888to0565 (t); WRITE(dst++, cvt8888to0565 (t));
} }
else else
{ {
d = *dst; d = READ(dst);
t = fbIn (src, m); t = fbIn (src, m);
t = fbOver (t, cvt0565to0888 (d)); t = fbOver (t, cvt0565to0888 (d));
*dst++ = cvt8888to0565 (t); WRITE(dst++, cvt8888to0565 (t));
} }
} }
} }
@ -1078,9 +1076,9 @@ fbCompositeTrans_0565xnx0565(CARD8 op,
if(((int)src&1)==1) if(((int)src&1)==1)
{ {
s_16 = *src++; s_16 = READ(src++);
d_16 = *dst; d_16 = READ(dst);
inOver0565(maskAlpha, s_16, d_16, *dst++); inOver0565(maskAlpha, s_16, d_16, dst++);
w--; w--;
} }
isrc=(CARD32 *)src; isrc=(CARD32 *)src;
@ -1089,9 +1087,9 @@ fbCompositeTrans_0565xnx0565(CARD8 op,
idst=(CARD32 *)dst; idst=(CARD32 *)dst;
while (w>1) while (w>1)
{ {
s_32 = *isrc++; s_32 = READ(isrc++);
d_32 = *idst; d_32 = READ(idst);
inOver2x0565(maskAlpha, s_32, d_32, *idst++); inOver2x0565(maskAlpha, s_32, d_32, idst++);
w-=2; w-=2;
} }
dst=(CARD16 *)idst; dst=(CARD16 *)idst;
@ -1100,30 +1098,30 @@ fbCompositeTrans_0565xnx0565(CARD8 op,
{ {
while (w > 1) while (w > 1)
{ {
s_32 = *isrc++; s_32 = READ(isrc++);
#if IMAGE_BYTE_ORDER == LSBFirst #if IMAGE_BYTE_ORDER == LSBFirst
s_16=s_32&0xffff; s_16=s_32&0xffff;
#else #else
s_16=s_32>>16; s_16=s_32>>16;
#endif #endif
d_16 = *dst; d_16 = READ(dst);
inOver0565 (maskAlpha, s_16, d_16, *dst++); inOver0565 (maskAlpha, s_16, d_16, dst++);
#if IMAGE_BYTE_ORDER == LSBFirst #if IMAGE_BYTE_ORDER == LSBFirst
s_16=s_32>>16; s_16=s_32>>16;
#else #else
s_16=s_32&0xffff; s_16=s_32&0xffff;
#endif #endif
d_16 = *dst; d_16 = READ(dst);
inOver0565(maskAlpha, s_16, d_16, *dst++); inOver0565(maskAlpha, s_16, d_16, dst++);
w-=2; w-=2;
} }
} }
src=(CARD16 *)isrc; src=(CARD16 *)isrc;
if(w!=0) if(w!=0)
{ {
s_16 = *src; s_16 = READ(src);
d_16 = *dst; d_16 = READ(dst);
inOver0565(maskAlpha, s_16, d_16, *dst); inOver0565(maskAlpha, s_16, d_16, dst);
} }
} }
@ -1133,6 +1131,7 @@ fbCompositeTrans_0565xnx0565(CARD8 op,
/* macros for "i can't believe it's not fast" packed pixel handling */ /* macros for "i can't believe it's not fast" packed pixel handling */
#define alphamaskCombine24(a,b) genericCombine24(a,b,maskAlpha,maskiAlpha) #define alphamaskCombine24(a,b) genericCombine24(a,b,maskAlpha,maskiAlpha)
static void static void
fbCompositeTrans_0888xnx0888(CARD8 op, fbCompositeTrans_0888xnx0888(CARD8 op,
PicturePtr pSrc, PicturePtr pSrc,
@ -1146,175 +1145,175 @@ fbCompositeTrans_0888xnx0888(CARD8 op,
INT16 yDst, INT16 yDst,
CARD16 width, CARD16 width,
CARD16 height) CARD16 height)
{ {
CARD8 *dstLine, *dst,*idst; CARD8 *dstLine, *dst,*idst;
CARD8 *srcLine, *src; CARD8 *srcLine, *src;
FbStride dstStride, srcStride; FbStride dstStride, srcStride;
CARD16 w; CARD16 w;
FbBits mask; FbBits mask;
CARD16 maskAlpha,maskiAlpha; CARD16 maskAlpha,maskiAlpha;
fbComposeGetSolid (pMask, mask, pDst->format); fbComposeGetSolid (pMask, mask, pDst->format);
maskAlpha = mask >> 24; maskAlpha = mask >> 24;
maskiAlpha= 255-maskAlpha; maskiAlpha= 255-maskAlpha;
if (!maskAlpha) if (!maskAlpha)
return; return;
/* /*
if (maskAlpha == 0xff) if (maskAlpha == 0xff)
{ {
fbCompositeSrc_0888x0888 (op, pSrc, pMask, pDst, fbCompositeSrc_0888x0888 (op, pSrc, pMask, pDst,
xSrc, ySrc, xMask, yMask, xDst, yDst, xSrc, ySrc, xMask, yMask, xDst, yDst,
width, height); width, height);
return; return;
} }
*/ */
fbComposeGetStart (pSrc, xSrc, ySrc, CARD8, srcStride, srcLine, 3); fbComposeGetStart (pSrc, xSrc, ySrc, CARD8, srcStride, srcLine, 3);
fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3); fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3);
{ {
unsigned int ws,wt; unsigned int ws,wt;
CARD32 workingSource; CARD32 workingSource;
CARD32 *wsrc, *wdst, *widst; CARD32 *wsrc, *wdst, *widst;
CARD32 rs, rd, nd; CARD32 rs, rd, nd;
CARD8 *isrc; CARD8 *isrc;
/* are xSrc and xDst at the same alignment? if not, we need to be complicated :) */ /* are xSrc and xDst at the same alignment? if not, we need to be complicated :) */
/* if(0==0) */ /* if(0==0) */
if( (((xSrc*3)&3)!=((xDst*3)&3)) || ((srcStride&3)!=(dstStride&3))) if ((((xSrc * 3) & 3) != ((xDst * 3) & 3)) ||
{ ((srcStride & 3) != (dstStride & 3)))
while (height--) {
{ while (height--)
dst = dstLine; {
dstLine += dstStride; dst = dstLine;
isrc = src = srcLine; dstLine += dstStride;
srcLine += srcStride; isrc = src = srcLine;
w = width*3; srcLine += srcStride;
w = width*3;
setupPackedReader(ws,wt,isrc,wsrc,workingSource);
setupPackedReader(ws,wt,isrc,wsrc,workingSource);
/* get to word aligned */
switch(!(int)src&3) /* get to word aligned */
{ switch(!(int)src&3)
case 1: {
readPackedSource(rs); case 1:
/* *dst++=alphamaskCombine24(rs, *dst)>>8; */ readPackedSource(rs);
rd=*dst; /* make gcc happy. hope it doens't cost us too much performance*/ /* *dst++=alphamaskCombine24(rs, *dst)>>8; */
*dst++=alphamaskCombine24(rs, rd)>>8; rd = READ(dst); /* make gcc happy. hope it doens't cost us too much performance*/
w--; if(w==0) break; WRITE(dst++, alphamaskCombine24(rs, rd) >> 8);
case 2: w--; if(w==0) break;
readPackedSource(rs); case 2:
rd=*dst; readPackedSource(rs);
*dst++=alphamaskCombine24(rs, rd)>>8; rd = READ(dst);
w--; if(w==0) break; WRITE(dst++, alphamaskCombine24(rs, rd) >> 8);
case 3: w--; if(w==0) break;
readPackedSource(rs); case 3:
rd=*dst; readPackedSource(rs);
*dst++=alphamaskCombine24(rs, rd)>>8; rd = READ(dst);
w--; if(w==0) break; WRITE(dst++,alphamaskCombine24(rs, rd) >> 8);
} w--; if(w==0) break;
wdst=(CARD32 *)dst; }
while (w>3) wdst=(CARD32 *)dst;
{ while (w>3)
rs=*wsrc++; {
/* FIXME: write a special readPackedWord macro, which knows how to rs=READ(wsrc++);
* halfword combine /* FIXME: write a special readPackedWord macro, which knows how to
*/ * halfword combine
#if IMAGE_BYTE_ORDER == LSBFirst */
rd=*wdst; #if IMAGE_BYTE_ORDER == LSBFirst
readPackedSource(nd); rd=READ(wdst);
readPackedSource(rs); readPackedSource(nd);
nd|=rs<<8; readPackedSource(rs);
readPackedSource(rs); nd|=rs<<8;
nd|=rs<<16; readPackedSource(rs);
readPackedSource(rs); nd|=rs<<16;
nd|=rs<<24; readPackedSource(rs);
nd|=rs<<24;
#else #else
readPackedSource(nd); readPackedSource(nd);
nd<<=24; nd<<=24;
readPackedSource(rs); readPackedSource(rs);
nd|=rs<<16; nd|=rs<<16;
readPackedSource(rs); readPackedSource(rs);
nd|=rs<<8; nd|=rs<<8;
readPackedSource(rs); readPackedSource(rs);
nd|=rs; nd|=rs;
#endif #endif
inOver0888(maskAlpha, nd, rd, *wdst++); inOver0888(maskAlpha, nd, rd, wdst++);
w-=4; w-=4;
} }
src=(CARD8 *)wdst; src=(CARD8 *)wdst;
switch(w) switch(w)
{ {
case 3: case 3:
readPackedSource(rs); readPackedSource(rs);
rd=*dst; rd=READ(dst);
*dst++=alphamaskCombine24(rs, rd)>>8; WRITE(dst++,alphamaskCombine24(rs, rd)>>8);
case 2: case 2:
readPackedSource(rs); readPackedSource(rs);
rd=*dst; rd = READ(dst);
*dst++=alphamaskCombine24(rs, rd)>>8; WRITE(dst++, alphamaskCombine24(rs, rd)>>8);
case 1: case 1:
readPackedSource(rs); readPackedSource(rs);
rd=*dst; rd = READ(dst);
*dst++=alphamaskCombine24(rs, rd)>>8; WRITE(dst++, alphamaskCombine24(rs, rd)>>8);
} }
} }
} }
else else
{ {
while (height--) while (height--)
{ {
idst=dst = dstLine; idst=dst = dstLine;
dstLine += dstStride; dstLine += dstStride;
src = srcLine; src = srcLine;
srcLine += srcStride; srcLine += srcStride;
w = width*3; w = width*3;
/* get to word aligned */ /* get to word aligned */
switch(!(int)src&3) switch(!(int)src&3)
{ {
case 1: case 1:
rd=alphamaskCombine24(*src++, *dst)>>8; rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
*dst++=rd; WRITE(dst++, rd);
w--; if(w==0) break; w--; if(w==0) break;
case 2: case 2:
rd=alphamaskCombine24(*src++, *dst)>>8; rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
*dst++=rd; WRITE(dst++, rd);
w--; if(w==0) break; w--; if(w==0) break;
case 3: case 3:
rd=alphamaskCombine24(*src++, *dst)>>8; rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
*dst++=rd; WRITE(dst++, rd);
w--; if(w==0) break; w--; if(w==0) break;
} }
wsrc=(CARD32 *)src; wsrc=(CARD32 *)src;
widst=(CARD32 *)dst; widst=(CARD32 *)dst;
while(w>3) while(w>3)
{ {
rs = *wsrc++; rs = READ(wsrc++);
rd = *widst; rd = READ(widst);
inOver0888 (maskAlpha, rs, rd, *widst++); inOver0888 (maskAlpha, rs, rd, widst++);
w-=4; w-=4;
} }
src=(CARD8 *)wsrc; src=(CARD8 *)wsrc;
dst=(CARD8 *)widst; dst=(CARD8 *)widst;
switch(w) switch(w)
{ {
case 3: case 3:
rd=alphamaskCombine24(*src++, *dst)>>8; rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
*dst++=rd; WRITE(dst++, rd);
case 2: case 2:
rd=alphamaskCombine24(*src++, *dst)>>8; rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
*dst++=rd; WRITE(dst++, rd);
case 1: case 1:
rd=alphamaskCombine24(*src++, *dst)>>8; rd=alphamaskCombine24(READ(src++), READ(dst))>>8;
*dst++=rd; WRITE(dst++, rd);
} }
} }
} }
} }
} }
/* /*
* Simple bitblt * Simple bitblt