pixman: Branch 'master' - 6 commits

Søren Sandmann Pedersen sandmann at kemper.freedesktop.org
Sat Dec 1 18:09:26 PST 2007


 TODO                 |   28 +
 pixman/pixman-pict.c |  839 ++++++++++++++++-----------------------------------
 pixman/pixman.h      |    6 
 3 files changed, 305 insertions(+), 568 deletions(-)

New commits:
commit 47d39c002d3b5bce827ab1f782583ae8625a5975
Author: Søren Sandmann <sandmann at redhat.com>
Date:   Sat Dec 1 20:55:56 2007 -0500

    Conditionalize MMX code with USE_MMX

diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c
index f6b64e1..be8f096 100644
--- a/pixman/pixman-pict.c
+++ b/pixman/pixman-pict.c
@@ -1406,6 +1406,7 @@ typedef struct
     uint32_t			flags;
 } FastPathInfo;
 
+#ifdef USE_MMX
 const FastPathInfo mmx_fast_paths[] =
 {
     { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_r5g6b5,   fbCompositeSolidMask_nx8x0565mmx,     0 },
@@ -1490,6 +1491,7 @@ const FastPathInfo mmx_fast_paths[] =
     { PIXMAN_OP_IN,  PIXMAN_solid,     PIXMAN_a8,	PIXMAN_a8,	 fbCompositeIn_nx8x8mmx, 0 },
     { PIXMAN_OP_NONE },
 };
+#endif
 
 const FastPathInfo c_fast_paths[] =
 {
@@ -1714,8 +1716,10 @@ pixman_image_composite (pixman_op_t      op,
 	    !pMask->common.component_alpha	&&
 	    !maskRepeat;
 
+#ifdef USE_MMX
 	info = get_fast_path (mmx_fast_paths, op, pSrc, pMask, pDst, pixbuf);
 	if (!info)
+#endif
 	    info = get_fast_path (c_fast_paths, op, pSrc, pMask, pDst, pixbuf);
 
 	if (info)
commit 14d628b0154c6101f0d1bb03d91ff99ca07e4398
Author: Søren Sandmann <sandmann at redhat.com>
Date:   Sat Dec 1 20:54:13 2007 -0500

    Add some commented-out plain C fast paths.

diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c
index 1341148..f6b64e1 100644
--- a/pixman/pixman-pict.c
+++ b/pixman/pixman-pict.c
@@ -1520,7 +1520,17 @@ const FastPathInfo c_fast_paths[] =
     { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null,	PIXMAN_a8b8g8r8, fbCompositeSrc_8888x8888,	   0 },
     { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null,	PIXMAN_x8b8g8r8, fbCompositeSrc_8888x8888,	   0 },
     { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null,     PIXMAN_b5g6r5,   fbCompositeSrc_8888x0565,	   0 },
-    
+#if 0
+    /* FIXME */
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a1,	PIXMAN_r5g6b5,   fbCompositeSolidMask_nx1xn,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a1,	PIXMAN_b5g6r5,   fbCompositeSolidMask_nx1xn,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a1,	PIXMAN_r8g8b8,   fbCompositeSolidMask_nx1xn,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a1,	PIXMAN_b8g8r8,   fbCompositeSolidMask_nx1xn,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a1,	PIXMAN_a8r8g8b8, fbCompositeSolidMask_nx1xn,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a1,	PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx1xn,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a1,	PIXMAN_x8r8g8b8, fbCompositeSolidMask_nx1xn,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a1,	PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx1xn,	   0 },
+#endif
     { PIXMAN_OP_ADD, PIXMAN_a8r8g8b8,  PIXMAN_null,	PIXMAN_a8r8g8b8, fbCompositeSrcAdd_8888x8888,   0 },
     { PIXMAN_OP_ADD, PIXMAN_a8b8g8r8,  PIXMAN_null,	PIXMAN_a8b8g8r8, fbCompositeSrcAdd_8888x8888,   0 },
     { PIXMAN_OP_ADD, PIXMAN_a8,        PIXMAN_null,     PIXMAN_a8,       fbCompositeSrcAdd_8000x8000,   0 },
@@ -1529,7 +1539,6 @@ const FastPathInfo c_fast_paths[] =
     { PIXMAN_OP_ADD, PIXMAN_a1,        PIXMAN_null,     PIXMAN_a1,       fbCompositeSrcAdd_1000x1000,   0 },
 #endif
     { PIXMAN_OP_ADD, PIXMAN_solid,     PIXMAN_a8,       PIXMAN_a8,       fbCompositeSrcAdd_8888x8x8,    0 },
-    
     { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_null,     PIXMAN_a8r8g8b8, fbCompositeSolidFill, 0 },
     { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_null,     PIXMAN_x8r8g8b8, fbCompositeSolidFill, 0 },
     { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_null,     PIXMAN_a8b8g8r8, fbCompositeSolidFill, 0 },
@@ -1540,6 +1549,15 @@ const FastPathInfo c_fast_paths[] =
     { PIXMAN_OP_SRC, PIXMAN_x8r8g8b8,  PIXMAN_null,     PIXMAN_x8r8g8b8, fbCompositeSrc_8888xx888, 0 },
     { PIXMAN_OP_SRC, PIXMAN_a8b8g8r8,  PIXMAN_null,     PIXMAN_x8b8g8r8, fbCompositeSrc_8888xx888, 0 },
     { PIXMAN_OP_SRC, PIXMAN_x8b8g8r8,  PIXMAN_null,     PIXMAN_x8b8g8r8, fbCompositeSrc_8888xx888, 0 },
+#if 0
+    /* FIXME */
+    { PIXMAN_OP_SRC, PIXMAN_a8r8g8b8,  PIXMAN_null,	PIXMAN_a8r8g8b8, fbCompositeSrcSrc_nxn, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_a8b8g8r8,  PIXMAN_null,	PIXMAN_a8b8g8r8, fbCompositeSrcSrc_nxn, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_x8r8g8b8,  PIXMAN_null,	PIXMAN_x8r8g8b8, fbCompositeSrcSrc_nxn, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_x8b8g8r8,  PIXMAN_null,	PIXMAN_x8b8g8r8, fbCompositeSrcSrc_nxn, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_r5g6b5,    PIXMAN_null,     PIXMAN_r5g6b5,   fbCompositeSrcSrc_nxn, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_b5g6r5,    PIXMAN_null,     PIXMAN_b5g6r5,   fbCompositeSrcSrc_nxn, 0 },
+#endif
     { PIXMAN_OP_IN,  PIXMAN_a8,        PIXMAN_null,     PIXMAN_a8,       fbCompositeSrcIn_8x8,   0 },
     { PIXMAN_OP_IN,  PIXMAN_solid,     PIXMAN_a8,	PIXMAN_a8,	 fbCompositeSolidMaskIn_nx8x8, 0 },
     { PIXMAN_OP_NONE },
commit a916c69cc6a02cf35e6aa26181581faf560b6e9d
Author: Søren Sandmann <sandmann at redhat.com>
Date:   Sat Dec 1 20:46:29 2007 -0500

    Delete switch of doom.

diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c
index 9f03656..1341148 100644
--- a/pixman/pixman-pict.c
+++ b/pixman/pixman-pict.c
@@ -1712,572 +1712,6 @@ pixman_image_composite (pixman_op_t      op,
 	}
     }
     
-#if 0
-    switch (op) {
-    case PIXMAN_OP_OVER:
-	if (pMask)
-	{
-	    if (can_get_solid(pSrc) &&
-		!maskRepeat)
-	    {
-		if (pSrc->type == SOLID || PIXMAN_FORMAT_COLOR(pSrc->bits.format)) {
-		    switch (pMask->bits.format) {
-		    case PIXMAN_a8:
-			switch (pDst->bits.format) {
-			case PIXMAN_r5g6b5:
-			case PIXMAN_b5g6r5:
-#ifdef USE_MMX
-			    if (pixman_have_mmx())
-				func = fbCompositeSolidMask_nx8x0565mmx;
-			    else
-#endif
-				func = fbCompositeSolidMask_nx8x0565;
-			    break;
-			case PIXMAN_r8g8b8:
-			case PIXMAN_b8g8r8:
-			    func = fbCompositeSolidMask_nx8x0888;
-			    break;
-			case PIXMAN_a8r8g8b8:
-			case PIXMAN_x8r8g8b8:
-			case PIXMAN_a8b8g8r8:
-			case PIXMAN_x8b8g8r8:
-#ifdef USE_MMX
-			    if (pixman_have_mmx())
-				func = fbCompositeSolidMask_nx8x8888mmx;
-			    else
-#endif
-				func = fbCompositeSolidMask_nx8x8888;
-			    break;
-			default:
-			    break;
-			}
-			break;
-		    case PIXMAN_a8r8g8b8:
-			if (pMask->common.component_alpha) {
-			    switch (pDst->bits.format) {
-			    case PIXMAN_a8r8g8b8:
-			    case PIXMAN_x8r8g8b8:
-#ifdef USE_MMX
-				if (pixman_have_mmx())
-				    func = fbCompositeSolidMask_nx8888x8888Cmmx;
-				else
-#endif
-				    func = fbCompositeSolidMask_nx8888x8888C;
-				break;
-			    case PIXMAN_r5g6b5:
-#ifdef USE_MMX
-				if (pixman_have_mmx())
-				    func = fbCompositeSolidMask_nx8888x0565Cmmx;
-				else
-#endif
-				    func = fbCompositeSolidMask_nx8888x0565C;
-				break;
-			    default:
-				break;
-			    }
-			}
-			break;
-		    case PIXMAN_a8b8g8r8:
-			if (pMask->common.component_alpha) {
-			    switch (pDst->bits.format) {
-			    case PIXMAN_a8b8g8r8:
-			    case PIXMAN_x8b8g8r8:
-#ifdef USE_MMX
-				if (pixman_have_mmx())
-				    func = fbCompositeSolidMask_nx8888x8888Cmmx;
-				else
-#endif
-				    func = fbCompositeSolidMask_nx8888x8888C;
-				break;
-			    case PIXMAN_b5g6r5:
-#ifdef USE_MMX
-				if (pixman_have_mmx())
-				    func = fbCompositeSolidMask_nx8888x0565Cmmx;
-				else
-#endif
-				    func = fbCompositeSolidMask_nx8888x0565C;
-				break;
-			    default:
-				break;
-			    }
-			}
-			break;
-		    case PIXMAN_a1:
-			switch (pDst->bits.format) {
-			case PIXMAN_r5g6b5:
-			case PIXMAN_b5g6r5:
-			case PIXMAN_r8g8b8:
-			case PIXMAN_b8g8r8:
-			case PIXMAN_a8r8g8b8:
-			case PIXMAN_x8r8g8b8:
-			case PIXMAN_a8b8g8r8:
-			case PIXMAN_x8b8g8r8:
-			{
-			    uint32_t src;
-
-#if 0
-			    /* FIXME */
-			    fbComposeGetSolid(pSrc, src, pDst->bits.format);
-			    if ((src & 0xff000000) == 0xff000000)
-				func = fbCompositeSolidMask_nx1xn;
-#endif
-			    break;
-			}
-			default:
-			    break;
-			}
-			break;
-		    default:
-			break;
-		    }
-		}
-		if (func)
-		    srcRepeat = FALSE;
-	    }
-	    else if (!srcRepeat) /* has mask and non-repeating source */
-	    {
-		if (pSrc->bits.bits == pMask->bits.bits &&
-		    xSrc == xMask &&
-		    ySrc == yMask &&
-		    !pMask->common.component_alpha && !maskRepeat)
-		{
-		    /* source == mask: non-premultiplied data */
-		    switch (pSrc->bits.format) {
-		    case PIXMAN_x8b8g8r8:
-			switch (pMask->bits.format) {
-			case PIXMAN_a8r8g8b8:
-			case PIXMAN_a8b8g8r8:
-			    switch (pDst->bits.format) {
-			    case PIXMAN_a8r8g8b8:
-			    case PIXMAN_x8r8g8b8:
-#ifdef USE_MMX
-				if (pixman_have_mmx())
-				    func = fbCompositeSrc_8888RevNPx8888mmx;
-#endif
-				break;
-			    case PIXMAN_r5g6b5:
-#ifdef USE_MMX
-				if (pixman_have_mmx())
-				    func = fbCompositeSrc_8888RevNPx0565mmx;
-#endif
-				break;
-			    default:
-				break;
-			    }
-			    break;
-			default:
-			    break;
-			}
-			break;
-		    case PIXMAN_x8r8g8b8:
-			switch (pMask->bits.format) {
-			case PIXMAN_a8r8g8b8:
-			case PIXMAN_a8b8g8r8:
-			    switch (pDst->bits.format) {
-			    case PIXMAN_a8b8g8r8:
-			    case PIXMAN_x8b8g8r8:
-#ifdef USE_MMX
-				if (pixman_have_mmx())
-				    func = fbCompositeSrc_8888RevNPx8888mmx;
-#endif
-				break;
-			    case PIXMAN_r5g6b5:
-#ifdef USE_MMX
-				if (pixman_have_mmx())
-				    func = fbCompositeSrc_8888RevNPx0565mmx;
-#endif
-				break;
-			    default:
-				break;
-			    }
-			    break;
-			default:
-			    break;
-			}
-			break;
-		    default:
-			break;
-		    }
-		    break;
-		}
-		else if (maskRepeat &&
-			 pMask->bits.width == 1 &&
-			 pMask->bits.height == 1)
-		{
-		    switch (pSrc->bits.format) {
-#ifdef USE_MMX
-		    case PIXMAN_x8r8g8b8:
-			if ((pDst->bits.format == PIXMAN_a8r8g8b8 ||
-			     pDst->bits.format == PIXMAN_x8r8g8b8) &&
-			    pMask->bits.format == PIXMAN_a8 && pixman_have_mmx())
-			    func = fbCompositeSrc_x888xnx8888mmx;
-			break;
-		    case PIXMAN_x8b8g8r8:
-			if ((pDst->bits.format == PIXMAN_a8b8g8r8 ||
-			     pDst->bits.format == PIXMAN_x8b8g8r8) &&
-			    pMask->bits.format == PIXMAN_a8 && pixman_have_mmx())
-			    func = fbCompositeSrc_x888xnx8888mmx;
-			break;
-		    case PIXMAN_a8r8g8b8:
-			if ((pDst->bits.format == PIXMAN_a8r8g8b8 ||
-			     pDst->bits.format == PIXMAN_x8r8g8b8) &&
-			    pMask->bits.format == PIXMAN_a8 && pixman_have_mmx())
-			    func = fbCompositeSrc_8888x8x8888mmx;
-			break;
-		    case PIXMAN_a8b8g8r8:
-			if ((pDst->bits.format == PIXMAN_a8b8g8r8 ||
-			     pDst->bits.format == PIXMAN_x8b8g8r8) &&
-			    pMask->bits.format == PIXMAN_a8 && pixman_have_mmx())
-			    func = fbCompositeSrc_8888x8x8888mmx;
-			break;
-#endif
-		    default:
-			break;
-		    }
-
-		    if (func)
-			maskRepeat = FALSE;
-		}
-		else
-		{
-#if 0
-		    /* FIXME: This code is commented out since it's apparently not
-		     * actually faster than the generic code.
-		     */
-		    if (pMask->bits.format == PIXMAN_a8)
-		    {
-			if ((pSrc->bits.format == PIXMAN_x8r8g8b8 &&
-			     (pDst->bits.format == PIXMAN_x8r8g8b8 ||
-			      pDst->bits.format == PIXMAN_a8r8g8b8))  ||
-			    (pSrc->bits.format == PIXMAN_x8b8g8r8 &&
-			     (pDst->bits.format == PIXMAN_x8b8g8r8 ||
-			      pDst->bits.format == PIXMAN_a8b8g8r8)))
-			{
-#ifdef USE_MMX
-			    if (pixman_have_mmx())
-				func = fbCompositeOver_x888x8x8888mmx;
-			    else
-#endif
-				func = fbCompositeOver_x888x8x8888;
-			}
-		    }
-#endif
-		}
-	    }
-	}
-	else /* no mask */
-	{
-	    if (can_get_solid(pSrc))
-	    {
-		/* no mask and repeating source */
-		if (pSrc->type == SOLID || pSrc->bits.format == PIXMAN_a8r8g8b8)
-		{
-		    switch (pDst->bits.format) {
-		    case PIXMAN_a8r8g8b8:
-		    case PIXMAN_x8r8g8b8:
-#ifdef USE_MMX
-			if (pixman_have_mmx())
-			{
-			    srcRepeat = FALSE;
-			    func = fbCompositeSolid_nx8888mmx;
-			}
-#endif
-			break;
-		    case PIXMAN_r5g6b5:
-#ifdef USE_MMX
-			if (pixman_have_mmx())
-			{
-			    srcRepeat = FALSE;
-			    func = fbCompositeSolid_nx0565mmx;
-			}
-#endif
-			break;
-		    default:
-			break;
-		    }
-		    break;
-		}
-	    }
-	    else if (! srcRepeat)
-	    {
-		/*
-		 * Formats without alpha bits are just Copy with Over
-		 */
-		if (pSrc->bits.format == pDst->bits.format && !PIXMAN_FORMAT_A(pSrc->bits.format))
-		{
-#ifdef USE_MMX
-		    if (pixman_have_mmx() &&
-			(pSrc->bits.format == PIXMAN_x8r8g8b8 || pSrc->bits.format == PIXMAN_x8b8g8r8))
-			func = fbCompositeCopyAreammx;
-		    else
-#endif
-			;
-		}
-		else switch (pSrc->bits.format) {
-		case PIXMAN_a8r8g8b8:
-		    switch (pDst->bits.format) {
-		    case PIXMAN_a8r8g8b8:
-		    case PIXMAN_x8r8g8b8:
-#ifdef USE_MMX
-			if (pixman_have_mmx())
-			    func = fbCompositeSrc_8888x8888mmx;
-			else
-#endif
-			    func = fbCompositeSrc_8888x8888;
-			break;
-		    case PIXMAN_r8g8b8:
-			func = fbCompositeSrc_8888x0888;
-			break;
-		    case PIXMAN_r5g6b5:
-#ifdef USE_MMX
-			if (pixman_have_mmx())
-			    func = fbCompositeSrc_8888x0565mmx;
-			else
-#endif
-			    func = fbCompositeSrc_8888x0565;
-			break;
-		    default:
-			break;
-		    }
-		    break;
-		case PIXMAN_x8r8g8b8:
-		    switch (pDst->bits.format) {
-		    case PIXMAN_x8r8g8b8:
-#ifdef USE_MMX
-			if (pixman_have_mmx())
-			    func = fbCompositeCopyAreammx;
-#endif
-			break;
-		    default:
-			break;
-		    }
-		case PIXMAN_x8b8g8r8:
-		    switch (pDst->bits.format) {
-		    case PIXMAN_x8b8g8r8:
-#ifdef USE_MMX
-			if (pixman_have_mmx())
-			    func = fbCompositeCopyAreammx;
-#endif
-			break;
-		    default:
-			break;
-		    }
-		    break;
-		case PIXMAN_a8b8g8r8:
-		    switch (pDst->bits.format) {
-		    case PIXMAN_a8b8g8r8:
-		    case PIXMAN_x8b8g8r8:
-#ifdef USE_MMX
-			if (pixman_have_mmx())
-			    func = fbCompositeSrc_8888x8888mmx;
-			else
-#endif
-			    func = fbCompositeSrc_8888x8888;
-			break;
-		    case PIXMAN_b8g8r8:
-			func = fbCompositeSrc_8888x0888;
-			break;
-		    case PIXMAN_b5g6r5:
-#ifdef USE_MMX
-			if (pixman_have_mmx())
-			    func = fbCompositeSrc_8888x0565mmx;
-			else
-#endif
-			    func = fbCompositeSrc_8888x0565;
-			break;
-		    default:
-			break;
-		    }
-		    break;
-		default:
-		    break;
-		}
-	    }
-	}
-	break;
-    case PIXMAN_OP_ADD:
-	if (pMask == 0)
-	{
-	    switch (pSrc->bits.format) {
-	    case PIXMAN_a8r8g8b8:
-		switch (pDst->bits.format) {
-		case PIXMAN_a8r8g8b8:
-#ifdef USE_MMX
-		    if (pixman_have_mmx())
-			func = fbCompositeSrcAdd_8888x8888mmx;
-		    else
-#endif
-			func = fbCompositeSrcAdd_8888x8888;
-		    break;
-		default:
-		    break;
-		}
-		break;
-	    case PIXMAN_a8b8g8r8:
-		switch (pDst->bits.format) {
-		case PIXMAN_a8b8g8r8:
-#ifdef USE_MMX
-		    if (pixman_have_mmx())
-			func = fbCompositeSrcAdd_8888x8888mmx;
-		    else
-#endif
-			func = fbCompositeSrcAdd_8888x8888;
-		    break;
-		default:
-		    break;
-		}
-		break;
-	    case PIXMAN_a8:
-		switch (pDst->bits.format) {
-		case PIXMAN_a8:
-#ifdef USE_MMX
-		    if (pixman_have_mmx())
-			func = fbCompositeSrcAdd_8000x8000mmx;
-		    else
-#endif
-			func = fbCompositeSrcAdd_8000x8000;
-		    break;
-		default:
-		    break;
-		}
-		break;
-	    case PIXMAN_a1:
-		switch (pDst->bits.format) {
-		case PIXMAN_a1:
-#if 0
-		    /* FIXME */
-		    func = fbCompositeSrcAdd_1000x1000;
-#endif
-		    break;
-		default:
-		    break;
-		}
-		break;
-	    default:
-		break;
-	    }
-	}
-	else
-	{
-	    if (can_get_solid (pSrc)		&&
-		pMask->bits.format == PIXMAN_a8	&&
-		pDst->bits.format == PIXMAN_a8)
-	    {
-		srcRepeat = FALSE;
-#ifdef USE_MMX
-		if (pixman_have_mmx())
-		    func = fbCompositeSrcAdd_8888x8x8mmx;
-		else
-#endif
-		    func = fbCompositeSrcAdd_8888x8x8;
-	    }
-	}
-	break;
-    case PIXMAN_OP_SRC:
-	if (pMask)
-	{
-#ifdef USE_MMX
-	    if (can_get_solid (pSrc))
-	    {
-		if (pMask->bits.format == PIXMAN_a8)
-		{
-		    switch (pDst->bits.format)
-		    {
-		    case PIXMAN_a8r8g8b8:
-		    case PIXMAN_x8r8g8b8:
-		    case PIXMAN_a8b8g8r8:
-		    case PIXMAN_x8b8g8r8:
-			if (pixman_have_mmx())
-			{
-			    srcRepeat = FALSE;
-			    func = fbCompositeSolidMaskSrc_nx8x8888mmx;
-			}
-			break;
-		    default:
-			break;
-		    }
-		}
-	    }
-#endif
-	}
-	else
-	{
-	    if (can_get_solid (pSrc))
-	    {
-		switch (pDst->bits.format)
-		{
-		case PIXMAN_a8r8g8b8:
-		case PIXMAN_x8r8g8b8:
-		case PIXMAN_a8b8g8r8:
-		case PIXMAN_x8b8g8r8:
-		case PIXMAN_a8:
-		case PIXMAN_r5g6b5:
-		    func = fbCompositeSolidFill;
-		    srcRepeat = FALSE;
-		    break;
-		default:
-		    break;
-		}
-	    }
-	    else if (pSrc->bits.format == pDst->bits.format)
-	    {
-#ifdef USE_MMX
-		if (pSrc->bits.bits != pDst->bits.bits && pixman_have_mmx() &&
-		    (PIXMAN_FORMAT_BPP (pSrc->bits.format) == 16 ||
-		     PIXMAN_FORMAT_BPP (pSrc->bits.format) == 32))
-		    func = fbCompositeCopyAreammx;
-		else
-#endif
-		    /* FIXME */
-#if 0
-		    func = fbCompositeSrcSrc_nxn
-#endif
-			;
-	    }
-	    else if (((pSrc->bits.format == PIXMAN_a8r8g8b8 ||
-		       pSrc->bits.format == PIXMAN_x8r8g8b8) &&
-		      pDst->bits.format == PIXMAN_x8r8g8b8)	||
-		     ((pSrc->bits.format == PIXMAN_a8b8g8r8 ||
-		       pSrc->bits.format == PIXMAN_x8b8g8r8) &&
-		      pDst->bits.format == PIXMAN_x8b8g8r8))
-	    {
-		func = fbCompositeSrc_8888xx888;
-	    }
-	}
-	break;
-	/*-=-*/
-    case PIXMAN_OP_IN:
-	if (pSrc->bits.format == PIXMAN_a8 &&
-	    pDst->bits.format == PIXMAN_a8 &&
-	    !pMask)
-	{
-#ifdef USE_MMX
-	    if (pixman_have_mmx())
-		func = fbCompositeIn_8x8mmx;
-	    else
-#endif
-		func = fbCompositeSrcIn_8x8;
-	}
-	else if (srcRepeat && pMask && !pMask->common.component_alpha &&
-		 (pSrc->bits.format == PIXMAN_a8r8g8b8 ||
-		  pSrc->bits.format == PIXMAN_a8b8g8r8)   &&
-		 (pMask->bits.format == PIXMAN_a8)        &&
-		 pDst->bits.format == PIXMAN_a8)
-	{
-#ifdef USE_MMX
-	    if (pixman_have_mmx())
-		func = fbCompositeIn_nx8x8mmx;
-	    else
-#endif
-		func = fbCompositeSolidMaskIn_nx8x8;
-	    srcRepeat = FALSE;
-	}
-       break;
-    default:
-	break;
-    }
-#endif
-
     if ((srcRepeat			&&
 	 pSrc->bits.width == 1		&&
 	 pSrc->bits.height == 1)	||
@@ -2296,7 +1730,8 @@ pixman_image_composite (pixman_op_t      op,
 	func = NULL;
     }
 
-    if (!func) {
+    if (!func)
+    {
 	func = pixman_image_composite_rect;
 
 	/* CompositeGeneral optimizes 1x1 repeating images itself */
commit 4dcddfa6e9d4de4f4e08fd8e8879db5327b8bf2a
Author: Søren Sandmann <sandmann at redhat.com>
Date:   Sat Dec 1 20:41:49 2007 -0500

    Check for correct op.

diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c
index 87c63d8..9f03656 100644
--- a/pixman/pixman-pict.c
+++ b/pixman/pixman-pict.c
@@ -1577,6 +1577,9 @@ get_fast_path (const FastPathInfo *fast_paths,
 	pixman_bool_t valid_src		= FALSE;
 	pixman_bool_t valid_mask	= FALSE;
 
+	if (info->op != op)
+	    continue;
+
 	if ((info->src_format == PIXMAN_solid && can_get_solid (pSrc))		||
 	    (pSrc->type == BITS && info->src_format == pSrc->bits.format))
 	{
commit 60134ed7ab638b244dc4f3007d56d794815dab7b
Author: Søren Sandmann <sandmann at redhat.com>
Date:   Sat Dec 1 20:35:03 2007 -0500

    Add code to locate fast paths. Comment out switch of doom.

diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c
index 87c2299..87c63d8 100644
--- a/pixman/pixman-pict.c
+++ b/pixman/pixman-pict.c
@@ -1392,7 +1392,7 @@ pixman_image_composite_rect  (pixman_op_t                   op,
 #define PIXMAN_solid		PIXMAN_FORMAT(0,1,0,0,0,0)
 
 #define NEED_COMPONENT_ALPHA		(1 << 0)
-#define NEED_NON_PREMUL			(1 << 1)
+#define NEED_PIXBUF			(1 << 1)
 #define NEED_SOLID_MASK		        (1 << 2)
 #define NEED_SAME_SRC_DST_FORMAT        (1 << 3)
 
@@ -1420,30 +1420,30 @@ const FastPathInfo mmx_fast_paths[] =
     { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx8888x8888Cmmx, NEED_COMPONENT_ALPHA },
     { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx8888x8888Cmmx, NEED_COMPONENT_ALPHA },
     { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8b8g8r8, PIXMAN_b5g6r5,   fbCompositeSolidMask_nx8888x0565Cmmx, NEED_COMPONENT_ALPHA },
-    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
-    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF },
     { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_a8r8g8b8, fbCompositeSrc_x888xnx8888mmx,    NEED_SOLID_MASK },
     { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_x8r8g8b8, fbCompositeSrc_x888xnx8888mmx,	   NEED_SOLID_MASK },
     { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8,	PIXMAN_a8b8g8r8, fbCompositeSrc_x888xnx8888mmx,	   NEED_SOLID_MASK },
@@ -1488,6 +1488,7 @@ const FastPathInfo mmx_fast_paths[] =
     { PIXMAN_OP_SRC, PIXMAN_b5g6r5,    PIXMAN_null,     PIXMAN_b5g6r5,   fbCompositeCopyAreammx, 0 },
     { PIXMAN_OP_IN,  PIXMAN_a8,        PIXMAN_null,     PIXMAN_a8,       fbCompositeIn_8x8mmx,   0 },
     { PIXMAN_OP_IN,  PIXMAN_solid,     PIXMAN_a8,	PIXMAN_a8,	 fbCompositeIn_nx8x8mmx, 0 },
+    { PIXMAN_OP_NONE },
 };
 
 const FastPathInfo c_fast_paths[] =
@@ -1541,8 +1542,83 @@ const FastPathInfo c_fast_paths[] =
     { PIXMAN_OP_SRC, PIXMAN_x8b8g8r8,  PIXMAN_null,     PIXMAN_x8b8g8r8, fbCompositeSrc_8888xx888, 0 },
     { PIXMAN_OP_IN,  PIXMAN_a8,        PIXMAN_null,     PIXMAN_a8,       fbCompositeSrcIn_8x8,   0 },
     { PIXMAN_OP_IN,  PIXMAN_solid,     PIXMAN_a8,	PIXMAN_a8,	 fbCompositeSolidMaskIn_nx8x8, 0 },
+    { PIXMAN_OP_NONE },
 };
 
+static pixman_bool_t
+mask_is_solid (pixman_image_t *mask)
+{
+    if (mask->type == SOLID)
+	return TRUE;
+
+    if (mask->type == BITS &&
+	mask->common.repeat == PIXMAN_REPEAT_NORMAL &&
+	mask->bits.width == 1 &&
+	mask->bits.height == 1)
+    {
+	return TRUE;
+    }
+
+    return FALSE;
+}
+
+static const FastPathInfo *
+get_fast_path (const FastPathInfo *fast_paths,
+	       pixman_op_t   op,
+	       pixman_image_t *pSrc,
+	       pixman_image_t *pMask,
+	       pixman_image_t *pDst,
+	       pixman_bool_t   pixbuf)
+{
+    const FastPathInfo *info;
+
+    for (info = fast_paths; info->op != PIXMAN_OP_NONE; info++)
+    {
+	pixman_bool_t valid_src		= FALSE;
+	pixman_bool_t valid_mask	= FALSE;
+
+	if ((info->src_format == PIXMAN_solid && can_get_solid (pSrc))		||
+	    (pSrc->type == BITS && info->src_format == pSrc->bits.format))
+	{
+	    valid_src = TRUE;
+	}
+
+	if (!valid_src)
+	    continue;
+
+	if ((info->mask_format == PIXMAN_null && !pMask)			||
+	    (pMask && pMask->type == BITS && info->mask_format == pMask->bits.format))
+	{
+	    valid_mask = TRUE;
+
+	    if (info->flags & NEED_SOLID_MASK)
+	    {
+		if (!pMask || !mask_is_solid (pMask))
+		    valid_mask = FALSE;
+	    }
+
+	    if (info->flags & NEED_COMPONENT_ALPHA)
+	    {
+		if (!pMask || !pMask->common.component_alpha)
+		    valid_mask = FALSE;
+	    }
+	}
+
+	if (!valid_mask)
+	    continue;
+	
+	if (info->dest_format != pDst->bits.format)
+	    continue;
+
+	if ((info->flags & NEED_PIXBUF) && !pixbuf)
+	    continue;
+
+	return info;
+    }
+
+    return NULL;
+}
+
 void
 pixman_image_composite (pixman_op_t      op,
 			pixman_image_t * pSrc,
@@ -1604,6 +1680,36 @@ pixman_image_composite (pixman_op_t      op,
 	&& !pSrc->common.read_func && !pSrc->common.write_func
 	&& !(pMask && pMask->common.read_func) && !(pMask && pMask->common.write_func)
 	&& !pDst->common.read_func && !pDst->common.write_func)
+    {
+	const FastPathInfo *info;
+	pixman_bool_t pixbuf;
+
+	pixbuf =
+	    pSrc && pSrc->type == BITS		&&
+	    pMask && pMask->type == BITS	&&
+	    pSrc->bits.bits == pMask->bits.bits &&
+	    xSrc == xMask			&&
+	    ySrc == yMask			&&
+	    !pMask->common.component_alpha	&&
+	    !maskRepeat;
+
+	info = get_fast_path (mmx_fast_paths, op, pSrc, pMask, pDst, pixbuf);
+	if (!info)
+	    info = get_fast_path (c_fast_paths, op, pSrc, pMask, pDst, pixbuf);
+
+	if (info)
+	{
+	    func = info->func;
+
+	    if (info->src_format == PIXMAN_solid)
+		srcRepeat = FALSE;
+
+	    if (info->mask_format == PIXMAN_solid)
+		maskRepeat = FALSE;
+	}
+    }
+    
+#if 0
     switch (op) {
     case PIXMAN_OP_OVER:
 	if (pMask)
@@ -2167,6 +2273,7 @@ pixman_image_composite (pixman_op_t      op,
     default:
 	break;
     }
+#endif
 
     if ((srcRepeat			&&
 	 pSrc->bits.width == 1		&&
diff --git a/pixman/pixman.h b/pixman/pixman.h
index 3b9601c..2f22525 100644
--- a/pixman/pixman.h
+++ b/pixman/pixman.h
@@ -221,7 +221,9 @@ typedef enum
     PIXMAN_OP_CONJOINT_OUT_REVERSE	= 0x28,
     PIXMAN_OP_CONJOINT_ATOP		= 0x29,
     PIXMAN_OP_CONJOINT_ATOP_REVERSE	= 0x2a,
-    PIXMAN_OP_CONJOINT_XOR		= 0x2b
+    PIXMAN_OP_CONJOINT_XOR		= 0x2b,
+
+    PIXMAN_OP_NONE
 } pixman_op_t;
 
 /*
commit 819a6d6878d57d3b55075f048a7eed6d5bcab694
Author: Søren Sandmann <sandmann at redhat.com>
Date:   Sat Dec 1 19:56:26 2007 -0500

    Beginning of the end for the Switch of Doom.
    
    Add tables with information about the MMX and plain-C fast paths.
    Update TODO.

diff --git a/TODO b/TODO
index 6649c69..fc457af 100644
--- a/TODO
+++ b/TODO
@@ -1,3 +1,12 @@
+  - Add a general way of dealing with architecture specific
+    fast-paths.  The current idea is to have each operation that can
+    be optimized is called through a function pointer that is
+    initially set to an initialization function that is responsible for
+    setting the function pointer to the appropriate fast-path.
+
+  - Get rid of the switch-of-doom; replace it with a big table
+    describing the various fast paths.
+
   - Go through things marked FIXME
 
   - Add calls to prepare and finish access where necessary.  grep for
@@ -26,11 +35,6 @@
     ABI, but should otherwise be mostly harmless, though a
     pixman_region_get_boxes16() may be useful.
 
-  - Make source clipping optional.
-      - done: source clipping happens through an indirection.
-	still needs to make the indirection settable. (And call it
-        from X)
-
   - Consider optimizing the 8/16 bit solid fills in pixman-util.c by
     storing more than one value at a time.
 
@@ -78,11 +82,23 @@
     It may make sense to have a PIXMAN_TYPE_YUV, and then use the
     channel bits to specify the exact subtype.
 
-    What about color spaces such a linear vs. srGB etc.?
+    Another possibility is to add 
 
+      	  PIXMAN_TYPE_ARGB_W
+	  PIXMAN_TYPE_ARGB_WW
+    
+    where the channel widths would get 16 and 32 added to them,
+    respectively.
+
+    What about color spaces such a linear vs. srGB etc.?
 
 done:
 
+- Make source clipping optional.
+    - done: source clipping happens through an indirection.
+        still needs to make the indirection settable. (And call it
+        from X)
+
 - Run cairo test suite; fix bugs
 	- one bug in source-scale-clip
 
diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c
index f923d4b..87c2299 100644
--- a/pixman/pixman-pict.c
+++ b/pixman/pixman-pict.c
@@ -1387,6 +1387,161 @@ pixman_image_composite_rect  (pixman_op_t                   op,
 	free (scanline_buffer);
 }
 
+/* These "formats" all have depth 0, so they will never clash with any real ones */
+#define PIXMAN_null		PIXMAN_FORMAT(0,0,0,0,0,0)
+#define PIXMAN_solid		PIXMAN_FORMAT(0,1,0,0,0,0)
+
+#define NEED_COMPONENT_ALPHA		(1 << 0)
+#define NEED_NON_PREMUL			(1 << 1)
+#define NEED_SOLID_MASK		        (1 << 2)
+#define NEED_SAME_SRC_DST_FORMAT        (1 << 3)
+
+typedef struct
+{
+    pixman_op_t			op;
+    pixman_format_code_t	src_format;
+    pixman_format_code_t	mask_format;
+    pixman_format_code_t	dest_format;
+    CompositeFunc		func;
+    uint32_t			flags;
+} FastPathInfo;
+
+const FastPathInfo mmx_fast_paths[] =
+{
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_r5g6b5,   fbCompositeSolidMask_nx8x0565mmx,     0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_b5g6r5,   fbCompositeSolidMask_nx8x0565mmx,     0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_a8r8g8b8, fbCompositeSolidMask_nx8x8888mmx,     0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_x8r8g8b8, fbCompositeSolidMask_nx8x8888mmx,     0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx8x8888mmx,     0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx8x8888mmx,     0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSolidMask_nx8888x8888Cmmx, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSolidMask_nx8888x8888Cmmx, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8r8g8b8, PIXMAN_r5g6b5,   fbCompositeSolidMask_nx8888x0565Cmmx, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx8888x8888Cmmx, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx8888x8888Cmmx, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8b8g8r8, PIXMAN_b5g6r5,   fbCompositeSolidMask_nx8888x0565Cmmx, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_r5g6b5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_b5g6r5,   fbCompositeSrc_8888RevNPx0565mmx, NEED_NON_PREMUL },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_a8r8g8b8, fbCompositeSrc_x888xnx8888mmx,    NEED_SOLID_MASK },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,       PIXMAN_x8r8g8b8, fbCompositeSrc_x888xnx8888mmx,	   NEED_SOLID_MASK },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8,	PIXMAN_a8b8g8r8, fbCompositeSrc_x888xnx8888mmx,	   NEED_SOLID_MASK },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8,	PIXMAN_x8b8g8r8, fbCompositeSrc_x888xnx8888mmx,	   NEED_SOLID_MASK },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8,       PIXMAN_a8r8g8b8, fbCompositeSrc_8888x8x8888mmx,    NEED_SOLID_MASK },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8,       PIXMAN_x8r8g8b8, fbCompositeSrc_8888x8x8888mmx,	   NEED_SOLID_MASK },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8,	PIXMAN_a8b8g8r8, fbCompositeSrc_8888x8x8888mmx,	   NEED_SOLID_MASK },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8,	PIXMAN_x8b8g8r8, fbCompositeSrc_8888x8x8888mmx,	   NEED_SOLID_MASK },
+#if 0
+    /* FIXME: This code is commented out since it's apparently not actually faster than the generic code. */
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,	PIXMAN_x8r8g8b8, fbCompositeOver_x888x8x8888mmx,   0 },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,	PIXMAN_a8r8g8b8, fbCompositeOver_x888x8x8888mmx,   0 },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8r8g8, PIXMAN_a8,	PIXMAN_x8b8g8r8, fbCompositeOver_x888x8x8888mmx,   0 },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8r8g8, PIXMAN_a8,	PIXMAN_a8r8g8b8, fbCompositeOver_x888x8x8888mmx,   0 },
+#endif
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_null,	PIXMAN_a8r8g8b8, fbCompositeSolid_nx8888mmx,        0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_null,     PIXMAN_x8r8g8b8, fbCompositeSolid_nx8888mmx,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_null,     PIXMAN_r5g6b5,   fbCompositeSolid_nx0565mmx,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_null,     PIXMAN_x8r8g8b8, fbCompositeCopyAreammx,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_null,     PIXMAN_x8b8g8r8, fbCompositeCopyAreammx,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null,     PIXMAN_a8r8g8b8, fbCompositeSrc_8888x8888mmx,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null,	PIXMAN_x8r8g8b8, fbCompositeSrc_8888x8888mmx,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null,	PIXMAN_r5g6b5,	 fbCompositeSrc_8888x0565mmx,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null,	PIXMAN_a8b8g8r8, fbCompositeSrc_8888x8888mmx,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null,	PIXMAN_x8b8g8r8, fbCompositeSrc_8888x8888mmx,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null,     PIXMAN_b5g6r5,   fbCompositeSrc_8888x0565mmx,	   0 },
+
+    { PIXMAN_OP_ADD, PIXMAN_a8r8g8b8,  PIXMAN_null,	PIXMAN_a8r8g8b8, fbCompositeSrcAdd_8888x8888mmx,   0 },
+    { PIXMAN_OP_ADD, PIXMAN_a8b8g8r8,  PIXMAN_null,	PIXMAN_a8b8g8r8, fbCompositeSrcAdd_8888x8888mmx,   0 },
+    { PIXMAN_OP_ADD, PIXMAN_a8,        PIXMAN_null,     PIXMAN_a8,       fbCompositeSrcAdd_8000x8000mmx,   0 },
+    { PIXMAN_OP_ADD, PIXMAN_solid,     PIXMAN_a8,       PIXMAN_a8,       fbCompositeSrcAdd_8888x8x8mmx,    0 },
+    { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_a8,       PIXMAN_a8r8g8b8, fbCompositeSolidMaskSrc_nx8x8888mmx, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_a8,       PIXMAN_x8r8g8b8, fbCompositeSolidMaskSrc_nx8x8888mmx, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_a8,       PIXMAN_a8b8g8r8, fbCompositeSolidMaskSrc_nx8x8888mmx, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_a8,       PIXMAN_x8b8g8r8, fbCompositeSolidMaskSrc_nx8x8888mmx, 0 },
+
+    { PIXMAN_OP_SRC, PIXMAN_a8r8g8b8,  PIXMAN_null,	PIXMAN_a8r8g8b8, fbCompositeCopyAreammx, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_a8b8g8r8,  PIXMAN_null,	PIXMAN_a8b8g8r8, fbCompositeCopyAreammx, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_x8r8g8b8,  PIXMAN_null,	PIXMAN_x8r8g8b8, fbCompositeCopyAreammx, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_x8b8g8r8,  PIXMAN_null,	PIXMAN_x8b8g8r8, fbCompositeCopyAreammx, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_r5g6b5,    PIXMAN_null,     PIXMAN_r5g6b5,   fbCompositeCopyAreammx, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_b5g6r5,    PIXMAN_null,     PIXMAN_b5g6r5,   fbCompositeCopyAreammx, 0 },
+    { PIXMAN_OP_IN,  PIXMAN_a8,        PIXMAN_null,     PIXMAN_a8,       fbCompositeIn_8x8mmx,   0 },
+    { PIXMAN_OP_IN,  PIXMAN_solid,     PIXMAN_a8,	PIXMAN_a8,	 fbCompositeIn_nx8x8mmx, 0 },
+};
+
+const FastPathInfo c_fast_paths[] =
+{
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_r5g6b5,   fbCompositeSolidMask_nx8x0565, 0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_b5g6r5,   fbCompositeSolidMask_nx8x0565, 0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_r8g8b8,   fbCompositeSolidMask_nx8x0888, 0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_b8g8r8,   fbCompositeSolidMask_nx8x0888, 0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_a8r8g8b8, fbCompositeSolidMask_nx8x8888, 0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_x8r8g8b8, fbCompositeSolidMask_nx8x8888, 0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx8x8888, 0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8,       PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx8x8888, 0 },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSolidMask_nx8888x8888C, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSolidMask_nx8888x8888C, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8r8g8b8, PIXMAN_r5g6b5,   fbCompositeSolidMask_nx8888x0565C, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx8888x8888C, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx8888x8888C, NEED_COMPONENT_ALPHA },
+    { PIXMAN_OP_OVER, PIXMAN_solid,    PIXMAN_a8b8g8r8, PIXMAN_b5g6r5,   fbCompositeSolidMask_nx8888x0565C, NEED_COMPONENT_ALPHA },
+#if 0
+    /* FIXME: This code is commented out since it's apparently not actually faster than the generic code */
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,	PIXMAN_x8r8g8b8, fbCompositeOver_x888x8x8888,       0 },
+    { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8,	PIXMAN_a8r8g8b8, fbCompositeOver_x888x8x8888,       0 },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8r8g8, PIXMAN_a8,	PIXMAN_x8b8g8r8, fbCompositeOver_x888x8x8888,       0 },
+    { PIXMAN_OP_OVER, PIXMAN_x8b8r8g8, PIXMAN_a8,	PIXMAN_a8r8g8b8, fbCompositeOver_x888x8x8888,       0 },
+#endif
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null,     PIXMAN_a8r8g8b8, fbCompositeSrc_8888x8888,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null,	PIXMAN_x8r8g8b8, fbCompositeSrc_8888x8888,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null,	PIXMAN_r5g6b5,	 fbCompositeSrc_8888x0565,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null,	PIXMAN_a8b8g8r8, fbCompositeSrc_8888x8888,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null,	PIXMAN_x8b8g8r8, fbCompositeSrc_8888x8888,	   0 },
+    { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null,     PIXMAN_b5g6r5,   fbCompositeSrc_8888x0565,	   0 },
+    
+    { PIXMAN_OP_ADD, PIXMAN_a8r8g8b8,  PIXMAN_null,	PIXMAN_a8r8g8b8, fbCompositeSrcAdd_8888x8888,   0 },
+    { PIXMAN_OP_ADD, PIXMAN_a8b8g8r8,  PIXMAN_null,	PIXMAN_a8b8g8r8, fbCompositeSrcAdd_8888x8888,   0 },
+    { PIXMAN_OP_ADD, PIXMAN_a8,        PIXMAN_null,     PIXMAN_a8,       fbCompositeSrcAdd_8000x8000,   0 },
+#if 0
+    /* FIXME */
+    { PIXMAN_OP_ADD, PIXMAN_a1,        PIXMAN_null,     PIXMAN_a1,       fbCompositeSrcAdd_1000x1000,   0 },
+#endif
+    { PIXMAN_OP_ADD, PIXMAN_solid,     PIXMAN_a8,       PIXMAN_a8,       fbCompositeSrcAdd_8888x8x8,    0 },
+    
+    { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_null,     PIXMAN_a8r8g8b8, fbCompositeSolidFill, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_null,     PIXMAN_x8r8g8b8, fbCompositeSolidFill, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_null,     PIXMAN_a8b8g8r8, fbCompositeSolidFill, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_null,     PIXMAN_x8b8g8r8, fbCompositeSolidFill, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_null,     PIXMAN_a8,       fbCompositeSolidFill, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_solid,     PIXMAN_null,     PIXMAN_r5g6b5,   fbCompositeSolidFill, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_a8r8g8b8,  PIXMAN_null,     PIXMAN_x8r8g8b8, fbCompositeSrc_8888xx888, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_x8r8g8b8,  PIXMAN_null,     PIXMAN_x8r8g8b8, fbCompositeSrc_8888xx888, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_a8b8g8r8,  PIXMAN_null,     PIXMAN_x8b8g8r8, fbCompositeSrc_8888xx888, 0 },
+    { PIXMAN_OP_SRC, PIXMAN_x8b8g8r8,  PIXMAN_null,     PIXMAN_x8b8g8r8, fbCompositeSrc_8888xx888, 0 },
+    { PIXMAN_OP_IN,  PIXMAN_a8,        PIXMAN_null,     PIXMAN_a8,       fbCompositeSrcIn_8x8,   0 },
+    { PIXMAN_OP_IN,  PIXMAN_solid,     PIXMAN_a8,	PIXMAN_a8,	 fbCompositeSolidMaskIn_nx8x8, 0 },
+};
 
 void
 pixman_image_composite (pixman_op_t      op,
@@ -1747,11 +1902,7 @@ pixman_image_composite (pixman_op_t      op,
 			func = fbCompositeCopyAreammx;
 		    else
 #endif
-#if 0
-		    /* FIXME */
-			func = fbCompositeSrcSrc_nxn
-#endif
-			    ;
+			;
 		}
 		else switch (pSrc->bits.format) {
 		case PIXMAN_a8r8g8b8:
@@ -1985,6 +2136,7 @@ pixman_image_composite (pixman_op_t      op,
 	    }
 	}
 	break;
+	/*-=-*/
     case PIXMAN_OP_IN:
 	if (pSrc->bits.format == PIXMAN_a8 &&
 	    pDst->bits.format == PIXMAN_a8 &&
diff --git a/pixman/pixman.h b/pixman/pixman.h
index 604e4a8..3b9601c 100644
--- a/pixman/pixman.h
+++ b/pixman/pixman.h
@@ -458,7 +458,7 @@ typedef enum {
 
 /* YUV formats */
     PIXMAN_yuy2 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_YUY2,0,0,0,0),
-    PIXMAN_yv12 =	PIXMAN_FORMAT(12,PIXMAN_TYPE_YV12,0,0,0,0)
+    PIXMAN_yv12 =	PIXMAN_FORMAT(12,PIXMAN_TYPE_YV12,0,0,0,0),
 } pixman_format_code_t;
 
 /* Constructors */


More information about the xorg-commit mailing list