xserver: Branch 'master' - 6 commits

Søren Sandmann Pedersen sandmann at kemper.freedesktop.org
Wed Apr 25 02:05:55 EEST 2007


 fb/fbpict.c |  755 ++++++++++++++++++++++++++++++++++++++++++++++++++++--------
 fb/fbpict.h |   12 
 2 files changed, 671 insertions(+), 96 deletions(-)

New commits:
diff-tree 0a2fe443d25b1ca25349aba3f748df986952e20f (from 7e16da7b78c422f96387502b9cc29eaa1741543f)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date:   Tue Apr 24 19:02:44 2007 -0400

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

diff --git a/fb/fbpict.c b/fb/fbpict.c
index 8ca7336..44bee1b 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -100,7 +100,7 @@ fbIn (CARD32 x, CARD8 y)
 #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; \
-	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) { \
  	CARD16 dstrb = destval & 0xf81f; CARD16 dstg  = destval & 0x7e0; \
  	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) { \
  	CARD32 dstrb = destval & 0x07e0f81f; CARD32 dstg  = (destval & 0xf81f07e0)>>5; \
  	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
-	#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \
+#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \
 					temp=count&3; \
 					where-=temp; \
 					workingWhere=(CARD32 *)where; \
-					workingVal=*workingWhere++; \
+                                        workingVal=READ(workingWhere++); \
 					count=4-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 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
 	#warning "I havn't tested fbCompositeTrans_0888xnx0888() on big endian yet!"
 	#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \
 					temp=count&3; \
 					where-=temp; \
 					workingWhere=(CARD32 *)where; \
-					workingVal=*workingWhere++; \
+                                        workingVal=READ(workingWhere)++; \
 					count=4-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 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
 
 /*
@@ -328,65 +328,65 @@ fbCompositeSolidMask_nx8x0888 (CARD8    
     fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3);
     fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
 
-     while (height--)
-  	{
-	        /* fixme: cleanup unused */
- 		unsigned int wt,wd;
- 		CARD32 workingiDest;
- 		CARD32 *widst;
- 		
- 		edst=dst = dstLine;
- 		dstLine += dstStride;
- 		mask = maskLine;
- 		maskLine += maskStride;
- 		w = width;
- 		
+    while (height--)
+    {
+	/* fixme: cleanup unused */
+	unsigned int wt, wd;
+	CARD32 workingiDest;
+	CARD32 *widst;
+ 	
+	edst = dst = dstLine;
+	dstLine += dstStride;
+	mask = maskLine;
+	maskLine += maskStride;
+	w = width;
+ 	
 #ifndef NO_MASKED_PACKED_READ
- 		setupPackedReader(wd,wt,edst,widst,workingiDest);
+	setupPackedReader(wd,wt,edst,widst,workingiDest);
 #endif
- 				
- 		while (w--)
- 		{
+ 	
+	while (w--)
+	{
 #ifndef NO_MASKED_PACKED_READ
- 			readPackedDest(rd);
- 			readPackedDest(gd);
- 			readPackedDest(bd);
+	    readPackedDest(rd);
+	    readPackedDest(gd);
+	    readPackedDest(bd);
 #else
- 			rd= *edst++;
- 			gd= *edst++;
- 			bd= *edst++;
-#endif
- 			m = *mask++;
- 			if (m == 0xff)
- 			{
- 				if (srca == 0xff)
- 				{
- 					*dst++=rs;
- 					*dst++=gs;
- 					*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;
- 			}
+	    rd = READ(edst++);
+	    gd = READ(edst++);
+	    bd = READ(edst++);
+#endif
+	    m = READ(mask++);
+	    if (m == 0xff)
+	    {
+		if (srca == 0xff)
+		{
+		    WRITE(dst++, rs);
+		    WRITE(dst++, gs);
+		    WRITE(dst++, bs);
 		}
+		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 (pDst->pDrawable);
 }
@@ -414,8 +414,6 @@ fbCompositeSolidMask_nx8x0565 (CARD8    
     CARD16	w,src16;
     
     fbComposeGetSolid(pSrc, src, pDst->format);
-
-    
     
     if (src == 0)
 	return;
@@ -437,23 +435,23 @@ fbCompositeSolidMask_nx8x0565 (CARD8    
  
 	while (w--)
 	{
-	    m = *mask++;
+	    m = READ(mask++);
 	    if (m == 0)
 		dst++;
 	    else if (srca5 == (0xff >> 3))
 	    {
 		if (m == 0xff)
-		    *dst++ = src16;
+		    WRITE(dst++, src16);
 		else 
  		{
-		    d = *dst;
+		    d = READ(dst);
 		    m >>= 3;
-		    inOver0565 (m, src16, d, *dst++);
+		    inOver0565 (m, src16, d, dst++);
  		}
 	    }
 	    else
 	    {
-		d = *dst;
+		d = READ(dst);
 		if (m == 0xff) 
 		{
 		    t = fbOver24 (src, cvt0565to0888 (d));
@@ -463,7 +461,7 @@ fbCompositeSolidMask_nx8x0565 (CARD8    
 		    t = fbIn (src, m);
 		    t = fbOver (t, cvt0565to0888 (d));
 		}
-		*dst++ = cvt8888to0565 (t);
+		WRITE(dst++, cvt8888to0565 (t));
 	    }
 	}
     }
@@ -517,34 +515,34 @@ fbCompositeSolidMask_nx8888x0565 (CARD8 
 
 	while (w--)
 	{
-	    m = *mask++ >> 24;
+	    m = READ(mask++) >> 24;
 	    if (m == 0)
 		dst++;
 	    else if (srca5 == (0xff >> 3))
 	    {
 		if (m == 0xff)
-		    *dst++ = src16;
+		    WRITE(dst++, src16);
 		else
 		{
-		    d = *dst;
+		    d = READ(dst);
 		    m >>= 3;
-		    inOver0565 (m, src16, d, *dst++);
+		    inOver0565 (m, src16, d, dst++);
 		}
 	    }
 	    else
 	    {
 		if (m == 0xff) 
 		{
-		    d = *dst;
+		    d = READ(dst);
 		    t = fbOver24 (src, cvt0565to0888 (d));
-		    *dst++ = cvt8888to0565 (t);
+		    WRITE(dst++, cvt8888to0565 (t));
 		}
 		else
 		{
-		    d = *dst;
+		    d = READ(dst);
 		    t = fbIn (src, m);
 		    t = fbOver (t, cvt0565to0888 (d));
-		    *dst++ = cvt8888to0565 (t);
+		    WRITE(dst++, cvt8888to0565 (t));
 		}
 	    }
 	}
@@ -1078,9 +1076,9 @@ fbCompositeTrans_0565xnx0565(CARD8      
 	
 	if(((int)src&1)==1)
 	{
-	    s_16 = *src++;
-	    d_16 = *dst;
-	    inOver0565(maskAlpha, s_16, d_16, *dst++);
+	    s_16 = READ(src++);
+	    d_16 = READ(dst);
+	    inOver0565(maskAlpha, s_16, d_16, dst++);
 	    w--;
 	}
 	isrc=(CARD32 *)src;
@@ -1089,9 +1087,9 @@ fbCompositeTrans_0565xnx0565(CARD8      
 	    idst=(CARD32 *)dst;
 	    while (w>1)
 	    {
-		s_32 = *isrc++;
-		d_32 = *idst;
-		inOver2x0565(maskAlpha, s_32, d_32, *idst++);
+		s_32 = READ(isrc++);
+		d_32 = READ(idst);
+		inOver2x0565(maskAlpha, s_32, d_32, idst++);
 		w-=2;
 	    }
 	    dst=(CARD16 *)idst;
@@ -1100,30 +1098,30 @@ fbCompositeTrans_0565xnx0565(CARD8      
 	{
 	    while (w > 1)
 	    {
-		s_32 = *isrc++;
+		s_32 = READ(isrc++);
 #if IMAGE_BYTE_ORDER == LSBFirst
 		s_16=s_32&0xffff;
 #else
 		s_16=s_32>>16;
 #endif
-		d_16 = *dst;
-		inOver0565 (maskAlpha, s_16, d_16, *dst++);
+		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 = *dst;
-		inOver0565(maskAlpha, s_16, d_16, *dst++);
+		d_16 = READ(dst);
+		inOver0565(maskAlpha, s_16, d_16, dst++);
 		w-=2;
 	    }
 	}
 	src=(CARD16 *)isrc;
 	if(w!=0)
 	{
-	    s_16 = *src;
-	    d_16 = *dst;
-	    inOver0565(maskAlpha, s_16, d_16, *dst);
+	    s_16 = READ(src);
+	    d_16 = READ(dst);
+	    inOver0565(maskAlpha, s_16, d_16, dst);
 	}
     }
     
@@ -1133,6 +1131,7 @@ fbCompositeTrans_0565xnx0565(CARD8      
 
 /* 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,
@@ -1146,175 +1145,175 @@ fbCompositeTrans_0888xnx0888(CARD8      
  			     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);
+{
+    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;
-     }
-     */
- 	
-     fbComposeGetStart (pSrc, xSrc, ySrc, CARD8, srcStride, srcLine, 3);
-     fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3);
-  
-  	{
- 		unsigned int 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(!(int)src&3)
- 				{
- 					case 1:
-					        readPackedSource(rs);
-						/* *dst++=alphamaskCombine24(rs, *dst)>>8; */
-						rd=*dst;  /* make gcc happy.  hope it doens't cost us too much performance*/
-						*dst++=alphamaskCombine24(rs, rd)>>8;
-						w--; if(w==0) break;
- 					case 2:
-					        readPackedSource(rs);
-						rd=*dst;  
-						*dst++=alphamaskCombine24(rs, rd)>>8;
- 						w--; if(w==0) break;
- 					case 3:
-					        readPackedSource(rs);
-						rd=*dst;  
-						*dst++=alphamaskCombine24(rs, rd)>>8;
- 						w--; if(w==0) break;
- 				}
- 				wdst=(CARD32 *)dst;
-				while (w>3)
-				{
- 					rs=*wsrc++;
-					/* FIXME: write a special readPackedWord macro, which knows how to 
-					 * halfword combine
-					 */
- #if IMAGE_BYTE_ORDER == LSBFirst
-					rd=*wdst;
-					readPackedSource(nd);
-					readPackedSource(rs);
-					nd|=rs<<8;
-					readPackedSource(rs);
-					nd|=rs<<16;
-					readPackedSource(rs);
-					nd|=rs<<24;
+    /*
+      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 int 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(!(int)src&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=*dst;  
-						*dst++=alphamaskCombine24(rs, rd)>>8;
- 					case 2:
-					        readPackedSource(rs);
-						rd=*dst;  
-						*dst++=alphamaskCombine24(rs, rd)>>8;
- 					case 1:
-                                               readPackedSource(rs);
-                                               rd=*dst;  
-                                               *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(!(int)src&3)
- 				{
-					case 1:
- 						rd=alphamaskCombine24(*src++, *dst)>>8;
- 						*dst++=rd;
- 						w--; if(w==0) break;
- 					case 2:
- 						rd=alphamaskCombine24(*src++, *dst)>>8;
- 						*dst++=rd;
- 						w--; if(w==0) break;
-					case 3:
- 						rd=alphamaskCombine24(*src++, *dst)>>8;
- 						*dst++=rd;
- 						w--; if(w==0) break;
- 				}
- 				wsrc=(CARD32 *)src;
- 				widst=(CARD32 *)dst;
- 				while(w>3)
- 				{
- 					rs = *wsrc++;
- 					rd = *widst;
- 					inOver0888 (maskAlpha, rs, rd, *widst++);
- 					w-=4;
- 				}
-				src=(CARD8 *)wsrc;
- 				dst=(CARD8 *)widst;
- 				switch(w)
- 				{
- 					case 3:
- 						rd=alphamaskCombine24(*src++, *dst)>>8;
- 						*dst++=rd;
- 					case 2:
-						rd=alphamaskCombine24(*src++, *dst)>>8;
- 						*dst++=rd;
- 					case 1:
- 						rd=alphamaskCombine24(*src++, *dst)>>8;
- 						*dst++=rd;
- 				}
- 			}
- 		}
- 	}
-  }
-
+		    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(!(int)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
diff-tree 7e16da7b78c422f96387502b9cc29eaa1741543f (from 2d9a7a768747ca39a800475f12c424c298018dc6)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date:   Tue Apr 24 18:15:34 2007 -0400

    Remove #if 0'ed blocks

diff --git a/fb/fbpict.c b/fb/fbpict.c
index d027e35..8ca7336 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -783,47 +783,6 @@ fbCompositeSrc_8888x0565 (CARD8      op,
     fbFinishAccess (pSrc->pDrawable);
 }
 
-#if 0
-void
-fbCompositeSrc_0565x0565 (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;
-
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD16, srcStride, srcLine, 1);
-
-    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
-
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-
-	while (w--)
-	    WRITE(dst, READ(src++));
-    }
-
-    fbFinishAccess (pDst->pDrawable);
-    fbFinishAccess (pSrc->pDrawable);
-}
-#endif
-
 void
 fbCompositeSrcAdd_8000x8000 (CARD8	op,
 			     PicturePtr pSrc,
diff-tree 2d9a7a768747ca39a800475f12c424c298018dc6 (from fde4a5adf02d3067a064ebf6bdd666aa5784cfe9)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date:   Tue Apr 24 14:46:59 2007 -0400

    From pixman (Jeff Muizelaar)
    
        Fix up the fast-path compositing operators; those are useful for
        sources without alpha, but can't be used for sources with
        alpha. Also, replaced fbCompositeSrcSrc_nxn with call to fbBlt as
        this function must handle 1, 4, 8, 16, 24, 32 bpp objects. Would
        be nice to optimize fbBlt for common cases involving 8, 16, 24 and
        32bpp.
    
        From Keith Packard.

diff --git a/fb/fbpict.c b/fb/fbpict.c
index 660112c..d027e35 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -64,20 +64,6 @@ fbOver (CARD32 x, CARD32 y)
     return m|n|o|p;
 }
 
-static CARD32
-fbIn24 (CARD32 x, CARD8 y)
-{
-    CARD16  a = y;
-    CARD16  t;
-    CARD32  m,n,o,p;
-
-    m = FbInU(x,0,a,t);
-    n = FbInU(x,8,a,t);
-    o = FbInU(x,16,a,t);
-    p = (y << 24);
-    return m|n|o|p;
-}
-
 CARD32
 fbOver24 (CARD32 x, CARD32 y)
 {
@@ -107,22 +93,34 @@ fbIn (CARD32 x, CARD8 y)
 
 #define genericCombine24(a,b,c,d) (((a)*(c)+(b)*(d)))
 
-#define fastcombine32(alpha, source, destval, destptr, dstrb, dstag, drb, dag) \
-	dstrb=destval&0xFF00FF; dstag=(destval>>8)&0xFF00FF; \
-	drb=((source&0xFF00FF)-dstrb)*alpha; dag=(((source>>8)&0xFF00FF)-dstag)*alpha; \
-	*destptr++=((((drb>>8) + dstrb) & 0x00FF00FF) | ((((dag>>8) + dstag) << 8) & 0xFF00FF00)); \
-
-#define fastcombine32(alpha, source, destval, destptr, dstrb, dstag, drb, dag) \
-	dstrb=destval&0xFF00FF; dstag=(destval>>8)&0xFF00FF; \
-	drb=((source&0xFF00FF)-dstrb)*alpha; dag=(((source>>8)&0xFF00FF)-dstag)*alpha; \
-	*destptr++=((((drb>>8) + dstrb) & 0x00FF00FF) | ((((dag>>8) + dstag) << 8) & 0xFF00FF00)); \
-	
-// Note: this macro expects 6 bits of alpha, not 8!
-#define fastCombine0565(alpha, source, destval, destptr) { \
-	CARD16 dstrb = destval & 0xf81f; CARD16 dstg  = destval & 0x7e0; \
-	CARD32 drb = ((source&0xf81f)-dstrb)*alpha; CARD32 dg=((source & 0x7e0)-dstg)*alpha; \
-	destptr= ((((drb>>6) + dstrb)&0xf81f) | (((dg>>6)  + dstg) & 0x7e0)); \
-	}
+/*
+ * 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; \
+	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; \
+	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; \
+	dest = ((((drb>>5) + dstrb)&0x07e0f81f) | ((((dg>>5)  + dstg)<<5) & 0xf81f07e0)); \
+    }
+
 
 #if IMAGE_BYTE_ORDER == LSBFirst
 	#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \
@@ -150,6 +148,7 @@ fbIn (CARD32 x, CARD8 y)
 	#define readPackedDest(where) readPacked(where,wd,workingiDest,widst)
 	#define writePacked(what) workingoDest<<=8; workingoDest|=what; ww--; if(!ww) { ww=4; *wodst++=workingoDest; } 
 #endif
+
 /*
  * Naming convention:
  *
@@ -310,7 +309,6 @@ fbCompositeSolidMask_nx8x0888 (CARD8    
 {
     CARD32	src, srca, srcia;
     CARD8	*dstLine, *dst, *edst;
-    CARD32	d;
     CARD8	*maskLine, *mask, m;
     FbStride	dstStride, maskStride;
     CARD16	w;
@@ -332,7 +330,7 @@ fbCompositeSolidMask_nx8x0888 (CARD8    
 
      while (height--)
   	{
- 		// fixme: cleanup unused
+	        /* fixme: cleanup unused */
  		unsigned int wt,wd;
  		CARD32 workingiDest;
  		CARD32 *widst;
@@ -407,61 +405,152 @@ fbCompositeSolidMask_nx8x0565 (CARD8    
 				  CARD16     width,
 				  CARD16     height)
 {
-     CARD32	src, srca,na, rsrca;
-     CARD16	*dstLine, *dst;
-     CARD16	d;
-     CARD8	*maskLine, *mask, m;
-     FbStride	dstStride, maskStride;
-     CARD16	w,src16;
-  
-     fbComposeGetSolid(pSrc, src, pDst->format);
-     src16 = cvt8888to0565(src);
-      
-     rsrca = src >> 24;
-     srca=rsrca>>2;
-      if (src == 0)
- 		return;
+    CARD32	src, srca8, srca5;
+    CARD16	*dstLine, *dst;
+    CARD16	d;
+    CARD32	t;
+    CARD8	*maskLine, *mask, m;
+    FbStride	dstStride, maskStride;
+    CARD16	w,src16;
+    
+    fbComposeGetSolid(pSrc, src, pDst->format);
+
+    
+    
+    if (src == 0)
+	return;
       
-      fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
-      fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
+    srca8 = (src >> 24);
+    srca5 = (srca8 >> 3);
+    src16 = cvt8888to0565(src);
+     
+    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
+    fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
     
- 	while (height--)
-  	{
- 		dst = dstLine;
- 		dstLine += dstStride;
- 		mask = maskLine;
- 		maskLine += maskStride;
- 		w = width;
+    while (height--)
+    {
+	dst = dstLine;
+	dstLine += dstStride;
+	mask = maskLine;
+	maskLine += maskStride;
+	w = width;
  
- 		while (w--)
-  		{
- 			m = *mask++;
- 			if (m == 0xff)
- 			{
- 				if (srca == 0xff)
- 				{
- 					*dst=src16;
- 				}
- 				else
- 				{
- 					d = *dst;
- 					fastCombine0565(srca, src16, d, *dst++);
- 				}
- 			}
- 			else if (m)
- 			{
- 				na=(rsrca*(int)m)>>10;
- 				d = *dst;
- 				fastCombine0565(na, src16, d, *dst++);
- 			}
- 			else
- 				dst++;
-  		}
-  	}
+	while (w--)
+	{
+	    m = *mask++;
+	    if (m == 0)
+		dst++;
+	    else if (srca5 == (0xff >> 3))
+	    {
+		if (m == 0xff)
+		    *dst++ = src16;
+		else 
+ 		{
+		    d = *dst;
+		    m >>= 3;
+		    inOver0565 (m, src16, d, *dst++);
+ 		}
+	    }
+	    else
+	    {
+		d = *dst;
+		if (m == 0xff) 
+		{
+		    t = fbOver24 (src, cvt0565to0888 (d));
+		}
+		else
+		{
+		    t = fbIn (src, m);
+		    t = fbOver (t, cvt0565to0888 (d));
+		}
+		*dst++ = cvt8888to0565 (t);
+	    }
+	}
+    }
+    
     fbFinishAccess (pMask->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 = *mask++ >> 24;
+	    if (m == 0)
+		dst++;
+	    else if (srca5 == (0xff >> 3))
+	    {
+		if (m == 0xff)
+		    *dst++ = src16;
+		else
+		{
+		    d = *dst;
+		    m >>= 3;
+		    inOver0565 (m, src16, d, *dst++);
+		}
+	    }
+	    else
+	    {
+		if (m == 0xff) 
+		{
+		    d = *dst;
+		    t = fbOver24 (src, cvt0565to0888 (d));
+		    *dst++ = cvt8888to0565 (t);
+		}
+		else
+		{
+		    d = *dst;
+		    t = fbIn (src, m);
+		    t = fbOver (t, cvt0565to0888 (d));
+		    *dst++ = cvt8888to0565 (t);
+		}
+	    }
+	}
+    }
+}
+
 void
 fbCompositeSolidMask_nx8888x0565C (CARD8      op,
 				   PicturePtr pSrc,
@@ -516,14 +605,14 @@ fbCompositeSolidMask_nx8888x0565C (CARD8
 		else
 		{
 		    d = READ(dst);
-		    d = fbOver24 (src, cvt0565to8888(d));
+		    d = fbOver24 (src, cvt0565to0888(d));
 		    WRITE(dst, cvt8888to0565(d));
 		}
 	    }
 	    else if (ma)
 	    {
 		d = READ(dst);
-		d = cvt0565to8888(d);
+		d = cvt0565to0888(d);
 		FbInOverC (src, srca, ma, d, 0, m);
 		FbInOverC (src, srca, ma, d, 8, n);
 		FbInOverC (src, srca, ma, d, 16, o);
@@ -682,7 +771,7 @@ fbCompositeSrc_8888x0565 (CARD8      op,
 		else
 		{
 		    d = READ(dst);
-		    d = fbOver24 (s, cvt0565to8888(d));
+		    d = fbOver24 (s, cvt0565to0888(d));
 		}
 		WRITE(dst, cvt8888to0565(d));
 	    }
@@ -694,6 +783,7 @@ fbCompositeSrc_8888x0565 (CARD8      op,
     fbFinishAccess (pSrc->pDrawable);
 }
 
+#if 0
 void
 fbCompositeSrc_0565x0565 (CARD8      op,
 			  PicturePtr pSrc,
@@ -732,6 +822,7 @@ fbCompositeSrc_0565x0565 (CARD8      op,
     fbFinishAccess (pDst->pDrawable);
     fbFinishAccess (pSrc->pDrawable);
 }
+#endif
 
 void
 fbCompositeSrcAdd_8000x8000 (CARD8	op,
@@ -964,6 +1055,19 @@ fbCompositeSolidMask_nx1xn (CARD8      o
 /*
  * Apply a constant alpha value in an over computation
  */
+static void
+fbCompositeSrcSrc_nxn  (CARD8	   op,
+			PicturePtr pSrc,
+			PicturePtr pMask,
+			PicturePtr pDst,
+			INT16      xSrc,
+			INT16      ySrc,
+			INT16      xMask,
+			INT16      yMask,
+			INT16      xDst,
+			INT16      yDst,
+			CARD16     width,
+			CARD16     height);
 
 static void
 fbCompositeTrans_0565xnx0565(CARD8      op,
@@ -985,19 +1089,19 @@ fbCompositeTrans_0565xnx0565(CARD8      
     CARD16	w;
     FbBits	mask;
     CARD8	maskAlpha;
-    CARD16	s_16, d_16, r_16;
-    CARD32	s_32, d_32, i_32, r_32;
+    CARD16	s_16, d_16;
+    CARD32	s_32, d_32;
     
     fbComposeGetSolid (pMask, mask, pDst->format);
-    maskAlpha = mask >> 26;
+    maskAlpha = mask >> 27;
     
     if (!maskAlpha)
 	return;
     if (maskAlpha == 0xff)
     {
-	fbCompositeSrc_0565x0565 (op, pSrc, pMask, pDst,
-				  xSrc, ySrc, xMask, yMask, xDst, yDst, 
-				  width, height);
+	fbCompositeSrcSrc_nxn (PictOpSrc, pSrc, pMask, pDst,
+			       xSrc, ySrc, xMask, yMask, xDst, yDst, 
+			       width, height);
 	return;
     }
 
@@ -1005,55 +1109,70 @@ fbCompositeTrans_0565xnx0565(CARD8      
     fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
 
     while (height--)
- 	{
- 		CARD32 *isrc;
- 		dst = dstLine;
- 		dstLine += dstStride;
- 		src = srcLine;
- 		srcLine += srcStride;
- 		w = width;
- 		
- 		if(((int)src&1)==1)
- 		{
- 			s_16 = *src++;
- 			d_16 = *dst;
- 			fastCombine0565(maskAlpha, s_16, d_16, *dst++);
- 			w--;
- 		}
- 		isrc=(CARD32 *)src;
- 		while (w>1)
- 		{
- 			s_32=*isrc++;
+    {
+	CARD32 *isrc, *idst;
+	dst = dstLine;
+	dstLine += dstStride;
+	src = srcLine;
+	srcLine += srcStride;
+	w = width;
+	
+	if(((int)src&1)==1)
+	{
+	    s_16 = *src++;
+	    d_16 = *dst;
+	    inOver0565(maskAlpha, s_16, d_16, *dst++);
+	    w--;
+	}
+	isrc=(CARD32 *)src;
+	if(((int)dst&1)==0)
+	{
+	    idst=(CARD32 *)dst;
+	    while (w>1)
+	    {
+		s_32 = *isrc++;
+		d_32 = *idst;
+		inOver2x0565(maskAlpha, s_32, d_32, *idst++);
+		w-=2;
+	    }
+	    dst=(CARD16 *)idst;
+	}
+	else
+	{
+	    while (w > 1)
+	    {
+		s_32 = *isrc++;
 #if IMAGE_BYTE_ORDER == LSBFirst
- 			s_16=s_32&0xffff;
+		s_16=s_32&0xffff;
 #else
-			s_16=s_32>>16;
+		s_16=s_32>>16;
 #endif
- 			d_16 = *dst;
- 			fastCombine0565(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 = *dst;
- 			fastCombine0565(maskAlpha, s_16, d_16, *dst++);
- 			w-=2;
- 		}
- 		src=(CARD16 *)isrc;
- 		if(w!=0)
- 		{
- 			s_16 = *src;
- 			d_16 = *dst;
- 			fastCombine0565(maskAlpha, s_16, d_16, *dst);
- 		}
- 	}
-
+		d_16 = *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 = *dst;
+		inOver0565(maskAlpha, s_16, d_16, *dst++);
+		w-=2;
+	    }
+	}
+	src=(CARD16 *)isrc;
+	if(w!=0)
+	{
+	    s_16 = *src;
+	    d_16 = *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
+/* 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,
@@ -1082,140 +1201,105 @@ fbCompositeTrans_0888xnx0888(CARD8      
      
      if (!maskAlpha)
  	return;
-     //if (maskAlpha == 0xff)
-     //{
- 	//fbCompositeSrc_0888x0888 (op, pSrc, pMask, pDst,
- 	//			  xSrc, ySrc, xMask, yMask, xDst, yDst, 
- 	//			  width, height);
- 	//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 int ws,wt,wd,ww;
+ 		unsigned int ws,wt;
  		CARD32 workingSource;
- 		CARD32 *wsrc;
- 		CARD32 rs,gs,bs;
- 		CARD32 rd,gd,bd;
- 
- 		CARD32 workingiDest,workingoDest;
- 		CARD32 *widst,*wodst;
- 
+		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)!=0 || (dstStride&3)!=0)
+ 		/* 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--)
  			{
- 				idst=dst = dstLine;
+			        dst = dstLine;
  				dstLine += dstStride;
- 				src = srcLine;
+ 				isrc = src = srcLine;
  				srcLine += srcStride;
  				w = width*3;
  				
- 				setupPackedReader(wd,wt,idst,widst,workingiDest);
- 				ww=(int)dst;
- 				wt=ww&3;
- 				dst-=wt; 
- 				wodst=(CARD32 *)dst; 
- 				workingoDest=*wodst; 
- 				ww=4-wt;
-#if IMAGE_BYTE_ORDER == LSBFirst
- 				workingoDest<<=(8*(ww+1));
-#else
- 				workingoDest>>=(8*(ww+1));
-#endif
- 
- 				// get to word aligned
+				setupPackedReader(ws,wt,isrc,wsrc,workingSource);
+				
+ 				/* get to word aligned */
  				switch(!(int)src&3)
  				{
  					case 1:
- 						readPackedDest(rd);
- 						rd=alphamaskCombine24(*src++, rd)>>8;
- 						writePacked(rd);
- 						w--; if(w==0) break;
+					        readPackedSource(rs);
+						/* *dst++=alphamaskCombine24(rs, *dst)>>8; */
+						rd=*dst;  /* make gcc happy.  hope it doens't cost us too much performance*/
+						*dst++=alphamaskCombine24(rs, rd)>>8;
+						w--; if(w==0) break;
  					case 2:
- 						readPackedDest(rd);
- 						rd=alphamaskCombine24(*src++, rd)>>8;
- 						writePacked(rd);
+					        readPackedSource(rs);
+						rd=*dst;  
+						*dst++=alphamaskCombine24(rs, rd)>>8;
  						w--; if(w==0) break;
  					case 3:
- 						readPackedDest(rd);
- 						rd=alphamaskCombine24(*src++, rd)>>8;
- 						writePacked(rd);
+					        readPackedSource(rs);
+						rd=*dst;  
+						*dst++=alphamaskCombine24(rs, rd)>>8;
  						w--; if(w==0) break;
  				}
- 				wsrc=(CARD32 *)src;
+ 				wdst=(CARD32 *)dst;
 				while (w>3)
 				{
  					rs=*wsrc++;
- 					// FIXME: write a version of readPackedDest() which
- 					// can collect 4 bytes at once if we're on a boundry (which we're
- 					// actually guarenteed not to be in this version, but do it anyhow), and can
- 					// collect as 2 16bit words on a 2byte boundry, and then use the 32bit combine here
+					/* FIXME: write a special readPackedWord macro, which knows how to 
+					 * halfword combine
+					 */
  #if IMAGE_BYTE_ORDER == LSBFirst
- 					readPackedDest(rd);
- 					rd=alphamaskCombine24(rs&0xff, rd)>>8;
- 					writePacked(rd);
- 
- 					readPackedDest(rd);
- 					rd=alphamaskCombine24((rs>>8)&0xff, rd)>>8;
- 					writePacked(rd);
- 					
- 					readPackedDest(rd);
- 					rd=alphamaskCombine24((rs>>16)&0xff, rd)>>8;
- 					writePacked(rd);
- 					
- 					readPackedDest(rd);
- 					rd=alphamaskCombine24(rs>>24, rd)>>8;
- 					writePacked(rd);
- #else
- 					readPackedDest(rd);
- 					rd=alphamaskCombine24(rs>>24, rd)>>8;
- 					writePacked(rd);
- 					
- 					readPackedDest(rd);
- 					rd=alphamaskCombine24((rs>>16)&0xff, rd)>>8;
- 					writePacked(rd);
- 					
- 					readPackedDest(rd);
- 					rd=alphamaskCombine24((rs>>8)&0xff, rd)>>8;
- 					writePacked(rd);
- 
- 					readPackedDest(rd);
- 					rd=alphamaskCombine24(rs&0xff, rd)>>8;
- 					writePacked(rd);
- #endif
+					rd=*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 *)wsrc;
+ 				src=(CARD8 *)wdst;
  				switch(w)
  				{
  					case 3:
- 						readPackedDest(rd);
- 						rd=alphamaskCombine24(*src++, rd)>>8;
- 						writePacked(rd);
+						readPackedSource(rs);
+						rd=*dst;  
+						*dst++=alphamaskCombine24(rs, rd)>>8;
  					case 2:
- 						readPackedDest(rd);
- 						rd=alphamaskCombine24(*src++, rd)>>8;
- 						writePacked(rd);
+					        readPackedSource(rs);
+						rd=*dst;  
+						*dst++=alphamaskCombine24(rs, rd)>>8;
  					case 1:
- 						readPackedDest(rd);
- 						rd=alphamaskCombine24(*src++, rd)>>8;
- 						writePacked(rd);
- 				}
- 				dst=(CARD8 *)wodst;
- 				switch(ww)
- 				{
- 					case 1:
- 						dst[2]=(workingoDest>>8)&0xff;
- 					case 2:
- 						dst[1]=(workingoDest>>16)&0xff;
- 					case 3:
- 						dst[0]=workingoDest>>24;
+                                               readPackedSource(rs);
+                                               rd=*dst;  
+                                               *dst++=alphamaskCombine24(rs, rd)>>8;
  				}
  			}
  		}
@@ -1228,7 +1312,7 @@ fbCompositeTrans_0888xnx0888(CARD8      
  				src = srcLine;
  				srcLine += srcStride;
  				w = width*3;
- 				// get to word aligned
+ 				/* get to word aligned */
  				switch(!(int)src&3)
  				{
 					case 1:
@@ -1246,13 +1330,11 @@ fbCompositeTrans_0888xnx0888(CARD8      
  				}
  				wsrc=(CARD32 *)src;
  				widst=(CARD32 *)dst;
- 
-				register CARD32 t1, t2, t3, t4;
  				while(w>3)
  				{
  					rs = *wsrc++;
  					rd = *widst;
- 					fastcombine32(maskAlpha, rs, rd, widst, t1, t2, t3, t4);
+ 					inOver0888 (maskAlpha, rs, rd, *widst++);
  					w-=4;
  				}
 				src=(CARD8 *)wsrc;
@@ -1300,80 +1382,29 @@ fbCompositeSrcSrc_nxn  (CARD8	   op,
     int		dstXoff, dstYoff;
     int		srcBpp;
     int		dstBpp;
-    // these need to be signed now!
-    int 	iwidth=width;
-    int 	iheight=height;
     Bool	reverse = FALSE;
     Bool	upsidedown = FALSE;
-    int initialWidth=width;
-    int initialX=xDst;
- 
- 	// FIXME: this is possibly the worst piece of code I've ever written.
- 	// My main objection to it, is that it is incrfedibly slow in a few cases, due to the
- 	// call-per-repeat structure of it - the *correct* solution is to implement
- 	// repeat into fbBlt(), but that's a nontrivial job, and it's far more 
- 	// important to get the "requireRepeat" stuff implented functionally
-	// first, *then* make it fast.
- 	//  -- jj
-    Bool srcRepeat=pSrc->repeat;
-    CARD32 srcHeight=pSrc->pDrawable->height;
-    CARD32 srcWidth=pSrc->pDrawable->width;
+    
+    fbGetDrawable(pSrc->pDrawable,src,srcStride,srcBpp,srcXoff,srcYoff);
+    fbGetDrawable(pDst->pDrawable,dst,dstStride,dstBpp,dstXoff,dstYoff);
+	
+    fbBlt (src + (ySrc + srcYoff) * srcStride,
+	   srcStride,
+	   (xSrc + srcXoff) * srcBpp,
  
- 	fbGetDrawable(pSrc->pDrawable,src,srcStride,srcBpp,srcXoff,srcYoff);
- 	fbGetDrawable(pDst->pDrawable,dst,dstStride,dstBpp,dstXoff,dstYoff);
+	   dst + (yDst + dstYoff) * dstStride,
+	   dstStride,
+	   (xDst + dstXoff) * dstBpp,
 
- 	if(srcRepeat)
- 	{
- 		xSrc%=srcWidth;
- 		ySrc%=srcHeight;
- 	}
- 	
- 	while(iheight>0)
-	{
- 		int wheight=iheight;
- 		if(wheight>(srcHeight-ySrc))
- 			wheight=(srcHeight-ySrc);
- 		iwidth=initialWidth;
- 		xDst=initialX;
- 		while(iwidth>0)
- 		{
-			int wwidth=iwidth;
- 			if(wwidth>(srcWidth-xSrc))
- 				wwidth=(srcWidth-xSrc);
- 
- 			fbBlt (src + (ySrc + srcYoff) * srcStride,
- 					srcStride,
- 					(xSrc + srcXoff) * srcBpp,
- 
-					dst + (yDst + dstYoff) * dstStride,
- 					dstStride,
- 					(xDst + dstXoff) * dstBpp,
- 
- 					(wwidth) * dstBpp,
- 					(wheight),
- 
- 					GXcopy,
-					FB_ALLONES,
- 					dstBpp,
- 
- 					reverse,
- 					upsidedown);
- 			if(!srcRepeat)
- 				iwidth=0;
- 			else
-			{
- 				xDst+=wwidth;
- 				iwidth-=wwidth;
- 			}
- 		}
- 		if(!srcRepeat)
- 			iheight=0;
- 		else
- 		{
- 			yDst+=wheight;
- 			iheight-=wheight;
- 		}
- 	}
+	   (width) * dstBpp,
+	   (height),
+
+	   GXcopy,
+	   FB_ALLONES,
+	   dstBpp,
+
+	   reverse,
+	   upsidedown);
     
     fbFinishAccess(pSrc->pDrawable);
     fbFinishAccess(pDst->pDrawable);
@@ -1530,6 +1561,16 @@ fbComposite (CARD8      op,
 				break;
 			    }
 			}
+			else
+			{
+			    switch (pDst->format) {
+                            case PICT_r5g6b5:
+                                func = fbCompositeSolidMask_nx8888x0565;
+                                break;
+			    default:
+				break;
+                            }
+			}
 			break;
 		    case PICT_a8b8g8r8:
 			if (pMask->componentAlpha) {
@@ -1555,6 +1596,16 @@ fbComposite (CARD8      op,
 				break;
 			    }
 			}
+			else
+			{
+			    switch (pDst->format) {
+                            case PICT_b5g6r5:
+                                func = fbCompositeSolidMask_nx8888x0565;
+                                break;
+			    default:
+				break;
+                            }
+			}
 			break;
 		    case PICT_a1:
 			switch (pDst->format) {
@@ -1722,7 +1773,20 @@ fbComposite (CARD8      op,
 	    }
 	    else if (! srcRepeat)
 	    {
-		switch (pSrc->format) {
+		/*
+		 * Formats without alpha bits are just Copy with Over
+		 */
+		if (pSrc->format == pDst->format && !PICT_FORMAT_A(pSrc->format))
+		{
+#ifdef USE_MMX
+		    if (fbHaveMMX() &&
+			(pSrc->format == PICT_x8r8g8b8 || pSrc->format == PICT_x8b8g8r8))
+			func = fbCompositeCopyAreammx;
+		    else
+#endif
+			func = fbCompositeSrcSrc_nxn;
+		}
+		else switch (pSrc->format) {
 		case PICT_a8r8g8b8:
 		    switch (pDst->format) {
 		    case PICT_a8r8g8b8:
@@ -1800,24 +1864,6 @@ fbComposite (CARD8      op,
 			break;
 		    }
 		    break;
-		case PICT_r5g6b5:
-		    switch (pDst->format) {
-		    case PICT_r5g6b5:
-			func = fbCompositeSrc_0565x0565;
-			break;
-		    default:
-			break;
-		    }
-		    break;
-		case PICT_b5g6r5:
-		    switch (pDst->format) {
-		    case PICT_b5g6r5:
-			func = fbCompositeSrc_0565x0565;
-			break;
-		    default:
-			break;
-		    }
-		    break;
 		default:
 		    break;
 		}
@@ -1908,14 +1954,6 @@ fbComposite (CARD8      op,
 
     n = REGION_NUM_RECTS (&region);
     pbox = REGION_RECTS (&region);
-    // FIXME: this is bascially a "white list" of composites that work
-    // with repeat until they are all implented.  Once that's done, we
-    // remove the checks below entirely
-    if(func==fbCompositeSrcSrc_nxn)
-    {
-	    srcRepeat=maskRepeat=FALSE;
-    }
-
     while (n--)
     {
 	h = pbox->y2 - pbox->y1;
diff --git a/fb/fbpict.h b/fb/fbpict.h
index 76cab5b..5246cd5 100644
--- a/fb/fbpict.h
+++ b/fb/fbpict.h
@@ -121,7 +121,7 @@ fbCanGetSolid(PicturePtr pict)
 	break; \
     case 16: \
 	(bits) = READ((CARD16 *) __bits__); \
-	(bits) = cvt0565to8888(bits); \
+	(bits) = cvt0565to0888(bits); \
 	break; \
     case 8: \
 	(bits) = READ((CARD8 *) __bits__); \
@@ -161,7 +161,7 @@ fbCanGetSolid(PicturePtr pict)
 #define cvt8888to0565(s)    ((((s) >> 3) & 0x001f) | \
 			     (((s) >> 5) & 0x07e0) | \
 			     (((s) >> 8) & 0xf800))
-#define cvt0565to8888(s)    (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
+#define cvt0565to0888(s)    (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
 			     ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \
 			     ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)))
 
diff-tree fde4a5adf02d3067a064ebf6bdd666aa5784cfe9 (from 13e1d5ea55b0a3b7729316c8e37d3d8fca2075b5)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date:   Tue Apr 24 13:30:43 2007 -0400

    From xserver via pixman (Jeff Muizelaar)
    
         Add some optimizations from jaymz. Also adds some compile
         warnings that will hopefully go awa y as we continue merging.

diff --git a/fb/fbpict.c b/fb/fbpict.c
index 072f8d8..660112c 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -105,6 +105,51 @@ fbIn (CARD32 x, CARD8 y)
     return m|n|o|p;
 }
 
+#define genericCombine24(a,b,c,d) (((a)*(c)+(b)*(d)))
+
+#define fastcombine32(alpha, source, destval, destptr, dstrb, dstag, drb, dag) \
+	dstrb=destval&0xFF00FF; dstag=(destval>>8)&0xFF00FF; \
+	drb=((source&0xFF00FF)-dstrb)*alpha; dag=(((source>>8)&0xFF00FF)-dstag)*alpha; \
+	*destptr++=((((drb>>8) + dstrb) & 0x00FF00FF) | ((((dag>>8) + dstag) << 8) & 0xFF00FF00)); \
+
+#define fastcombine32(alpha, source, destval, destptr, dstrb, dstag, drb, dag) \
+	dstrb=destval&0xFF00FF; dstag=(destval>>8)&0xFF00FF; \
+	drb=((source&0xFF00FF)-dstrb)*alpha; dag=(((source>>8)&0xFF00FF)-dstag)*alpha; \
+	*destptr++=((((drb>>8) + dstrb) & 0x00FF00FF) | ((((dag>>8) + dstag) << 8) & 0xFF00FF00)); \
+	
+// Note: this macro expects 6 bits of alpha, not 8!
+#define fastCombine0565(alpha, source, destval, destptr) { \
+	CARD16 dstrb = destval & 0xf81f; CARD16 dstg  = destval & 0x7e0; \
+	CARD32 drb = ((source&0xf81f)-dstrb)*alpha; CARD32 dg=((source & 0x7e0)-dstg)*alpha; \
+	destptr= ((((drb>>6) + dstrb)&0xf81f) | (((dg>>6)  + dstg) & 0x7e0)); \
+	}
+
+#if IMAGE_BYTE_ORDER == LSBFirst
+	#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \
+					temp=count&3; \
+					where-=temp; \
+					workingWhere=(CARD32 *)where; \
+					workingVal=*workingWhere++; \
+					count=4-temp; \
+					workingVal>>=(8*temp)
+	#define readPacked(where,x,y,z) {if(!(x)) { (x)=4; y=*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; *wodst++=workingoDest; } 
+#else
+	#warning "I havn't tested fbCompositeTrans_0888xnx0888() on big endian yet!"
+	#define setupPackedReader(count,temp,where,workingWhere,workingVal) count=(int)where; \
+					temp=count&3; \
+					where-=temp; \
+					workingWhere=(CARD32 *)where; \
+					workingVal=*workingWhere++; \
+					count=4-temp; \
+					workingVal<<=(8*temp)
+	#define readPacked(where,x,y,z) {if(!(x)) { (x)=4; y=*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; *wodst++=workingoDest; } 
+#endif
 /*
  * Naming convention:
  *
@@ -248,6 +293,7 @@ fbCompositeSolidMask_nx8888x8888C (CARD8
     fbFinishAccess (pDst->pDrawable);
 }
 
+#define srcAlphaCombine24(a,b) genericCombine24(a,b,srca,srcia)
 void
 fbCompositeSolidMask_nx8x0888 (CARD8      op,
 			       PicturePtr pSrc,
@@ -262,52 +308,86 @@ fbCompositeSolidMask_nx8x0888 (CARD8    
 			       CARD16     width,
 			       CARD16     height)
 {
-    CARD32	src, srca;
-    CARD8	*dstLine, *dst;
+    CARD32	src, srca, srcia;
+    CARD8	*dstLine, *dst, *edst;
     CARD32	d;
     CARD8	*maskLine, *mask, m;
     FbStride	dstStride, maskStride;
     CARD16	w;
+    CARD32 rs,gs,bs,rd,gd,bd;
 
     fbComposeGetSolid(pSrc, src, pDst->format);
 
     srca = src >> 24;
+    srcia = 255-srca;
     if (src == 0)
 	return;
 
+    rs=src&0xff;
+    gs=(src>>8)&0xff;
+    bs=(src>>16)&0xff;
+      
     fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3);
     fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
 
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	mask = maskLine;
-	maskLine += maskStride;
-	w = width;
-
-	while (w--)
-	{
-	    m = READ(mask++);
-	    if (m == 0xff)
-	    {
-		if (srca == 0xff)
-		    d = src;
-		else
-		{
-		    d = Fetch24(dst);
-		    d = fbOver24 (src, d);
+     while (height--)
+  	{
+ 		// fixme: cleanup unused
+ 		unsigned int wt,wd;
+ 		CARD32 workingiDest;
+ 		CARD32 *widst;
+ 		
+ 		edst=dst = dstLine;
+ 		dstLine += dstStride;
+ 		mask = maskLine;
+ 		maskLine += maskStride;
+ 		w = width;
+ 		
+#ifndef NO_MASKED_PACKED_READ
+ 		setupPackedReader(wd,wt,edst,widst,workingiDest);
+#endif
+ 				
+ 		while (w--)
+ 		{
+#ifndef NO_MASKED_PACKED_READ
+ 			readPackedDest(rd);
+ 			readPackedDest(gd);
+ 			readPackedDest(bd);
+#else
+ 			rd= *edst++;
+ 			gd= *edst++;
+ 			bd= *edst++;
+#endif
+ 			m = *mask++;
+ 			if (m == 0xff)
+ 			{
+ 				if (srca == 0xff)
+ 				{
+ 					*dst++=rs;
+ 					*dst++=gs;
+ 					*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;
+ 			}
 		}
-		Store24(dst,d);
-	    }
-	    else if (m)
-	    {
-		d = fbOver24 (fbIn(src,m), Fetch24(dst));
-		Store24(dst,d);
-	    }
-	    dst += 3;
 	}
-    }
 
     fbFinishAccess (pMask->pDrawable);
     fbFinishAccess (pDst->pDrawable);
@@ -327,54 +407,57 @@ fbCompositeSolidMask_nx8x0565 (CARD8    
 				  CARD16     width,
 				  CARD16     height)
 {
-    CARD32	src, srca;
-    CARD16	*dstLine, *dst;
-    CARD32	d;
-    CARD8	*maskLine, *mask, m;
-    FbStride	dstStride, maskStride;
-    CARD16	w;
-
-    fbComposeGetSolid(pSrc, src, pDst->format);
-
-    srca = src >> 24;
-    if (src == 0)
-	return;
-
-    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
-    fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
-
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	mask = maskLine;
-	maskLine += maskStride;
-	w = width;
-
-	while (w--)
-	{
-	    m = READ(mask++);
-	    if (m == 0xff)
-	    {
-		if (srca == 0xff)
-		    d = src;
-		else
-		{
-		    d = READ(dst);
-		    d = fbOver24 (src, cvt0565to8888(d));
-		}
-		WRITE(dst, cvt8888to0565(d));
-	    }
-	    else if (m)
-	    {
-		d = READ(dst);
-		d = fbOver24 (fbIn(src,m), cvt0565to8888(d));
-		WRITE(dst, cvt8888to0565(d));
-	    }
-	    dst++;
-	}
-    }
-
+     CARD32	src, srca,na, rsrca;
+     CARD16	*dstLine, *dst;
+     CARD16	d;
+     CARD8	*maskLine, *mask, m;
+     FbStride	dstStride, maskStride;
+     CARD16	w,src16;
+  
+     fbComposeGetSolid(pSrc, src, pDst->format);
+     src16 = cvt8888to0565(src);
+      
+     rsrca = src >> 24;
+     srca=rsrca>>2;
+      if (src == 0)
+ 		return;
+      
+      fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
+      fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
+    
+ 	while (height--)
+  	{
+ 		dst = dstLine;
+ 		dstLine += dstStride;
+ 		mask = maskLine;
+ 		maskLine += maskStride;
+ 		w = width;
+ 
+ 		while (w--)
+  		{
+ 			m = *mask++;
+ 			if (m == 0xff)
+ 			{
+ 				if (srca == 0xff)
+ 				{
+ 					*dst=src16;
+ 				}
+ 				else
+ 				{
+ 					d = *dst;
+ 					fastCombine0565(srca, src16, d, *dst++);
+ 				}
+ 			}
+ 			else if (m)
+ 			{
+ 				na=(rsrca*(int)m)>>10;
+ 				d = *dst;
+ 				fastCombine0565(na, src16, d, *dst++);
+ 			}
+ 			else
+ 				dst++;
+  		}
+  	}
     fbFinishAccess (pMask->pDrawable);
     fbFinishAccess (pDst->pDrawable);
 }
@@ -906,7 +989,7 @@ fbCompositeTrans_0565xnx0565(CARD8      
     CARD32	s_32, d_32, i_32, r_32;
     
     fbComposeGetSolid (pMask, mask, pDst->format);
-    maskAlpha = mask >> 24;
+    maskAlpha = mask >> 26;
     
     if (!maskAlpha)
 	return;
@@ -922,31 +1005,276 @@ fbCompositeTrans_0565xnx0565(CARD8      
     fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
 
     while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-
-	while (w--)
-	{
-	    s_16 = READ(src++);
-	    s_32 = cvt0565to8888(s_16);
-	    d_16 = READ(dst);
-	    d_32 = cvt0565to8888(d_16);
-	    
-	    i_32 = fbIn24 (s_32, maskAlpha);
-	    r_32 = fbOver24 (i_32, d_32);
-	    r_16 = cvt8888to0565(r_32);
-	    WRITE(dst++, r_16);
-	}
-    }
+ 	{
+ 		CARD32 *isrc;
+ 		dst = dstLine;
+ 		dstLine += dstStride;
+ 		src = srcLine;
+ 		srcLine += srcStride;
+ 		w = width;
+ 		
+ 		if(((int)src&1)==1)
+ 		{
+ 			s_16 = *src++;
+ 			d_16 = *dst;
+ 			fastCombine0565(maskAlpha, s_16, d_16, *dst++);
+ 			w--;
+ 		}
+ 		isrc=(CARD32 *)src;
+ 		while (w>1)
+ 		{
+ 			s_32=*isrc++;
+#if IMAGE_BYTE_ORDER == LSBFirst
+ 			s_16=s_32&0xffff;
+#else
+			s_16=s_32>>16;
+#endif
+ 			d_16 = *dst;
+ 			fastCombine0565(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 = *dst;
+ 			fastCombine0565(maskAlpha, s_16, d_16, *dst++);
+ 			w-=2;
+ 		}
+ 		src=(CARD16 *)isrc;
+ 		if(w!=0)
+ 		{
+ 			s_16 = *src;
+ 			d_16 = *dst;
+ 			fastCombine0565(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 int ws,wt,wd,ww;
+ 		CARD32 workingSource;
+ 		CARD32 *wsrc;
+ 		CARD32 rs,gs,bs;
+ 		CARD32 rd,gd,bd;
+ 
+ 		CARD32 workingiDest,workingoDest;
+ 		CARD32 *widst,*wodst;
+ 
+ 
+ 		// 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)!=0 || (dstStride&3)!=0)
+ 		{
+ 			while (height--)
+ 			{
+ 				idst=dst = dstLine;
+ 				dstLine += dstStride;
+ 				src = srcLine;
+ 				srcLine += srcStride;
+ 				w = width*3;
+ 				
+ 				setupPackedReader(wd,wt,idst,widst,workingiDest);
+ 				ww=(int)dst;
+ 				wt=ww&3;
+ 				dst-=wt; 
+ 				wodst=(CARD32 *)dst; 
+ 				workingoDest=*wodst; 
+ 				ww=4-wt;
+#if IMAGE_BYTE_ORDER == LSBFirst
+ 				workingoDest<<=(8*(ww+1));
+#else
+ 				workingoDest>>=(8*(ww+1));
+#endif
+ 
+ 				// get to word aligned
+ 				switch(!(int)src&3)
+ 				{
+ 					case 1:
+ 						readPackedDest(rd);
+ 						rd=alphamaskCombine24(*src++, rd)>>8;
+ 						writePacked(rd);
+ 						w--; if(w==0) break;
+ 					case 2:
+ 						readPackedDest(rd);
+ 						rd=alphamaskCombine24(*src++, rd)>>8;
+ 						writePacked(rd);
+ 						w--; if(w==0) break;
+ 					case 3:
+ 						readPackedDest(rd);
+ 						rd=alphamaskCombine24(*src++, rd)>>8;
+ 						writePacked(rd);
+ 						w--; if(w==0) break;
+ 				}
+ 				wsrc=(CARD32 *)src;
+				while (w>3)
+				{
+ 					rs=*wsrc++;
+ 					// FIXME: write a version of readPackedDest() which
+ 					// can collect 4 bytes at once if we're on a boundry (which we're
+ 					// actually guarenteed not to be in this version, but do it anyhow), and can
+ 					// collect as 2 16bit words on a 2byte boundry, and then use the 32bit combine here
+ #if IMAGE_BYTE_ORDER == LSBFirst
+ 					readPackedDest(rd);
+ 					rd=alphamaskCombine24(rs&0xff, rd)>>8;
+ 					writePacked(rd);
+ 
+ 					readPackedDest(rd);
+ 					rd=alphamaskCombine24((rs>>8)&0xff, rd)>>8;
+ 					writePacked(rd);
+ 					
+ 					readPackedDest(rd);
+ 					rd=alphamaskCombine24((rs>>16)&0xff, rd)>>8;
+ 					writePacked(rd);
+ 					
+ 					readPackedDest(rd);
+ 					rd=alphamaskCombine24(rs>>24, rd)>>8;
+ 					writePacked(rd);
+ #else
+ 					readPackedDest(rd);
+ 					rd=alphamaskCombine24(rs>>24, rd)>>8;
+ 					writePacked(rd);
+ 					
+ 					readPackedDest(rd);
+ 					rd=alphamaskCombine24((rs>>16)&0xff, rd)>>8;
+ 					writePacked(rd);
+ 					
+ 					readPackedDest(rd);
+ 					rd=alphamaskCombine24((rs>>8)&0xff, rd)>>8;
+ 					writePacked(rd);
+ 
+ 					readPackedDest(rd);
+ 					rd=alphamaskCombine24(rs&0xff, rd)>>8;
+ 					writePacked(rd);
+ #endif
+ 					w-=4;
+ 				}
+ 				src=(CARD8 *)wsrc;
+ 				switch(w)
+ 				{
+ 					case 3:
+ 						readPackedDest(rd);
+ 						rd=alphamaskCombine24(*src++, rd)>>8;
+ 						writePacked(rd);
+ 					case 2:
+ 						readPackedDest(rd);
+ 						rd=alphamaskCombine24(*src++, rd)>>8;
+ 						writePacked(rd);
+ 					case 1:
+ 						readPackedDest(rd);
+ 						rd=alphamaskCombine24(*src++, rd)>>8;
+ 						writePacked(rd);
+ 				}
+ 				dst=(CARD8 *)wodst;
+ 				switch(ww)
+ 				{
+ 					case 1:
+ 						dst[2]=(workingoDest>>8)&0xff;
+ 					case 2:
+ 						dst[1]=(workingoDest>>16)&0xff;
+ 					case 3:
+ 						dst[0]=workingoDest>>24;
+ 				}
+ 			}
+ 		}
+ 		else
+ 		{
+ 			while (height--)
+ 			{
+ 				idst=dst = dstLine;
+ 				dstLine += dstStride;
+ 				src = srcLine;
+ 				srcLine += srcStride;
+ 				w = width*3;
+ 				// get to word aligned
+ 				switch(!(int)src&3)
+ 				{
+					case 1:
+ 						rd=alphamaskCombine24(*src++, *dst)>>8;
+ 						*dst++=rd;
+ 						w--; if(w==0) break;
+ 					case 2:
+ 						rd=alphamaskCombine24(*src++, *dst)>>8;
+ 						*dst++=rd;
+ 						w--; if(w==0) break;
+					case 3:
+ 						rd=alphamaskCombine24(*src++, *dst)>>8;
+ 						*dst++=rd;
+ 						w--; if(w==0) break;
+ 				}
+ 				wsrc=(CARD32 *)src;
+ 				widst=(CARD32 *)dst;
+ 
+				register CARD32 t1, t2, t3, t4;
+ 				while(w>3)
+ 				{
+ 					rs = *wsrc++;
+ 					rd = *widst;
+ 					fastcombine32(maskAlpha, rs, rd, widst, t1, t2, t3, t4);
+ 					w-=4;
+ 				}
+				src=(CARD8 *)wsrc;
+ 				dst=(CARD8 *)widst;
+ 				switch(w)
+ 				{
+ 					case 3:
+ 						rd=alphamaskCombine24(*src++, *dst)>>8;
+ 						*dst++=rd;
+ 					case 2:
+						rd=alphamaskCombine24(*src++, *dst)>>8;
+ 						*dst++=rd;
+ 					case 1:
+ 						rd=alphamaskCombine24(*src++, *dst)>>8;
+ 						*dst++=rd;
+ 				}
+ 			}
+ 		}
+ 	}
+  }
+
+
 /*
  * Simple bitblt
  */
@@ -972,30 +1300,81 @@ fbCompositeSrcSrc_nxn  (CARD8	   op,
     int		dstXoff, dstYoff;
     int		srcBpp;
     int		dstBpp;
+    // these need to be signed now!
+    int 	iwidth=width;
+    int 	iheight=height;
     Bool	reverse = FALSE;
     Bool	upsidedown = FALSE;
+    int initialWidth=width;
+    int initialX=xDst;
+ 
+ 	// FIXME: this is possibly the worst piece of code I've ever written.
+ 	// My main objection to it, is that it is incrfedibly slow in a few cases, due to the
+ 	// call-per-repeat structure of it - the *correct* solution is to implement
+ 	// repeat into fbBlt(), but that's a nontrivial job, and it's far more 
+ 	// important to get the "requireRepeat" stuff implented functionally
+	// first, *then* make it fast.
+ 	//  -- jj
+    Bool srcRepeat=pSrc->repeat;
+    CARD32 srcHeight=pSrc->pDrawable->height;
+    CARD32 srcWidth=pSrc->pDrawable->width;
+ 
+ 	fbGetDrawable(pSrc->pDrawable,src,srcStride,srcBpp,srcXoff,srcYoff);
+ 	fbGetDrawable(pDst->pDrawable,dst,dstStride,dstBpp,dstXoff,dstYoff);
+
+ 	if(srcRepeat)
+ 	{
+ 		xSrc%=srcWidth;
+ 		ySrc%=srcHeight;
+ 	}
+ 	
+ 	while(iheight>0)
+	{
+ 		int wheight=iheight;
+ 		if(wheight>(srcHeight-ySrc))
+ 			wheight=(srcHeight-ySrc);
+ 		iwidth=initialWidth;
+ 		xDst=initialX;
+ 		while(iwidth>0)
+ 		{
+			int wwidth=iwidth;
+ 			if(wwidth>(srcWidth-xSrc))
+ 				wwidth=(srcWidth-xSrc);
+ 
+ 			fbBlt (src + (ySrc + srcYoff) * srcStride,
+ 					srcStride,
+ 					(xSrc + srcXoff) * srcBpp,
+ 
+					dst + (yDst + dstYoff) * dstStride,
+ 					dstStride,
+ 					(xDst + dstXoff) * dstBpp,
+ 
+ 					(wwidth) * dstBpp,
+ 					(wheight),
+ 
+ 					GXcopy,
+					FB_ALLONES,
+ 					dstBpp,
+ 
+ 					reverse,
+ 					upsidedown);
+ 			if(!srcRepeat)
+ 				iwidth=0;
+ 			else
+			{
+ 				xDst+=wwidth;
+ 				iwidth-=wwidth;
+ 			}
+ 		}
+ 		if(!srcRepeat)
+ 			iheight=0;
+ 		else
+ 		{
+ 			yDst+=wheight;
+ 			iheight-=wheight;
+ 		}
+ 	}
     
-    fbGetDrawable(pSrc->pDrawable,src,srcStride,srcBpp,srcXoff,srcYoff);
-    fbGetDrawable(pDst->pDrawable,dst,dstStride,dstBpp,dstXoff,dstYoff);
-
-    fbBlt (src + (ySrc + srcYoff) * srcStride,
-	   srcStride,
-	   (xSrc + srcXoff) * srcBpp,
-
-	   dst + (yDst + dstYoff) * dstStride,
-	   dstStride,
-	   (xDst + dstXoff) * dstBpp,
-
-	   (width) * dstBpp,
-	   (height),
-
-	   GXcopy,
-	   FB_ALLONES,
-	   dstBpp,
-
-	   reverse,
-	   upsidedown);
-
     fbFinishAccess(pSrc->pDrawable);
     fbFinishAccess(pDst->pDrawable);
 }
@@ -1294,6 +1673,11 @@ fbComposite (CARD8      op,
 		    if (pDst->format == pSrc->format)
 		        func = fbCompositeTrans_0565xnx0565;
 		    break;
+ 		case PICT_r8g8b8:
+ 		case PICT_b8g8r8:
+ 		    if (pDst->format == pSrc->format)
+ 		        func = fbCompositeTrans_0888xnx0888;
+ 		    break;
 		default:
 		    break;
 		}
@@ -1524,6 +1908,14 @@ fbComposite (CARD8      op,
 
     n = REGION_NUM_RECTS (&region);
     pbox = REGION_RECTS (&region);
+    // FIXME: this is bascially a "white list" of composites that work
+    // with repeat until they are all implented.  Once that's done, we
+    // remove the checks below entirely
+    if(func==fbCompositeSrcSrc_nxn)
+    {
+	    srcRepeat=maskRepeat=FALSE;
+    }
+
     while (n--)
     {
 	h = pbox->y2 - pbox->y1;
diff-tree 13e1d5ea55b0a3b7729316c8e37d3d8fca2075b5 (from 077a5d4555676d5775e990468a697b6890c6d609)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date:   Tue Apr 24 12:59:18 2007 -0400

    Fix format vs formatCode in previous commit

diff --git a/fb/fbpict.c b/fb/fbpict.c
index bc737d8..072f8d8 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -1085,7 +1085,7 @@ fbComposite (CARD8      op,
 #endif
 	    if (pMask == 0)
 	    {
-		if (pSrc->format_code == pDst->format_code)
+		if (pSrc->format == pDst->format)
 		    func = fbCompositeSrcSrc_nxn;
 	    }
 	break;
diff-tree 077a5d4555676d5775e990468a697b6890c6d609 (from 09436fb7c38a9819bde770c4c21143591671c4d7)
Author: Soren Sandmann Pedersen <ssp at dhcp83-218.boston.redhat.com>
Date:   Tue Apr 24 12:57:55 2007 -0400

    Add functions fbCompositeSrcSrc_nxn() and fbCompositeTrans_0565xnx0565
    from xserver via pixman. Add READ/WRITE and fbFinishAccess as
    appropriate.

diff --git a/fb/fbpict.c b/fb/fbpict.c
index cd6cac2..bc737d8 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -64,6 +64,20 @@ fbOver (CARD32 x, CARD32 y)
     return m|n|o|p;
 }
 
+static CARD32
+fbIn24 (CARD32 x, CARD8 y)
+{
+    CARD16  a = y;
+    CARD16  t;
+    CARD32  m,n,o,p;
+
+    m = FbInU(x,0,a,t);
+    n = FbInU(x,8,a,t);
+    o = FbInU(x,16,a,t);
+    p = (y << 24);
+    return m|n|o|p;
+}
+
 CARD32
 fbOver24 (CARD32 x, CARD32 y)
 {
@@ -864,6 +878,148 @@ fbCompositeSolidMask_nx1xn (CARD8      o
 
 # define mod(a,b)	((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b))
 
+/*
+ * Apply a constant alpha value in an over computation
+ */
+
+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, r_16;
+    CARD32	s_32, d_32, i_32, r_32;
+    
+    fbComposeGetSolid (pMask, mask, pDst->format);
+    maskAlpha = mask >> 24;
+    
+    if (!maskAlpha)
+	return;
+    if (maskAlpha == 0xff)
+    {
+	fbCompositeSrc_0565x0565 (op, 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--)
+    {
+	dst = dstLine;
+	dstLine += dstStride;
+	src = srcLine;
+	srcLine += srcStride;
+	w = width;
+
+	while (w--)
+	{
+	    s_16 = READ(src++);
+	    s_32 = cvt0565to8888(s_16);
+	    d_16 = READ(dst);
+	    d_32 = cvt0565to8888(d_16);
+	    
+	    i_32 = fbIn24 (s_32, maskAlpha);
+	    r_32 = fbOver24 (i_32, d_32);
+	    r_16 = cvt8888to0565(r_32);
+	    WRITE(dst++, r_16);
+	}
+    }
+
+    fbFinishAccess (pSrc->pDrawable);
+    fbFinishAccess (pDst->pDrawable);
+}
+
+/*
+ * Simple bitblt
+ */
+
+static void
+fbCompositeSrcSrc_nxn  (CARD8	   op,
+			PicturePtr pSrc,
+			PicturePtr pMask,
+			PicturePtr pDst,
+			INT16      xSrc,
+			INT16      ySrc,
+			INT16      xMask,
+			INT16      yMask,
+			INT16      xDst,
+			INT16      yDst,
+			CARD16     width,
+			CARD16     height)
+{
+    FbBits	*dst;
+    FbBits	*src;
+    FbStride	dstStride, srcStride;
+    int		srcXoff, srcYoff;
+    int		dstXoff, dstYoff;
+    int		srcBpp;
+    int		dstBpp;
+    Bool	reverse = FALSE;
+    Bool	upsidedown = FALSE;
+    
+    fbGetDrawable(pSrc->pDrawable,src,srcStride,srcBpp,srcXoff,srcYoff);
+    fbGetDrawable(pDst->pDrawable,dst,dstStride,dstBpp,dstXoff,dstYoff);
+
+    fbBlt (src + (ySrc + srcYoff) * srcStride,
+	   srcStride,
+	   (xSrc + srcXoff) * srcBpp,
+
+	   dst + (yDst + dstYoff) * dstStride,
+	   dstStride,
+	   (xDst + dstXoff) * dstBpp,
+
+	   (width) * dstBpp,
+	   (height),
+
+	   GXcopy,
+	   FB_ALLONES,
+	   dstBpp,
+
+	   reverse,
+	   upsidedown);
+
+    fbFinishAccess(pSrc->pDrawable);
+    fbFinishAccess(pDst->pDrawable);
+}
+
+/*
+ * Solid fill
+void
+fbCompositeSolidSrc_nxn  (CARD8	op,
+			  PicturePtr pSrc,
+			  PicturePtr pMask,
+			  PicturePtr pDst,
+			  INT16      xSrc,
+			  INT16      ySrc,
+			  INT16      xMask,
+			  INT16      yMask,
+			  INT16      xDst,
+			  INT16      yDst,
+			  CARD16     width,
+			  CARD16     height)
+{
+    
+}
+ */
+
 void
 fbComposite (CARD8      op,
 	     PicturePtr pSrc,
@@ -925,7 +1081,13 @@ fbComposite (CARD8      op,
 	{
 	    func = fbCompositeCopyAreammx;
 	}
+	else
 #endif
+	    if (pMask == 0)
+	    {
+		if (pSrc->format_code == pDst->format_code)
+		    func = fbCompositeSrcSrc_nxn;
+	    }
 	break;
     case PictOpOver:
 	if (pMask)
@@ -933,7 +1095,6 @@ fbComposite (CARD8      op,
 	    if (fbCanGetSolid(pSrc) &&
 		!maskRepeat)
 	    {
-		srcRepeat = FALSE;
 		if (PICT_FORMAT_COLOR(pSrc->format)) {
 		    switch (pMask->format) {
 		    case PICT_a8:
@@ -1120,6 +1281,24 @@ fbComposite (CARD8      op,
 			}
 		    }
 		}
+		if (func != fbCompositeGeneral)
+		    srcRepeat = FALSE;
+	    }
+	    else if (maskRepeat &&
+		     pMask->pDrawable->width == 1 &&
+		     pMask->pDrawable->height == 1)
+	    {
+		switch (pSrc->format) {
+		case PICT_r5g6b5:
+		case PICT_b5g6r5:
+		    if (pDst->format == pSrc->format)
+		        func = fbCompositeTrans_0565xnx0565;
+		    break;
+		default:
+		    break;
+		}
+		if (func != fbCompositeGeneral)
+		    maskRepeat = FALSE;
 	    }
 	}
 	else /* no mask */
diff --git a/fb/fbpict.h b/fb/fbpict.h
index 434526e..76cab5b 100644
--- a/fb/fbpict.h
+++ b/fb/fbpict.h
@@ -123,6 +123,14 @@ fbCanGetSolid(PicturePtr pict)
 	(bits) = READ((CARD16 *) __bits__); \
 	(bits) = cvt0565to8888(bits); \
 	break; \
+    case 8: \
+	(bits) = READ((CARD8 *) __bits__); \
+	(bits) = (bits) << 24; \
+	break; \
+    case 1: \
+	(bits) = READ((CARD32 *) __bits__);			\
+	(bits) = FbLeftStipBits((bits),1) ? 0xff000000 : 0x00000000;\
+	break; \
     default: \
 	return; \
     } \



More information about the xorg-commit mailing list