xserver: Branch 'xorg-server-1.2-apple' - 8 commits

Jeremy Huddleston jeremyhu at kemper.freedesktop.org
Mon Feb 11 15:47:11 PST 2008


 configure.ac                 |   13 
 fb/Makefile.am               |   30 
 fb/fb.h                      |  166 +
 fb/fb24_32.c                 |   74 
 fb/fb24_32.h                 |    2 
 fb/fballpriv.c               |   11 
 fb/fbarc.c                   |    3 
 fb/fbbits.c                  |   18 
 fb/fbbits.h                  |   37 
 fb/fbblt.c                   |  140 -
 fb/fbbltone.c                |   98 -
 fb/fbbstore.c                |    2 
 fb/fbcmap.c                  |   91 -
 fb/fbcmap_mi.c               |  123 +
 fb/fbcompose.c               | 3676 -------------------------------------------
 fb/fbcopy.c                  |   37 
 fb/fbedge.c                  |  314 ---
 fb/fbedgeimp.h               |  143 -
 fb/fbfill.c                  |   59 
 fb/fbfillrect.c              |    2 
 fb/fbfillsp.c                |    2 
 fb/fbgc.c                    |   15 
 fb/fbgetsp.c                 |    4 
 fb/fbglyph.c                 |   18 
 fb/fbimage.c                 |    8 
 fb/fbline.c                  |    2 
 fb/fbmmx.c                   | 2314 ---------------------------
 fb/fbmmx.h                   |  220 --
 fb/fboverlay.c               |    6 
 fb/fbpict.c                  | 1793 +++-----------------
 fb/fbpict.h                  |  270 ---
 fb/fbpixmap.c                |   30 
 fb/fbpoint.c                 |    9 
 fb/fbpseudocolor.c           |    6 
 fb/fbpush.c                  |    9 
 fb/fbrop.h                   |    2 
 fb/fbscreen.c                |   71 
 fb/fbseg.c                   |   30 
 fb/fbsetsp.c                 |    3 
 fb/fbsolid.c                 |   44 
 fb/fbstipple.c               |    8 
 fb/fbtile.c                  |   18 
 fb/fbtrap.c                  |  102 -
 fb/fbutil.c                  |    2 
 fb/fbwindow.c                |   51 
 fb/wfbrename.h               |  201 ++
 hw/xquartz/Makefile.am       |    2 
 hw/xquartz/bundle/Info.plist |    2 
 render/animcur.c             |    4 
 render/filter.c              |    2 
 render/glyph.c               |   10 
 render/glyphstr.h            |    3 
 render/mipict.c              |   58 
 render/mipict.h              |    6 
 render/picture.c             |  142 -
 render/picture.h             |  174 --
 render/picturestr.h          |   66 
 render/render.c              |   12 
 render/renderedge.c          |  120 -
 render/renderedge.h          |   17 
 60 files changed, 1487 insertions(+), 9408 deletions(-)

New commits:
commit 2e7a8396b7aeaf9ffe8f72a6d2f6da61bc1c1cf4
Author: Jeremy Huddleston <jeremy at tifa.local>
Date:   Mon Feb 11 15:41:45 2008 -0800

    Versioned 1.3.0-apple10...
    also bumpd X11.app version to 2.1.4 in anticipation of the next release

diff --git a/configure.ac b/configure.ac
index 728c54a..25422f7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -28,7 +28,7 @@ dnl Process this file with autoconf to create configure.
 AC_PREREQ(2.57)
 dnl This is the not the Xorg version number, it's the server version number.
 dnl Yes, that's weird.
-AC_INIT([xorg-server], 1.3.0-apple9, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+AC_INIT([xorg-server], 1.3.0-apple10, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([dist-bzip2 foreign])
 AM_MAINTAINER_MODE
diff --git a/hw/xquartz/bundle/Info.plist b/hw/xquartz/bundle/Info.plist
index 813b52f..58c16f4 100644
--- a/hw/xquartz/bundle/Info.plist
+++ b/hw/xquartz/bundle/Info.plist
@@ -19,7 +19,7 @@
 	<key>CFBundlePackageType</key>
 		<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-		<string>2.1.3</string>
+		<string>2.1.4</string>
 	<key>CFBundleSignature</key>
 		<string>x11a</string>
 	<key>CSResourcesFileMapped</key>
commit e4bfb460eaed75d4dd665004af64dbfe2160a0de
Author: Jeremy Huddleston <jeremy at tifa.local>
Date:   Mon Feb 11 15:35:53 2008 -0800

    render: Back to SECURITY_VERIFY_DRAWABLE instead of dixLookupDrawable...

diff --git a/render/render.c b/render/render.c
index daa73d3..d6170f6 100644
--- a/render/render.c
+++ b/render/render.c
@@ -620,16 +620,14 @@ ProcRenderCreatePicture (ClientPtr client)
     PicturePtr	    pPicture;
     DrawablePtr	    pDrawable;
     PictFormatPtr   pFormat;
-    int		    len, error, rc;
+    int		    len, error;
     REQUEST(xRenderCreatePictureReq);
 
     REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
 
     LEGAL_NEW_RESOURCE(stuff->pid, client);
-    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
-			   SecurityWriteAccess);
-    if (rc != Success)
-	return rc;
+    SECURITY_VERIFY_DRAWABLE(pDrawable, stuff->drawable, client,
+                             SecurityWriteAccess);
 
     pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 
 						      stuff->format,
@@ -1698,15 +1696,12 @@ ProcRenderQueryFilters (ClientPtr client)
     int				nnames;
     ScreenPtr			pScreen;
     PictureScreenPtr		ps;
-    int				i, j, len, total_bytes, rc;
+    int				i, j, len, total_bytes;
     INT16			*aliases;
     char			*names;
 
     REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
-    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
-			   SecurityReadAccess);
-    if (rc != Success)
-	return rc;
+    SECURITY_VERIFY_DRAWABLE(pDrawable, stuff->drawable, client, SecurityReadAccess);
     
     pScreen = pDrawable->pScreen;
     nbytesName = 0;
commit f0211369e6613eeb9f481c4b9dcc36396c2f22d8
Author: Jeremy Huddleston <jeremy at tifa.local>
Date:   Mon Feb 11 15:04:16 2008 -0800

    Xquartz: Switched to using fbcmap_mi.c

diff --git a/hw/xquartz/Makefile.am b/hw/xquartz/Makefile.am
index c9749be..8948a67 100644
--- a/hw/xquartz/Makefile.am
+++ b/hw/xquartz/Makefile.am
@@ -16,7 +16,7 @@ SUBDIRS = . xpr $(X11APP_SUBDIRS)
 DIST_SUBDIRS = xpr bundle
 
 libXquartz_la_SOURCES = \
-	$(top_srcdir)/fb/fbcmap.c \
+	$(top_srcdir)/fb/fbcmap_mi.c \
 	$(top_srcdir)/mi/miinitext.c \
 	X11Application.m \
 	X11Controller.m \
commit 3cbb434e7ae2b887b143485190879ca425aa0d44
Author: Jeremy Huddleston <jeremy at tifa.local>
Date:   Mon Feb 11 15:03:29 2008 -0800

    fb: Added missing files

diff --git a/fb/fbcmap_mi.c b/fb/fbcmap_mi.c
new file mode 100644
index 0000000..58bcae3
--- /dev/null
+++ b/fb/fbcmap_mi.c
@@ -0,0 +1,123 @@
+/************************************************************
+Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
+
+                    All Rights Reserved
+
+Permission  to  use,  copy,  modify,  and  distribute   this
+software  and  its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright no-
+tice  appear  in all copies and that both that copyright no-
+tice and this permission notice appear in  supporting  docu-
+mentation,  and  that the names of Sun or X Consortium
+not be used in advertising or publicity pertaining to 
+distribution  of  the software  without specific prior 
+written permission. Sun and X Consortium make no 
+representations about the suitability of this software for 
+any purpose. It is provided "as is" without any express or 
+implied warranty.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
+PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+
+/**
+ * This version of fbcmap.c is implemented in terms of mi functions.
+ * These functions used to be in fbcmap.c and depended upon the symbol
+ * XFree86Server being defined.
+ */
+
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include "fb.h"
+#include "micmap.h"
+
+int
+fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
+{
+    return miListInstalledColormaps(pScreen, pmaps);
+}
+
+void
+fbInstallColormap(ColormapPtr pmap)
+{
+    miInstallColormap(pmap);
+}
+
+void
+fbUninstallColormap(ColormapPtr pmap)
+{
+    miUninstallColormap(pmap);
+}
+
+void
+fbResolveColor(unsigned short   *pred,
+	       unsigned short   *pgreen,
+	       unsigned short   *pblue,
+	       VisualPtr	pVisual)
+{
+    miResolveColor(pred, pgreen, pblue, pVisual);
+}
+
+Bool
+fbInitializeColormap(ColormapPtr pmap)
+{
+    return miInitializeColormap(pmap);
+}
+
+int
+fbExpandDirectColors (ColormapPtr   pmap,
+		      int	    ndef,
+		      xColorItem    *indefs,
+		      xColorItem    *outdefs)
+{
+    return miExpandDirectColors(pmap, ndef, indefs, outdefs);
+}
+
+Bool
+fbCreateDefColormap(ScreenPtr pScreen)
+{
+    return miCreateDefColormap(pScreen);
+}
+
+void
+fbClearVisualTypes(void)
+{
+    miClearVisualTypes();
+}
+
+Bool
+fbSetVisualTypes (int depth, int visuals, int bitsPerRGB)
+{
+    return miSetVisualTypes(depth, visuals, bitsPerRGB, -1);
+}
+
+/*
+ * Given a list of formats for a screen, create a list
+ * of visuals and depths for the screen which coorespond to
+ * the set which can be used with this version of fb.
+ */
+Bool
+fbInitVisuals (VisualPtr    *visualp, 
+	       DepthPtr	    *depthp,
+	       int	    *nvisualp,
+	       int	    *ndepthp,
+	       int	    *rootDepthp,
+	       VisualID	    *defaultVisp,
+	       unsigned long	sizes,
+	       int	    bitsPerRGB)
+{
+    return miInitVisuals(visualp, depthp, nvisualp, ndepthp, rootDepthp,
+			 defaultVisp, sizes, bitsPerRGB, -1);
+}
diff --git a/fb/wfbrename.h b/fb/wfbrename.h
new file mode 100644
index 0000000..5ea9092
--- /dev/null
+++ b/fb/wfbrename.h
@@ -0,0 +1,201 @@
+#define fb16Lane wfb16Lane
+#define fb24_32CopyMtoN wfb24_32CopyMtoN
+#define fb24_32CreateScreenResources wfb24_32CreateScreenResources
+#define fb24_32GetImage wfb24_32GetImage
+#define fb24_32GetSpans wfb24_32GetSpans
+#define fb24_32ModifyPixmapHeader wfb24_32ModifyPixmapHeader
+#define fb24_32PutZImage wfb24_32PutZImage
+#define fb24_32ReformatTile wfb24_32ReformatTile
+#define fb24_32SetSpans wfb24_32SetSpans
+#define fb32Lane wfb32Lane
+#define fb8Lane wfb8Lane
+#define fbAddTraps wfbAddTraps
+#define fbAddTriangles wfbAddTriangles
+#define fbAllocatePrivates wfbAllocatePrivates
+#define fbArc16 wfbArc16
+#define fbArc24 wfbArc24
+#define fbArc32 wfbArc32
+#define fbArc8 wfbArc8
+#define fbBlt wfbBlt
+#define fbBlt24 wfbBlt24
+#define fbBltOne wfbBltOne
+#define fbBltOne24 wfbBltOne24
+#define fbBltPlane wfbBltPlane
+#define fbBltStip wfbBltStip
+#define fbBres wfbBres
+#define fbBresDash wfbBresDash
+#define fbBresDash16 wfbBresDash16
+#define fbBresDash24 wfbBresDash24
+#define fbBresDash32 wfbBresDash32
+#define fbBresDash8 wfbBresDash8
+#define fbBresFill wfbBresFill
+#define fbBresFillDash wfbBresFillDash
+#define fbBresSolid wfbBresSolid
+#define fbBresSolid16 wfbBresSolid16
+#define fbBresSolid24 wfbBresSolid24
+#define fbBresSolid32 wfbBresSolid32
+#define fbBresSolid8 wfbBresSolid8
+#define fbChangeWindowAttributes wfbChangeWindowAttributes
+#define fbClearVisualTypes wfbClearVisualTypes
+#define fbCloseScreen wfbCloseScreen
+#define fbComposite wfbComposite
+#define fbCompositeGeneral wfbCompositeGeneral
+#define fbCompositeSolidMask_nx1xn wfbCompositeSolidMask_nx1xn
+#define fbCompositeSolidMask_nx8888x0565C wfbCompositeSolidMask_nx8888x0565C
+#define fbCompositeSolidMask_nx8888x8888C wfbCompositeSolidMask_nx8888x8888C
+#define fbCompositeSolidMask_nx8x0565 wfbCompositeSolidMask_nx8x0565
+#define fbCompositeSolidMask_nx8x0888 wfbCompositeSolidMask_nx8x0888
+#define fbCompositeSolidMask_nx8x8888 wfbCompositeSolidMask_nx8x8888
+#define fbCompositeSrc_0565x0565 wfbCompositeSrc_0565x0565
+#define fbCompositeSrc_8888x0565 wfbCompositeSrc_8888x0565
+#define fbCompositeSrc_8888x0888 wfbCompositeSrc_8888x0888
+#define fbCompositeSrc_8888x8888 wfbCompositeSrc_8888x8888
+#define fbCompositeSrcAdd_1000x1000 wfbCompositeSrcAdd_1000x1000
+#define fbCompositeSrcAdd_8000x8000 wfbCompositeSrcAdd_8000x8000
+#define fbCompositeSrcAdd_8888x8888 wfbCompositeSrcAdd_8888x8888
+#define fbCopy1toN wfbCopy1toN
+#define fbCopyArea wfbCopyArea
+#define fbCopyNto1 wfbCopyNto1
+#define fbCopyNtoN wfbCopyNtoN
+#define fbCopyPlane wfbCopyPlane
+#define fbCopyRegion wfbCopyRegion
+#define fbCopyWindow wfbCopyWindow
+#define fbCopyWindowProc wfbCopyWindowProc
+#define fbCreateDefColormap wfbCreateDefColormap
+#define fbCreateGC wfbCreateGC
+#define fbCreatePixmap wfbCreatePixmap
+#define fbCreatePixmapBpp wfbCreatePixmapBpp
+#define fbCreateWindow wfbCreateWindow
+#define fbDestroyPixmap wfbDestroyPixmap
+#define fbDestroyWindow wfbDestroyWindow
+#define fbDoCopy wfbDoCopy
+#define fbDots wfbDots
+#define fbDots16 wfbDots16
+#define fbDots24 wfbDots24
+#define fbDots32 wfbDots32
+#define fbDots8 wfbDots8
+#define fbEvenStipple wfbEvenStipple
+#define fbEvenTile wfbEvenTile
+#define fbExpandDirectColors wfbExpandDirectColors
+#define fbFill wfbFill
+#define fbFillRegionSolid wfbFillRegionSolid
+#define fbFillRegionTiled wfbFillRegionTiled
+#define fbFillSpans wfbFillSpans
+#define fbFixCoordModePrevious wfbFixCoordModePrevious
+#define fbGCFuncs wfbGCFuncs
+#define fbGCOps wfbGCOps
+#define fbGCPrivateIndex wfbGCPrivateIndex
+#define fbGeneration wfbGeneration
+#define fbGetGCPrivateIndex wfbGetGCPrivateIndex
+#define fbGetImage wfbGetImage
+#define fbGetScreenPrivateIndex wfbGetScreenPrivateIndex
+#define fbGetSpans wfbGetSpans
+#define _fbGetWindowPixmap _wfbGetWindowPixmap
+#define fbGetWinPrivateIndex wfbGetWinPrivateIndex
+#define fbGlyph16 wfbGlyph16
+#define fbGlyph24 wfbGlyph24
+#define fbGlyph32 wfbGlyph32
+#define fbGlyph8 wfbGlyph8
+#define fbGlyphIn wfbGlyphIn
+#define fbHasVisualTypes wfbHasVisualTypes
+#define fbImageGlyphBlt wfbImageGlyphBlt
+#define fbIn wfbIn
+#define fbInitializeColormap wfbInitializeColormap
+#define fbInitVisuals wfbInitVisuals
+#define fbInstallColormap wfbInstallColormap
+#define fbLaneTable wfbLaneTable
+#define fbListInstalledColormaps wfbListInstalledColormaps
+#define fbMapWindow wfbMapWindow
+#define FbMergeRopBits wFbMergeRopBits
+#define fbOddStipple wfbOddStipple
+#define fbOddTile wfbOddTile
+#define fbOver wfbOver
+#define fbOver24 wfbOver24
+#define fbOverlayCloseScreen wfbOverlayCloseScreen
+#define fbOverlayCopyWindow wfbOverlayCopyWindow
+#define fbOverlayCreateScreenResources wfbOverlayCreateScreenResources
+#define fbOverlayCreateWindow wfbOverlayCreateWindow
+#define fbOverlayFinishScreenInit wfbOverlayFinishScreenInit
+#define fbOverlayGeneration wfbOverlayGeneration
+#define fbOverlayGetScreenPrivateIndex wfbOverlayGetScreenPrivateIndex
+#define fbOverlayPaintKey wfbOverlayPaintKey
+#define fbOverlayPaintWindow wfbOverlayPaintWindow
+#define fbOverlayScreenPrivateIndex wfbOverlayScreenPrivateIndex
+#define fbOverlaySetupScreen wfbOverlaySetupScreen
+#define fbOverlayUpdateLayerRegion wfbOverlayUpdateLayerRegion
+#define fbOverlayWindowExposures wfbOverlayWindowExposures
+#define fbOverlayWindowLayer wfbOverlayWindowLayer
+#define fbPadPixmap wfbPadPixmap
+#define fbPaintWindow wfbPaintWindow
+#define fbPictureInit wfbPictureInit
+#define fbPixmapToRegion wfbPixmapToRegion
+#define fbPolyArc wfbPolyArc
+#define fbPolyFillRect wfbPolyFillRect
+#define fbPolyGlyphBlt wfbPolyGlyphBlt
+#define fbPolyLine wfbPolyLine
+#define fbPolyline16 wfbPolyline16
+#define fbPolyline24 wfbPolyline24
+#define fbPolyline32 wfbPolyline32
+#define fbPolyline8 wfbPolyline8
+#define fbPolyPoint wfbPolyPoint
+#define fbPolySegment wfbPolySegment
+#define fbPolySegment16 wfbPolySegment16
+#define fbPolySegment24 wfbPolySegment24
+#define fbPolySegment32 wfbPolySegment32
+#define fbPolySegment8 wfbPolySegment8
+#define fbPositionWindow wfbPositionWindow
+#define fbPushFill wfbPushFill
+#define fbPushImage wfbPushImage
+#define fbPushPattern wfbPushPattern
+#define fbPushPixels wfbPushPixels
+#define fbPutImage wfbPutImage
+#define fbPutXYImage wfbPutXYImage
+#define fbPutZImage wfbPutZImage
+#define fbQueryBestSize wfbQueryBestSize
+#define fbRasterizeEdges wfbRasterizeEdges
+#define fbRasterizeTrapezoid wfbRasterizeTrapezoid
+#define fbRealizeFont wfbRealizeFont
+#define fbReduceRasterOp wfbReduceRasterOp
+#define fbReplicatePixel wfbReplicatePixel
+#define fbResolveColor wfbResolveColor
+#define fbRestoreAreas wfbRestoreAreas
+#define fbSaveAreas wfbSaveAreas
+#define fbScreenPrivateIndex wfbScreenPrivateIndex
+#define fbSegment wfbSegment
+#define fbSelectBres wfbSelectBres
+#define fbSetSpans wfbSetSpans
+#define fbSetupScreen wfbSetupScreen
+#define fbSetVisualTypes wfbSetVisualTypes
+#define fbSetVisualTypesAndMasks wfbSetVisualTypesAndMasks
+#define _fbSetWindowPixmap _wfbSetWindowPixmap
+#define fbSolid wfbSolid
+#define fbSolid24 wfbSolid24
+#define fbSolidBoxClipped wfbSolidBoxClipped
+#define fbStipple wfbStipple
+#define fbStipple1Bits wfbStipple1Bits
+#define fbStipple24Bits wfbStipple24Bits
+#define fbStipple2Bits wfbStipple2Bits
+#define fbStipple4Bits wfbStipple4Bits
+#define fbStipple8Bits wfbStipple8Bits
+#define fbStippleTable wfbStippleTable
+#define fbTile wfbTile
+#define fbTransparentSpan wfbTransparentSpan
+#define fbUninstallColormap wfbUninstallColormap
+#define fbUnmapWindow wfbUnmapWindow
+#define fbUnrealizeFont wfbUnrealizeFont
+#define fbValidateGC wfbValidateGC
+#define fbWalkCompositeRegion wfbWalkCompositeRegion
+#define fbWinPrivateIndex wfbWinPrivateIndex
+#define fbZeroLine wfbZeroLine
+#define fbZeroSegment wfbZeroSegment
+#define free_pixman_pict wfb_free_pixman_pict
+#define image_from_pict wfb_image_from_pict
+#define xxScrPrivateIndex wfbxxScrPrivateIndex
+#define xxGCPrivateIndex wfbxxGCPrivateIndex
+#define xxColormapPrivateIndex wfbxxColormapPrivateIndex
+#define xxGeneration wfbxxGeneration
+#define xxPrintVisuals wfbxxPrintVisuals
+#define xxGCFuncs wfbxxGCFuncs
+#define xxGCOps wfbxxGCOps
+#define xxSetup wfbxxSetup
+#define composeFunctions wfbComposeFunctions
commit 74dde04eb893540fe7e481f77275e3ff1226edde
Author: Jeremy Huddleston <jeremy at tifa.local>
Date:   Mon Feb 11 13:01:34 2008 -0800

    render: Changed naming Dix*Access -> Security*Access for 1.3

diff --git a/render/picture.c b/render/picture.c
index 5ddd68c..e30edf3 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -1166,7 +1166,7 @@ ChangePicture (PicturePtr	pPicture,
 			pAlpha = (PicturePtr) SecurityLookupIDByType(client,
 								     pid, 
 								     PictureType, 
-								     DixWriteAccess|DixReadAccess);
+								     SecurityWriteAccess|SecurityReadAccess);
 			if (!pAlpha)
 			{
 			    client->errorValue = pid;
@@ -1228,7 +1228,7 @@ ChangePicture (PicturePtr	pPicture,
 			pPixmap = (PixmapPtr)SecurityLookupIDByType(client,
 								    pid, 
 								    RT_PIXMAP,
-								    DixReadAccess);
+								    SecurityReadAccess);
 			if (!pPixmap)
 			{
 			    client->errorValue = pid;
diff --git a/render/render.c b/render/render.c
index caaa278..daa73d3 100644
--- a/render/render.c
+++ b/render/render.c
@@ -560,7 +560,7 @@ ProcRenderQueryPictIndexValues (ClientPtr client)
     pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 
 						      stuff->format,
 						      PictFormatType,
-						      DixReadAccess);
+						      SecurityReadAccess);
 
     if (!pFormat)
     {
@@ -627,14 +627,14 @@ ProcRenderCreatePicture (ClientPtr client)
 
     LEGAL_NEW_RESOURCE(stuff->pid, client);
     rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
-			   DixWriteAccess);
+			   SecurityWriteAccess);
     if (rc != Success)
 	return rc;
 
     pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 
 						      stuff->format,
 						      PictFormatType,
-						      DixReadAccess);
+						      SecurityReadAccess);
     if (!pFormat)
     {
 	client->errorValue = stuff->format;
@@ -668,7 +668,7 @@ ProcRenderChangePicture (ClientPtr client)
     int len;
 
     REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
-    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess,
+    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityWriteAccess,
 		    RenderErrBase + BadPicture);
 
     len = client->req_len - (sizeof(xRenderChangePictureReq) >> 2);
@@ -688,7 +688,7 @@ ProcRenderSetPictureClipRectangles (ClientPtr client)
     int		    result;
 
     REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
-    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess,
+    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityWriteAccess,
 		    RenderErrBase + BadPicture);
     if (!pPicture->pDrawable)
         return BadDrawable;
@@ -714,7 +714,7 @@ ProcRenderFreePicture (ClientPtr client)
 
     REQUEST_SIZE_MATCH(xRenderFreePictureReq);
 
-    VERIFY_PICTURE (pPicture, stuff->picture, client, DixDestroyAccess,
+    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityDestroyAccess,
 		    RenderErrBase + BadPicture);
     FreeResource (stuff->picture, RT_NONE);
     return(client->noClientException);
@@ -744,13 +744,13 @@ ProcRenderComposite (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
+    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess,
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
-    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
 		    RenderErrBase + BadPicture);
-    VERIFY_ALPHA (pMask, stuff->mask, client, DixReadAccess, 
+    VERIFY_ALPHA (pMask, stuff->mask, client, SecurityReadAccess, 
 		  RenderErrBase + BadPicture);
     if ((pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) ||
 	(pMask && pMask->pDrawable && pDst->pDrawable->pScreen != pMask->pDrawable->pScreen))
@@ -790,9 +790,9 @@ ProcRenderTrapezoids (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
 		    RenderErrBase + BadPicture);
-    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 
+    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -803,7 +803,7 @@ ProcRenderTrapezoids (ClientPtr client)
 	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
 							  stuff->maskFormat,
 							  PictFormatType,
-							  DixReadAccess);
+							  SecurityReadAccess);
 	if (!pFormat)
 	{
 	    client->errorValue = stuff->maskFormat;
@@ -837,9 +837,9 @@ ProcRenderTriangles (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
 		    RenderErrBase + BadPicture);
-    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 
+    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -850,7 +850,7 @@ ProcRenderTriangles (ClientPtr client)
 	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
 							  stuff->maskFormat,
 							  PictFormatType,
-							  DixReadAccess);
+							  SecurityReadAccess);
 	if (!pFormat)
 	{
 	    client->errorValue = stuff->maskFormat;
@@ -884,9 +884,9 @@ ProcRenderTriStrip (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
 		    RenderErrBase + BadPicture);
-    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 
+    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -897,7 +897,7 @@ ProcRenderTriStrip (ClientPtr client)
 	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
 							  stuff->maskFormat,
 							  PictFormatType,
-							  DixReadAccess);
+							  SecurityReadAccess);
 	if (!pFormat)
 	{
 	    client->errorValue = stuff->maskFormat;
@@ -931,9 +931,9 @@ ProcRenderTriFan (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
 		    RenderErrBase + BadPicture);
-    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 
+    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -944,7 +944,7 @@ ProcRenderTriFan (ClientPtr client)
 	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
 							  stuff->maskFormat,
 							  PictFormatType,
-							  DixReadAccess);
+							  SecurityReadAccess);
 	if (!pFormat)
 	{
 	    client->errorValue = stuff->maskFormat;
@@ -996,7 +996,7 @@ ProcRenderCreateGlyphSet (ClientPtr client)
     format = (PictFormatPtr) SecurityLookupIDByType (client,
 						     stuff->format,
 						     PictFormatType,
-						     DixReadAccess);
+						     SecurityReadAccess);
     if (!format)
     {
 	client->errorValue = stuff->format;
@@ -1044,7 +1044,7 @@ ProcRenderReferenceGlyphSet (ClientPtr client)
     glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 						     stuff->existing,
 						     GlyphSetType,
-						     DixWriteAccess);
+						     SecurityWriteAccess);
     if (!glyphSet)
     {
 	client->errorValue = stuff->existing;
@@ -1069,7 +1069,7 @@ ProcRenderFreeGlyphSet (ClientPtr client)
     glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 						     stuff->glyphset,
 						     GlyphSetType,
-						     DixDestroyAccess);
+						     SecurityDestroyAccess);
     if (!glyphSet)
     {
 	client->errorValue = stuff->glyphset;
@@ -1103,7 +1103,7 @@ ProcRenderAddGlyphs (ClientPtr client)
     glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 						     stuff->glyphset,
 						     GlyphSetType,
-						     DixWriteAccess);
+						     SecurityWriteAccess);
     if (!glyphSet)
     {
 	client->errorValue = stuff->glyphset;
@@ -1207,7 +1207,7 @@ ProcRenderFreeGlyphs (ClientPtr client)
     glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 						     stuff->glyphset,
 						     GlyphSetType,
-						     DixWriteAccess);
+						     SecurityWriteAccess);
     if (!glyphSet)
     {
 	client->errorValue = stuff->glyphset;
@@ -1262,9 +1262,9 @@ ProcRenderCompositeGlyphs (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess,
+    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess,
 		    RenderErrBase + BadPicture);
-    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
+    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess,
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -1275,7 +1275,7 @@ ProcRenderCompositeGlyphs (ClientPtr client)
 	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
 							  stuff->maskFormat,
 							  PictFormatType,
-							  DixReadAccess);
+							  SecurityReadAccess);
 	if (!pFormat)
 	{
 	    client->errorValue = stuff->maskFormat;
@@ -1288,7 +1288,7 @@ ProcRenderCompositeGlyphs (ClientPtr client)
     glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 						     stuff->glyphset,
 						     GlyphSetType,
-						     DixReadAccess);
+						     SecurityReadAccess);
     if (!glyphSet)
     {
 	client->errorValue = stuff->glyphset;
@@ -1350,7 +1350,7 @@ ProcRenderCompositeGlyphs (ClientPtr client)
 		glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 								 gs,
 								 GlyphSetType,
-								 DixReadAccess);
+								 SecurityReadAccess);
 		if (!glyphSet)
 		{
 		    client->errorValue = gs;
@@ -1431,7 +1431,7 @@ ProcRenderFillRectangles (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 
+    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -1497,7 +1497,7 @@ ProcRenderCreateCursor (ClientPtr client)
     REQUEST_SIZE_MATCH (xRenderCreateCursorReq);
     LEGAL_NEW_RESOURCE(stuff->cid, client);
     
-    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
 		    RenderErrBase + BadPicture);
     if (!pSrc->pDrawable)
         return BadDrawable;
@@ -1679,7 +1679,7 @@ ProcRenderSetPictureTransform (ClientPtr client)
     int		result;
 
     REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
-    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess,
+    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityWriteAccess,
 		    RenderErrBase + BadPicture);
     result = SetPictureTransform (pPicture, (PictTransform *) &stuff->transform);
     if (client->noClientException != Success)
@@ -1704,7 +1704,7 @@ ProcRenderQueryFilters (ClientPtr client)
 
     REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
     rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
-			   DixReadAccess);
+			   SecurityReadAccess);
     if (rc != Success)
 	return rc;
     
@@ -1809,7 +1809,7 @@ ProcRenderSetPictureFilter (ClientPtr client)
     char	*name;
     
     REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq);
-    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess,
+    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityWriteAccess,
 		    RenderErrBase + BadPicture);
     name = (char *) (stuff + 1);
     params = (xFixed *) (name + ((stuff->nbytes + 3) & ~3));
@@ -1843,7 +1843,7 @@ ProcRenderCreateAnimCursor (ClientPtr client)
     for (i = 0; i < ncursor; i++)
     {
 	cursors[i] = (CursorPtr)SecurityLookupIDByType(client, elt->cursor,
-						       RT_CURSOR, DixReadAccess);
+						       RT_CURSOR, SecurityReadAccess);
 	if (!cursors[i])
 	{
 	    xfree (cursors);
@@ -1871,7 +1871,7 @@ ProcRenderAddTraps (ClientPtr client)
     REQUEST(xRenderAddTrapsReq);
 
     REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
-    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess, 
+    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pPicture->pDrawable)
         return BadDrawable;
@@ -2628,7 +2628,7 @@ PanoramiXRenderCreatePicture (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
     if(!(refDraw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
+		client, stuff->drawable, XRC_DRAWABLE, SecurityWriteAccess)))
 	return BadDrawable;
     if(!(newPict = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes))))
 	return BadAlloc;
@@ -2670,7 +2670,7 @@ PanoramiXRenderChangePicture (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
     
-    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE(pict, stuff->picture, client, SecurityWriteAccess,
 		       RenderErrBase + BadPicture);
     
     FOR_NSCREENS_BACKWARD(j) {
@@ -2691,7 +2691,7 @@ PanoramiXRenderSetPictureClipRectangles (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
     
-    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE(pict, stuff->picture, client, SecurityWriteAccess,
 		       RenderErrBase + BadPicture);
     
     FOR_NSCREENS_BACKWARD(j) {
@@ -2712,7 +2712,7 @@ PanoramiXRenderSetPictureTransform (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq);
     
-    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE(pict, stuff->picture, client, SecurityWriteAccess,
 		       RenderErrBase + BadPicture);
     
     FOR_NSCREENS_BACKWARD(j) {
@@ -2733,7 +2733,7 @@ PanoramiXRenderSetPictureFilter (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
     
-    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE(pict, stuff->picture, client, SecurityWriteAccess,
 		       RenderErrBase + BadPicture);
     
     FOR_NSCREENS_BACKWARD(j) {
@@ -2756,7 +2756,7 @@ PanoramiXRenderFreePicture (ClientPtr client)
 
     client->errorValue = stuff->picture;
 
-    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess,
+    VERIFY_XIN_PICTURE(pict, stuff->picture, client, SecurityDestroyAccess,
 		       RenderErrBase + BadPicture);
     
 
@@ -2782,11 +2782,11 @@ PanoramiXRenderComposite (ClientPtr client)
 
     REQUEST_SIZE_MATCH(xRenderCompositeReq);
     
-    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess, 
+    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess, 
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_ALPHA (msk, stuff->mask, client, DixReadAccess, 
+    VERIFY_XIN_ALPHA (msk, stuff->mask, client, SecurityReadAccess, 
 		      RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess, 
 			RenderErrBase + BadPicture);
     
     orig = *stuff;
@@ -2830,9 +2830,9 @@ PanoramiXRenderCompositeGlyphs (ClientPtr client)
     INT16	    xSrc, ySrc;
 
     REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
-    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
+    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess,
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
 			RenderErrBase + BadPicture);
 
     if (client->req_len << 2 >= (sizeof (xRenderCompositeGlyphsReq) +
@@ -2873,7 +2873,7 @@ PanoramiXRenderFillRectangles (ClientPtr client)
     int		    extra_len;
 
     REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess, 
 			RenderErrBase + BadPicture);
     extra_len = (client->req_len << 2) - sizeof (xRenderFillRectanglesReq);
     if (extra_len &&
@@ -2920,9 +2920,9 @@ PanoramiXRenderTrapezoids(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderTrapezoidsReq);
     
-    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
+    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess,
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
@@ -2982,9 +2982,9 @@ PanoramiXRenderTriangles(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderTrianglesReq);
     
-    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
+    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess,
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
@@ -3040,9 +3040,9 @@ PanoramiXRenderTriStrip(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderTriStripReq);
     
-    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
+    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess,
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTriStripReq);
@@ -3094,9 +3094,9 @@ PanoramiXRenderTriFan(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderTriFanReq);
     
-    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
+    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess,
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTriFanReq);
@@ -3150,7 +3150,7 @@ PanoramiXRenderColorTrapezoids(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderColorTrapezoidsReq);
     
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderColorTrapezoidsReq);
@@ -3194,7 +3194,7 @@ PanoramiXRenderColorTriangles(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderColorTrianglesReq);
     
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderColorTrianglesReq);
@@ -3240,7 +3240,7 @@ PanoramiXRenderAddTraps (ClientPtr client)
     INT16    	    x_off, y_off;
 
     REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
-    VERIFY_XIN_PICTURE (picture, stuff->picture, client, DixWriteAccess, 
+    VERIFY_XIN_PICTURE (picture, stuff->picture, client, SecurityWriteAccess, 
 			RenderErrBase + BadPicture);
     extra_len = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
     if (extra_len &&
commit 1a3846bb3bbe7ea728c35896f30ed72a90f4f6e3
Author: Jeremy Huddleston <jeremy at tifa.local>
Date:   Mon Feb 11 12:31:43 2008 -0800

    render: Brought in changes from xorg-server-1.4-apple

diff --git a/render/animcur.c b/render/animcur.c
index 8e4f59d..1f25e79 100644
--- a/render/animcur.c
+++ b/render/animcur.c
@@ -87,8 +87,8 @@ static CursorBits   animCursorBits = {
     empty, empty, 2, 1, 1, 0, 0, 1
 };
 
-int	AnimCurScreenPrivateIndex = -1;
-int	AnimCurGeneration;
+static int AnimCurScreenPrivateIndex = -1;
+static int AnimCurGeneration;
 
 #define IsAnimCur(c)	    ((c)->bits == &animCursorBits)
 #define GetAnimCur(c)	    ((AnimCurPtr) ((c) + 1))
diff --git a/render/filter.c b/render/filter.c
index 71375da..092313f 100644
--- a/render/filter.c
+++ b/render/filter.c
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * Copyright © 2002 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
diff --git a/render/glyph.c b/render/glyph.c
index 6d09a0e..583a52b 100644
--- a/render/glyph.c
+++ b/render/glyph.c
@@ -77,22 +77,22 @@ static GlyphHashSetRec glyphHashSets[] = {
 
 #define NGLYPHHASHSETS	(sizeof(glyphHashSets)/sizeof(glyphHashSets[0]))
 
-const CARD8	glyphDepths[GlyphFormatNum] = { 1, 4, 8, 16, 32 };
+static const CARD8	glyphDepths[GlyphFormatNum] = { 1, 4, 8, 16, 32 };
 
-GlyphHashRec	globalGlyphs[GlyphFormatNum];
+static GlyphHashRec	globalGlyphs[GlyphFormatNum];
 
-int		globalTotalGlyphPrivateSize = 0;
+static int	globalTotalGlyphPrivateSize = 0;
 
 static int	glyphPrivateCount = 0;
 
 void
-ResetGlyphPrivates ()
+ResetGlyphPrivates (void)
 {
     glyphPrivateCount = 0;
 }
 
 int
-AllocateGlyphPrivateIndex ()
+AllocateGlyphPrivateIndex (void)
 {
     return glyphPrivateCount++;
 }
diff --git a/render/glyphstr.h b/render/glyphstr.h
index e8f83e7..22150de 100644
--- a/render/glyphstr.h
+++ b/render/glyphstr.h
@@ -25,7 +25,6 @@
 #ifndef _GLYPHSTR_H_
 #define _GLYPHSTR_H_
 
-#include <X11/Xdefs.h>
 #include <X11/extensions/renderproto.h>
 #include "picture.h"
 #include "screenint.h"
@@ -92,8 +91,6 @@ typedef struct _GlyphList {
     PictFormatPtr   format;
 } GlyphListRec, *GlyphListPtr;
 
-extern GlyphHashRec	globalGlyphs[GlyphFormatNum];
-
 GlyphHashSetPtr
 FindGlyphHashSet (CARD32 filled);
 
diff --git a/render/mipict.c b/render/mipict.c
index 3d6c1ae..87dccbb 100644
--- a/render/mipict.c
+++ b/render/mipict.c
@@ -1,4 +1,4 @@
- /*
+/*
  *
  * Copyright © 1999 Keith Packard
  *
@@ -266,19 +266,19 @@ miChangePictureFilter (PicturePtr pPicture,
 
 #define BOUND(v)	(INT16) ((v) < MINSHORT ? MINSHORT : (v) > MAXSHORT ? MAXSHORT : (v))
 
-static __inline Bool
-miClipPictureReg (RegionPtr	pRegion,
-		  RegionPtr	pClip,
+static inline pixman_bool_t
+miClipPictureReg (pixman_region16_t *	pRegion,
+		  pixman_region16_t *	pClip,
 		  int		dx,
 		  int		dy)
 {
-    if (REGION_NUM_RECTS(pRegion) == 1 &&
-	REGION_NUM_RECTS(pClip) == 1)
+    if (pixman_region_n_rects(pRegion) == 1 &&
+	pixman_region_n_rects(pClip) == 1)
     {
-	BoxPtr  pRbox = REGION_RECTS(pRegion);
-	BoxPtr  pCbox = REGION_RECTS(pClip);
+	pixman_box16_t *  pRbox = pixman_region_rectangles(pRegion, NULL);
+	pixman_box16_t *  pCbox = pixman_region_rectangles(pClip, NULL);
 	int	v;
-
+	
 	if (pRbox->x1 < (v = pCbox->x1 + dx))
 	    pRbox->x1 = BOUND(v);
 	if (pRbox->x2 > (v = pCbox->x2 + dx))
@@ -290,23 +290,23 @@ miClipPictureReg (RegionPtr	pRegion,
 	if (pRbox->x1 >= pRbox->x2 ||
 	    pRbox->y1 >= pRbox->y2)
 	{
-	    REGION_EMPTY(pScreen, pRegion);
+	    pixman_region_init (pRegion);
 	}
     }
-    else if (!REGION_NOTEMPTY (pScreen, pClip))
+    else if (!pixman_region_not_empty (pClip))
 	return FALSE;
     else
     {
 	if (dx || dy)
-	    REGION_TRANSLATE(pScreen, pRegion, -dx, -dy);
-	if (!REGION_INTERSECT (pScreen, pRegion, pRegion, pClip))
+	    pixman_region_translate (pRegion, -dx, -dy);
+	if (!pixman_region_intersect (pRegion, pRegion, pClip))
 	    return FALSE;
 	if (dx || dy)
-	    REGION_TRANSLATE(pScreen, pRegion, dx, dy);
+	    pixman_region_translate(pRegion, dx, dy);
     }
-    return REGION_NOTEMPTY(pScreen, pRegion);
+    return pixman_region_not_empty(pRegion);
 }
-		  
+
 static __inline Bool
 miClipPictureSrc (RegionPtr	pRegion,
 		  PicturePtr	pPicture,
@@ -320,13 +320,13 @@ miClipPictureSrc (RegionPtr	pRegion,
     {
 	if (pPicture->clientClipType != CT_NONE)
 	{
-	    REGION_TRANSLATE(pScreen, pRegion, 
+	    pixman_region_translate ( pRegion, 
 			     dx - pPicture->clipOrigin.x,
 			     dy - pPicture->clipOrigin.y);
 	    if (!REGION_INTERSECT (pScreen, pRegion, pRegion, 
-				   (RegionPtr) pPicture->clientClip))
+				   (RegionPtr) pPicture->pCompositeClip)) // clientClip))
 		return FALSE;
-	    REGION_TRANSLATE(pScreen, pRegion, 
+	    pixman_region_translate ( pRegion, 
 			     - (dx - pPicture->clipOrigin.x),
 			     - (dy - pPicture->clipOrigin.y));
 	}
@@ -341,7 +341,7 @@ miClipPictureSrc (RegionPtr	pRegion,
     }
 }
 
-static void
+void
 miCompositeSourceValidate (PicturePtr	pPicture,
 			   INT16	x,
 			   INT16	y,
@@ -417,6 +417,7 @@ miComputeCompositeRegion (RegionPtr	pRegion,
 			  CARD16	width,
 			  CARD16	height)
 {
+    
     int		v;
 
     pRegion->extents.x1 = xDst;
@@ -430,13 +431,13 @@ miComputeCompositeRegion (RegionPtr	pRegion,
     if (pRegion->extents.x1 >= pRegion->extents.x2 ||
 	pRegion->extents.y1 >= pRegion->extents.y2)
     {
-	REGION_EMPTY (pDst->pDrawable->pScreen, pRegion);
+	pixman_region_init (pRegion);
 	return FALSE;
     }
     /* clip against dst */
     if (!miClipPictureReg (pRegion, pDst->pCompositeClip, 0, 0))
     {
-	REGION_UNINIT (pScreen, pRegion);
+	pixman_region_fini (pRegion);
 	return FALSE;
     }
     if (pDst->alphaMap)
@@ -445,14 +446,14 @@ miComputeCompositeRegion (RegionPtr	pRegion,
 			       -pDst->alphaOrigin.x,
 			       -pDst->alphaOrigin.y))
 	{
-	    REGION_UNINIT (pScreen, pRegion);
+	    pixman_region_fini (pRegion);
 	    return FALSE;
 	}
     }
     /* clip against src */
     if (!miClipPictureSrc (pRegion, pSrc, xDst - xSrc, yDst - ySrc))
     {
-	REGION_UNINIT (pScreen, pRegion);
+	pixman_region_fini (pRegion);
 	return FALSE;
     }
     if (pSrc->alphaMap)
@@ -461,7 +462,7 @@ miComputeCompositeRegion (RegionPtr	pRegion,
 			       xDst - (xSrc + pSrc->alphaOrigin.x),
 			       yDst - (ySrc + pSrc->alphaOrigin.y)))
 	{
-	    REGION_UNINIT (pScreen, pRegion);
+	    pixman_region_fini (pRegion);
 	    return FALSE;
 	}
     }
@@ -470,7 +471,7 @@ miComputeCompositeRegion (RegionPtr	pRegion,
     {
 	if (!miClipPictureSrc (pRegion, pMask, xDst - xMask, yDst - yMask))
 	{
-	    REGION_UNINIT (pScreen, pRegion);
+	    pixman_region_fini (pRegion);
 	    return FALSE;
 	}	
 	if (pMask->alphaMap)
@@ -479,14 +480,17 @@ miComputeCompositeRegion (RegionPtr	pRegion,
 				   xDst - (xMask + pMask->alphaOrigin.x),
 				   yDst - (yMask + pMask->alphaOrigin.y)))
 	    {
-		REGION_UNINIT (pScreen, pRegion);
+		pixman_region_fini (pRegion);
 		return FALSE;
 	    }
 	}
     }
+
+    
     miCompositeSourceValidate (pSrc, xSrc, ySrc, width, height);
     if (pMask)
 	miCompositeSourceValidate (pMask, xMask, yMask, width, height);
+
     return TRUE;
 }
 
diff --git a/render/mipict.h b/render/mipict.h
index eef155f..bd7c23f 100644
--- a/render/mipict.h
+++ b/render/mipict.h
@@ -88,6 +88,12 @@ miClipPicture (RegionPtr    pRegion,
 	       INT16	    xPict,
 	       INT16	    yPict);
 
+void
+miCompositeSourceValidate (PicturePtr	pPicture,
+			   INT16	x,
+			   INT16	y,
+			   CARD16	width,
+			   CARD16	height);
 Bool
 miComputeCompositeRegion (RegionPtr	pRegion,
 			  PicturePtr	pSrc,
diff --git a/render/picture.c b/render/picture.c
index a3443c2..5ddd68c 100644
--- a/render/picture.c
+++ b/render/picture.c
@@ -43,7 +43,7 @@
 
 _X_EXPORT int	PictureScreenPrivateIndex = -1;
 int		PictureWindowPrivateIndex;
-int		PictureGeneration;
+static int	PictureGeneration;
 RESTYPE		PictureType;
 RESTYPE		PictFormatType;
 RESTYPE		GlyphSetType;
@@ -890,54 +890,22 @@ static unsigned int INTERPOLATE_PIXEL_256(unsigned int x, unsigned int a,
     return x;
 }
 
-static void initGradientColorTable(SourcePictPtr pGradient, int *error)
+CARD32
+PictureGradientColor (PictGradientStopPtr stop1,
+		      PictGradientStopPtr stop2,
+		      CARD32	          x)
 {
-    int begin_pos, end_pos;
-    xFixed incr, dpos;
-    int pos, current_stop;
-    PictGradientStopPtr stops = pGradient->linear.stops;
-    int nstops = pGradient->linear.nstops;
-
-    /* The position where the gradient begins and ends */
-    begin_pos = (stops[0].x * PICT_GRADIENT_STOPTABLE_SIZE) >> 16;
-    end_pos = (stops[nstops - 1].x * PICT_GRADIENT_STOPTABLE_SIZE) >> 16;
-
-    pos = 0; /* The position in the color table. */
-
-    /* Up to first point */
-    while (pos <= begin_pos) {
-        pGradient->linear.colorTable[pos] = xRenderColorToCard32(stops[0].color);
-        ++pos;
-    }
-
-    incr =  (1<<16)/ PICT_GRADIENT_STOPTABLE_SIZE; /* the double increment. */
-    dpos = incr * pos; /* The position in terms of 0-1. */
-
-    current_stop = 0; /* We always interpolate between current and current + 1. */
-
-    /* Gradient area */
-    while (pos < end_pos) {
-        unsigned int current_color = xRenderColorToCard32(stops[current_stop].color);
-        unsigned int next_color = xRenderColorToCard32(stops[current_stop + 1].color);
+     CARD32 current_color, next_color;
+     int	   dist, idist;
 
-        int dist = (int)(256*(dpos - stops[current_stop].x)
-                         / (stops[current_stop+1].x - stops[current_stop].x));
-        int idist = 256 - dist;
+     current_color = xRenderColorToCard32 (stop1->color);
+     next_color    = xRenderColorToCard32 (stop2->color);
 
-        pGradient->linear.colorTable[pos] = premultiply(INTERPOLATE_PIXEL_256(current_color, idist, next_color, dist));
+     dist  = (int) (256 * (x - stop1->x) / (stop2->x - stop1->x));
+     idist = 256 - dist;
 
-        ++pos;
-        dpos += incr;
-
-        if (dpos > stops[current_stop + 1].x)
-            ++current_stop;
-    }
-
-    /* After last point */
-    while (pos < PICT_GRADIENT_STOPTABLE_SIZE) {
-        pGradient->linear.colorTable[pos] = xRenderColorToCard32(stops[nstops - 1].color);
-        ++pos;
-    }
+     return premultiply (INTERPOLATE_PIXEL_256 (current_color, idist,
+					       next_color, dist));
 }
 
 static void initGradient(SourcePictPtr pGradient, int stopCount,
@@ -953,26 +921,30 @@ static void initGradient(SourcePictPtr pGradient, int stopCount,
 
     dpos = -1;
     for (i = 0; i < stopCount; ++i) {
-        if (stopPoints[i] <= dpos || stopPoints[i] > (1<<16)) {
+        if (stopPoints[i] < dpos || stopPoints[i] > (1<<16)) {
             *error = BadValue;
             return;
         }
         dpos = stopPoints[i];
     }
 
-    pGradient->linear.stops = xalloc(stopCount*sizeof(PictGradientStop));
-    if (!pGradient->linear.stops) {
+    pGradient->gradient.stops = xalloc(stopCount*sizeof(PictGradientStop));
+    if (!pGradient->gradient.stops) {
         *error = BadAlloc;
         return;
     }
 
-    pGradient->linear.nstops = stopCount;
+    pGradient->gradient.nstops = stopCount;
 
     for (i = 0; i < stopCount; ++i) {
-        pGradient->linear.stops[i].x = stopPoints[i];
-        pGradient->linear.stops[i].color = stopColors[i];
+        pGradient->gradient.stops[i].x = stopPoints[i];
+        pGradient->gradient.stops[i].color = stopColors[i];
     }
-    initGradientColorTable(pGradient, error);
+
+    pGradient->gradient.class	       = SourcePictClassUnknown;
+    pGradient->gradient.stopRange      = 0xffff;
+    pGradient->gradient.colorTable     = NULL;
+    pGradient->gradient.colorTableSize = 0;
 }
 
 static PicturePtr createSourcePicture(void)
@@ -980,9 +952,9 @@ static PicturePtr createSourcePicture(void)
     PicturePtr pPicture;
     pPicture = (PicturePtr) xalloc(sizeof(PictureRec));
     pPicture->pDrawable = 0;
-    pPicture->format = PICT_a8r8g8b8;
     pPicture->pFormat = 0;
     pPicture->pNext = 0;
+    pPicture->format = PICT_a8r8g8b8;
     pPicture->devPrivates = 0;
 
     SetPictureToDefaults(pPicture);
@@ -1027,10 +999,6 @@ CreateLinearGradientPicture (Picture pid, xPointFixed *p1, xPointFixed *p2,
         *error = BadAlloc;
         return 0;
     }
-    if (p1->x == p2->x && p1->y == p2->y) {
-        *error = BadValue;
-        return 0;
-    }
 
     pPicture->id = pid;
     pPicture->pSourcePict = (SourcePictPtr) xalloc(sizeof(PictLinearGradient));
@@ -1072,14 +1040,6 @@ CreateRadialGradientPicture (Picture pid, xPointFixed *inner, xPointFixed *outer
         *error = BadAlloc;
         return 0;
     }
-    {
-        double dx = (double)(inner->x - outer->x);
-        double dy = (double)(inner->y - outer->y);
-        if (sqrt(dx*dx + dy*dy) + (double)(innerRadius) > (double)(outerRadius)) {
-            *error = BadValue;
-            return 0;
-        }
-    }
 
     pPicture->id = pid;
     pPicture->pSourcePict = (SourcePictPtr) xalloc(sizeof(PictRadialGradient));
@@ -1091,22 +1051,19 @@ CreateRadialGradientPicture (Picture pid, xPointFixed *inner, xPointFixed *outer
     radial = &pPicture->pSourcePict->radial;
 
     radial->type = SourcePictTypeRadial;
-    {
-        double x = (double)innerRadius / (double)outerRadius;
-        radial->dx = (outer->x - inner->x);
-        radial->dy = (outer->y - inner->y);
-        radial->fx = (inner->x) - x*radial->dx;
-        radial->fy = (inner->y) - x*radial->dy;
-        radial->m = 1./(1+x);
-        radial->b = -x*radial->m;
-        radial->dx /= 65536.;
-        radial->dy /= 65536.;
-        radial->fx /= 65536.;
-        radial->fy /= 65536.;
-        x = outerRadius/65536.;
-        radial->a = x*x - radial->dx*radial->dx - radial->dy*radial->dy;
-    }
-
+    radial->c1.x = inner->x;
+    radial->c1.y = inner->y;
+    radial->c1.radius = innerRadius;
+    radial->c2.x = outer->x;
+    radial->c2.y = outer->y;
+    radial->c2.radius = outerRadius;
+    radial->cdx = (radial->c2.x - radial->c1.x) / 65536.;
+    radial->cdy = (radial->c2.y - radial->c1.y) / 65536.;
+    radial->dr = (radial->c2.radius - radial->c1.radius) / 65536.;
+    radial->A = (  radial->cdx * radial->cdx
+		   + radial->cdy * radial->cdy
+		   - radial->dr  * radial->dr);
+    
     initGradient(pPicture->pSourcePict, nStops, stops, colors, error);
     if (*error) {
         xfree(pPicture);
@@ -1209,7 +1166,7 @@ ChangePicture (PicturePtr	pPicture,
 			pAlpha = (PicturePtr) SecurityLookupIDByType(client,
 								     pid, 
 								     PictureType, 
-								     SecurityWriteAccess|SecurityReadAccess);
+								     DixWriteAccess|DixReadAccess);
 			if (!pAlpha)
 			{
 			    client->errorValue = pid;
@@ -1271,7 +1228,7 @@ ChangePicture (PicturePtr	pPicture,
 			pPixmap = (PixmapPtr)SecurityLookupIDByType(client,
 								    pid, 
 								    RT_PIXMAP,
-								    SecurityReadAccess);
+								    DixReadAccess);
 			if (!pPixmap)
 			{
 			    client->errorValue = pid;
@@ -1627,13 +1584,17 @@ FreePicture (pointer	value,
     {
 	if (pPicture->transform)
 	    xfree (pPicture->transform);
-        if (!pPicture->pDrawable) {
-            if (pPicture->pSourcePict) {
-                if (pPicture->pSourcePict->type != SourcePictTypeSolidFill)
-                    xfree(pPicture->pSourcePict->linear.stops);
-                xfree(pPicture->pSourcePict);
-            }
-        } else {
+
+	if (pPicture->pSourcePict)
+	{
+	    if (pPicture->pSourcePict->type != SourcePictTypeSolidFill)
+		xfree(pPicture->pSourcePict->linear.stops);
+
+	    xfree(pPicture->pSourcePict);
+	}
+
+	if (pPicture->pDrawable)
+	{
             ScreenPtr	    pScreen = pPicture->pDrawable->pScreen;
             PictureScreenPtr    ps = GetPictureScreen(pScreen);
 	
@@ -1680,7 +1641,7 @@ FreePictFormat (pointer	pPictFormat,
  * unnecessary.  It may also avoid destination reads sometimes if apps aren't
  * being careful to avoid these cases.
  */
-static Bool
+static CARD8
 ReduceCompositeOp (CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst)
 {
     Bool no_src_alpha, no_dst_alpha;
@@ -1918,9 +1879,6 @@ AddTraps (PicturePtr	pPicture,
     (*ps->AddTraps) (pPicture, xOff, yOff, ntrap, traps);
 }
 
-#define MAX_FIXED_48_16	    ((xFixed_48_16) 0x7fffffff)
-#define MIN_FIXED_48_16	    (-((xFixed_48_16) 1 << 31))
-
 _X_EXPORT Bool
 PictureTransformPoint3d (PictTransformPtr transform,
                          PictVectorPtr	vector)
diff --git a/render/picture.h b/render/picture.h
index 1b62234..563a81b 100644
--- a/render/picture.h
+++ b/render/picture.h
@@ -25,6 +25,8 @@
 #ifndef _PICTURE_H_
 #define _PICTURE_H_
 
+#include <pixman.h>
+
 typedef struct _DirectFormat	*DirectFormatPtr;
 typedef struct _PictFormat	*PictFormatPtr;
 typedef struct _Picture		*PicturePtr;
@@ -34,12 +36,7 @@ typedef struct _Picture		*PicturePtr;
  * sample implementation allows only packed RGB and GBR
  * representations for data to simplify software rendering,
  */
-#define PICT_FORMAT(bpp,type,a,r,g,b)	(((bpp) << 24) |  \
-					 ((type) << 16) | \
-					 ((a) << 12) | \
-					 ((r) << 8) | \
-					 ((g) << 4) | \
-					 ((b)))
+#define PICT_FORMAT(bpp,type,a,r,g,b)	PIXMAN_FORMAT(bpp, type, a, r, g, b)
 
 /*
  * gray/color formats use a visual index instead of argb
@@ -48,77 +45,77 @@ typedef struct _Picture		*PicturePtr;
 					 ((type) << 16) | \
 					 ((vi)))
 
-#define PICT_FORMAT_BPP(f)	(((f) >> 24)       )
-#define PICT_FORMAT_TYPE(f)	(((f) >> 16) & 0xff)
-#define PICT_FORMAT_A(f)	(((f) >> 12) & 0x0f)
-#define PICT_FORMAT_R(f)	(((f) >>  8) & 0x0f)
-#define PICT_FORMAT_G(f)	(((f) >>  4) & 0x0f)
-#define PICT_FORMAT_B(f)	(((f)      ) & 0x0f)
-#define PICT_FORMAT_RGB(f)	(((f)      ) & 0xfff)
-#define PICT_FORMAT_VIS(f)	(((f)      ) & 0xffff)
+#define PICT_FORMAT_BPP(f)	PIXMAN_FORMAT_BPP(f)
+#define PICT_FORMAT_TYPE(f)	PIXMAN_FORMAT_TYPE(f)
+#define PICT_FORMAT_A(f)	PIXMAN_FORMAT_A(f)
+#define PICT_FORMAT_R(f)	PIXMAN_FORMAT_R(f)
+#define PICT_FORMAT_G(f)	PIXMAN_FORMAT_G(f)
+#define PICT_FORMAT_B(f)	PIXMAN_FORMAT_B(f)
+#define PICT_FORMAT_RGB(f)	PIXMAN_FORMAT_RGB(f)
+#define PICT_FORMAT_VIS(f)	PIXMAN_FORMAT_VIS(f)
 
-#define PICT_TYPE_OTHER	0
-#define PICT_TYPE_A	1
-#define PICT_TYPE_ARGB	2
-#define PICT_TYPE_ABGR	3
-#define PICT_TYPE_COLOR	4
-#define PICT_TYPE_GRAY	5
+#define PICT_TYPE_OTHER		PIXMAN_TYPE_OTHER
+#define PICT_TYPE_A		PIXMAN_TYPE_A
+#define PICT_TYPE_ARGB		PIXMAN_TYPE_ARGB
+#define PICT_TYPE_ABGR		PIXMAN_TYPE_ABGR
+#define PICT_TYPE_COLOR		PIXMAN_TYPE_COLOR
+#define PICT_TYPE_GRAY		PIXMAN_TYPE_GRAY
 
-#define PICT_FORMAT_COLOR(f)	(PICT_FORMAT_TYPE(f) & 2)
+#define PICT_FORMAT_COLOR(f)	PIXMAN_FORMAT_COLOR(f)
 
 /* 32bpp formats */
 typedef enum _PictFormatShort {
-   PICT_a8r8g8b8 =	PICT_FORMAT(32,PICT_TYPE_ARGB,8,8,8,8),
-   PICT_x8r8g8b8 =	PICT_FORMAT(32,PICT_TYPE_ARGB,0,8,8,8),
-   PICT_a8b8g8r8 =	PICT_FORMAT(32,PICT_TYPE_ABGR,8,8,8,8),
-   PICT_x8b8g8r8 =	PICT_FORMAT(32,PICT_TYPE_ABGR,0,8,8,8),
+    PICT_a8r8g8b8 =	PIXMAN_a8r8g8b8,
+    PICT_x8r8g8b8 =	PIXMAN_x8r8g8b8,
+    PICT_a8b8g8r8 =	PIXMAN_a8b8g8r8,
+    PICT_x8b8g8r8 =	PIXMAN_x8b8g8r8,
 
 /* 24bpp formats */
-   PICT_r8g8b8 =	PICT_FORMAT(24,PICT_TYPE_ARGB,0,8,8,8),
-   PICT_b8g8r8 =	PICT_FORMAT(24,PICT_TYPE_ABGR,0,8,8,8),
+    PICT_r8g8b8 =	PIXMAN_r8g8b8,
+    PICT_b8g8r8 =	PIXMAN_b8g8r8,
 
 /* 16bpp formats */
-   PICT_r5g6b5 =	PICT_FORMAT(16,PICT_TYPE_ARGB,0,5,6,5),
-   PICT_b5g6r5 =	PICT_FORMAT(16,PICT_TYPE_ABGR,0,5,6,5),
-
-   PICT_a1r5g5b5 =	PICT_FORMAT(16,PICT_TYPE_ARGB,1,5,5,5),
-   PICT_x1r5g5b5 =	PICT_FORMAT(16,PICT_TYPE_ARGB,0,5,5,5),
-   PICT_a1b5g5r5 =	PICT_FORMAT(16,PICT_TYPE_ABGR,1,5,5,5),
-   PICT_x1b5g5r5 =	PICT_FORMAT(16,PICT_TYPE_ABGR,0,5,5,5),
-   PICT_a4r4g4b4 =	PICT_FORMAT(16,PICT_TYPE_ARGB,4,4,4,4),
-   PICT_x4r4g4b4 =	PICT_FORMAT(16,PICT_TYPE_ARGB,0,4,4,4),
-   PICT_a4b4g4r4 =	PICT_FORMAT(16,PICT_TYPE_ABGR,4,4,4,4),
-   PICT_x4b4g4r4 =	PICT_FORMAT(16,PICT_TYPE_ABGR,0,4,4,4),
+    PICT_r5g6b5 =	PIXMAN_r5g6b5,
+    PICT_b5g6r5 =	PIXMAN_b5g6r5,
+
+    PICT_a1r5g5b5 =	PIXMAN_a1r5g5b5,
+    PICT_x1r5g5b5 =	PIXMAN_x1r5g5b5,
+    PICT_a1b5g5r5 =	PIXMAN_a1b5g5r5,
+    PICT_x1b5g5r5 =	PIXMAN_x1b5g5r5,
+    PICT_a4r4g4b4 =	PIXMAN_a4r4g4b4,
+    PICT_x4r4g4b4 =	PIXMAN_x4r4g4b4,
+    PICT_a4b4g4r4 =	PIXMAN_a4b4g4r4,
+    PICT_x4b4g4r4 =	PIXMAN_x4b4g4r4,
 
 /* 8bpp formats */
-   PICT_a8 =		PICT_FORMAT(8,PICT_TYPE_A,8,0,0,0),
-   PICT_r3g3b2 =	PICT_FORMAT(8,PICT_TYPE_ARGB,0,3,3,2),
-   PICT_b2g3r3 =	PICT_FORMAT(8,PICT_TYPE_ABGR,0,3,3,2),
-   PICT_a2r2g2b2 =	PICT_FORMAT(8,PICT_TYPE_ARGB,2,2,2,2),
-   PICT_a2b2g2r2 =	PICT_FORMAT(8,PICT_TYPE_ABGR,2,2,2,2),
+    PICT_a8 =		PIXMAN_a8,
+    PICT_r3g3b2 =	PIXMAN_r3g3b2,
+    PICT_b2g3r3 =	PIXMAN_b2g3r3,
+    PICT_a2r2g2b2 =	PIXMAN_a2r2g2b2,
+    PICT_a2b2g2r2 =	PIXMAN_a2b2g2r2,
 
-   PICT_c8 =		PICT_FORMAT(8,PICT_TYPE_COLOR,0,0,0,0),
-   PICT_g8 =		PICT_FORMAT(8,PICT_TYPE_GRAY,0,0,0,0),
+    PICT_c8 =		PIXMAN_c8,
+    PICT_g8 =		PIXMAN_g8,
 
-   PICT_x4a4 =		PICT_FORMAT(8,PICT_TYPE_A,4,0,0,0),
+    PICT_x4a4 =		PIXMAN_x4a4,
 				    
-   PICT_x4c4 =		PICT_FORMAT(8,PICT_TYPE_COLOR,0,0,0,0),
-   PICT_x4g4 =		PICT_FORMAT(8,PICT_TYPE_GRAY,0,0,0,0),
+    PICT_x4c4 =		PIXMAN_x4c4,
+    PICT_x4g4 =		PIXMAN_x4g4,
 
 /* 4bpp formats */
-   PICT_a4 =		PICT_FORMAT(4,PICT_TYPE_A,4,0,0,0),
-   PICT_r1g2b1 =	PICT_FORMAT(4,PICT_TYPE_ARGB,0,1,2,1),
-   PICT_b1g2r1 =	PICT_FORMAT(4,PICT_TYPE_ABGR,0,1,2,1),
-   PICT_a1r1g1b1 =	PICT_FORMAT(4,PICT_TYPE_ARGB,1,1,1,1),
-   PICT_a1b1g1r1 =	PICT_FORMAT(4,PICT_TYPE_ABGR,1,1,1,1),
+    PICT_a4 =		PIXMAN_a4,
+    PICT_r1g2b1 =	PIXMAN_r1g2b1,
+    PICT_b1g2r1 =	PIXMAN_b1g2r1,
+    PICT_a1r1g1b1 =	PIXMAN_a1r1g1b1,
+    PICT_a1b1g1r1 =	PIXMAN_a1b1g1r1,
 				    
-   PICT_c4 =		PICT_FORMAT(4,PICT_TYPE_COLOR,0,0,0,0),
-   PICT_g4 =		PICT_FORMAT(4,PICT_TYPE_GRAY,0,0,0,0),
+    PICT_c4 =		PIXMAN_c4,
+    PICT_g4 =		PIXMAN_g4,
 
 /* 1bpp formats */
-   PICT_a1 =		PICT_FORMAT(1,PICT_TYPE_A,1,0,0,0),
+    PICT_a1 =		PIXMAN_a1,
 
-   PICT_g1 =		PICT_FORMAT(1,PICT_TYPE_GRAY,0,0,0,0),
+    PICT_g1 =		PIXMAN_g1,
 } PictFormatShort;
 
 /*
@@ -171,54 +168,35 @@ extern int	RenderClientPrivateIndex;
 
 /* Fixed point updates from Carl Worth, USC, Information Sciences Institute */
 
-#if defined(WIN32) && !defined(__GNUC__)
-typedef __int64		xFixed_32_32;
-#else
-#  if defined (_LP64) || \
-      defined(__alpha__) || defined(__alpha) || \
-      defined(ia64) || defined(__ia64__) || \
-      defined(__sparc64__) || \
-      defined(__s390x__) || \
-      defined(amd64) || defined (__amd64__) || \
-      (defined(sgi) && (_MIPS_SZLONG == 64))
-typedef long		xFixed_32_32;
-# else
-#  if defined(__GNUC__) && \
-    ((__GNUC__ > 2) || \
-     ((__GNUC__ == 2) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ > 7)))
-__extension__
-#  endif
-typedef long long int	xFixed_32_32;
-# endif
-#endif
-
-typedef xFixed_32_32	xFixed_48_16;
-
-#define MAX_FIXED_48_16	    ((xFixed_48_16) 0x7fffffff)
-#define MIN_FIXED_48_16	    (-((xFixed_48_16) 1 << 31))
-
-typedef CARD32		xFixed_1_31;
-typedef CARD32		xFixed_1_16;
-typedef INT32		xFixed_16_16;
+typedef pixman_fixed_32_32_t	xFixed_32_32;
+
+typedef pixman_fixed_48_16_t	xFixed_48_16;
+
+#define MAX_FIXED_48_16		pixman_max_fixed_48_16
+#define MIN_FIXED_48_16		pixman_min_fixed_48_16
+
+typedef pixman_fixed_1_31_t	xFixed_1_31;
+typedef pixman_fixed_1_16_t	xFixed_1_16;
+typedef pixman_fixed_16_16_t	xFixed_16_16;
 
 /*
  * An unadorned "xFixed" is the same as xFixed_16_16, 
  * (since it's quite common in the code) 
  */
-typedef	xFixed_16_16	xFixed;
+typedef	pixman_fixed_t	xFixed;
 #define XFIXED_BITS	16
 
-#define xFixedToInt(f)	(int) ((f) >> XFIXED_BITS)
-#define IntToxFixed(i)	((xFixed) (i) << XFIXED_BITS)
-#define xFixedE		((xFixed) 1)
-#define xFixed1		(IntToxFixed(1))
-#define xFixed1MinusE	(xFixed1 - xFixedE)
-#define xFixedFrac(f)	((f) & xFixed1MinusE)
-#define xFixedFloor(f)	((f) & ~xFixed1MinusE)
-#define xFixedCeil(f)	xFixedFloor((f) + xFixed1MinusE)
-
-#define xFixedFraction(f)	((f) & xFixed1MinusE)
-#define xFixedMod2(f)		((f) & (xFixed1 | xFixed1MinusE))
+#define xFixedToInt(f)	pixman_fixed_to_int(f)
+#define IntToxFixed(i)	pixman_int_to_fixed(i)
+#define xFixedE		pixman_fixed_e
+#define xFixed1		pixman_fixed_1
+#define xFixed1MinusE	pixman_fixed_1_minus_e
+#define xFixedFrac(f)	pixman_fixed_frac(f)
+#define xFixedFloor(f)	pixman_fixed_floor(f)
+#define xFixedCeil(f)	pixman_fixed_ceil(f)
+
+#define xFixedFraction(f)	pixman_fixed_fraction(f)
+#define xFixedMod2(f)		pixman_fixed_mod2(f)
 
 /* whether 't' is a well defined not obviously empty trapezoid */
 #define xTrapezoidValid(t)  ((t)->left.p1.y != (t)->left.p2.y && \
diff --git a/render/picturestr.h b/render/picturestr.h
index f1617f6..aabce84 100644
--- a/render/picturestr.h
+++ b/render/picturestr.h
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * Copyright © 2000 SuSE, Inc.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -26,8 +24,8 @@
 #ifndef _PICTURESTR_H_
 #define _PICTURESTR_H_
 
-#include "glyphstr.h"
 #include "scrnintstr.h"
+#include "glyphstr.h"
 #include "resource.h"
 
 typedef struct _DirectFormat {
@@ -54,13 +52,8 @@ typedef struct _PictFormat {
     IndexFormatRec  index;
 } PictFormatRec;
 
-typedef struct _PictVector {
-    xFixed	    vector[3];
-} PictVector, *PictVectorPtr;
-
-typedef struct _PictTransform {
-    xFixed	    matrix[3][3];
-} PictTransform, *PictTransformPtr;
+typedef struct pixman_vector PictVector, *PictVectorPtr;
+typedef struct pixman_transform PictTransform, *PictTransformPtr;
 
 #define PICT_GRADIENT_STOPTABLE_SIZE 1024
 #define SourcePictTypeSolidFill 0
@@ -68,8 +61,13 @@ typedef struct _PictTransform {
 #define SourcePictTypeRadial 2
 #define SourcePictTypeConical 3
 
+#define SourcePictClassUnknown    0
+#define SourcePictClassHorizontal 1
+#define SourcePictClassVertical   2
+
 typedef struct _PictSolidFill {
     unsigned int type;
+    unsigned int class;
     CARD32 color;
 } PictSolidFill, *PictSolidFillPtr;
 
@@ -80,39 +78,56 @@ typedef struct _PictGradientStop {
 
 typedef struct _PictGradient {
     unsigned int type;
+    unsigned int class;
     int nstops;
     PictGradientStopPtr stops;
-    CARD32 colorTable[PICT_GRADIENT_STOPTABLE_SIZE];
+    int stopRange;
+    CARD32 *colorTable;
+    int colorTableSize;
 } PictGradient, *PictGradientPtr;
 
 typedef struct _PictLinearGradient {
     unsigned int type;
+    unsigned int class;
     int nstops;
     PictGradientStopPtr stops;
-    CARD32 colorTable[PICT_GRADIENT_STOPTABLE_SIZE];
+    int stopRange;
+    CARD32 *colorTable;
+    int colorTableSize;
     xPointFixed p1;
     xPointFixed p2;
 } PictLinearGradient, *PictLinearGradientPtr;
 
+typedef struct _PictCircle {
+    xFixed x;
+    xFixed y;
+    xFixed radius;
+} PictCircle, *PictCirclePtr;
+
 typedef struct _PictRadialGradient {
     unsigned int type;
+    unsigned int class;
     int nstops;
     PictGradientStopPtr stops;
-    CARD32 colorTable[PICT_GRADIENT_STOPTABLE_SIZE];
-    double fx;
-    double fy;
-    double dx;
-    double dy;
-    double a;
-    double m;
-    double b;
+    int stopRange;
+    CARD32 *colorTable;
+    int colorTableSize;
+    PictCircle c1;
+    PictCircle c2;
+    double cdx;
+    double cdy;
+    double dr;
+    double A;
 } PictRadialGradient, *PictRadialGradientPtr;
 
 typedef struct _PictConicalGradient {
     unsigned int type;
+    unsigned int class;
     int nstops;
     PictGradientStopPtr stops;
-    CARD32 colorTable[PICT_GRADIENT_STOPTABLE_SIZE];
+    int stopRange;
+    CARD32 *colorTable;
+    int colorTableSize;
     xPointFixed center;
     xFixed angle;
 } PictConicalGradient, *PictConicalGradientPtr;
@@ -624,6 +639,11 @@ Bool
 PictureTransformPoint3d (PictTransformPtr transform,
                          PictVectorPtr	vector);
 
+CARD32
+PictureGradientColor (PictGradientStopPtr stop1,
+		      PictGradientStopPtr stop2,
+		      CARD32	          x);
+
 void RenderExtensionInit (void);
 
 Bool
@@ -639,6 +659,10 @@ AddTraps (PicturePtr	pPicture,
 	  int		ntraps,
 	  xTrap		*traps);
 
+pixman_image_t *
+PixmanImageFromPicture (PicturePtr pPict,
+			Bool hasClip);
+
 PicturePtr
 CreateSolidPicture (Picture pid,
                     xRenderColor *color,
diff --git a/render/render.c b/render/render.c
index 55f360a..caaa278 100644
--- a/render/render.c
+++ b/render/render.c
@@ -560,7 +560,7 @@ ProcRenderQueryPictIndexValues (ClientPtr client)
     pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 
 						      stuff->format,
 						      PictFormatType,
-						      SecurityReadAccess);
+						      DixReadAccess);
 
     if (!pFormat)
     {
@@ -620,19 +620,21 @@ ProcRenderCreatePicture (ClientPtr client)
     PicturePtr	    pPicture;
     DrawablePtr	    pDrawable;
     PictFormatPtr   pFormat;
-    int		    len;
-    int		    error;
+    int		    len, error, rc;
     REQUEST(xRenderCreatePictureReq);
 
     REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
 
     LEGAL_NEW_RESOURCE(stuff->pid, client);
-    SECURITY_VERIFY_DRAWABLE(pDrawable, stuff->drawable, client,
-			     SecurityWriteAccess);
+    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+			   DixWriteAccess);
+    if (rc != Success)
+	return rc;
+
     pFormat = (PictFormatPtr) SecurityLookupIDByType (client, 
 						      stuff->format,
 						      PictFormatType,
-						      SecurityReadAccess);
+						      DixReadAccess);
     if (!pFormat)
     {
 	client->errorValue = stuff->format;
@@ -666,7 +668,7 @@ ProcRenderChangePicture (ClientPtr client)
     int len;
 
     REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq);
-    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityWriteAccess,
+    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess,
 		    RenderErrBase + BadPicture);
 
     len = client->req_len - (sizeof(xRenderChangePictureReq) >> 2);
@@ -686,7 +688,7 @@ ProcRenderSetPictureClipRectangles (ClientPtr client)
     int		    result;
 
     REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
-    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityWriteAccess,
+    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess,
 		    RenderErrBase + BadPicture);
     if (!pPicture->pDrawable)
         return BadDrawable;
@@ -712,7 +714,7 @@ ProcRenderFreePicture (ClientPtr client)
 
     REQUEST_SIZE_MATCH(xRenderFreePictureReq);
 
-    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityDestroyAccess,
+    VERIFY_PICTURE (pPicture, stuff->picture, client, DixDestroyAccess,
 		    RenderErrBase + BadPicture);
     FreeResource (stuff->picture, RT_NONE);
     return(client->noClientException);
@@ -742,13 +744,13 @@ ProcRenderComposite (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess,
+    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
-    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
 		    RenderErrBase + BadPicture);
-    VERIFY_ALPHA (pMask, stuff->mask, client, SecurityReadAccess, 
+    VERIFY_ALPHA (pMask, stuff->mask, client, DixReadAccess, 
 		  RenderErrBase + BadPicture);
     if ((pSrc->pDrawable && pSrc->pDrawable->pScreen != pDst->pDrawable->pScreen) ||
 	(pMask && pMask->pDrawable && pDst->pDrawable->pScreen != pMask->pDrawable->pScreen))
@@ -788,9 +790,9 @@ ProcRenderTrapezoids (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
 		    RenderErrBase + BadPicture);
-    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess, 
+    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -801,7 +803,7 @@ ProcRenderTrapezoids (ClientPtr client)
 	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
 							  stuff->maskFormat,
 							  PictFormatType,
-							  SecurityReadAccess);
+							  DixReadAccess);
 	if (!pFormat)
 	{
 	    client->errorValue = stuff->maskFormat;
@@ -835,9 +837,9 @@ ProcRenderTriangles (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
 		    RenderErrBase + BadPicture);
-    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess, 
+    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -848,7 +850,7 @@ ProcRenderTriangles (ClientPtr client)
 	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
 							  stuff->maskFormat,
 							  PictFormatType,
-							  SecurityReadAccess);
+							  DixReadAccess);
 	if (!pFormat)
 	{
 	    client->errorValue = stuff->maskFormat;
@@ -882,9 +884,9 @@ ProcRenderTriStrip (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
 		    RenderErrBase + BadPicture);
-    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess, 
+    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -895,7 +897,7 @@ ProcRenderTriStrip (ClientPtr client)
 	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
 							  stuff->maskFormat,
 							  PictFormatType,
-							  SecurityReadAccess);
+							  DixReadAccess);
 	if (!pFormat)
 	{
 	    client->errorValue = stuff->maskFormat;
@@ -929,9 +931,9 @@ ProcRenderTriFan (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
 		    RenderErrBase + BadPicture);
-    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess, 
+    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -942,7 +944,7 @@ ProcRenderTriFan (ClientPtr client)
 	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
 							  stuff->maskFormat,
 							  PictFormatType,
-							  SecurityReadAccess);
+							  DixReadAccess);
 	if (!pFormat)
 	{
 	    client->errorValue = stuff->maskFormat;
@@ -994,7 +996,7 @@ ProcRenderCreateGlyphSet (ClientPtr client)
     format = (PictFormatPtr) SecurityLookupIDByType (client,
 						     stuff->format,
 						     PictFormatType,
-						     SecurityReadAccess);
+						     DixReadAccess);
     if (!format)
     {
 	client->errorValue = stuff->format;
@@ -1042,7 +1044,7 @@ ProcRenderReferenceGlyphSet (ClientPtr client)
     glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 						     stuff->existing,
 						     GlyphSetType,
-						     SecurityWriteAccess);
+						     DixWriteAccess);
     if (!glyphSet)
     {
 	client->errorValue = stuff->existing;
@@ -1067,7 +1069,7 @@ ProcRenderFreeGlyphSet (ClientPtr client)
     glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 						     stuff->glyphset,
 						     GlyphSetType,
-						     SecurityDestroyAccess);
+						     DixDestroyAccess);
     if (!glyphSet)
     {
 	client->errorValue = stuff->glyphset;
@@ -1101,7 +1103,7 @@ ProcRenderAddGlyphs (ClientPtr client)
     glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 						     stuff->glyphset,
 						     GlyphSetType,
-						     SecurityWriteAccess);
+						     DixWriteAccess);
     if (!glyphSet)
     {
 	client->errorValue = stuff->glyphset;
@@ -1205,7 +1207,7 @@ ProcRenderFreeGlyphs (ClientPtr client)
     glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 						     stuff->glyphset,
 						     GlyphSetType,
-						     SecurityWriteAccess);
+						     DixWriteAccess);
     if (!glyphSet)
     {
 	client->errorValue = stuff->glyphset;
@@ -1260,9 +1262,9 @@ ProcRenderCompositeGlyphs (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess,
+    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess,
 		    RenderErrBase + BadPicture);
-    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess,
+    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess,
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -1273,7 +1275,7 @@ ProcRenderCompositeGlyphs (ClientPtr client)
 	pFormat = (PictFormatPtr) SecurityLookupIDByType (client,
 							  stuff->maskFormat,
 							  PictFormatType,
-							  SecurityReadAccess);
+							  DixReadAccess);
 	if (!pFormat)
 	{
 	    client->errorValue = stuff->maskFormat;
@@ -1286,7 +1288,7 @@ ProcRenderCompositeGlyphs (ClientPtr client)
     glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 						     stuff->glyphset,
 						     GlyphSetType,
-						     SecurityReadAccess);
+						     DixReadAccess);
     if (!glyphSet)
     {
 	client->errorValue = stuff->glyphset;
@@ -1348,7 +1350,7 @@ ProcRenderCompositeGlyphs (ClientPtr client)
 		glyphSet = (GlyphSetPtr) SecurityLookupIDByType (client,
 								 gs,
 								 GlyphSetType,
-								 SecurityReadAccess);
+								 DixReadAccess);
 		if (!glyphSet)
 		{
 		    client->errorValue = gs;
@@ -1429,7 +1431,7 @@ ProcRenderFillRectangles (ClientPtr client)
 	client->errorValue = stuff->op;
 	return BadValue;
     }
-    VERIFY_PICTURE (pDst, stuff->dst, client, SecurityWriteAccess, 
+    VERIFY_PICTURE (pDst, stuff->dst, client, DixWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pDst->pDrawable)
         return BadDrawable;
@@ -1495,7 +1497,7 @@ ProcRenderCreateCursor (ClientPtr client)
     REQUEST_SIZE_MATCH (xRenderCreateCursorReq);
     LEGAL_NEW_RESOURCE(stuff->cid, client);
     
-    VERIFY_PICTURE (pSrc, stuff->src, client, SecurityReadAccess, 
+    VERIFY_PICTURE (pSrc, stuff->src, client, DixReadAccess, 
 		    RenderErrBase + BadPicture);
     if (!pSrc->pDrawable)
         return BadDrawable;
@@ -1677,7 +1679,7 @@ ProcRenderSetPictureTransform (ClientPtr client)
     int		result;
 
     REQUEST_SIZE_MATCH(xRenderSetPictureTransformReq);
-    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityWriteAccess,
+    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess,
 		    RenderErrBase + BadPicture);
     result = SetPictureTransform (pPicture, (PictTransform *) &stuff->transform);
     if (client->noClientException != Success)
@@ -1696,14 +1698,15 @@ ProcRenderQueryFilters (ClientPtr client)
     int				nnames;
     ScreenPtr			pScreen;
     PictureScreenPtr		ps;
-    int				i, j;
-    int				len;
-    int				total_bytes;
+    int				i, j, len, total_bytes, rc;
     INT16			*aliases;
     char			*names;
 
     REQUEST_SIZE_MATCH(xRenderQueryFiltersReq);
-    SECURITY_VERIFY_DRAWABLE(pDrawable, stuff->drawable, client, SecurityReadAccess);
+    rc = dixLookupDrawable(&pDrawable, stuff->drawable, client, 0,
+			   DixReadAccess);
+    if (rc != Success)
+	return rc;
     
     pScreen = pDrawable->pScreen;
     nbytesName = 0;
@@ -1806,7 +1809,7 @@ ProcRenderSetPictureFilter (ClientPtr client)
     char	*name;
     
     REQUEST_AT_LEAST_SIZE (xRenderSetPictureFilterReq);
-    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityWriteAccess,
+    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess,
 		    RenderErrBase + BadPicture);
     name = (char *) (stuff + 1);
     params = (xFixed *) (name + ((stuff->nbytes + 3) & ~3));
@@ -1840,7 +1843,7 @@ ProcRenderCreateAnimCursor (ClientPtr client)
     for (i = 0; i < ncursor; i++)
     {
 	cursors[i] = (CursorPtr)SecurityLookupIDByType(client, elt->cursor,
-						       RT_CURSOR, SecurityReadAccess);
+						       RT_CURSOR, DixReadAccess);
 	if (!cursors[i])
 	{
 	    xfree (cursors);
@@ -1868,7 +1871,7 @@ ProcRenderAddTraps (ClientPtr client)
     REQUEST(xRenderAddTrapsReq);
 
     REQUEST_AT_LEAST_SIZE(xRenderAddTrapsReq);
-    VERIFY_PICTURE (pPicture, stuff->picture, client, SecurityWriteAccess, 
+    VERIFY_PICTURE (pPicture, stuff->picture, client, DixWriteAccess, 
 		    RenderErrBase + BadPicture);
     if (!pPicture->pDrawable)
         return BadDrawable;
@@ -2071,6 +2074,8 @@ SProcRenderSetPictureClipRectangles (ClientPtr client)
     REQUEST(xRenderSetPictureClipRectanglesReq);
     swaps(&stuff->length, n);
     swapl(&stuff->picture, n);
+    swaps(&stuff->xOrigin, n);
+    swaps(&stuff->yOrigin, n);
     SwapRestS(stuff);
     return (*ProcRenderVector[stuff->renderReqType]) (client);
 }
@@ -2623,7 +2628,7 @@ PanoramiXRenderCreatePicture (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq);
     if(!(refDraw = (PanoramiXRes *)SecurityLookupIDByClass(
-		client, stuff->drawable, XRC_DRAWABLE, SecurityWriteAccess)))
+		client, stuff->drawable, XRC_DRAWABLE, DixWriteAccess)))
 	return BadDrawable;
     if(!(newPict = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes))))
 	return BadAlloc;
@@ -2665,7 +2670,7 @@ PanoramiXRenderChangePicture (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
     
-    VERIFY_XIN_PICTURE(pict, stuff->picture, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
 		       RenderErrBase + BadPicture);
     
     FOR_NSCREENS_BACKWARD(j) {
@@ -2686,7 +2691,7 @@ PanoramiXRenderSetPictureClipRectangles (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
     
-    VERIFY_XIN_PICTURE(pict, stuff->picture, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
 		       RenderErrBase + BadPicture);
     
     FOR_NSCREENS_BACKWARD(j) {
@@ -2707,7 +2712,7 @@ PanoramiXRenderSetPictureTransform (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xRenderSetPictureTransformReq);
     
-    VERIFY_XIN_PICTURE(pict, stuff->picture, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
 		       RenderErrBase + BadPicture);
     
     FOR_NSCREENS_BACKWARD(j) {
@@ -2728,7 +2733,7 @@ PanoramiXRenderSetPictureFilter (ClientPtr client)
 
     REQUEST_AT_LEAST_SIZE(xRenderSetPictureFilterReq);
     
-    VERIFY_XIN_PICTURE(pict, stuff->picture, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixWriteAccess,
 		       RenderErrBase + BadPicture);
     
     FOR_NSCREENS_BACKWARD(j) {
@@ -2751,7 +2756,7 @@ PanoramiXRenderFreePicture (ClientPtr client)
 
     client->errorValue = stuff->picture;
 
-    VERIFY_XIN_PICTURE(pict, stuff->picture, client, SecurityDestroyAccess,
+    VERIFY_XIN_PICTURE(pict, stuff->picture, client, DixDestroyAccess,
 		       RenderErrBase + BadPicture);
     
 
@@ -2777,11 +2782,11 @@ PanoramiXRenderComposite (ClientPtr client)
 
     REQUEST_SIZE_MATCH(xRenderCompositeReq);
     
-    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess, 
+    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess, 
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_ALPHA (msk, stuff->mask, client, SecurityReadAccess, 
+    VERIFY_XIN_ALPHA (msk, stuff->mask, client, DixReadAccess, 
 		      RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess, 
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 
 			RenderErrBase + BadPicture);
     
     orig = *stuff;
@@ -2825,9 +2830,9 @@ PanoramiXRenderCompositeGlyphs (ClientPtr client)
     INT16	    xSrc, ySrc;
 
     REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq);
-    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess,
+    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
 			RenderErrBase + BadPicture);
 
     if (client->req_len << 2 >= (sizeof (xRenderCompositeGlyphsReq) +
@@ -2868,7 +2873,7 @@ PanoramiXRenderFillRectangles (ClientPtr client)
     int		    extra_len;
 
     REQUEST_AT_LEAST_SIZE (xRenderFillRectanglesReq);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess, 
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess, 
 			RenderErrBase + BadPicture);
     extra_len = (client->req_len << 2) - sizeof (xRenderFillRectanglesReq);
     if (extra_len &&
@@ -2915,9 +2920,9 @@ PanoramiXRenderTrapezoids(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderTrapezoidsReq);
     
-    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess,
+    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTrapezoidsReq);
@@ -2977,9 +2982,9 @@ PanoramiXRenderTriangles(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderTrianglesReq);
     
-    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess,
+    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTrianglesReq);
@@ -3035,9 +3040,9 @@ PanoramiXRenderTriStrip(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderTriStripReq);
     
-    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess,
+    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTriStripReq);
@@ -3089,9 +3094,9 @@ PanoramiXRenderTriFan(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderTriFanReq);
     
-    VERIFY_XIN_PICTURE (src, stuff->src, client, SecurityReadAccess,
+    VERIFY_XIN_PICTURE (src, stuff->src, client, DixReadAccess,
 			RenderErrBase + BadPicture);
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderTriFanReq);
@@ -3145,7 +3150,7 @@ PanoramiXRenderColorTrapezoids(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderColorTrapezoidsReq);
     
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderColorTrapezoidsReq);
@@ -3189,7 +3194,7 @@ PanoramiXRenderColorTriangles(ClientPtr client)
     
     REQUEST_AT_LEAST_SIZE (xRenderColorTrianglesReq);
     
-    VERIFY_XIN_PICTURE (dst, stuff->dst, client, SecurityWriteAccess,
+    VERIFY_XIN_PICTURE (dst, stuff->dst, client, DixWriteAccess,
 			RenderErrBase + BadPicture);
 
     extra_len = (client->req_len << 2) - sizeof (xRenderColorTrianglesReq);
@@ -3235,7 +3240,7 @@ PanoramiXRenderAddTraps (ClientPtr client)
     INT16    	    x_off, y_off;
 
     REQUEST_AT_LEAST_SIZE (xRenderAddTrapsReq);
-    VERIFY_XIN_PICTURE (picture, stuff->picture, client, SecurityWriteAccess, 
+    VERIFY_XIN_PICTURE (picture, stuff->picture, client, DixWriteAccess, 
 			RenderErrBase + BadPicture);
     extra_len = (client->req_len << 2) - sizeof (xRenderAddTrapsReq);
     if (extra_len &&
diff --git a/render/renderedge.c b/render/renderedge.c
index 199ec22..d0ee307 100644
--- a/render/renderedge.c
+++ b/render/renderedge.c
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * Copyright © 2004 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -36,16 +34,7 @@
 _X_EXPORT xFixed
 RenderSampleCeilY (xFixed y, int n)
 {
-    xFixed   f = xFixedFrac(y);
-    xFixed   i = xFixedFloor(y);
-    
-    f = ((f + Y_FRAC_FIRST(n)) / STEP_Y_SMALL(n)) * STEP_Y_SMALL(n) + Y_FRAC_FIRST(n);
-    if (f > Y_FRAC_LAST(n))
-    {
-	f = Y_FRAC_FIRST(n);
-	i += xFixed1;
-    }
-    return (i | f);
+    return pixman_sample_ceil_y (y, n);
 }
 
 #define _div(a,b)    ((a) >= 0 ? (a) / (b) : -((-(a) + (b) - 1) / (b)))
@@ -57,16 +46,7 @@ RenderSampleCeilY (xFixed y, int n)
 _X_EXPORT xFixed
 RenderSampleFloorY (xFixed y, int n)
 {
-    xFixed   f = xFixedFrac(y);
-    xFixed   i = xFixedFloor (y);
-    
-    f = _div(f - Y_FRAC_FIRST(n), STEP_Y_SMALL(n)) * STEP_Y_SMALL(n) + Y_FRAC_FIRST(n);
-    if (f < Y_FRAC_FIRST(n))
-    {
-	f = Y_FRAC_LAST(n);
-	i -= xFixed1;
-    }
-    return (i | f);
+    return pixman_sample_floor_y (y, n);
 }
 
 /*
@@ -75,52 +55,7 @@ RenderSampleFloorY (xFixed y, int n)
 _X_EXPORT void
 RenderEdgeStep (RenderEdge *e, int n)
 {
-    xFixed_48_16	ne;
-
-    e->x += n * e->stepx;
-    
-    ne = e->e + n * (xFixed_48_16) e->dx;
-    
-    if (n >= 0)
-    {
-	if (ne > 0)
-	{
-	    int nx = (ne + e->dy - 1) / e->dy;
-	    e->e = ne - nx * (xFixed_48_16) e->dy;
-	    e->x += nx * e->signdx;
-	}
-    }
-    else
-    {
-	if (ne <= -e->dy)
-	{
-	    int nx = (-ne) / e->dy;
-	    e->e = ne + nx * (xFixed_48_16) e->dy;
-	    e->x -= nx * e->signdx;
-	}
-    }
-}
-
-/*
- * A private routine to initialize the multi-step
- * elements of an edge structure
- */
-static void
-_RenderEdgeMultiInit (RenderEdge *e, int n, xFixed *stepx_p, xFixed *dx_p)
-{
-    xFixed	stepx;
-    xFixed_48_16	ne;
-    
-    ne = n * (xFixed_48_16) e->dx;
-    stepx = n * e->stepx;
-    if (ne > 0)
-    {
-	int nx = ne / e->dy;
-	ne -= nx * e->dy;
-	stepx += nx * e->signdx;
-    }
-    *dx_p = ne;
-    *stepx_p = stepx;
+    pixman_edge_step (e, n);
 }
 
 /*
@@ -136,34 +71,7 @@ RenderEdgeInit (RenderEdge	*e,
 		xFixed		x_bot,
 		xFixed		y_bot)
 {
-    xFixed	dx, dy;
-
-    e->x = x_top;
-    e->e = 0;
-    dx = x_bot - x_top;
-    dy = y_bot - y_top;
-    e->dy = dy;
-    if (dy)
-    {
-	if (dx >= 0)
-	{
-	    e->signdx = 1;
-	    e->stepx = dx / dy;
-	    e->dx = dx % dy;
-	    e->e = -dy;
-	}
-	else
-	{
-	    e->signdx = -1;
-	    e->stepx = -(-dx / dy);
-	    e->dx = -dx % dy;
-	    e->e = 0;
-	}
-    
-	_RenderEdgeMultiInit (e, STEP_Y_SMALL(n), &e->stepx_small, &e->dx_small);
-	_RenderEdgeMultiInit (e, STEP_Y_BIG(n), &e->stepx_big, &e->dx_big);
-    }
-    RenderEdgeStep (e, y_start - y_top);
+    pixman_edge_init (e, n, y_start, x_top, y_top, x_bot, y_bot);
 }
 
 /*
@@ -178,24 +86,6 @@ RenderLineFixedEdgeInit (RenderEdge *e,
 			 int	    x_off,
 			 int	    y_off)
 {
-    xFixed	x_off_fixed = IntToxFixed(x_off);
-    xFixed	y_off_fixed = IntToxFixed(y_off);
-    xPointFixed	*top, *bot;
-
-    if (line->p1.y <= line->p2.y)
-    {
-	top = &line->p1;
-	bot = &line->p2;
-    }
-    else
-    {
-	top = &line->p2;
-	bot = &line->p1;
-    }
-    RenderEdgeInit (e, n, y,
-		    top->x + x_off_fixed,
-		    top->y + y_off_fixed,
-		    bot->x + x_off_fixed,
-		    bot->y + y_off_fixed);
+    pixman_line_fixed_edge_init (e, n, y, (pixman_line_fixed_t *)line, x_off, y_off);
 }
 
diff --git a/render/renderedge.h b/render/renderedge.h
index d621d9d..644d9d9 100644
--- a/render/renderedge.h
+++ b/render/renderedge.h
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * Copyright © 2004 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -50,20 +48,7 @@
  * and can be quickly stepped across small or large gaps in the
  * sample grid
  */
-
-typedef struct {
-    xFixed   x;
-    xFixed   e;
-    xFixed   stepx;
-    xFixed   signdx;
-    xFixed   dy;
-    xFixed   dx;
-
-    xFixed   stepx_small;
-    xFixed   stepx_big;
-    xFixed   dx_small;
-    xFixed   dx_big;
-} RenderEdge;
+typedef pixman_edge_t RenderEdge;
 
 /*
  * Step across a small sample grid gap
commit b1927d88d588ff1d5dd37eefb02508d04dc2f750
Author: Jeremy Huddleston <jeremy at tifa.local>
Date:   Mon Feb 11 12:24:14 2008 -0800

    Updated configure.ac for pixman

diff --git a/configure.ac b/configure.ac
index fb277dc..728c54a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -604,9 +604,13 @@ XEXT_INC='-I$(top_srcdir)/Xext'
 XEXT_LIB='$(top_builddir)/Xext/libXext.la'
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
+PIXMAN="[pixman-1 >= 0.9.5]"
+PKG_CHECK_MODULES(PIXMAN, $PIXMAN)
+AC_SUBST(PIXMAN_CFLAGS)
+
 dnl Core modules for most extensions, et al.
 REQUIRED_MODULES="[randrproto >= 1.2] renderproto [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto xextproto xproto xtrans xf86miscproto xf86vidmodeproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto [kbproto >= 1.0.3]"
-REQUIRED_LIBS="xfont xau fontenc"
+REQUIRED_LIBS="xfont xau fontenc $PIXMAN"
 
 AM_CONDITIONAL(XV, [test "x$XV" = xyes])
 if test "x$XV" = xyes; then
@@ -1028,7 +1032,7 @@ dnl ---------------------------------------------------------------------------
 dnl DMX DDX
 
 AC_MSG_CHECKING([whether to build Xdmx DDX])
-PKG_CHECK_MODULES([DMXMODULES], [xmuu xext x11 xrender xfixes xfont xi dmxproto xau $XDMCP_MODULES], [have_dmx=yes], [have_dmx=no])
+PKG_CHECK_MODULES([DMXMODULES], [xmuu xext x11 xrender xfixes xfont xi dmxproto xau $XDMCP_MODULES $PIXMAN], [have_dmx=yes], [have_dmx=no])
 if test "x$DMX" = xauto; then
 	DMX="$have_dmx"
 fi
@@ -1498,7 +1502,7 @@ AC_MSG_CHECKING([whether to build Xprint DDX])
 AC_MSG_RESULT([$XPRINT])
 
 if test "x$XPRINT" = xyes; then
-	PKG_CHECK_MODULES([XPRINT], [printproto x11 xfont $XDMCP_MODULES xau])
+	PKG_CHECK_MODULES([XPRINT], [printproto x11 xfont $XDMCP_MODULES xau $PIXMAN])
 	XPRINT_EXTENSIONS="$XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $RENDER_LIB $COMPOSITE_LIB $RANDR_LIB $XI_LIB $FIXES_LIB $DAMAGE_LIB $XI_LIB $GLX_LIBS"
 	XPRINT_LIBS="$DIX_LIB $XPRINT_LIBS $XKB_LIB $XKB_STUB_LIB $XPRINT_EXTENSIONS $MI_LIB $MIEXT_DAMAGE_LIB $CWRAP_LIB $OS_LIB"
 	AC_SUBST([XPRINT_CFLAGS])
@@ -1852,6 +1856,7 @@ AC_ARG_ENABLE(xorgcfg, AS_HELP_STRING([--enable-xorgcfg],
 if test x$XORGCFG = xyes ; then
 	PKG_CHECK_MODULES([XORGCFG_DEP], 
 	    [xkbui >= 1.0.2 xkbfile xxf86misc xxf86vm xaw7 xmu xt xpm xext x11])
+	XORGCFG_DEP_CFLAGS="$XORGCFG_DEP_CFLAGS $PIXMAN_CFLAGS"
 	AC_CHECK_LIB([curses],[waddstr],
 	    [XORGCFG_DEP_LIBS="$XORGCFG_DEP_LIBS -lcurses"; CURSES=yes],
 	    AC_CHECK_LIB([ncurses],[waddstr],
commit 7021577a86be1921e8bc7451230480c429f13d8a
Author: Jeremy Huddleston <jeremy at tifa.local>
Date:   Mon Feb 11 12:18:15 2008 -0800

    fb: Pulled in all changes to fb from xorg-server-1.4-apple.

diff --git a/fb/Makefile.am b/fb/Makefile.am
index 11b2d2f..75861a3 100644
--- a/fb/Makefile.am
+++ b/fb/Makefile.am
@@ -1,4 +1,4 @@
-noinst_LTLIBRARIES = libfb.la libfbmmx.la
+noinst_LTLIBRARIES = libfb.la libwfb.la
 
 INCLUDES = \
 	-I$(top_srcdir)/hw/xfree86/os-support \
@@ -7,25 +7,12 @@ INCLUDES = \
 AM_CFLAGS = $(DIX_CFLAGS)
 
 if XORG
-sdk_HEADERS = fb.h fbrop.h fbpseudocolor.h fboverlay.h
+sdk_HEADERS = fb.h fbrop.h fbpseudocolor.h fboverlay.h wfbrename.h
 endif
 
-if MMX_CAPABLE
-AM_CFLAGS += -DUSE_MMX
+libfb_la_CFLAGS = $(AM_CFLAGS)
 
-libfbmmx_la_CFLAGS =				\
-	$(DIX_CFLAGS)				\
-	-DUSE_MMX				\
-	-mmmx					\
-	-msse					\
-	-Winline				\
-	--param inline-unit-growth=10000	\
-        --param large-function-growth=10000
-endif
-
-libfbmmx_la_SOURCES =	\
-	fbmmx.c		\
-	fbmmx.h
+libwfb_la_CFLAGS = $(AM_CFLAGS) -DFB_ACCESS_WRAPPER
 
 libfb_la_SOURCES = 	\
 	fb.h		\
@@ -38,7 +25,6 @@ libfb_la_SOURCES = 	\
 	fbblt.c		\
 	fbbltone.c	\
 	fbbstore.c	\
-	fbcompose.c	\
 	fbcopy.c	\
 	fbfill.c	\
 	fbfillrect.c	\
@@ -66,10 +52,8 @@ libfb_la_SOURCES = 	\
 	fbutil.c	\
 	fbwindow.c	\
 	fbpseudocolor.c \
-	fbpseudocolor.h \
-	fbedge.c	\
-	fbedgeimp.h
+	fbpseudocolor.h
 
-libfb_la_LIBADD = libfbmmx.la
+libwfb_la_SOURCES = $(libfb_la_SOURCES)
 
-EXTRA_DIST = fbcmap.c
+EXTRA_DIST = fbcmap.c fbcmap_mi.c
diff --git a/fb/fb.h b/fb/fb.h
index ce0729c..65fa173 100644
--- a/fb/fb.h
+++ b/fb/fb.h
@@ -26,6 +26,8 @@
 #define _FB_H_
 
 #include <X11/X.h>
+#include <pixman.h>
+
 #include "scrnintstr.h"
 #include "pixmap.h"
 #include "pixmapstr.h"
@@ -44,6 +46,39 @@
 #include "picture.h"
 #endif
 
+#ifdef FB_ACCESS_WRAPPER
+
+#include "wfbrename.h"
+#define FBPREFIX(x) wfb##x
+#define WRITE(ptr, val) ((*wfbWriteMemory)((ptr), (val), sizeof(*(ptr))))
+#define READ(ptr) ((*wfbReadMemory)((ptr), sizeof(*(ptr))))
+
+#define MEMCPY_WRAPPED(dst, src, size) do {                       \
+    size_t _i;                                                    \
+    CARD8 *_dst = (CARD8*)(dst), *_src = (CARD8*)(src);           \
+    for(_i = 0; _i < size; _i++) {                                \
+        WRITE(_dst +_i, READ(_src + _i));                         \
+    }                                                             \
+} while(0)
+
+#define MEMSET_WRAPPED(dst, val, size) do {                       \
+    size_t _i;                                                    \
+    CARD8 *_dst = (CARD8*)(dst);                                  \
+    for(_i = 0; _i < size; _i++) {                                \
+        WRITE(_dst +_i, (val));                                   \
+    }                                                             \
+} while(0)
+
+#else
+
+#define FBPREFIX(x) fb##x
+#define WRITE(ptr, val) (*(ptr) = (val))
+#define READ(ptr) (*(ptr))
+#define MEMCPY_WRAPPED(dst, src, size) memcpy((dst), (src), (size))
+#define MEMSET_WRAPPED(dst, val, size) memset((dst), (val), (size))
+
+#endif
+
 /*
  * This single define controls the basic size of data manipulated
  * by this software; it must be log2(sizeof (FbBits) * 8)
@@ -133,11 +168,10 @@ typedef CARD32		    FbStip;
 
 typedef int		    FbStride;
 
-int fb_null_pointer(char *file, unsigned int line);
-
 #define CHECK_NULL(ptr) \
   if ((ptr) == NULL) {\
-    if (fb_null_pointer(__FILE__, __LINE__)) return; \
+    ErrorF("%s:%d: null pointer\n", __FILE__, __LINE__); \
+    return; \
   }
 
 #ifdef FB_DEBUG
@@ -228,8 +262,8 @@ extern void fbSetBits (FbStip *bits, int stride, FbStip data);
 
 #define FbPtrOffset(p,o,t)		((t *) ((CARD8 *) (p) + (o)))
 #define FbSelectPatternPart(xor,o,t)	((xor) >> (FbPatternOffset (o,t) << 3))
-#define FbStorePart(dst,off,t,xor)	(*FbPtrOffset(dst,off,t) = \
-					 FbSelectPart(xor,off,t))
+#define FbStorePart(dst,off,t,xor)	(WRITE(FbPtrOffset(dst,off,t), \
+					 FbSelectPart(xor,off,t)))
 #ifndef FbSelectPart
 #define FbSelectPart(x,o,t) FbSelectPatternPart(x,o,t)
 #endif
@@ -409,7 +443,7 @@ extern void fbSetBits (FbStip *bits, int stride, FbStip data);
 	FbStorePart(dst,sizeof (FbBits) - 1,CARD8,xor); \
 	break; \
     default: \
-	*dst = FbDoMaskRRop(*dst, and, xor, l); \
+	WRITE(dst, FbDoMaskRRop(READ(dst), and, xor, l)); \
 	break; \
     } \
 }
@@ -429,7 +463,7 @@ extern void fbSetBits (FbStip *bits, int stride, FbStip data);
 	break; \
     FbDoRightMaskByteRRop6Cases(dst,xor) \
     default: \
-	*dst = FbDoMaskRRop (*dst, and, xor, r); \
+	WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, r)); \
     } \
 }
 #endif
@@ -461,20 +495,20 @@ extern void fbSetBits (FbStip *bits, int stride, FbStip data);
  * The term "lane" comes from the hardware term "byte-lane" which
  */
 
-#define FbLaneCase1(n,a,o)  ((n) == 0x01 ? \
-			     (*(CARD8 *) ((a)+FbPatternOffset(o,CARD8)) = \
-			      fgxor) : 0)
-#define FbLaneCase2(n,a,o)  ((n) == 0x03 ? \
-			     (*(CARD16 *) ((a)+FbPatternOffset(o,CARD16)) = \
+#define FbLaneCase1(n,a,o)  ((n) == 0x01 ? (void) \
+			     WRITE((CARD8 *) ((a)+FbPatternOffset(o,CARD8)), \
+			      fgxor) : (void) 0)
+#define FbLaneCase2(n,a,o)  ((n) == 0x03 ? (void) \
+			     WRITE((CARD16 *) ((a)+FbPatternOffset(o,CARD16)), \
 			      fgxor) : \
 			     ((void)FbLaneCase1((n)&1,a,o), \
 				    FbLaneCase1((n)>>1,a,(o)+1)))
-#define FbLaneCase4(n,a,o)  ((n) == 0x0f ? \
-			     (*(CARD32 *) ((a)+FbPatternOffset(o,CARD32)) = \
+#define FbLaneCase4(n,a,o)  ((n) == 0x0f ? (void) \
+			     WRITE((CARD32 *) ((a)+FbPatternOffset(o,CARD32)), \
 			      fgxor) : \
 			     ((void)FbLaneCase2((n)&3,a,o), \
 				    FbLaneCase2((n)>>2,a,(o)+2)))
-#define FbLaneCase8(n,a,o)  ((n) == 0x0ff ? (*(FbBits *) ((a)+(o)) = fgxor) : \
+#define FbLaneCase8(n,a,o)  ((n) == 0x0ff ? (void) (*(FbBits *) ((a)+(o)) = fgxor) : \
 			     ((void)FbLaneCase4((n)&15,a,o), \
 				    FbLaneCase4((n)>>4,a,(o)+4)))
 
@@ -580,20 +614,36 @@ extern int	fbGetWinPrivateIndex(void);
 extern const GCOps	fbGCOps;
 extern const GCFuncs	fbGCFuncs;
 
-#ifdef TEKX11
-#define FB_OLD_GC
-#define FB_OLD_SCREEN
+#ifdef FB_24_32BIT
+#define FB_SCREEN_PRIVATE
 #endif
 
-#ifdef FB_OLD_SCREEN
-# define FB_OLD_MISCREENINIT	/* miScreenInit requires 14 args, not 13 */
-extern WindowPtr    *WindowTable;
-#endif
+/* Framebuffer access wrapper */
+typedef FbBits (*ReadMemoryProcPtr)(const void *src, int size);
+typedef void (*WriteMemoryProcPtr)(void *dst, FbBits value, int size);
+typedef void (*SetupWrapProcPtr)(ReadMemoryProcPtr  *pRead,
+                                 WriteMemoryProcPtr *pWrite,
+                                 DrawablePtr         pDraw);
+typedef void (*FinishWrapProcPtr)(DrawablePtr pDraw);
+
+#ifdef FB_ACCESS_WRAPPER
+
+#define fbPrepareAccess(pDraw) \
+	fbGetScreenPrivate((pDraw)->pScreen)->setupWrap( \
+		&wfbReadMemory, \
+		&wfbWriteMemory, \
+		(pDraw))
+#define fbFinishAccess(pDraw) \
+	fbGetScreenPrivate((pDraw)->pScreen)->finishWrap(pDraw)
+
+#else
+
+#define fbPrepareAccess(pPix)
+#define fbFinishAccess(pDraw)
 
-#ifdef FB_24_32BIT
-#define FB_SCREEN_PRIVATE
 #endif
 
+
 #ifdef FB_SCREEN_PRIVATE
 extern int	fbScreenPrivateIndex;
 extern int	fbGetScreenPrivateIndex(void);
@@ -602,6 +652,10 @@ extern int	fbGetScreenPrivateIndex(void);
 typedef struct {
     unsigned char	win32bpp;	/* window bpp for 32-bpp images */
     unsigned char	pix32bpp;	/* pixmap bpp for 32-bpp images */
+#ifdef FB_ACCESS_WRAPPER
+    SetupWrapProcPtr	setupWrap;	/* driver hook to set pixmap access wrapping */
+    FinishWrapProcPtr	finishWrap;	/* driver hook to clean up pixmap access wrapping */
+#endif
 } FbScreenPrivRec, *FbScreenPrivPtr;
 
 #define fbGetScreenPrivate(pScreen) ((FbScreenPrivPtr) \
@@ -610,15 +664,6 @@ typedef struct {
 
 /* private field of GC */
 typedef struct {
-#ifdef FB_OLD_GC
-    unsigned char       pad1;
-    unsigned char       pad2;
-    unsigned char       pad3;
-    unsigned		fExpose:1;
-    unsigned		freeCompClip:1;
-    PixmapPtr		pRotatedPixmap;
-    RegionPtr		pCompositeClip;
-#endif    
     FbBits		and, xor;	/* reduced rop values */
     FbBits		bgand, bgxor;	/* for stipples */
     FbBits		fg, bg, pm;	/* expanded and filled */
@@ -631,17 +676,10 @@ typedef struct {
 #define fbGetGCPrivate(pGC)	((FbGCPrivPtr)\
 	(pGC)->devPrivates[fbGetGCPrivateIndex()].ptr)
 
-#ifdef FB_OLD_GC
-#define fbGetCompositeClip(pGC) (fbGetGCPrivate(pGC)->pCompositeClip)
-#define fbGetExpose(pGC)	(fbGetGCPrivate(pGC)->fExpose)
-#define fbGetFreeCompClip(pGC)	(fbGetGCPrivate(pGC)->freeCompClip)
-#define fbGetRotatedPixmap(pGC)	(fbGetGCPrivate(pGC)->pRotatedPixmap)
-#else
 #define fbGetCompositeClip(pGC) ((pGC)->pCompositeClip)
 #define fbGetExpose(pGC)	((pGC)->fExpose)
 #define fbGetFreeCompClip(pGC)	((pGC)->freeCompClip)
 #define fbGetRotatedPixmap(pGC)	((pGC)->pRotatedPixmap)
-#endif
 
 #define fbGetScreenPixmap(s)	((PixmapPtr) (s)->devPrivate)
 #ifdef FB_NO_WINDOW_PIXMAPS
@@ -680,6 +718,7 @@ typedef struct {
 	(xoff) = __fbPixOffXPix(_pPix); \
 	(yoff) = __fbPixOffYPix(_pPix); \
     } \
+    fbPrepareAccess(pDrawable); \
     (pointer) = (FbBits *) _pPix->devPrivate.ptr; \
     (stride) = ((int) _pPix->devKind) / sizeof (FbBits); (void)(stride); \
     (bpp) = _pPix->drawable.bitsPerPixel;  (void)(bpp); \
@@ -697,6 +736,7 @@ typedef struct {
 	(xoff) = __fbPixOffXPix(_pPix); \
 	(yoff) = __fbPixOffYPix(_pPix); \
     } \
+    fbPrepareAccess(pDrawable); \
     (pointer) = (FbStip *) _pPix->devPrivate.ptr; \
     (stride) = ((int) _pPix->devKind) / sizeof (FbStip); (void)(stride); \
     (bpp) = _pPix->drawable.bitsPerPixel; (void)(bpp); \
@@ -716,12 +756,6 @@ typedef struct {
     ((pDrawable)->type == DRAWABLE_PIXMAP ? \
      TRUE : fbWindowEnabled((WindowPtr) pDrawable))
 
-#ifdef FB_OLD_SCREEN
-#define BitsPerPixel(d) (\
-    ((1 << PixmapWidthPaddingInfo[d].padBytesLog2) * 8 / \
-    (PixmapWidthPaddingInfo[d].padRoundUp+1)))
-#endif
-
 #define FbPowerOfTwo(w)	    (((w) & ((w) - 1)) == 0)
 /*
  * Accelerated tiles are power of 2 width <= FB_UNIT
@@ -1285,6 +1319,9 @@ void
 fbClearVisualTypes(void);
 
 Bool
+fbHasVisualTypes (int depth);
+
+Bool
 fbSetVisualTypes (int depth, int visuals, int bitsPerRGB);
 
 Bool
@@ -1728,13 +1765,11 @@ fbQueryBestSize (int class,
 		 unsigned short *width, unsigned short *height,
 		 ScreenPtr pScreen);
 
-#ifndef FB_OLD_SCREEN
 PixmapPtr
 _fbGetWindowPixmap (WindowPtr pWindow);
 
 void
 _fbSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap);
-#endif
 
 Bool
 fbSetupScreen(ScreenPtr	pScreen, 
@@ -1747,6 +1782,30 @@ fbSetupScreen(ScreenPtr	pScreen,
 	      int	bpp);		/* bits per pixel of frame buffer */
 
 Bool
+wfbFinishScreenInit(ScreenPtr	pScreen,
+		    pointer	pbits,
+		    int		xsize,
+		    int		ysize,
+		    int		dpix,
+		    int		dpiy,
+		    int		width,
+		    int		bpp,
+		    SetupWrapProcPtr setupWrap,
+		    FinishWrapProcPtr finishWrap);
+
+Bool
+wfbScreenInit(ScreenPtr	pScreen,
+	      pointer	pbits,
+	      int	xsize,
+	      int	ysize,
+	      int	dpix,
+	      int	dpiy,
+	      int	width,
+	      int	bpp,
+	      SetupWrapProcPtr setupWrap,
+	      FinishWrapProcPtr finishWrap);
+
+Bool
 fbFinishScreenInit(ScreenPtr	pScreen,
 		   pointer	pbits,
 		   int		xsize,
@@ -1946,6 +2005,7 @@ fbEvenTile (FbBits	*dst,
 	    int		height,
 
 	    FbBits	*tile,
+	    FbStride	tileStride,
 	    int		tileHeight,
 
 	    int		alu,
@@ -2002,6 +2062,11 @@ fbReplicatePixel (Pixel p, int bpp);
 void
 fbReduceRasterOp (int rop, FbBits fg, FbBits pm, FbBits *andp, FbBits *xorp);
 
+#ifdef FB_ACCESS_WRAPPER
+extern ReadMemoryProcPtr wfbReadMemory;
+extern WriteMemoryProcPtr wfbWriteMemory;
+#endif
+
 /*
  * fbwindow.c
  */
@@ -2057,4 +2122,9 @@ void
 fbPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what);
 
 
+pixman_image_t *image_from_pict (PicturePtr pict,
+				 Bool       has_clip);
+void free_pixman_pict (PicturePtr, pixman_image_t *);
+
 #endif /* _FB_H_ */
+
diff --git a/fb/fb24_32.c b/fb/fb24_32.c
index 572da48..00b739b 100644
--- a/fb/fb24_32.c
+++ b/fb/fb24_32.c
@@ -38,18 +38,18 @@
  * by reading/writing aligned CARD32s where it's easy
  */
 
-#define Get8(a)	((CARD32) *(a))
+#define Get8(a)	((CARD32) READ(a))
 
 #if BITMAP_BIT_ORDER == MSBFirst
 #define Get24(a)    ((Get8(a) << 16) | (Get8((a)+1) << 8) | Get8((a)+2))
-#define Put24(a,p)  (((a)[0] = (CARD8) ((p) >> 16)), \
-		     ((a)[1] = (CARD8) ((p) >> 8)), \
-		     ((a)[2] = (CARD8) (p)))
+#define Put24(a,p)  ((WRITE((a+0), (CARD8) ((p) >> 16))), \
+		     (WRITE((a+1), (CARD8) ((p) >> 8))), \
+		     (WRITE((a+2), (CARD8) (p))))
 #else
 #define Get24(a)    (Get8(a) | (Get8((a)+1) << 8) | (Get8((a)+2)<<16))
-#define Put24(a,p)  (((a)[0] = (CARD8) (p)), \
-		     ((a)[1] = (CARD8) ((p) >> 8)), \
-		     ((a)[2] = (CARD8) ((p) >> 16)))
+#define Put24(a,p)  ((WRITE((a+0), (CARD8) (p))), \
+		     (WRITE((a+1), (CARD8) ((p) >> 8))), \
+		     (WRITE((a+2), (CARD8) ((p) >> 16))))
 #endif
 
 typedef void (*fb24_32BltFunc) (CARD8	    *srcLine,
@@ -106,7 +106,7 @@ fb24_32BltDown (CARD8	    *srcLine,
 	    while (((long) dst & 3) && w)
 	    {
 		w--;
-		pixel = *src++;
+		pixel = READ(src++);
 		pixel = FbDoDestInvarientMergeRop(pixel);
 		Put24 (dst, pixel);
 		dst += 3;
@@ -115,35 +115,35 @@ fb24_32BltDown (CARD8	    *srcLine,
 	    while (w >= 4)
 	    {
 		CARD32  s0, s1;
-		s0 = *src++;
+		s0 = READ(src++);
 		s0 = FbDoDestInvarientMergeRop(s0);
-		s1 = *src++;
+		s1 = READ(src++);
 		s1 = FbDoDestInvarientMergeRop(s1);
 #if BITMAP_BIT_ORDER == LSBFirst
-		*(CARD32 *)(dst) = (s0 & 0xffffff) | (s1 << 24);
+		WRITE((CARD32 *)dst, (s0 & 0xffffff) | (s1 << 24));
 #else
-		*(CARD32 *)(dst) = (s0 << 8) | ((s1 & 0xffffff) >> 16);
+		WRITE((CARD32 *)dst, (s0 << 8) | ((s1 & 0xffffff) >> 16));
 #endif
-		s0 = *src++;
+		s0 = READ(src++);
 		s0 = FbDoDestInvarientMergeRop(s0);
 #if BITMAP_BIT_ORDER == LSBFirst
-		*(CARD32 *)(dst+4) = ((s1 & 0xffffff) >> 8) | (s0 << 16);
+		WRITE((CARD32 *)(dst+4), ((s1 & 0xffffff) >> 8) | (s0 << 16));
 #else
-		*(CARD32 *)(dst+4) = (s1 << 16) | ((s0 & 0xffffff) >> 8);
+		WRITE((CARD32 *)(dst+4), (s1 << 16) | ((s0 & 0xffffff) >> 8));
 #endif
-		s1 = *src++;
+		s1 = READ(src++);
 		s1 = FbDoDestInvarientMergeRop(s1);
 #if BITMAP_BIT_ORDER == LSBFirst
-		*(CARD32 *)(dst+8) = ((s0 & 0xffffff) >> 16) | (s1 << 8);
+		WRITE((CARD32 *)(dst+8), ((s0 & 0xffffff) >> 16) | (s1 << 8));
 #else
-		*(CARD32 *)(dst+8) = (s0 << 24) | (s1 & 0xffffff);
+		WRITE((CARD32 *)(dst+8), (s0 << 24) | (s1 & 0xffffff));
 #endif
 		dst += 12;
 		w -= 4;
 	    }
 	    while (w--)
 	    {
-		pixel = *src++;
+		pixel = READ(src++);
 		pixel = FbDoDestInvarientMergeRop(pixel);
 		Put24 (dst, pixel);
 		dst += 3;
@@ -153,7 +153,7 @@ fb24_32BltDown (CARD8	    *srcLine,
 	{
 	    while (w--)
 	    {
-		pixel = *src++;
+		pixel = READ(src++);
 		dpixel = Get24 (dst);
 		pixel = FbDoMergeRop(pixel, dpixel);
 		Put24 (dst, pixel);
@@ -205,40 +205,40 @@ fb24_32BltUp (CARD8	    *srcLine,
 		w--;
 		pixel = Get24(src);
 		src += 3;
-		*dst++ = FbDoDestInvarientMergeRop(pixel);
+		WRITE(dst++, FbDoDestInvarientMergeRop(pixel));
 	    }
 	    /* Do four aligned pixels at a time */
 	    while (w >= 4)
 	    {
 		CARD32  s0, s1;
 
-		s0 = *(CARD32 *)(src);
+		s0 = READ((CARD32 *)src);
 #if BITMAP_BIT_ORDER == LSBFirst
 		pixel = s0 & 0xffffff;
 #else
 		pixel = s0 >> 8;
 #endif
-		*dst++ = FbDoDestInvarientMergeRop(pixel);
-		s1 = *(CARD32 *)(src+4);
+		WRITE(dst++, FbDoDestInvarientMergeRop(pixel));
+		s1 = READ((CARD32 *)(src+4));
 #if BITMAP_BIT_ORDER == LSBFirst
 		pixel = (s0 >> 24) | ((s1 << 8) & 0xffffff);
 #else
 		pixel = ((s0 << 16) & 0xffffff) | (s1 >> 16);
 #endif
-		*dst++ = FbDoDestInvarientMergeRop(pixel);
-		s0 = *(CARD32 *)(src+8);
+		WRITE(dst++, FbDoDestInvarientMergeRop(pixel));
+		s0 = READ((CARD32 *)(src+8));
 #if BITMAP_BIT_ORDER == LSBFirst
 		pixel = (s1 >> 16) | ((s0 << 16) & 0xffffff);
 #else
 		pixel = ((s1 << 8) & 0xffffff) | (s0 >> 24);
 #endif
-		*dst++ = FbDoDestInvarientMergeRop(pixel);
+		WRITE(dst++, FbDoDestInvarientMergeRop(pixel));
 #if BITMAP_BIT_ORDER == LSBFirst
 		pixel = s0 >> 8;
 #else
 		pixel = s0 & 0xffffff;
 #endif
-		*dst++ = FbDoDestInvarientMergeRop(pixel);
+		WRITE(dst++, FbDoDestInvarientMergeRop(pixel));
 		src += 12;
 		w -= 4;
 	    }
@@ -247,7 +247,7 @@ fb24_32BltUp (CARD8	    *srcLine,
 		w--;
 		pixel = Get24(src);
 		src += 3;
-		*dst++ = FbDoDestInvarientMergeRop(pixel);
+		WRITE(dst++, FbDoDestInvarientMergeRop(pixel));
 	    }
 	}
 	else
@@ -256,7 +256,7 @@ fb24_32BltUp (CARD8	    *srcLine,
 	    {
 		pixel = Get24(src);
 		src += 3;
-		*dst = FbDoMergeRop(pixel, *dst);
+		WRITE(dst, FbDoMergeRop(pixel, READ(dst)));
 		dst++;
 	    }
 	}
@@ -305,6 +305,8 @@ fb24_32GetSpans(DrawablePtr	pDrawable,
 	ppt++;
 	pwidth++;
     }
+
+    fbFinishAccess (pDrawable);
 }
 
 void
@@ -366,6 +368,8 @@ fb24_32SetSpans (DrawablePtr	    pDrawable,
 	ppt++;
 	pwidth++;
     }
+
+    fbFinishAccess (pDrawable);
 }
 
 /*
@@ -429,6 +433,8 @@ fb24_32PutZImage (DrawablePtr	pDrawable,
 			alu,
 			pm);
     }
+
+    fbFinishAccess (pDrawable);
 }
 
 void
@@ -463,6 +469,8 @@ fb24_32GetImage (DrawablePtr     pDrawable,
     fb24_32BltUp (src + (y + srcYoff) * srcStride, srcStride, x + srcXoff,
 		  (CARD8 *) d, dstStride, 0,
 		  w, h, GXcopy, pm);
+
+    fbFinishAccess (pDrawable);
 }
 
 void
@@ -519,6 +527,9 @@ fb24_32CopyMtoN (DrawablePtr pSrcDrawable,
 		pPriv->pm);
 	pbox++;
     }
+
+    fbFinishAccess (pSrcDrawable);
+    fbFinishAccess (pDstDrawable);
 }
 
 PixmapPtr
@@ -563,6 +574,9 @@ fb24_32ReformatTile(PixmapPtr pOldTile, int bitsPerPixel)
 	    GXcopy,
 	    FB_ALLONES);
 
+    fbFinishAccess (&pOldTile->drawable);
+    fbFinishAccess (&pNewTile->drawable);
+
     return pNewTile;
 }
 
diff --git a/fb/fb24_32.h b/fb/fb24_32.h
index 3c83f34..7c9819e 100644
--- a/fb/fb24_32.h
+++ b/fb/fb24_32.h
@@ -1,6 +1,4 @@
 /*
- * $XFree86$
- *
  * Copyright © 2000 SuSE, Inc.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
diff --git a/fb/fballpriv.c b/fb/fballpriv.c
index 3c05ff3..8efb8fa 100644
--- a/fb/fballpriv.c
+++ b/fb/fballpriv.c
@@ -1,6 +1,4 @@
 /*
- * Id: fballpriv.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -49,10 +47,6 @@ int fbGetWinPrivateIndex(void)
 #endif
 int fbGeneration;
 
-#ifdef FB_OLD_SCREEN
-#define miAllocateGCPrivateIndex()  AllocateGCPrivateIndex()
-#endif
-
 Bool
 fbAllocatePrivates(ScreenPtr pScreen, int *pGCIndex)
 {
@@ -90,3 +84,8 @@ fbAllocatePrivates(ScreenPtr pScreen, int *pGCIndex)
 #endif
     return TRUE;
 }
+
+#ifdef FB_ACCESS_WRAPPER
+ReadMemoryProcPtr wfbReadMemory;
+WriteMemoryProcPtr wfbWriteMemory;
+#endif
diff --git a/fb/fbarc.c b/fb/fbarc.c
index 8f4d296..3f46bd4 100644
--- a/fb/fbarc.c
+++ b/fb/fbarc.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbarc.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -109,6 +107,7 @@ fbPolyArc (DrawablePtr	pDrawable,
 		    miPolyArc(pDrawable, pGC, 1, parcs);
 		parcs++;
 	    }
+	    fbFinishAccess (pDrawable);
 	}
 	else
 #endif
diff --git a/fb/fbbits.c b/fb/fbbits.c
index 56b58df..8083743 100644
--- a/fb/fbbits.c
+++ b/fb/fbbits.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbbits.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -103,14 +101,14 @@
 #define BITSUNIT    BYTE
 #define BITSMUL	    3
 
-#define FbDoTypeStore(b,t,x,s)	(*((t *) (b)) = (x) >> (s))
-#define FbDoTypeRRop(b,t,a,x,s) (*((t *) (b)) = FbDoRRop(*((t *) (b)),\
-							 (a) >> (s), \
-							 (x) >> (s)))
-#define FbDoTypeMaskRRop(b,t,a,x,m,s) (*((t *) (b)) = FbDoMaskRRop(*((t *) (b)),\
-								   (a) >> (s), \
-								   (x) >> (s), \
-								   (m) >> (s))
+#define FbDoTypeStore(b,t,x,s)	WRITE(((t *) (b)), (x) >> (s))
+#define FbDoTypeRRop(b,t,a,x,s) WRITE((t *) (b), FbDoRRop(READ((t *) (b)),\
+							  (a) >> (s), \
+							  (x) >> (s)))
+#define FbDoTypeMaskRRop(b,t,a,x,m,s) WRITE((t *) (b), FbDoMaskRRop(READ((t *) (b)),\
+								    (a) >> (s), \
+								    (x) >> (s), \
+								    (m) >> (s)))
 #if BITMAP_BIT_ORDER == LSBFirst
 #define BITSSTORE(b,x)	((unsigned long) (b) & 1 ? \
 			 (FbDoTypeStore (b, CARD8, x, 0), \
diff --git a/fb/fbbits.h b/fb/fbbits.h
index e5c006d..44991f1 100644
--- a/fb/fbbits.h
+++ b/fb/fbbits.h
@@ -1,6 +1,4 @@
 /*
- * $XFree86$
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -42,13 +40,13 @@
 #ifdef BITSSTORE
 #define STORE(b,x)  BITSSTORE(b,x)
 #else
-#define STORE(b,x)  (*(b) = (x))
+#define STORE(b,x)  WRITE((b), (x))
 #endif
 
 #ifdef BITSRROP
 #define RROP(b,a,x)	BITSRROP(b,a,x)
 #else
-#define RROP(b,a,x)	(*(b) = FbDoRRop (*(b), (a), (x)))
+#define RROP(b,a,x)	WRITE((b), FbDoRRop (READ(b), (a), (x)))
 #endif
 
 #ifdef BITSUNIT
@@ -119,6 +117,8 @@ BRESSOLID (DrawablePtr	pDrawable,
 	    e += e3;
 	}
     }
+
+    fbFinishAccess (pDrawable);
 }
 #endif
 
@@ -263,6 +263,8 @@ onOffOdd:
 		dashlen = len;
 	}
     }
+
+    fbFinishAccess (pDrawable);
 }
 #endif
 
@@ -541,18 +543,18 @@ ARC (FbBits	*dst,
 # define WRITE_ADDR4(n)	    ((n))
 #endif
 
-#define WRITE1(d,n,fg)	    ((d)[WRITE_ADDR1(n)] = (BITS) (fg))
+#define WRITE1(d,n,fg)	    WRITE(d + WRITE_ADDR1(n), (BITS) (fg))
 
 #ifdef BITS2
-# define WRITE2(d,n,fg)	    (*((BITS2 *) &((d)[WRITE_ADDR2(n)])) = (BITS2) (fg))
+# define WRITE2(d,n,fg)	    WRITE((BITS2 *) &((d)[WRITE_ADDR2(n)]), (BITS2) (fg))
 #else
-# define WRITE2(d,n,fg)	    WRITE1(d,(n)+1,WRITE1(d,n,fg))
+# define WRITE2(d,n,fg)	    (WRITE1(d,n,fg), WRITE1(d,(n)+1,fg))
 #endif
 
 #ifdef BITS4
-# define WRITE4(d,n,fg)	    (*((BITS4 *) &((d)[WRITE_ADDR4(n)])) = (BITS4) (fg))
+# define WRITE4(d,n,fg)	    WRITE((BITS4 *) &((d)[WRITE_ADDR4(n)]), (BITS4) (fg))
 #else
-# define WRITE4(d,n,fg)	    WRITE2(d,(n)+2,WRITE2(d,n,fg))
+# define WRITE4(d,n,fg)	    (WRITE2(d,n,fg), WRITE2(d,(n)+2,fg))
 #endif
 
 void
@@ -710,8 +712,10 @@ POLYLINE (DrawablePtr	pDrawable,
 		       intToX(pt2) + xoff, intToY(pt2) + yoff,
 		       npt == 0 && pGC->capStyle != CapNotLast,
 		       &dashoffset);
-	    if (!npt)
+	    if (!npt) {
+		fbFinishAccess (pDrawable);
 		return;
+	    }
 	    pt1 = pt2;
 	    pt2 = *pts++;
 	    npt--;
@@ -776,6 +780,7 @@ POLYLINE (DrawablePtr	pDrawable,
 		    {
 			RROP(bits,and,xor);
 		    }
+		    fbFinishAccess (pDrawable);
 		    return;
 		}
 		pt1 = pt2;
@@ -786,6 +791,8 @@ POLYLINE (DrawablePtr	pDrawable,
     	    }
 	}
     }
+
+    fbFinishAccess (pDrawable);
 }
 #endif
 
@@ -883,20 +890,20 @@ POLYSEGMENT (DrawablePtr    pDrawable,
 		FbMaskBits (dstX, width, startmask, nmiddle, endmask);
 		if (startmask)
 		{
-		    *dstLine = FbDoMaskRRop (*dstLine, andBits, xorBits, startmask);
+		    WRITE(dstLine, FbDoMaskRRop (READ(dstLine), andBits, xorBits, startmask));
 		    dstLine++;
 		}
 		if (!andBits)
 		    while (nmiddle--)
-			*dstLine++ = xorBits;
+			WRITE(dstLine++, xorBits);
 		else
 		    while (nmiddle--)
 		    {
-			*dstLine = FbDoRRop (*dstLine, andBits, xorBits);
+			WRITE(dstLine, FbDoRRop (READ(dstLine), andBits, xorBits));
 			dstLine++;
 		    }
 		if (endmask)
-		    *dstLine = FbDoMaskRRop (*dstLine, andBits, xorBits, endmask);
+		    WRITE(dstLine, FbDoMaskRRop (READ(dstLine), andBits, xorBits, endmask));
 	    }
 	    else
 	    {
@@ -950,6 +957,8 @@ POLYSEGMENT (DrawablePtr    pDrawable,
 	    }
 	}
     }
+
+    fbFinishAccess (pDrawable);
 }
 #endif
 
diff --git a/fb/fbblt.c b/fb/fbblt.c
index d176a7c..837c3a2 100644
--- a/fb/fbblt.c
+++ b/fb/fbblt.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbblt.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -92,10 +90,10 @@ fbBlt (FbBits   *srcLine,
 
         if (!upsidedown)
             for (i = 0; i < height; i++)
-                memcpy(dst + i * dstStride, src + i * srcStride, width);
+                MEMCPY_WRAPPED(dst + i * dstStride, src + i * srcStride, width);
         else
             for (i = height - 1; i >= 0; i--)
-                memcpy(dst + i * dstStride, src + i * srcStride, width);
+                MEMCPY_WRAPPED(dst + i * dstStride, src + i * srcStride, width);
 
         return;
     }
@@ -137,7 +135,7 @@ fbBlt (FbBits   *srcLine,
 	    {
 		if (endmask)
 		{
-		    bits = *--src;
+		    bits = READ(--src);
 		    --dst;
 		    FbDoRightMaskByteMergeRop(dst, bits, endbyte, endmask);
 		}
@@ -145,20 +143,20 @@ fbBlt (FbBits   *srcLine,
 		if (destInvarient)
 		{
 		    while (n--)
-			*--dst = FbDoDestInvarientMergeRop(*--src);
+			WRITE(--dst, FbDoDestInvarientMergeRop(READ(--src)));
 		}
 		else
 		{
 		    while (n--)
 		    {
-			bits = *--src;
+			bits = READ(--src);
 			--dst;
-			*dst = FbDoMergeRop (bits, *dst);
+			WRITE(dst, FbDoMergeRop (bits, READ(dst)));
 		    }
 		}
 		if (startmask)
 		{
-		    bits = *--src;
+		    bits = READ(--src);
 		    --dst;
 		    FbDoLeftMaskByteMergeRop(dst, bits, startbyte, startmask);
 		}
@@ -167,7 +165,7 @@ fbBlt (FbBits   *srcLine,
 	    {
 		if (startmask)
 		{
-		    bits = *src++;
+		    bits = READ(src++);
 		    FbDoLeftMaskByteMergeRop(dst, bits, startbyte, startmask);
 		    dst++;
 		}
@@ -198,20 +196,20 @@ fbBlt (FbBits   *srcLine,
 		    }
 #endif
 		    while (n--)
-			*dst++ = FbDoDestInvarientMergeRop(*src++);
+			WRITE(dst++, FbDoDestInvarientMergeRop(READ(src++)));
 		}
 		else
 		{
 		    while (n--)
 		    {
-			bits = *src++;
-			*dst = FbDoMergeRop (bits, *dst);
+			bits = READ(src++);
+			WRITE(dst, FbDoMergeRop (bits, READ(dst)));
 			dst++;
 		    }
 		}
 		if (endmask)
 		{
-		    bits = *src;
+		    bits = READ(src);
 		    FbDoRightMaskByteMergeRop(dst, bits, endbyte, endmask);
 		}
 	    }
@@ -240,13 +238,13 @@ fbBlt (FbBits   *srcLine,
 	    if (reverse)
 	    {
 		if (srcX < dstX)
-		    bits1 = *--src;
+		    bits1 = READ(--src);
 		if (endmask)
 		{
 		    bits = FbScrRight(bits1, rightShift); 
 		    if (FbScrRight(endmask, leftShift))
 		    {
-			bits1 = *--src;
+			bits1 = READ(--src);
 			bits |= FbScrLeft(bits1, leftShift);
 		    }
 		    --dst;
@@ -258,10 +256,10 @@ fbBlt (FbBits   *srcLine,
 		    while (n--)
 		    {
 			bits = FbScrRight(bits1, rightShift); 
-			bits1 = *--src;
+			bits1 = READ(--src);
 			bits |= FbScrLeft(bits1, leftShift);
 			--dst;
-			*dst = FbDoDestInvarientMergeRop(bits);
+			WRITE(dst, FbDoDestInvarientMergeRop(bits));
 		    }
 		}
 		else
@@ -269,10 +267,10 @@ fbBlt (FbBits   *srcLine,
 		    while (n--)
 		    {
 			bits = FbScrRight(bits1, rightShift); 
-			bits1 = *--src;
+			bits1 = READ(--src);
 			bits |= FbScrLeft(bits1, leftShift);
 			--dst;
-			*dst = FbDoMergeRop(bits, *dst);
+			WRITE(dst, FbDoMergeRop(bits, READ(dst)));
 		    }
 		}
 		if (startmask)
@@ -280,7 +278,7 @@ fbBlt (FbBits   *srcLine,
 		    bits = FbScrRight(bits1, rightShift); 
 		    if (FbScrRight(startmask, leftShift))
 		    {
-			bits1 = *--src;
+			bits1 = READ(--src);
 			bits |= FbScrLeft(bits1, leftShift);
 		    }
 		    --dst;
@@ -290,13 +288,13 @@ fbBlt (FbBits   *srcLine,
 	    else
 	    {
 		if (srcX > dstX)
-		    bits1 = *src++;
+		    bits1 = READ(src++);
 		if (startmask)
 		{
 		    bits = FbScrLeft(bits1, leftShift); 
 		    if (FbScrLeft(startmask, rightShift))
 		    {
-			bits1 = *src++;
+			bits1 = READ(src++);
 			bits |= FbScrRight(bits1, rightShift);
 		    }
 		    FbDoLeftMaskByteMergeRop (dst, bits, startbyte, startmask);
@@ -308,9 +306,9 @@ fbBlt (FbBits   *srcLine,
 		    while (n--)
 		    {
 			bits = FbScrLeft(bits1, leftShift); 
-			bits1 = *src++;
+			bits1 = READ(src++);
 			bits |= FbScrRight(bits1, rightShift);
-			*dst = FbDoDestInvarientMergeRop(bits);
+			WRITE(dst, FbDoDestInvarientMergeRop(bits));
 			dst++;
 		    }
 		}
@@ -319,9 +317,9 @@ fbBlt (FbBits   *srcLine,
 		    while (n--)
 		    {
 			bits = FbScrLeft(bits1, leftShift); 
-			bits1 = *src++;
+			bits1 = READ(src++);
 			bits |= FbScrRight(bits1, rightShift);
-			*dst = FbDoMergeRop(bits, *dst);
+			WRITE(dst, FbDoMergeRop(bits, READ(dst)));
 			dst++;
 		    }
 		}
@@ -330,7 +328,7 @@ fbBlt (FbBits   *srcLine,
 		    bits = FbScrLeft(bits1, leftShift); 
 		    if (FbScrLeft(endmask, rightShift))
 		    {
-			bits1 = *src;
+			bits1 = READ(src);
 			bits |= FbScrRight(bits1, rightShift);
 		    }
 		    FbDoRightMaskByteMergeRop (dst, bits, endbyte, endmask);
@@ -425,45 +423,45 @@ fbBlt24Line (FbBits	    *src,
 	{
 	    if (endmask)
 	    {
-		bits = *--src;
+		bits = READ(--src);
 		--dst;
-		*dst = FbDoMaskMergeRop (bits, *dst, mask & endmask);
+		WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & endmask));
 		mask = FbPrev24Pix (mask);
 	    }
 	    while (n--)
 	    {
-		bits = *--src;
+		bits = READ(--src);
 		--dst;
-		*dst = FbDoMaskMergeRop (bits, *dst, mask);
+		WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask));
 		mask = FbPrev24Pix (mask);
 	    }
 	    if (startmask)
 	    {
-		bits = *--src;
+		bits = READ(--src);
 		--dst;
-		*dst = FbDoMaskMergeRop(bits, *dst, mask & startmask);
+		WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask & startmask));
 	    }
 	}
 	else
 	{
 	    if (startmask)
 	    {
-		bits = *src++;
-		*dst = FbDoMaskMergeRop (bits, *dst, mask & startmask);
+		bits = READ(src++);
+		WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & startmask));
 		dst++;
 		mask = FbNext24Pix(mask);
 	    }
 	    while (n--)
 	    {
-		bits = *src++;
-		*dst = FbDoMaskMergeRop (bits, *dst, mask);
+		bits = READ(src++);
+		WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask));
 		dst++;
 		mask = FbNext24Pix(mask);
 	    }
 	    if (endmask)
 	    {
-		bits = *src;
-		*dst = FbDoMaskMergeRop(bits, *dst, mask & endmask);
+		bits = READ(src);
+		WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask & endmask));
 	    }
 	}
     }
@@ -484,26 +482,26 @@ fbBlt24Line (FbBits	    *src,
 	if (reverse)
 	{
 	    if (srcX < dstX)
-		bits1 = *--src;
+		bits1 = READ(--src);
 	    if (endmask)
 	    {
 		bits = FbScrRight(bits1, rightShift); 
 		if (FbScrRight(endmask, leftShift))
 		{
-		    bits1 = *--src;
+		    bits1 = READ(--src);
 		    bits |= FbScrLeft(bits1, leftShift);
 		}
 		--dst;
-		*dst = FbDoMaskMergeRop (bits, *dst, mask & endmask);
+		WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & endmask));
 		mask = FbPrev24Pix(mask);
 	    }
 	    while (n--)
 	    {
 		bits = FbScrRight(bits1, rightShift); 
-		bits1 = *--src;
+		bits1 = READ(--src);
 		bits |= FbScrLeft(bits1, leftShift);
 		--dst;
-		*dst = FbDoMaskMergeRop(bits, *dst, mask);
+		WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask));
 		mask = FbPrev24Pix(mask);
 	    }
 	    if (startmask)
@@ -511,32 +509,32 @@ fbBlt24Line (FbBits	    *src,
 		bits = FbScrRight(bits1, rightShift); 
 		if (FbScrRight(startmask, leftShift))
 		{
-		    bits1 = *--src;
+		    bits1 = READ(--src);
 		    bits |= FbScrLeft(bits1, leftShift);
 		}
 		--dst;
-		*dst = FbDoMaskMergeRop (bits, *dst, mask & startmask);
+		WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & startmask));
 	    }
 	}
 	else
 	{
 	    if (srcX > dstX)
-		bits1 = *src++;
+		bits1 = READ(src++);
 	    if (startmask)
 	    {
 		bits = FbScrLeft(bits1, leftShift); 
-		bits1 = *src++;
+		bits1 = READ(src++);
 		bits |= FbScrRight(bits1, rightShift);
-		*dst = FbDoMaskMergeRop (bits, *dst, mask & startmask);
+		WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & startmask));
 		dst++;
 		mask = FbNext24Pix(mask);
 	    }
 	    while (n--)
 	    {
 		bits = FbScrLeft(bits1, leftShift); 
-		bits1 = *src++;
+		bits1 = READ(src++);
 		bits |= FbScrRight(bits1, rightShift);
-		*dst = FbDoMaskMergeRop(bits, *dst, mask);
+		WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), mask));
 		dst++;
 		mask = FbNext24Pix(mask);
 	    }
@@ -545,10 +543,10 @@ fbBlt24Line (FbBits	    *src,
 		bits = FbScrLeft(bits1, leftShift); 
 		if (FbScrLeft(endmask, rightShift))
 		{
-		    bits1 = *src;
+		    bits1 = READ(src);
 		    bits |= FbScrRight(bits1, rightShift);
 		}
-		*dst = FbDoMaskMergeRop (bits, *dst, mask & endmask);
+		WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), mask & endmask));
 	    }
 	}
     }
@@ -707,8 +705,8 @@ fbBltOdd (FbBits    *srcLine,
 	{
 	    if (startmask)
 	    {
-		bits = *src++;
-		*dst = FbDoMaskMergeRop (bits, *dst, startmask);
+		bits = READ(src++);
+		WRITE(dst, FbDoMaskMergeRop (bits, READ(dst), startmask));
 		dst++;
 	    }
 	    n = nmiddle;
@@ -716,8 +714,8 @@ fbBltOdd (FbBits    *srcLine,
 	    {
 		while (n--)
 		{
-		    bits = *src++;
-		    *dst = FbDoDestInvarientMergeRop(bits);
+		    bits = READ(src++);
+		    WRITE(dst, FbDoDestInvarientMergeRop(bits));
 		    dst++;
 		}
 	    }
@@ -725,28 +723,28 @@ fbBltOdd (FbBits    *srcLine,
 	    {
 		while (n--)
 		{
-		    bits = *src++;
-		    *dst = FbDoMergeRop (bits, *dst);
+		    bits = READ(src++);
+		    WRITE(dst, FbDoMergeRop (bits, READ(dst)));
 		    dst++;
 		}
 	    }
 	    if (endmask)
 	    {
-		bits = *src;
-		*dst = FbDoMaskMergeRop(bits, *dst, endmask);
+		bits = READ(src);
+		WRITE(dst, FbDoMaskMergeRop(bits, READ(dst), endmask));
 	    }
 	}
 	else
 	{
 	    bits = 0;
 	    if (srcX > dstX)
-		bits = *src++;
+		bits = READ(src++);
 	    if (startmask)
 	    {
 		bits1 = FbScrLeft(bits, leftShift);
-		bits = *src++;
+		bits = READ(src++);
 		bits1 |= FbScrRight(bits, rightShift);
-		*dst = FbDoMaskMergeRop (bits1, *dst, startmask);
+		WRITE(dst, FbDoMaskMergeRop (bits1, READ(dst), startmask));
 		dst++;
 	    }
 	    n = nmiddle;
@@ -755,9 +753,9 @@ fbBltOdd (FbBits    *srcLine,
 		while (n--)
 		{
 		    bits1 = FbScrLeft(bits, leftShift);
-		    bits = *src++;
+		    bits = READ(src++);
 		    bits1 |= FbScrRight(bits, rightShift);
-		    *dst = FbDoDestInvarientMergeRop(bits1);
+		    WRITE(dst, FbDoDestInvarientMergeRop(bits1));
 		    dst++;
 		}
 	    }
@@ -766,9 +764,9 @@ fbBltOdd (FbBits    *srcLine,
 		while (n--)
 		{
 		    bits1 = FbScrLeft(bits, leftShift);
-		    bits = *src++;
+		    bits = READ(src++);
 		    bits1 |= FbScrRight(bits, rightShift);
-		    *dst = FbDoMergeRop(bits1, *dst);
+		    WRITE(dst, FbDoMergeRop(bits1, READ(dst)));
 		    dst++;
 		}
 	    }
@@ -777,10 +775,10 @@ fbBltOdd (FbBits    *srcLine,
 		bits1 = FbScrLeft(bits, leftShift);
 		if (FbScrLeft(endmask, rightShift))
 		{
-		    bits = *src;
+		    bits = READ(src);
 		    bits1 |= FbScrRight(bits, rightShift);
 		}
-		*dst = FbDoMaskMergeRop (bits1, *dst, endmask);
+		WRITE(dst, FbDoMaskMergeRop (bits1, READ(dst), endmask));
 	    }
 	}
     }
diff --git a/fb/fbbltone.c b/fb/fbbltone.c
index 33e6c35..88ada9d 100644
--- a/fb/fbbltone.c
+++ b/fb/fbbltone.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbbltone.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -51,12 +49,12 @@
 
 #define LoadBits {\
     if (leftShift) { \
-	bitsRight = (src < srcEnd ? *src++ : 0); \
+	bitsRight = (src < srcEnd ? READ(src++) : 0); \
 	bits = (FbStipLeft (bitsLeft, leftShift) | \
 		FbStipRight(bitsRight, rightShift)); \
 	bitsLeft = bitsRight; \
     } else \
-	bits = (src < srcEnd ? *src++ : 0); \
+	bits = (src < srcEnd ? READ(src++) : 0); \
 }
 
 #define CHECK_BOUNDS(pointer, limit) \
@@ -293,7 +291,7 @@ fbBltOne (FbStip    *src,
 	
 	bitsLeft = 0;
 	if (srcX > dstS)
-	    bitsLeft = *src++;
+	    bitsLeft = READ(src++);
 	if (n)
 	{
 	    /*
@@ -348,7 +346,7 @@ fbBltOne (FbStip    *src,
 #endif
 			    mask = fbBits[FbLeftStipBits(bits,pixelsPerDst)];
 			CHECK_BOUNDS(dst, dstEnd);
-			*dst = FbOpaqueStipple (mask, fgxor, bgxor);
+			WRITE(dst, FbOpaqueStipple (mask, fgxor, bgxor));
 			dst++;
 			bits = FbStipLeft(bits, pixelsPerDst);
 		    }
@@ -380,8 +378,8 @@ fbBltOne (FbStip    *src,
 			    {
 				mask = fbBits[left];
 				CHECK_BOUNDS(dst, dstEnd);
-				*dst = FbStippleRRop (*dst, mask,
-						      fgand, fgxor, bgand, bgxor);
+				WRITE(dst, FbStippleRRop (READ(dst), mask,
+						          fgand, fgxor, bgand, bgxor));
 			    }
 			    dst++;
 			    bits = FbStipLeft(bits, pixelsPerDst);
@@ -549,7 +547,7 @@ const FbBits	fbStipple24Bits[3][1 << FbStip24Len] = {
 	stip = FbLeftStipBits(bits, len); \
     } else { \
 	stip = FbLeftStipBits(bits, remain); \
-	bits = (src < srcEnd ? *src++ : 0); \
+	bits = (src < srcEnd ? READ(src++) : 0); \
 	__len = (len) - remain; \
 	stip = FbMergePartStip24Bits(stip, FbLeftStipBits(bits, __len), \
 				     remain, __len); \
@@ -560,7 +558,7 @@ const FbBits	fbStipple24Bits[3][1 << FbStip24Len] = {
 }
 
 #define fbInitStipBits(offset,len,stip) {\
-    bits = FbStipLeft (*src++,offset); \
+    bits = FbStipLeft (READ(src++),offset); \
     remain = FB_STIP_UNIT - offset; \
     fbFirstStipBits(len,stip); \
     stip = FbMergeStip24Bits (0, stip, len); \
@@ -645,10 +643,11 @@ fbBltOne24 (FbStip	*srcLine,
 	    {
 		mask = fbStipple24Bits[rot >> 3][stip];
 		CHECK_BOUNDS(dst, dstEnd);
-		*dst = (*dst & ~leftMask) | (FbOpaqueStipple (mask,
-							      FbRot24(fgxor, rot),
-							      FbRot24(bgxor, rot))
-					     & leftMask);
+		WRITE(dst, (READ(dst) & ~leftMask) |
+			    (FbOpaqueStipple (mask,
+					      FbRot24(fgxor, rot),
+					      FbRot24(bgxor, rot))
+			     & leftMask));
 		dst++;
 		fbNextStipBits(rot,stip);
 	    }
@@ -657,9 +656,9 @@ fbBltOne24 (FbStip	*srcLine,
 	    {
 		mask = fbStipple24Bits[rot>>3][stip];
 		CHECK_BOUNDS(dst, dstEnd);
-		*dst = FbOpaqueStipple (mask, 
-					FbRot24(fgxor, rot),
-					FbRot24(bgxor, rot));
+		WRITE(dst, FbOpaqueStipple (mask,
+					    FbRot24(fgxor, rot),
+					    FbRot24(bgxor, rot)));
 		dst++;
 		fbNextStipBits(rot,stip);
 	    }
@@ -667,10 +666,11 @@ fbBltOne24 (FbStip	*srcLine,
 	    {
 		mask = fbStipple24Bits[rot >> 3][stip];
 		CHECK_BOUNDS(dst, dstEnd);
-		*dst = (*dst & ~rightMask) | (FbOpaqueStipple (mask,
-							       FbRot24(fgxor, rot),
-							       FbRot24(bgxor, rot))
-					      & rightMask);
+		WRITE(dst, (READ(dst) & ~rightMask) |
+			    (FbOpaqueStipple (mask,
+					      FbRot24(fgxor, rot),
+					      FbRot24(bgxor, rot))
+			     & rightMask));
 	    }
 	    dst += dstStride;
 	    src += srcStride;
@@ -691,7 +691,7 @@ fbBltOne24 (FbStip	*srcLine,
 		{
 		    mask = fbStipple24Bits[rot >> 3][stip] & leftMask;
 		    CHECK_BOUNDS(dst, dstEnd);
-		    *dst = (*dst & ~mask) | (FbRot24(fgxor, rot) & mask);
+		    WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor, rot) & mask));
 		}
 		dst++;
 		fbNextStipBits (rot, stip);
@@ -703,7 +703,7 @@ fbBltOne24 (FbStip	*srcLine,
 		{
 		    mask = fbStipple24Bits[rot>>3][stip];
 		    CHECK_BOUNDS(dst, dstEnd);
-		    *dst = (*dst & ~mask) | (FbRot24(fgxor,rot) & mask);
+		    WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor,rot) & mask));
 		}
 		dst++;
 		fbNextStipBits (rot, stip);
@@ -714,7 +714,7 @@ fbBltOne24 (FbStip	*srcLine,
 		{
 		    mask = fbStipple24Bits[rot >> 3][stip] & rightMask;
 		    CHECK_BOUNDS(dst, dstEnd);
-		    *dst = (*dst & ~mask) | (FbRot24(fgxor, rot) & mask);
+		    WRITE(dst, (READ(dst) & ~mask) | (FbRot24(fgxor, rot) & mask));
 		}
 	    }
 	    dst += dstStride;
@@ -732,12 +732,12 @@ fbBltOne24 (FbStip	*srcLine,
 	    {
 		mask = fbStipple24Bits[rot >> 3][stip];
 		CHECK_BOUNDS(dst, dstEnd);
-		*dst = FbStippleRRopMask (*dst, mask,
-					  FbRot24(fgand, rot),
-					  FbRot24(fgxor, rot),
-					  FbRot24(bgand, rot),
-					  FbRot24(bgxor, rot),
-					  leftMask);
+		WRITE(dst, FbStippleRRopMask (READ(dst), mask,
+					      FbRot24(fgand, rot),
+					      FbRot24(fgxor, rot),
+					      FbRot24(bgand, rot),
+					      FbRot24(bgxor, rot),
+					      leftMask));
 		dst++;
 		fbNextStipBits(rot,stip);
 	    }
@@ -746,11 +746,11 @@ fbBltOne24 (FbStip	*srcLine,
 	    {
 		mask = fbStipple24Bits[rot >> 3][stip];
 		CHECK_BOUNDS(dst, dstEnd);
-		*dst = FbStippleRRop (*dst, mask,
-				      FbRot24(fgand, rot),
-				      FbRot24(fgxor, rot),
-				      FbRot24(bgand, rot),
-				      FbRot24(bgxor, rot));
+		WRITE(dst, FbStippleRRop (READ(dst), mask,
+					  FbRot24(fgand, rot),
+					  FbRot24(fgxor, rot),
+					  FbRot24(bgand, rot),
+					  FbRot24(bgxor, rot)));
 		dst++;
 		fbNextStipBits(rot,stip);
 	    }
@@ -758,12 +758,12 @@ fbBltOne24 (FbStip	*srcLine,
 	    {
 		mask = fbStipple24Bits[rot >> 3][stip];
 		CHECK_BOUNDS(dst, dstEnd);
-		*dst = FbStippleRRopMask (*dst, mask,
-					  FbRot24(fgand, rot),
-					  FbRot24(fgxor, rot),
-					  FbRot24(bgand, rot),
-					  FbRot24(bgxor, rot),
-					  rightMask);
+		WRITE(dst, FbStippleRRopMask (READ(dst), mask,
+					      FbRot24(fgand, rot),
+					      FbRot24(fgxor, rot),
+					      FbRot24(bgand, rot),
+					      FbRot24(bgxor, rot),
+					      rightMask));
 	    }
 	    dst += dstStride;
 	}
@@ -854,7 +854,7 @@ fbBltPlane (FbBits	    *src,
 	if (srcBpp == 24)
 	    srcMask0 = FbRot24(pm,rot0) & FbBitsMask(0, srcBpp);
 #endif
-    	srcBits = *s++;
+    	srcBits = READ(s++);
 
 	dstMask = dstMaskFirst;
 	dstUnion = 0;
@@ -866,7 +866,7 @@ fbBltPlane (FbBits	    *src,
 	{
 	    if (!srcMask)
 	    {
-		srcBits = *s++;
+		srcBits = READ(s++);
 #ifdef FB_24BIT
 		if (srcBpp == 24)
 		    srcMask0 = FbNext24Pix(srcMask0) & FbBitsMask(0,24);
@@ -875,9 +875,9 @@ fbBltPlane (FbBits	    *src,
 	    }
 	    if (!dstMask)
 	    {
-		*d = FbStippleRRopMask(*d, dstBits,
-				       fgand, fgxor, bgand, bgxor,
-				       dstUnion);
+		WRITE(d, FbStippleRRopMask(READ(d), dstBits,
+					   fgand, fgxor, bgand, bgxor,
+					   dstUnion));
 		d++;
 		dstMask = FbStipMask(0,1);
 		dstUnion = 0;
@@ -893,9 +893,9 @@ fbBltPlane (FbBits	    *src,
 	    dstMask = FbStipRight(dstMask,1);
 	}
 	if (dstUnion)
-	    *d = FbStippleRRopMask(*d,dstBits,
-				   fgand, fgxor, bgand, bgxor,
-				   dstUnion);
+	    WRITE(d, FbStippleRRopMask(READ(d),dstBits,
+				       fgand, fgxor, bgand, bgxor,
+				       dstUnion));
     }
 }
 
diff --git a/fb/fbbstore.c b/fb/fbbstore.c
index 78174b6..3ee5f5e 100644
--- a/fb/fbbstore.c
+++ b/fb/fbbstore.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbbstore.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
diff --git a/fb/fbcmap.c b/fb/fbcmap.c
index 9cf5bcb..c29a513 100644
--- a/fb/fbcmap.c
+++ b/fb/fbcmap.c
@@ -39,7 +39,12 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include "resource.h"
 #include "fb.h"
 
-#ifndef XFree86Server
+#ifdef XFree86Server
+#error "You should be compiling fbcmap_mi.c instead of fbcmap.c!"
+#endif
+
+
+
 ColormapPtr FbInstalledMaps[MAXSCREENS];
 
 int
@@ -584,87 +589,3 @@ fbInitVisuals (VisualPtr    *visualp,
     *defaultVisp = depth[i].vids[j];
     return TRUE;
 }
-#else
-
-#include "micmap.h"
-
-int
-fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps)
-{
-    return miListInstalledColormaps(pScreen, pmaps);
-}
-
-void
-fbInstallColormap(ColormapPtr pmap)
-{
-    miInstallColormap(pmap);
-}
-
-void
-fbUninstallColormap(ColormapPtr pmap)
-{
-    miUninstallColormap(pmap);
-}
-
-void
-fbResolveColor(unsigned short   *pred,
-	       unsigned short   *pgreen,
-	       unsigned short   *pblue,
-	       VisualPtr	pVisual)
-{
-    miResolveColor(pred, pgreen, pblue, pVisual);
-}
-
-Bool
-fbInitializeColormap(ColormapPtr pmap)
-{
-    return miInitializeColormap(pmap);
-}
-
-int
-fbExpandDirectColors (ColormapPtr   pmap,
-		      int	    ndef,
-		      xColorItem    *indefs,
-		      xColorItem    *outdefs)
-{
-    return miExpandDirectColors(pmap, ndef, indefs, outdefs);
-}
-
-Bool
-fbCreateDefColormap(ScreenPtr pScreen)
-{
-    return miCreateDefColormap(pScreen);
-}
-
-void
-fbClearVisualTypes(void)
-{
-    miClearVisualTypes();
-}
-
-Bool
-fbSetVisualTypes (int depth, int visuals, int bitsPerRGB)
-{
-    return miSetVisualTypes(depth, visuals, bitsPerRGB, -1);
-}
-
-/*
- * Given a list of formats for a screen, create a list
- * of visuals and depths for the screen which coorespond to
- * the set which can be used with this version of fb.
- */
-
-Bool
-fbInitVisuals (VisualPtr    *visualp, 
-	       DepthPtr	    *depthp,
-	       int	    *nvisualp,
-	       int	    *ndepthp,
-	       int	    *rootDepthp,
-	       VisualID	    *defaultVisp,
-	       unsigned long	sizes,
-	       int	    bitsPerRGB)
-{
-    return miInitVisuals(visualp, depthp, nvisualp, ndepthp, rootDepthp,
-			 defaultVisp, sizes, bitsPerRGB, -1);
-}
-#endif
diff --git a/fb/fbcompose.c b/fb/fbcompose.c
deleted file mode 100644
index b1903e9..0000000
--- a/fb/fbcompose.c
+++ /dev/null
@@ -1,3676 +0,0 @@
-/*
- *
- * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
- *             2005 Lars Knoll & Zack Rusin, Trolltech
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-#ifdef RENDER
-
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <assert.h>
-
-#include "picturestr.h"
-#include "mipict.h"
-#include "fbpict.h"
-
-#define mod(a,b)	((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b))
-
-#define SCANLINE_BUFFER_LENGTH 2048
-
-typedef FASTCALL void (*fetchProc)(const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed);
-
-/*
- * All of the fetch functions
- */
-
-static FASTCALL void
-fbFetch_a8r8g8b8 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    memcpy(buffer, (const CARD32 *)bits + x, width*sizeof(CARD32));
-}
-
-static FASTCALL void
-fbFetch_x8r8g8b8 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD32 *pixel = (const CARD32 *)bits + x;
-    const CARD32 *end = pixel + width;
-    while (pixel < end) {
-        *buffer++ = *pixel++ | 0xff000000;
-    }
-}
-
-static FASTCALL void
-fbFetch_a8b8g8r8 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD32 *pixel = (CARD32 *)bits + x;
-    const CARD32 *end = pixel + width;
-    while (pixel < end) {
-        *buffer++ =  ((*pixel & 0xff00ff00) |
-                      ((*pixel >> 16) & 0xff) |
-                      ((*pixel & 0xff) << 16));
-        ++pixel;
-    }
-}
-
-static FASTCALL void
-fbFetch_x8b8g8r8 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD32 *pixel = (CARD32 *)bits + x;
-    const CARD32 *end = pixel + width;
-    while (pixel < end) {
-        *buffer++ =  0xff000000 |
-                     ((*pixel & 0x0000ff00) |
-                      ((*pixel >> 16) & 0xff) |
-                      ((*pixel & 0xff) << 16));
-        ++pixel;
-    }
-}
-
-static FASTCALL void
-fbFetch_r8g8b8 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD8 *pixel = (const CARD8 *)bits + 3*x;
-    const CARD8 *end = pixel + 3*width;
-    while (pixel < end) {
-        CARD32 b = Fetch24(pixel) | 0xff000000;
-        pixel += 3;
-        *buffer++ = b;
-    }
-}
-
-static FASTCALL void
-fbFetch_b8g8r8 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD8 *pixel = (const CARD8 *)bits + 3*x;
-    const CARD8 *end = pixel + 3*width;
-    while (pixel < end) {
-        CARD32 b = 0xff000000;
-#if IMAGE_BYTE_ORDER == MSBFirst
-        b |= (*pixel++);
-        b |= (*pixel++ << 8);
-        b |= (*pixel++ << 16);
-#else
-        b |= (*pixel++ << 16);
-        b |= (*pixel++ << 8);
-        b |= (*pixel++);
-#endif
-    }
-}
-
-static FASTCALL void
-fbFetch_r5g6b5 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD16 *pixel = (const CARD16 *)bits + x;
-    const CARD16 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32 r = (((p) << 3) & 0xf8) | 
-                   (((p) << 5) & 0xfc00) |
-                   (((p) << 8) & 0xf80000);
-        r |= (r >> 5) & 0x70007;
-        r |= (r >> 6) & 0x300;
-        *buffer++ = 0xff000000 | r;
-    }
-}
-
-static FASTCALL void
-fbFetch_b5g6r5 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD16 *pixel = (const CARD16 *)bits + x;
-    const CARD16 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b;
-
-        b = ((p & 0xf800) | ((p & 0xe000) >> 5)) >> 8;
-        g = ((p & 0x07e0) | ((p & 0x0600) >> 6)) << 5;
-        r = ((p & 0x001c) | ((p & 0x001f) << 5)) << 14;
-        *buffer++ = (0xff000000 | r | g | b);
-    }
-}
-
-static FASTCALL void
-fbFetch_a1r5g5b5 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD16 *pixel = (const CARD16 *)bits + x;
-    const CARD16 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b, a;
-
-        a = (CARD32) ((CARD8) (0 - ((p & 0x8000) >> 15))) << 24;
-        r = ((p & 0x7c00) | ((p & 0x7000) >> 5)) << 9;
-        g = ((p & 0x03e0) | ((p & 0x0380) >> 5)) << 6;
-        b = ((p & 0x001c) | ((p & 0x001f) << 5)) >> 2;
-        *buffer++ = (a | r | g | b);
-    }
-}
-
-static FASTCALL void
-fbFetch_x1r5g5b5 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD16 *pixel = (const CARD16 *)bits + x;
-    const CARD16 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b;
-
-        r = ((p & 0x7c00) | ((p & 0x7000) >> 5)) << 9;
-        g = ((p & 0x03e0) | ((p & 0x0380) >> 5)) << 6;
-        b = ((p & 0x001c) | ((p & 0x001f) << 5)) >> 2;
-        *buffer++ = (0xff000000 | r | g | b);
-    }
-}
-
-static FASTCALL void
-fbFetch_a1b5g5r5 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD16 *pixel = (const CARD16 *)bits + x;
-    const CARD16 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b, a;
-
-        a = (CARD32) ((CARD8) (0 - ((p & 0x8000) >> 15))) << 24;
-        b = ((p & 0x7c00) | ((p & 0x7000) >> 5)) >> 7;
-        g = ((p & 0x03e0) | ((p & 0x0380) >> 5)) << 6;
-        r = ((p & 0x001c) | ((p & 0x001f) << 5)) << 14;
-        *buffer++ = (a | r | g | b);
-    }
-}
-
-static FASTCALL void
-fbFetch_x1b5g5r5 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD16 *pixel = (const CARD16 *)bits + x;
-    const CARD16 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b;
-
-        b = ((p & 0x7c00) | ((p & 0x7000) >> 5)) >> 7;
-        g = ((p & 0x03e0) | ((p & 0x0380) >> 5)) << 6;
-        r = ((p & 0x001c) | ((p & 0x001f) << 5)) << 14;
-        *buffer++ = (0xff000000 | r | g | b);
-    }
-}
-
-static FASTCALL void
-fbFetch_a4r4g4b4 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD16 *pixel = (const CARD16 *)bits + x;
-    const CARD16 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b, a;
-
-        a = ((p & 0xf000) | ((p & 0xf000) >> 4)) << 16;
-        r = ((p & 0x0f00) | ((p & 0x0f00) >> 4)) << 12;
-        g = ((p & 0x00f0) | ((p & 0x00f0) >> 4)) << 8;
-        b = ((p & 0x000f) | ((p & 0x000f) << 4));
-        *buffer++ = (a | r | g | b);
-    }
-}
-
-static FASTCALL void
-fbFetch_x4r4g4b4 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD16 *pixel = (const CARD16 *)bits + x;
-    const CARD16 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b;
-
-        r = ((p & 0x0f00) | ((p & 0x0f00) >> 4)) << 12;
-        g = ((p & 0x00f0) | ((p & 0x00f0) >> 4)) << 8;
-        b = ((p & 0x000f) | ((p & 0x000f) << 4));
-        *buffer++ = (0xff000000 | r | g | b);
-    }
-}
-
-static FASTCALL void
-fbFetch_a4b4g4r4 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD16 *pixel = (const CARD16 *)bits + x;
-    const CARD16 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b, a;
-
-        a = ((p & 0xf000) | ((p & 0xf000) >> 4)) << 16;
-        b = ((p & 0x0f00) | ((p & 0x0f00) >> 4)) >> 4;
-        g = ((p & 0x00f0) | ((p & 0x00f0) >> 4)) << 8;
-        r = ((p & 0x000f) | ((p & 0x000f) << 4)) << 16;
-        *buffer++ = (a | r | g | b);
-    }
-}
-
-static FASTCALL void
-fbFetch_x4b4g4r4 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD16 *pixel = (const CARD16 *)bits + x;
-    const CARD16 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b;
-
-        b = ((p & 0x0f00) | ((p & 0x0f00) >> 4)) >> 4;
-        g = ((p & 0x00f0) | ((p & 0x00f0) >> 4)) << 8;
-        r = ((p & 0x000f) | ((p & 0x000f) << 4)) << 16;
-        *buffer++ = (0xff000000 | r | g | b);
-    }
-}
-
-static FASTCALL void
-fbFetch_a8 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD8 *pixel = (const CARD8 *)bits + x;
-    const CARD8 *end = pixel + width;
-    while (pixel < end) {
-        *buffer++ = (*pixel++) << 24;
-    }
-}
-
-static FASTCALL void
-fbFetch_r3g3b2 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD8 *pixel = (const CARD8 *)bits + x;
-    const CARD8 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b;
-
-        r = ((p & 0xe0) | ((p & 0xe0) >> 3) | ((p & 0xc0) >> 6)) << 16;
-        g = ((p & 0x1c) | ((p & 0x18) >> 3) | ((p & 0x1c) << 3)) << 8;
-        b = (((p & 0x03)     ) |
-             ((p & 0x03) << 2) |
-             ((p & 0x03) << 4) |
-             ((p & 0x03) << 6));
-        *buffer++ = (0xff000000 | r | g | b);
-    }
-}
-
-static FASTCALL void
-fbFetch_b2g3r3 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD8 *pixel = (const CARD8 *)bits + x;
-    const CARD8 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32  r,g,b;
-
-        b = (((p & 0xc0)     ) |
-             ((p & 0xc0) >> 2) |
-             ((p & 0xc0) >> 4) |
-             ((p & 0xc0) >> 6));
-        g = ((p & 0x38) | ((p & 0x38) >> 3) | ((p & 0x30) << 2)) << 8;
-        r = (((p & 0x07)     ) |
-             ((p & 0x07) << 3) |
-             ((p & 0x06) << 6)) << 16;
-        *buffer++ = (0xff000000 | r | g | b);
-	}
-}
-
-static FASTCALL void
-fbFetch_a2r2g2b2 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD8 *pixel = (const CARD8 *)bits + x;
-    const CARD8 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32   a,r,g,b;
-
-        a = ((p & 0xc0) * 0x55) << 18;
-        r = ((p & 0x30) * 0x55) << 12;
-        g = ((p & 0x0c) * 0x55) << 6;
-        b = ((p & 0x03) * 0x55);
-        *buffer++ = a|r|g|b;
-    }
-}
-
-static FASTCALL void
-fbFetch_a2b2g2r2 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD8 *pixel = (const CARD8 *)bits + x;
-    const CARD8 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        CARD32   a,r,g,b;
-
-        a = ((p & 0xc0) * 0x55) << 18;
-        b = ((p & 0x30) * 0x55) >> 6;
-        g = ((p & 0x0c) * 0x55) << 6;
-        r = ((p & 0x03) * 0x55) << 16;
-        *buffer++ = a|r|g|b;
-    }
-}
-
-static FASTCALL void
-fbFetch_c8 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD8 *pixel = (const CARD8 *)bits + x;
-    const CARD8 *end = pixel + width;
-    while (pixel < end) {
-        CARD32  p = *pixel++;
-        *buffer++ = indexed->rgba[p];
-    }
-}
-
-static FASTCALL void
-fbFetch_x4a4 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    const CARD8 *pixel = (const CARD8 *)bits + x;
-    const CARD8 *end = pixel + width;
-    while (pixel < end) {
-	CARD8 p = (*pixel++) & 0xf;
-        *buffer++ = (p | (p << 4)) << 24;
-    }
-}
-
-#define Fetch8(l,o)    (((CARD8 *) (l))[(o) >> 2])
-#if IMAGE_BYTE_ORDER == MSBFirst
-#define Fetch4(l,o)    ((o) & 2 ? Fetch8(l,o) & 0xf : Fetch8(l,o) >> 4)
-#else
-#define Fetch4(l,o)    ((o) & 2 ? Fetch8(l,o) >> 4 : Fetch8(l,o) & 0xf)
-#endif
-
-static FASTCALL void
-fbFetch_a4 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  p = Fetch4(bits, i + x);
-
-        p |= p << 4;
-        *buffer++ = p << 24;
-    }
-}
-
-static FASTCALL void
-fbFetch_r1g2b1 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  p = Fetch4(bits, i + x);
-        CARD32  r,g,b;
-
-        r = ((p & 0x8) * 0xff) << 13;
-        g = ((p & 0x6) * 0x55) << 7;
-        b = ((p & 0x1) * 0xff);
-        *buffer++ = 0xff000000|r|g|b;
-    }
-}
-
-static FASTCALL void
-fbFetch_b1g2r1 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  p = Fetch4(bits, i + x);
-        CARD32  r,g,b;
-
-        b = ((p & 0x8) * 0xff) >> 3;
-        g = ((p & 0x6) * 0x55) << 7;
-        r = ((p & 0x1) * 0xff) << 16;
-        *buffer++ = 0xff000000|r|g|b;
-    }
-}
-
-static FASTCALL void
-fbFetch_a1r1g1b1 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  p = Fetch4(bits, i + x);
-        CARD32  a,r,g,b;
-
-        a = ((p & 0x8) * 0xff) << 21;
-        r = ((p & 0x4) * 0xff) << 14;
-        g = ((p & 0x2) * 0xff) << 7;
-        b = ((p & 0x1) * 0xff);
-        *buffer++ = a|r|g|b;
-    }
-}
-
-static FASTCALL void
-fbFetch_a1b1g1r1 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  p = Fetch4(bits, i + x);
-        CARD32  a,r,g,b;
-
-        a = ((p & 0x8) * 0xff) << 21;
-        r = ((p & 0x4) * 0xff) >> 3;
-        g = ((p & 0x2) * 0xff) << 7;
-        b = ((p & 0x1) * 0xff) << 16;
-        *buffer++ = a|r|g|b;
-    }
-}
-
-static FASTCALL void
-fbFetch_c4 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  p = Fetch4(bits, i + x);
-
-        *buffer++ = indexed->rgba[p];
-    }
-}
-
-
-static FASTCALL void
-fbFetch_a1 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  p = ((CARD32 *)bits)[(i + x) >> 5];
-        CARD32  a;
-#if BITMAP_BIT_ORDER == MSBFirst
-        a = p >> (0x1f - ((i+x) & 0x1f));
-#else
-        a = p >> ((i+x) & 0x1f);
-#endif
-        a = a & 1;
-        a |= a << 1;
-        a |= a << 2;
-        a |= a << 4;
-        *buffer++ = a << 24;
-    }
-}
-
-static FASTCALL void
-fbFetch_g1 (const FbBits *bits, int x, int width, CARD32 *buffer, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  p = ((CARD32 *)bits)[(i+x) >> 5];
-        CARD32 a;
-#if BITMAP_BIT_ORDER == MSBFirst
-        a = p >> (0x1f - ((i+x) & 0x1f));
-#else
-        a = p >> ((i+x) & 0x1f);
-#endif
-        a = a & 1;
-        *buffer++ = indexed->rgba[a];
-    }
-}
-
-static fetchProc fetchProcForPicture (PicturePtr pict)
-{
-    switch(pict->format) {
-    case PICT_a8r8g8b8: return fbFetch_a8r8g8b8;
-    case PICT_x8r8g8b8: return fbFetch_x8r8g8b8;
-    case PICT_a8b8g8r8: return fbFetch_a8b8g8r8;
-    case PICT_x8b8g8r8: return fbFetch_x8b8g8r8;
-
-        /* 24bpp formats */
-    case PICT_r8g8b8: return fbFetch_r8g8b8;
-    case PICT_b8g8r8: return fbFetch_b8g8r8;
-
-        /* 16bpp formats */
-    case PICT_r5g6b5: return fbFetch_r5g6b5;
-    case PICT_b5g6r5: return fbFetch_b5g6r5;
-
-    case PICT_a1r5g5b5: return fbFetch_a1r5g5b5;
-    case PICT_x1r5g5b5: return fbFetch_x1r5g5b5;
-    case PICT_a1b5g5r5: return fbFetch_a1b5g5r5;
-    case PICT_x1b5g5r5: return fbFetch_x1b5g5r5;
-    case PICT_a4r4g4b4: return fbFetch_a4r4g4b4;
-    case PICT_x4r4g4b4: return fbFetch_x4r4g4b4;
-    case PICT_a4b4g4r4: return fbFetch_a4b4g4r4;
-    case PICT_x4b4g4r4: return fbFetch_x4b4g4r4;
-
-        /* 8bpp formats */
-    case PICT_a8: return  fbFetch_a8;
-    case PICT_r3g3b2: return fbFetch_r3g3b2;
-    case PICT_b2g3r3: return fbFetch_b2g3r3;
-    case PICT_a2r2g2b2: return fbFetch_a2r2g2b2;
-    case PICT_a2b2g2r2: return fbFetch_a2b2g2r2;
-    case PICT_c8: return  fbFetch_c8;
-    case PICT_g8: return  fbFetch_c8;
-    case PICT_x4a4: return fbFetch_x4a4;
-    
-        /* 4bpp formats */
-    case PICT_a4: return  fbFetch_a4;
-    case PICT_r1g2b1: return fbFetch_r1g2b1;
-    case PICT_b1g2r1: return fbFetch_b1g2r1;
-    case PICT_a1r1g1b1: return fbFetch_a1r1g1b1;
-    case PICT_a1b1g1r1: return fbFetch_a1b1g1r1;
-    case PICT_c4: return  fbFetch_c4;
-    case PICT_g4: return  fbFetch_c4;
-
-        /* 1bpp formats */
-    case PICT_a1: return  fbFetch_a1;
-    case PICT_g1: return  fbFetch_g1;
-    }
-
-    return NULL;
-}
-
-/*
- * Pixel wise fetching
- */
-
-typedef FASTCALL CARD32 (*fetchPixelProc)(const FbBits *bits, int offset, miIndexedPtr indexed);
-
-static FASTCALL CARD32
-fbFetchPixel_a8r8g8b8 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    return ((CARD32 *)bits)[offset];
-}
-
-static FASTCALL CARD32
-fbFetchPixel_x8r8g8b8 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    return ((CARD32 *)bits)[offset] | 0xff000000;
-}
-
-static FASTCALL CARD32
-fbFetchPixel_a8b8g8r8 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD32 *)bits)[offset];
-
-    return ((pixel & 0xff000000) |
-	    ((pixel >> 16) & 0xff) |
-	    (pixel & 0x0000ff00) |
-	    ((pixel & 0xff) << 16));
-}
-
-static FASTCALL CARD32
-fbFetchPixel_x8b8g8r8 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD32 *)bits)[offset];
-
-    return ((0xff000000) |
-	    ((pixel >> 16) & 0xff) |
-	    (pixel & 0x0000ff00) |
-	    ((pixel & 0xff) << 16));
-}
-
-static FASTCALL CARD32
-fbFetchPixel_r8g8b8 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD8   *pixel = ((CARD8 *) bits) + (offset*3);
-#if IMAGE_BYTE_ORDER == MSBFirst
-    return (0xff000000 |
-	    (pixel[0] << 16) |
-	    (pixel[1] << 8) |
-	    (pixel[2]));
-#else
-    return (0xff000000 |
-            (pixel[2] << 16) |
-            (pixel[1] << 8) |
-            (pixel[0]));
-#endif
-}
-
-static FASTCALL CARD32
-fbFetchPixel_b8g8r8 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD8   *pixel = ((CARD8 *) bits) + (offset*3);
-#if IMAGE_BYTE_ORDER == MSBFirst
-    return (0xff000000 |
-	    (pixel[2] << 16) |
-	    (pixel[1] << 8) |
-	    (pixel[0]));
-#else
-    return (0xff000000 |
-	    (pixel[0] << 16) |
-	    (pixel[1] << 8) |
-	    (pixel[2]));
-#endif
-}
-
-static FASTCALL CARD32
-fbFetchPixel_r5g6b5 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD16 *) bits)[offset];
-    CARD32  r,g,b;
-
-    r = ((pixel & 0xf800) | ((pixel & 0xe000) >> 5)) << 8;
-    g = ((pixel & 0x07e0) | ((pixel & 0x0600) >> 6)) << 5;
-    b = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) >> 2;
-    return (0xff000000 | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_b5g6r5 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD16 *) bits)[offset];
-    CARD32  r,g,b;
-
-    b = ((pixel & 0xf800) | ((pixel & 0xe000) >> 5)) >> 8;
-    g = ((pixel & 0x07e0) | ((pixel & 0x0600) >> 6)) << 5;
-    r = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) << 14;
-    return (0xff000000 | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_a1r5g5b5 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD16 *) bits)[offset];
-    CARD32  a,r,g,b;
-
-    a = (CARD32) ((CARD8) (0 - ((pixel & 0x8000) >> 15))) << 24;
-    r = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) << 9;
-    g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6;
-    b = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) >> 2;
-    return (a | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_x1r5g5b5 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD16 *) bits)[offset];
-    CARD32  r,g,b;
-
-    r = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) << 9;
-    g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6;
-    b = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) >> 2;
-    return (0xff000000 | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_a1b5g5r5 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD16 *) bits)[offset];
-    CARD32  a,r,g,b;
-
-    a = (CARD32) ((CARD8) (0 - ((pixel & 0x8000) >> 15))) << 24;
-    b = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) >> 7;
-    g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6;
-    r = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) << 14;
-    return (a | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_x1b5g5r5 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD16 *) bits)[offset];
-    CARD32  r,g,b;
-
-    b = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) >> 7;
-    g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6;
-    r = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) << 14;
-    return (0xff000000 | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_a4r4g4b4 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD16 *) bits)[offset];
-    CARD32  a,r,g,b;
-
-    a = ((pixel & 0xf000) | ((pixel & 0xf000) >> 4)) << 16;
-    r = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) << 12;
-    g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8;
-    b = ((pixel & 0x000f) | ((pixel & 0x000f) << 4));
-    return (a | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_x4r4g4b4 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD16 *) bits)[offset];
-    CARD32  r,g,b;
-
-    r = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) << 12;
-    g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8;
-    b = ((pixel & 0x000f) | ((pixel & 0x000f) << 4));
-    return (0xff000000 | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_a4b4g4r4 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD16 *) bits)[offset];
-    CARD32  a,r,g,b;
-
-    a = ((pixel & 0xf000) | ((pixel & 0xf000) >> 4)) << 16;
-    b = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) >> 4;
-    g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8;
-    r = ((pixel & 0x000f) | ((pixel & 0x000f) << 4)) << 16;
-    return (a | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_x4b4g4r4 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD16 *) bits)[offset];
-    CARD32  r,g,b;
-
-    b = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) >> 4;
-    g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8;
-    r = ((pixel & 0x000f) | ((pixel & 0x000f) << 4)) << 16;
-    return (0xff000000 | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_a8 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32   pixel = ((CARD8 *) bits)[offset];
-
-    return pixel << 24;
-}
-
-static FASTCALL CARD32
-fbFetchPixel_r3g3b2 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32   pixel = ((CARD8 *) bits)[offset];
-    CARD32  r,g,b;
-
-    r = ((pixel & 0xe0) | ((pixel & 0xe0) >> 3) | ((pixel & 0xc0) >> 6)) << 16;
-    g = ((pixel & 0x1c) | ((pixel & 0x18) >> 3) | ((pixel & 0x1c) << 3)) << 8;
-    b = (((pixel & 0x03)     ) |
-	 ((pixel & 0x03) << 2) |
-	 ((pixel & 0x03) << 4) |
-	 ((pixel & 0x03) << 6));
-    return (0xff000000 | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_b2g3r3 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32   pixel = ((CARD8 *) bits)[offset];
-    CARD32  r,g,b;
-
-    b = (((pixel & 0xc0)     ) |
-	 ((pixel & 0xc0) >> 2) |
-	 ((pixel & 0xc0) >> 4) |
-	 ((pixel & 0xc0) >> 6));
-    g = ((pixel & 0x38) | ((pixel & 0x38) >> 3) | ((pixel & 0x30) << 2)) << 8;
-    r = (((pixel & 0x07)     ) |
-	 ((pixel & 0x07) << 3) |
-	 ((pixel & 0x06) << 6)) << 16;
-    return (0xff000000 | r | g | b);
-}
-
-static FASTCALL CARD32
-fbFetchPixel_a2r2g2b2 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32   pixel = ((CARD8 *) bits)[offset];
-    CARD32   a,r,g,b;
-
-    a = ((pixel & 0xc0) * 0x55) << 18;
-    r = ((pixel & 0x30) * 0x55) << 12;
-    g = ((pixel & 0x0c) * 0x55) << 6;
-    b = ((pixel & 0x03) * 0x55);
-    return a|r|g|b;
-}
-
-static FASTCALL CARD32
-fbFetchPixel_a2b2g2r2 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32   pixel = ((CARD8 *) bits)[offset];
-    CARD32   a,r,g,b;
-
-    a = ((pixel & 0xc0) * 0x55) << 18;
-    b = ((pixel & 0x30) * 0x55) >> 6;
-    g = ((pixel & 0x0c) * 0x55) << 6;
-    r = ((pixel & 0x03) * 0x55) << 16;
-    return a|r|g|b;
-}
-
-static FASTCALL CARD32
-fbFetchPixel_c8 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32   pixel = ((CARD8 *) bits)[offset];
-    return indexed->rgba[pixel];
-}
-
-static FASTCALL CARD32
-fbFetchPixel_x4a4 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32   pixel = ((CARD8 *) bits)[offset];
-
-    return ((pixel & 0xf) | ((pixel & 0xf) << 4)) << 24;
-}
-
-#define Fetch8(l,o)    (((CARD8 *) (l))[(o) >> 2])
-#if IMAGE_BYTE_ORDER == MSBFirst
-#define Fetch4(l,o)    ((o) & 2 ? Fetch8(l,o) & 0xf : Fetch8(l,o) >> 4)
-#else
-#define Fetch4(l,o)    ((o) & 2 ? Fetch8(l,o) >> 4 : Fetch8(l,o) & 0xf)
-#endif
-
-static FASTCALL CARD32
-fbFetchPixel_a4 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = Fetch4(bits, offset);
-
-    pixel |= pixel << 4;
-    return pixel << 24;
-}
-
-static FASTCALL CARD32
-fbFetchPixel_r1g2b1 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = Fetch4(bits, offset);
-    CARD32  r,g,b;
-
-    r = ((pixel & 0x8) * 0xff) << 13;
-    g = ((pixel & 0x6) * 0x55) << 7;
-    b = ((pixel & 0x1) * 0xff);
-    return 0xff000000|r|g|b;
-}
-
-static FASTCALL CARD32
-fbFetchPixel_b1g2r1 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = Fetch4(bits, offset);
-    CARD32  r,g,b;
-
-    b = ((pixel & 0x8) * 0xff) >> 3;
-    g = ((pixel & 0x6) * 0x55) << 7;
-    r = ((pixel & 0x1) * 0xff) << 16;
-    return 0xff000000|r|g|b;
-}
-
-static FASTCALL CARD32
-fbFetchPixel_a1r1g1b1 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = Fetch4(bits, offset);
-    CARD32  a,r,g,b;
-
-    a = ((pixel & 0x8) * 0xff) << 21;
-    r = ((pixel & 0x4) * 0xff) << 14;
-    g = ((pixel & 0x2) * 0xff) << 7;
-    b = ((pixel & 0x1) * 0xff);
-    return a|r|g|b;
-}
-
-static FASTCALL CARD32
-fbFetchPixel_a1b1g1r1 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = Fetch4(bits, offset);
-    CARD32  a,r,g,b;
-
-    a = ((pixel & 0x8) * 0xff) << 21;
-    r = ((pixel & 0x4) * 0xff) >> 3;
-    g = ((pixel & 0x2) * 0xff) << 7;
-    b = ((pixel & 0x1) * 0xff) << 16;
-    return a|r|g|b;
-}
-
-static FASTCALL CARD32
-fbFetchPixel_c4 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = Fetch4(bits, offset);
-
-    return indexed->rgba[pixel];
-}
-
-
-static FASTCALL CARD32
-fbFetchPixel_a1 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32  pixel = ((CARD32 *)bits)[offset >> 5];
-    CARD32  a;
-#if BITMAP_BIT_ORDER == MSBFirst
-    a = pixel >> (0x1f - (offset & 0x1f));
-#else
-    a = pixel >> (offset & 0x1f);
-#endif
-    a = a & 1;
-    a |= a << 1;
-    a |= a << 2;
-    a |= a << 4;
-    return a << 24;
-}
-
-static FASTCALL CARD32
-fbFetchPixel_g1 (const FbBits *bits, int offset, miIndexedPtr indexed)
-{
-    CARD32 pixel = ((CARD32 *)bits)[offset >> 5];
-    CARD32 a;
-#if BITMAP_BIT_ORDER == MSBFirst
-    a = pixel >> (0x1f - (offset & 0x1f));
-#else
-    a = pixel >> (offset & 0x1f);
-#endif
-    a = a & 1;
-    return indexed->rgba[a];
-}
-
-static fetchPixelProc fetchPixelProcForPicture (PicturePtr pict)
-{
-    switch(pict->format) {
-    case PICT_a8r8g8b8: return fbFetchPixel_a8r8g8b8;
-    case PICT_x8r8g8b8: return fbFetchPixel_x8r8g8b8;
-    case PICT_a8b8g8r8: return fbFetchPixel_a8b8g8r8;
-    case PICT_x8b8g8r8: return fbFetchPixel_x8b8g8r8;
-
-        /* 24bpp formats */
-    case PICT_r8g8b8: return fbFetchPixel_r8g8b8;
-    case PICT_b8g8r8: return fbFetchPixel_b8g8r8;
-
-        /* 16bpp formats */
-    case PICT_r5g6b5: return fbFetchPixel_r5g6b5;
-    case PICT_b5g6r5: return fbFetchPixel_b5g6r5;
-
-    case PICT_a1r5g5b5: return fbFetchPixel_a1r5g5b5;
-    case PICT_x1r5g5b5: return fbFetchPixel_x1r5g5b5;
-    case PICT_a1b5g5r5: return fbFetchPixel_a1b5g5r5;
-    case PICT_x1b5g5r5: return fbFetchPixel_x1b5g5r5;
-    case PICT_a4r4g4b4: return fbFetchPixel_a4r4g4b4;
-    case PICT_x4r4g4b4: return fbFetchPixel_x4r4g4b4;
-    case PICT_a4b4g4r4: return fbFetchPixel_a4b4g4r4;
-    case PICT_x4b4g4r4: return fbFetchPixel_x4b4g4r4;
-
-        /* 8bpp formats */
-    case PICT_a8: return  fbFetchPixel_a8;
-    case PICT_r3g3b2: return fbFetchPixel_r3g3b2;
-    case PICT_b2g3r3: return fbFetchPixel_b2g3r3;
-    case PICT_a2r2g2b2: return fbFetchPixel_a2r2g2b2;
-    case PICT_a2b2g2r2: return fbFetchPixel_a2b2g2r2;
-    case PICT_c8: return  fbFetchPixel_c8;
-    case PICT_g8: return  fbFetchPixel_c8;
-    case PICT_x4a4: return fbFetchPixel_x4a4;
-
-        /* 4bpp formats */
-    case PICT_a4: return  fbFetchPixel_a4;
-    case PICT_r1g2b1: return fbFetchPixel_r1g2b1;
-    case PICT_b1g2r1: return fbFetchPixel_b1g2r1;
-    case PICT_a1r1g1b1: return fbFetchPixel_a1r1g1b1;
-    case PICT_a1b1g1r1: return fbFetchPixel_a1b1g1r1;
-    case PICT_c4: return  fbFetchPixel_c4;
-    case PICT_g4: return  fbFetchPixel_c4;
-
-        /* 1bpp formats */
-    case PICT_a1: return  fbFetchPixel_a1;
-    case PICT_g1: return  fbFetchPixel_g1;
-    }
-
-    return NULL;
-}
-
-
-
-/*
- * All the store functions
- */
-
-typedef FASTCALL void (*storeProc) (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed);
-
-#define Splita(v)	CARD32	a = ((v) >> 24), r = ((v) >> 16) & 0xff, g = ((v) >> 8) & 0xff, b = (v) & 0xff
-#define Split(v)	CARD32	r = ((v) >> 16) & 0xff, g = ((v) >> 8) & 0xff, b = (v) & 0xff
-
-static FASTCALL void
-fbStore_a8r8g8b8 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    memcpy(((CARD32 *)bits) + x, values, width*sizeof(CARD32));
-}
-
-static FASTCALL void
-fbStore_x8r8g8b8 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD32 *pixel = (CARD32 *)bits + x;
-    for (i = 0; i < width; ++i)
-        *pixel++ = values[i] & 0xffffff;
-}
-
-static FASTCALL void
-fbStore_a8b8g8r8 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD32 *pixel = (CARD32 *)bits + x;
-    for (i = 0; i < width; ++i)
-        *pixel++ = (values[i] & 0xff00ff00) | ((values[i] >> 16) & 0xff) | ((values[i] & 0xff) << 16);
-}
-
-static FASTCALL void
-fbStore_x8b8g8r8 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD32 *pixel = (CARD32 *)bits + x;
-    for (i = 0; i < width; ++i)
-        *pixel++ = (values[i] & 0x0000ff00) | ((values[i] >> 16) & 0xff) | ((values[i] & 0xff) << 16);
-}
-
-static FASTCALL void
-fbStore_r8g8b8 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD8 *pixel = ((CARD8 *) bits) + 3*x;
-    for (i = 0; i < width; ++i) {
-        Store24(pixel, values[i]);
-        pixel += 3;
-    }
-}
-
-static FASTCALL void
-fbStore_b8g8r8 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD8 *pixel = ((CARD8 *) bits) + 3*x;
-    for (i = 0; i < width; ++i) {
-#if IMAGE_BYTE_ORDER == MSBFirst
-        *pixel++ = Blue(values[i]);
-        *pixel++ = Green(values[i]);
-        *pixel++ = Red(values[i]);
-#else
-        *pixel++ = Red(values[i]);
-        *pixel++ = Green(values[i]);
-        *pixel++ = Blue(values[i]);
-#endif
-    }
-}
-
-static FASTCALL void
-fbStore_r5g6b5 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD16 *pixel = ((CARD16 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        CARD32 s = values[i];
-        *pixel++ = ((s >> 3) & 0x001f) |
-                   ((s >> 5) & 0x07e0) |
-                   ((s >> 8) & 0xf800);
-    }
-}
-
-static FASTCALL void
-fbStore_b5g6r5 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD16  *pixel = ((CARD16 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Split(values[i]);
-        *pixel++ = (((b << 8) & 0xf800) |
-                    ((g << 3) & 0x07e0) |
-                    ((r >> 3)         ));
-    }
-}
-
-static FASTCALL void
-fbStore_a1r5g5b5 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD16  *pixel = ((CARD16 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Splita(values[i]);
-        *pixel++ = (((a << 8) & 0x8000) |
-                    ((r << 7) & 0x7c00) |
-                    ((g << 2) & 0x03e0) |
-                    ((b >> 3)         ));
-    }
-}
-
-static FASTCALL void
-fbStore_x1r5g5b5 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD16  *pixel = ((CARD16 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Split(values[i]);
-        *pixel++ = (((r << 7) & 0x7c00) |
-                    ((g << 2) & 0x03e0) |
-                    ((b >> 3)         ));
-    }
-}
-
-static FASTCALL void
-fbStore_a1b5g5r5 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD16  *pixel = ((CARD16 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Splita(values[i]);
-        *pixel++ = (((a << 8) & 0x8000) |
-                    ((b << 7) & 0x7c00) |
-                    ((g << 2) & 0x03e0) |
-                    ((r >> 3)         ));
-	}
-}
-
-static FASTCALL void
-fbStore_x1b5g5r5 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD16  *pixel = ((CARD16 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Split(values[i]);
-        *pixel++ = (((b << 7) & 0x7c00) |
-                    ((g << 2) & 0x03e0) |
-                    ((r >> 3)         ));
-    }
-}
-
-static FASTCALL void
-fbStore_a4r4g4b4 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD16  *pixel = ((CARD16 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Splita(values[i]);
-        *pixel++ = (((a << 8) & 0xf000) |
-                    ((r << 4) & 0x0f00) |
-                    ((g     ) & 0x00f0) |
-                    ((b >> 4)         ));
-    }
-}
-
-static FASTCALL void
-fbStore_x4r4g4b4 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD16  *pixel = ((CARD16 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Split(values[i]);
-        *pixel++ = (((r << 4) & 0x0f00) |
-                    ((g     ) & 0x00f0) |
-                    ((b >> 4)         ));
-    }
-}
-
-static FASTCALL void
-fbStore_a4b4g4r4 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD16  *pixel = ((CARD16 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Splita(values[i]);
-        *pixel++ = (((a << 8) & 0xf000) |
-                    ((b << 4) & 0x0f00) |
-                    ((g     ) & 0x00f0) |
-                    ((r >> 4)         ));
-    }
-}
-
-static FASTCALL void
-fbStore_x4b4g4r4 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD16  *pixel = ((CARD16 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Split(values[i]);
-        *pixel++ = (((b << 4) & 0x0f00) |
-                    ((g     ) & 0x00f0) |
-                    ((r >> 4)         ));
-    }
-}
-
-static FASTCALL void
-fbStore_a8 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD8   *pixel = ((CARD8 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        *pixel++ = values[i] >> 24;
-    }
-}
-
-static FASTCALL void
-fbStore_r3g3b2 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD8   *pixel = ((CARD8 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Split(values[i]);
-        *pixel++ = (((r     ) & 0xe0) |
-                    ((g >> 3) & 0x1c) |
-                    ((b >> 6)       ));
-    }
-}
-
-static FASTCALL void
-fbStore_b2g3r3 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD8   *pixel = ((CARD8 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Split(values[i]);
-        *pixel++ = (((b     ) & 0xe0) |
-                    ((g >> 3) & 0x1c) |
-                    ((r >> 6)       ));
-    }
-}
-
-static FASTCALL void
-fbStore_a2r2g2b2 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD8   *pixel = ((CARD8 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        Splita(values[i]);
-        *pixel++ = (((a     ) & 0xc0) |
-                    ((r >> 2) & 0x30) |
-                    ((g >> 4) & 0x0c) |
-                    ((b >> 6)       ));
-    }
-}
-
-static FASTCALL void
-fbStore_c8 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD8   *pixel = ((CARD8 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        *pixel++ = miIndexToEnt24(indexed,values[i]);
-    }
-}
-
-static FASTCALL void
-fbStore_x4a4 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    CARD8   *pixel = ((CARD8 *) bits) + x;
-    for (i = 0; i < width; ++i) {
-        *pixel++ = values[i] >> 28;
-    }
-}
-
-#define Store8(l,o,v)  (((CARD8 *) l)[(o) >> 3] = (v))
-#if IMAGE_BYTE_ORDER == MSBFirst
-#define Store4(l,o,v)  Store8(l,o,((o) & 4 ? \
-				   (Fetch8(l,o) & 0xf0) | (v) : \
-				   (Fetch8(l,o) & 0x0f) | ((v) << 4)))
-#else
-#define Store4(l,o,v)  Store8(l,o,((o) & 4 ? \
-				   (Fetch8(l,o) & 0x0f) | ((v) << 4) : \
-				   (Fetch8(l,o) & 0xf0) | (v)))
-#endif
-
-static FASTCALL void
-fbStore_a4 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        Store4(bits, i + x, values[i]>>28);
-    }
-}
-
-static FASTCALL void
-fbStore_r1g2b1 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  pixel;
-
-        Split(values[i]);
-        pixel = (((r >> 4) & 0x8) |
-                 ((g >> 5) & 0x6) |
-                 ((b >> 7)      ));
-        Store4(bits, i + x, pixel);
-    }
-}
-
-static FASTCALL void
-fbStore_b1g2r1 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  pixel;
-
-        Split(values[i]);
-        pixel = (((b >> 4) & 0x8) |
-                 ((g >> 5) & 0x6) |
-                 ((r >> 7)      ));
-        Store4(bits, i + x, pixel);
-    }
-}
-
-static FASTCALL void
-fbStore_a1r1g1b1 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  pixel;
-        Splita(values[i]);
-        pixel = (((a >> 4) & 0x8) |
-                 ((r >> 5) & 0x4) |
-                 ((g >> 6) & 0x2) |
-                 ((b >> 7)      ));
-        Store4(bits, i + x, pixel);
-    }
-}
-
-static FASTCALL void
-fbStore_a1b1g1r1 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  pixel;
-        Splita(values[i]);
-        pixel = (((a >> 4) & 0x8) |
-                 ((b >> 5) & 0x4) |
-                 ((g >> 6) & 0x2) |
-                 ((r >> 7)      ));
-        Store4(bits, i + x, pixel);
-    }
-}
-
-static FASTCALL void
-fbStore_c4 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  pixel;
-
-        pixel = miIndexToEnt24(indexed, values[i]);
-        Store4(bits, i + x, pixel);
-    }
-}
-
-static FASTCALL void
-fbStore_a1 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  *pixel = ((CARD32 *) bits) + ((i+x) >> 5);
-        CARD32  mask = FbStipMask((i+x) & 0x1f, 1);
-
-        CARD32 v = values[i] & 0x80000000 ? mask : 0;
-        *pixel = (*pixel & ~mask) | v;
-    }
-}
-
-static FASTCALL void
-fbStore_g1 (FbBits *bits, const CARD32 *values, int x, int width, miIndexedPtr indexed)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  *pixel = ((CARD32 *) bits) + ((i+x) >> 5);
-        CARD32  mask = FbStipMask((i+x) & 0x1f, 1);
-
-        CARD32 v = miIndexToEntY24(indexed,values[i]) ? mask : 0;
-        *pixel = (*pixel & ~mask) | v;
-    }
-}
-
-
-static storeProc storeProcForPicture (PicturePtr pict)
-{
-    switch(pict->format) {
-    case PICT_a8r8g8b8: return fbStore_a8r8g8b8;
-    case PICT_x8r8g8b8: return fbStore_x8r8g8b8;
-    case PICT_a8b8g8r8: return fbStore_a8b8g8r8;
-    case PICT_x8b8g8r8: return fbStore_x8b8g8r8;
-
-        /* 24bpp formats */
-    case PICT_r8g8b8: return fbStore_r8g8b8;
-    case PICT_b8g8r8: return fbStore_b8g8r8;
-
-        /* 16bpp formats */
-    case PICT_r5g6b5: return fbStore_r5g6b5;
-    case PICT_b5g6r5: return fbStore_b5g6r5;
-
-    case PICT_a1r5g5b5: return fbStore_a1r5g5b5;
-    case PICT_x1r5g5b5: return fbStore_x1r5g5b5;
-    case PICT_a1b5g5r5: return fbStore_a1b5g5r5;
-    case PICT_x1b5g5r5: return fbStore_x1b5g5r5;
-    case PICT_a4r4g4b4: return fbStore_a4r4g4b4;
-    case PICT_x4r4g4b4: return fbStore_x4r4g4b4;
-    case PICT_a4b4g4r4: return fbStore_a4b4g4r4;
-    case PICT_x4b4g4r4: return fbStore_x4b4g4r4;
-
-        /* 8bpp formats */
-    case PICT_a8: return  fbStore_a8;
-    case PICT_r3g3b2: return fbStore_r3g3b2;
-    case PICT_b2g3r3: return fbStore_b2g3r3;
-    case PICT_a2r2g2b2: return fbStore_a2r2g2b2;
-    case PICT_c8: return  fbStore_c8;
-    case PICT_g8: return  fbStore_c8;
-    case PICT_x4a4: return fbStore_x4a4;
-
-        /* 4bpp formats */
-    case PICT_a4: return  fbStore_a4;
-    case PICT_r1g2b1: return fbStore_r1g2b1;
-    case PICT_b1g2r1: return fbStore_b1g2r1;
-    case PICT_a1r1g1b1: return fbStore_a1r1g1b1;
-    case PICT_a1b1g1r1: return fbStore_a1b1g1r1;
-    case PICT_c4: return  fbStore_c4;
-    case PICT_g4: return  fbStore_c4;
-
-        /* 1bpp formats */
-    case PICT_a1: return  fbStore_a1;
-    case PICT_g1: return  fbStore_g1;
-    default:
-        return NULL;
-    }
-}
-
-
-/*
- * Combine src and mask
- */
-static FASTCALL void
-fbCombineMaskU (CARD32 *src, const CARD32 *mask, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 a = mask[i] >> 24;
-        CARD32 s = src[i];
-        FbByteMul(s, a);
-        src[i] = s;
-    }
-}
-
-/*
- * All of the composing functions
- */
-
-static FASTCALL void
-fbCombineClear (CARD32 *dest, const CARD32 *src, int width)
-{
-    memset(dest, 0, width*sizeof(CARD32));
-}
-
-static FASTCALL void
-fbCombineSrcU (CARD32 *dest, const CARD32 *src, int width)
-{
-    memcpy(dest, src, width*sizeof(CARD32));
-}
-
-
-static FASTCALL void
-fbCombineOverU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 s = src[i];
-        CARD32 d = dest[i];
-        CARD32 ia = Alpha(~s);
-
-        FbByteMulAdd(d, ia, s);
-        dest[i] = d;
-    }
-}
-
-static FASTCALL void
-fbCombineOverReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 s = src[i];
-        CARD32 d = dest[i];
-        CARD32 ia = Alpha(~dest[i]);
-        FbByteMulAdd(s, ia, d);
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineInU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 s = src[i];
-        CARD32 a = Alpha(dest[i]);
-        FbByteMul(s, a);
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineInReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 d = dest[i];
-        CARD32 a = Alpha(src[i]);
-        FbByteMul(d, a);
-        dest[i] = d;
-    }
-}
-
-static FASTCALL void
-fbCombineOutU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 s = src[i];
-        CARD32 a = Alpha(~dest[i]);
-        FbByteMul(s, a);
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineOutReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 d = dest[i];
-        CARD32 a = Alpha(~src[i]);
-        FbByteMul(d, a);
-        dest[i] = d;
-    }
-}
-
-static FASTCALL void
-fbCombineAtopU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 s = src[i];
-        CARD32 d = dest[i];
-        CARD32 dest_a = Alpha(d);
-        CARD32 src_ia = Alpha(~s);
-
-        FbByteAddMul(s, dest_a, d, src_ia);
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineAtopReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 s = src[i];
-        CARD32 d = dest[i];
-        CARD32 src_a = Alpha(s);
-        CARD32 dest_ia = Alpha(~d);
-
-        FbByteAddMul(s, dest_ia, d, src_a);
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineXorU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 s = src[i];
-        CARD32 d = dest[i];
-        CARD32 src_ia = Alpha(~s);
-        CARD32 dest_ia = Alpha(~d);
-
-        FbByteAddMul(s, dest_ia, d, src_ia);
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineAddU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 s = src[i];
-        CARD32 d = dest[i];
-        FbByteAdd(d, s);
-        dest[i] = d;
-    }
-}
-
-static FASTCALL void
-fbCombineSaturateU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  s = src[i];
-        CARD32 d = dest[i];
-        CARD16  sa, da;
-
-        sa = s >> 24;
-        da = ~d >> 24;
-        if (sa > da)
-        {
-            sa = FbIntDiv(da, sa);
-            FbByteMul(s, sa);
-        }
-        FbByteAdd(d, s);
-        dest[i] = d;
-    }
-}
-
-/*
- * All of the disjoint composing functions
-
- The four entries in the first column indicate what source contributions
- come from each of the four areas of the picture -- areas covered by neither
- A nor B, areas covered only by A, areas covered only by B and finally
- areas covered by both A and B.
-
-		Disjoint			Conjoint
-		Fa		Fb		Fa		Fb
-(0,0,0,0)	0		0		0		0
-(0,A,0,A)	1		0		1		0
-(0,0,B,B)	0		1		0		1
-(0,A,B,A)	1		min((1-a)/b,1)	1		max(1-a/b,0)
-(0,A,B,B)	min((1-b)/a,1)	1		max(1-b/a,0)	1
-(0,0,0,A)	max(1-(1-b)/a,0) 0		min(1,b/a)	0
-(0,0,0,B)	0		max(1-(1-a)/b,0) 0		min(a/b,1)
-(0,A,0,0)	min(1,(1-b)/a)	0		max(1-b/a,0)	0
-(0,0,B,0)	0		min(1,(1-a)/b)	0		max(1-a/b,0)
-(0,0,B,A)	max(1-(1-b)/a,0) min(1,(1-a)/b)	 min(1,b/a)	max(1-a/b,0)
-(0,A,0,B)	min(1,(1-b)/a)	max(1-(1-a)/b,0) max(1-b/a,0)	min(1,a/b)
-(0,A,B,0)	min(1,(1-b)/a)	min(1,(1-a)/b)	max(1-b/a,0)	max(1-a/b,0)
-
- */
-
-#define CombineAOut 1
-#define CombineAIn  2
-#define CombineBOut 4
-#define CombineBIn  8
-
-#define CombineClear	0
-#define CombineA	(CombineAOut|CombineAIn)
-#define CombineB	(CombineBOut|CombineBIn)
-#define CombineAOver	(CombineAOut|CombineBOut|CombineAIn)
-#define CombineBOver	(CombineAOut|CombineBOut|CombineBIn)
-#define CombineAAtop	(CombineBOut|CombineAIn)
-#define CombineBAtop	(CombineAOut|CombineBIn)
-#define CombineXor	(CombineAOut|CombineBOut)
-
-/* portion covered by a but not b */
-static INLINE CARD8
-fbCombineDisjointOutPart (CARD8 a, CARD8 b)
-{
-    /* min (1, (1-b) / a) */
-
-    b = ~b;		    /* 1 - b */
-    if (b >= a)		    /* 1 - b >= a -> (1-b)/a >= 1 */
-	return 0xff;	    /* 1 */
-    return FbIntDiv(b,a);   /* (1-b) / a */
-}
-
-/* portion covered by both a and b */
-static INLINE CARD8
-fbCombineDisjointInPart (CARD8 a, CARD8 b)
-{
-    /* max (1-(1-b)/a,0) */
-    /*  = - min ((1-b)/a - 1, 0) */
-    /*  = 1 - min (1, (1-b)/a) */
-
-    b = ~b;		    /* 1 - b */
-    if (b >= a)		    /* 1 - b >= a -> (1-b)/a >= 1 */
-	return 0;	    /* 1 - 1 */
-    return ~FbIntDiv(b,a);  /* 1 - (1-b) / a */
-}
-
-static FASTCALL void
-fbCombineDisjointGeneralU (CARD32 *dest, const CARD32 *src, int width, CARD8 combine)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 s = src[i];
-        CARD32 d = dest[i];
-        CARD32 m,n,o,p;
-        CARD16 Fa, Fb, t, u, v;
-        CARD8 sa = s >> 24;
-        CARD8 da = d >> 24;
-
-        switch (combine & CombineA) {
-        default:
-            Fa = 0;
-            break;
-        case CombineAOut:
-            Fa = fbCombineDisjointOutPart (sa, da);
-            break;
-        case CombineAIn:
-            Fa = fbCombineDisjointInPart (sa, da);
-            break;
-        case CombineA:
-            Fa = 0xff;
-            break;
-        }
-
-        switch (combine & CombineB) {
-        default:
-            Fb = 0;
-            break;
-        case CombineBOut:
-            Fb = fbCombineDisjointOutPart (da, sa);
-            break;
-        case CombineBIn:
-            Fb = fbCombineDisjointInPart (da, sa);
-            break;
-        case CombineB:
-            Fb = 0xff;
-            break;
-        }
-        m = FbGen (s,d,0,Fa,Fb,t, u, v);
-        n = FbGen (s,d,8,Fa,Fb,t, u, v);
-        o = FbGen (s,d,16,Fa,Fb,t, u, v);
-        p = FbGen (s,d,24,Fa,Fb,t, u, v);
-        s = m|n|o|p;
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineDisjointOverU (CARD32 *dest, const CARD32 *src, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  s = src[i];
-        CARD16  a = s >> 24;
-
-        if (a != 0x00)
-        {
-            if (a != 0xff)
-            {
-                CARD32 d = dest[i];
-                a = fbCombineDisjointOutPart (d >> 24, a);
-                FbByteMulAdd(d, a, s);
-                s = d;
-            }
-            dest[i] = s;
-        }
-    }
-}
-
-static FASTCALL void
-fbCombineDisjointInU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineDisjointGeneralU (dest, src, width, CombineAIn);
-}
-
-static FASTCALL void
-fbCombineDisjointInReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineDisjointGeneralU (dest, src, width, CombineBIn);
-}
-
-static FASTCALL void
-fbCombineDisjointOutU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineDisjointGeneralU (dest, src, width, CombineAOut);
-}
-
-static FASTCALL void
-fbCombineDisjointOutReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineDisjointGeneralU (dest, src, width, CombineBOut);
-}
-
-static FASTCALL void
-fbCombineDisjointAtopU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineDisjointGeneralU (dest, src, width, CombineAAtop);
-}
-
-static FASTCALL void
-fbCombineDisjointAtopReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineDisjointGeneralU (dest, src, width, CombineBAtop);
-}
-
-static FASTCALL void
-fbCombineDisjointXorU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineDisjointGeneralU (dest, src, width, CombineXor);
-}
-
-/* portion covered by a but not b */
-static INLINE CARD8
-fbCombineConjointOutPart (CARD8 a, CARD8 b)
-{
-    /* max (1-b/a,0) */
-    /* = 1-min(b/a,1) */
-
-    /* min (1, (1-b) / a) */
-
-    if (b >= a)		    /* b >= a -> b/a >= 1 */
-	return 0x00;	    /* 0 */
-    return ~FbIntDiv(b,a);   /* 1 - b/a */
-}
-
-/* portion covered by both a and b */
-static INLINE CARD8
-fbCombineConjointInPart (CARD8 a, CARD8 b)
-{
-    /* min (1,b/a) */
-
-    if (b >= a)		    /* b >= a -> b/a >= 1 */
-	return 0xff;	    /* 1 */
-    return FbIntDiv(b,a);   /* b/a */
-}
-
-static FASTCALL void
-fbCombineConjointGeneralU (CARD32 *dest, const CARD32 *src, int width, CARD8 combine)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32  s = src[i];
-        CARD32 d = dest[i];
-        CARD32  m,n,o,p;
-        CARD16  Fa, Fb, t, u, v;
-        CARD8 sa = s >> 24;
-        CARD8 da = d >> 24;
-
-        switch (combine & CombineA) {
-        default:
-            Fa = 0;
-            break;
-        case CombineAOut:
-            Fa = fbCombineConjointOutPart (sa, da);
-            break;
-        case CombineAIn:
-            Fa = fbCombineConjointInPart (sa, da);
-            break;
-        case CombineA:
-            Fa = 0xff;
-            break;
-        }
-
-        switch (combine & CombineB) {
-        default:
-            Fb = 0;
-            break;
-        case CombineBOut:
-            Fb = fbCombineConjointOutPart (da, sa);
-            break;
-        case CombineBIn:
-            Fb = fbCombineConjointInPart (da, sa);
-            break;
-        case CombineB:
-            Fb = 0xff;
-            break;
-        }
-        m = FbGen (s,d,0,Fa,Fb,t, u, v);
-        n = FbGen (s,d,8,Fa,Fb,t, u, v);
-        o = FbGen (s,d,16,Fa,Fb,t, u, v);
-        p = FbGen (s,d,24,Fa,Fb,t, u, v);
-        s = m|n|o|p;
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineConjointOverU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineConjointGeneralU (dest, src, width, CombineAOver);
-}
-
-
-static FASTCALL void
-fbCombineConjointOverReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineConjointGeneralU (dest, src, width, CombineBOver);
-}
-
-
-static FASTCALL void
-fbCombineConjointInU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineConjointGeneralU (dest, src, width, CombineAIn);
-}
-
-
-static FASTCALL void
-fbCombineConjointInReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineConjointGeneralU (dest, src, width, CombineBIn);
-}
-
-static FASTCALL void
-fbCombineConjointOutU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineConjointGeneralU (dest, src, width, CombineAOut);
-}
-
-static FASTCALL void
-fbCombineConjointOutReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineConjointGeneralU (dest, src, width, CombineBOut);
-}
-
-static FASTCALL void
-fbCombineConjointAtopU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineConjointGeneralU (dest, src, width, CombineAAtop);
-}
-
-static FASTCALL void
-fbCombineConjointAtopReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineConjointGeneralU (dest, src, width, CombineBAtop);
-}
-
-static FASTCALL void
-fbCombineConjointXorU (CARD32 *dest, const CARD32 *src, int width)
-{
-    fbCombineConjointGeneralU (dest, src, width, CombineXor);
-}
-
-static CombineFuncU fbCombineFuncU[] = {
-    fbCombineClear,
-    fbCombineSrcU,
-    NULL, /* CombineDst */
-    fbCombineOverU,
-    fbCombineOverReverseU,
-    fbCombineInU,
-    fbCombineInReverseU,
-    fbCombineOutU,
-    fbCombineOutReverseU,
-    fbCombineAtopU,
-    fbCombineAtopReverseU,
-    fbCombineXorU,
-    fbCombineAddU,
-    fbCombineSaturateU,
-    NULL,
-    NULL,
-    fbCombineClear,
-    fbCombineSrcU,
-    NULL, /* CombineDst */
-    fbCombineDisjointOverU,
-    fbCombineSaturateU, /* DisjointOverReverse */
-    fbCombineDisjointInU,
-    fbCombineDisjointInReverseU,
-    fbCombineDisjointOutU,
-    fbCombineDisjointOutReverseU,
-    fbCombineDisjointAtopU,
-    fbCombineDisjointAtopReverseU,
-    fbCombineDisjointXorU,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    fbCombineClear,
-    fbCombineSrcU,
-    NULL, /* CombineDst */
-    fbCombineConjointOverU,
-    fbCombineConjointOverReverseU,
-    fbCombineConjointInU,
-    fbCombineConjointInReverseU,
-    fbCombineConjointOutU,
-    fbCombineConjointOutReverseU,
-    fbCombineConjointAtopU,
-    fbCombineConjointAtopReverseU,
-    fbCombineConjointXorU,
-};
-
-static FASTCALL void
-fbCombineMaskC (CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 a = mask[i];
-
-        CARD32	x;
-        CARD16	xa;
-
-        if (!a)
-        {
-            src[i] = 0;
-            continue;
-        }
-
-        x = src[i];
-        if (a == 0xffffffff)
-        {
-            x = x >> 24;
-            x |= x << 8;
-            x |= x << 16;
-            mask[i] = x;
-            continue;
-        }
-
-        xa = x >> 24;
-        FbByteMulC(x, a);
-        src[i] = x;
-        FbByteMul(a, xa);
-        mask[i] = a;
-    }
-}
-
-static FASTCALL void
-fbCombineMaskValueC (CARD32 *src, const CARD32 *mask, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 a = mask[i];
-        CARD32	x;
-
-        if (!a)
-        {
-            src[i] = 0;
-            continue;
-        }
-
-        if (a == 0xffffffff)
-            continue;
-
-        x = src[i];
-        FbByteMulC(x, a);
-        src[i] = x;
-    }
-}
-
-
-static FASTCALL void
-fbCombineMaskAlphaC (const CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    for (i = 0; i < width; ++i) {
-        CARD32 a = mask[i];
-        CARD32	x;
-
-        if (!a)
-            continue;
-
-        x = src[i] >> 24;
-        if (x == 0xff)
-            continue;
-        if (a == 0xffffffff)
-        {
-            x = x >> 24;
-            x |= x << 8;
-            x |= x << 16;
-            mask[i] = x;
-            continue;
-        }
-
-        FbByteMul(a, x);
-        mask[i] = a;
-    }
-}
-
-static FASTCALL void
-fbCombineClearC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    memset(dest, 0, width*sizeof(CARD32));
-}
-
-static FASTCALL void
-fbCombineSrcC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineMaskValueC(src, mask, width);
-    memcpy(dest, src, width*sizeof(CARD32));
-}
-
-static FASTCALL void
-fbCombineOverC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32  s = src[i];
-        CARD32  a = ~mask[i];
-
-        if (a != 0xffffffff)
-        {
-            if (a)
-            {
-                CARD32 d = dest[i];
-                FbByteMulAddC(d, a, s);
-                s = d;
-            }
-            dest[i] = s;
-        }
-    }
-}
-
-static FASTCALL void
-fbCombineOverReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskValueC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32 d = dest[i];
-        CARD32 a = ~d >> 24;
-
-        if (a)
-        {
-            CARD32 s = src[i];
-            if (a != 0xff)
-            {
-                FbByteMulAdd(s, a, d);
-            }
-            dest[i] = s;
-        }
-    }
-}
-
-static FASTCALL void
-fbCombineInC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskValueC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32 d = dest[i];
-        CARD16 a = d >> 24;
-        CARD32 s = 0;
-        if (a)
-        {
-            s = src[i];
-            if (a != 0xff)
-            {
-                FbByteMul(s, a);
-            }
-        }
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineInReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskAlphaC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32 a = mask[i];
-
-        if (a != 0xffffffff)
-        {
-            CARD32 d = 0;
-            if (a)
-            {
-                d = dest[i];
-                FbByteMulC(d, a);
-            }
-            dest[i] = d;
-        }
-    }
-}
-
-static FASTCALL void
-fbCombineOutC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskValueC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32 d = dest[i];
-        CARD16 a = ~d >> 24;
-        CARD32 s = 0;
-        if (a)
-        {
-            s = src[i];
-            if (a != 0xff)
-            {
-                FbByteMul(s, a);
-            }
-        }
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineOutReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskAlphaC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32 a = ~mask[i];
-
-        if (a != 0xffffffff)
-        {
-            CARD32 d = 0;
-            if (a)
-            {
-                d = dest[i];
-                FbByteMulC(d, a);
-            }
-            dest[i] = d;
-        }
-    }
-}
-
-static FASTCALL void
-fbCombineAtopC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32 d = dest[i];
-        CARD32 s = src[i];
-        CARD32 ad = ~mask[i];
-        CARD16 as = d >> 24;
-        FbByteAddMulC(d, ad, s, as);
-        dest[i] = d;
-    }
-}
-
-static FASTCALL void
-fbCombineAtopReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-
-        CARD32 d = dest[i];
-        CARD32 s = src[i];
-        CARD32 ad = mask[i];
-        CARD16 as = ~d >> 24;
-        FbByteAddMulC(d, ad, s, as);
-        dest[i] = d;
-    }
-}
-
-static FASTCALL void
-fbCombineXorC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32 d = dest[i];
-        CARD32 s = src[i];
-        CARD32 ad = ~mask[i];
-        CARD16 as = ~d >> 24;
-        FbByteAddMulC(d, ad, s, as);
-        dest[i] = d;
-    }
-}
-
-static FASTCALL void
-fbCombineAddC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskValueC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32 s = src[i];
-        CARD32 d = dest[i];
-        FbByteAdd(d, s);
-        dest[i] = d;
-    }
-}
-
-static FASTCALL void
-fbCombineSaturateC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    int i;
-    fbCombineMaskC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32  s, d;
-        CARD16  sa, sr, sg, sb, da;
-        CARD16  t, u, v;
-        CARD32  m,n,o,p;
-
-        d = dest[i];
-        s = src[i];
-        sa = (mask[i] >> 24);
-        sr = (mask[i] >> 16) & 0xff;
-        sg = (mask[i] >>  8) & 0xff;
-        sb = (mask[i]      ) & 0xff;
-        da = ~d >> 24;
-
-        if (sb <= da)
-            m = FbAdd(s,d,0,t);
-        else
-            m = FbGen (s, d, 0, (da << 8) / sb, 0xff, t, u, v);
-
-        if (sg <= da)
-            n = FbAdd(s,d,8,t);
-        else
-            n = FbGen (s, d, 8, (da << 8) / sg, 0xff, t, u, v);
-
-        if (sr <= da)
-            o = FbAdd(s,d,16,t);
-        else
-            o = FbGen (s, d, 16, (da << 8) / sr, 0xff, t, u, v);
-
-        if (sa <= da)
-            p = FbAdd(s,d,24,t);
-        else
-            p = FbGen (s, d, 24, (da << 8) / sa, 0xff, t, u, v);
-
-        dest[i] = m|n|o|p;
-    }
-}
-
-static FASTCALL void
-fbCombineDisjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, CARD8 combine)
-{
-    int i;
-    fbCombineMaskC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32  s, d;
-        CARD32  m,n,o,p;
-        CARD32  Fa, Fb;
-        CARD16  t, u, v;
-        CARD32  sa;
-        CARD8   da;
-
-        s = src[i];
-        sa = mask[i];
-        d = dest[i];
-        da = d >> 24;
-
-        switch (combine & CombineA) {
-        default:
-            Fa = 0;
-            break;
-        case CombineAOut:
-            m = fbCombineDisjointOutPart ((CARD8) (sa >> 0), da);
-            n = fbCombineDisjointOutPart ((CARD8) (sa >> 8), da) << 8;
-            o = fbCombineDisjointOutPart ((CARD8) (sa >> 16), da) << 16;
-            p = fbCombineDisjointOutPart ((CARD8) (sa >> 24), da) << 24;
-            Fa = m|n|o|p;
-            break;
-        case CombineAIn:
-            m = fbCombineDisjointInPart ((CARD8) (sa >> 0), da);
-            n = fbCombineDisjointInPart ((CARD8) (sa >> 8), da) << 8;
-            o = fbCombineDisjointInPart ((CARD8) (sa >> 16), da) << 16;
-            p = fbCombineDisjointInPart ((CARD8) (sa >> 24), da) << 24;
-            Fa = m|n|o|p;
-            break;
-        case CombineA:
-            Fa = 0xffffffff;
-            break;
-        }
-
-        switch (combine & CombineB) {
-        default:
-            Fb = 0;
-            break;
-        case CombineBOut:
-            m = fbCombineDisjointOutPart (da, (CARD8) (sa >> 0));
-            n = fbCombineDisjointOutPart (da, (CARD8) (sa >> 8)) << 8;
-            o = fbCombineDisjointOutPart (da, (CARD8) (sa >> 16)) << 16;
-            p = fbCombineDisjointOutPart (da, (CARD8) (sa >> 24)) << 24;
-            Fb = m|n|o|p;
-            break;
-        case CombineBIn:
-            m = fbCombineDisjointInPart (da, (CARD8) (sa >> 0));
-            n = fbCombineDisjointInPart (da, (CARD8) (sa >> 8)) << 8;
-            o = fbCombineDisjointInPart (da, (CARD8) (sa >> 16)) << 16;
-            p = fbCombineDisjointInPart (da, (CARD8) (sa >> 24)) << 24;
-            Fb = m|n|o|p;
-            break;
-        case CombineB:
-            Fb = 0xffffffff;
-            break;
-        }
-        m = FbGen (s,d,0,FbGet8(Fa,0),FbGet8(Fb,0),t, u, v);
-        n = FbGen (s,d,8,FbGet8(Fa,8),FbGet8(Fb,8),t, u, v);
-        o = FbGen (s,d,16,FbGet8(Fa,16),FbGet8(Fb,16),t, u, v);
-        p = FbGen (s,d,24,FbGet8(Fa,24),FbGet8(Fb,24),t, u, v);
-        s = m|n|o|p;
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineDisjointOverC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineDisjointGeneralC (dest, src, mask, width, CombineAOver);
-}
-
-static FASTCALL void
-fbCombineDisjointInC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineDisjointGeneralC (dest, src, mask, width, CombineAIn);
-}
-
-static FASTCALL void
-fbCombineDisjointInReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineDisjointGeneralC (dest, src, mask, width, CombineBIn);
-}
-
-static FASTCALL void
-fbCombineDisjointOutC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineDisjointGeneralC (dest, src, mask, width, CombineAOut);
-}
-
-static FASTCALL void
-fbCombineDisjointOutReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineDisjointGeneralC (dest, src, mask, width, CombineBOut);
-}
-
-static FASTCALL void
-fbCombineDisjointAtopC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineDisjointGeneralC (dest, src, mask, width, CombineAAtop);
-}
-
-static FASTCALL void
-fbCombineDisjointAtopReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineDisjointGeneralC (dest, src, mask, width, CombineBAtop);
-}
-
-static FASTCALL void
-fbCombineDisjointXorC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineDisjointGeneralC (dest, src, mask, width, CombineXor);
-}
-
-static FASTCALL void
-fbCombineConjointGeneralC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width, CARD8 combine)
-{
-    int i;
-    fbCombineMaskC(src, mask, width);
-    for (i = 0; i < width; ++i) {
-        CARD32  s, d;
-        CARD32  m,n,o,p;
-        CARD32  Fa, Fb;
-        CARD16  t, u, v;
-        CARD32  sa;
-        CARD8   da;
-
-        s = src[i];
-        sa = mask[i];
-        d = dest[i];
-        da = d >> 24;
-
-        switch (combine & CombineA) {
-        default:
-            Fa = 0;
-            break;
-        case CombineAOut:
-            m = fbCombineConjointOutPart ((CARD8) (sa >> 0), da);
-            n = fbCombineConjointOutPart ((CARD8) (sa >> 8), da) << 8;
-            o = fbCombineConjointOutPart ((CARD8) (sa >> 16), da) << 16;
-            p = fbCombineConjointOutPart ((CARD8) (sa >> 24), da) << 24;
-            Fa = m|n|o|p;
-            break;
-        case CombineAIn:
-            m = fbCombineConjointInPart ((CARD8) (sa >> 0), da);
-            n = fbCombineConjointInPart ((CARD8) (sa >> 8), da) << 8;
-            o = fbCombineConjointInPart ((CARD8) (sa >> 16), da) << 16;
-            p = fbCombineConjointInPart ((CARD8) (sa >> 24), da) << 24;
-            Fa = m|n|o|p;
-            break;
-        case CombineA:
-            Fa = 0xffffffff;
-            break;
-        }
-
-        switch (combine & CombineB) {
-        default:
-            Fb = 0;
-            break;
-        case CombineBOut:
-            m = fbCombineConjointOutPart (da, (CARD8) (sa >> 0));
-            n = fbCombineConjointOutPart (da, (CARD8) (sa >> 8)) << 8;
-            o = fbCombineConjointOutPart (da, (CARD8) (sa >> 16)) << 16;
-            p = fbCombineConjointOutPart (da, (CARD8) (sa >> 24)) << 24;
-            Fb = m|n|o|p;
-            break;
-        case CombineBIn:
-            m = fbCombineConjointInPart (da, (CARD8) (sa >> 0));
-            n = fbCombineConjointInPart (da, (CARD8) (sa >> 8)) << 8;
-            o = fbCombineConjointInPart (da, (CARD8) (sa >> 16)) << 16;
-            p = fbCombineConjointInPart (da, (CARD8) (sa >> 24)) << 24;
-            Fb = m|n|o|p;
-            break;
-        case CombineB:
-            Fb = 0xffffffff;
-            break;
-        }
-        m = FbGen (s,d,0,FbGet8(Fa,0),FbGet8(Fb,0),t, u, v);
-        n = FbGen (s,d,8,FbGet8(Fa,8),FbGet8(Fb,8),t, u, v);
-        o = FbGen (s,d,16,FbGet8(Fa,16),FbGet8(Fb,16),t, u, v);
-        p = FbGen (s,d,24,FbGet8(Fa,24),FbGet8(Fb,24),t, u, v);
-        s = m|n|o|p;
-        dest[i] = s;
-    }
-}
-
-static FASTCALL void
-fbCombineConjointOverC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineConjointGeneralC (dest, src, mask, width, CombineAOver);
-}
-
-static FASTCALL void
-fbCombineConjointOverReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineConjointGeneralC (dest, src, mask, width, CombineBOver);
-}
-
-static FASTCALL void
-fbCombineConjointInC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineConjointGeneralC (dest, src, mask, width, CombineAIn);
-}
-
-static FASTCALL void
-fbCombineConjointInReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineConjointGeneralC (dest, src, mask, width, CombineBIn);
-}
-
-static FASTCALL void
-fbCombineConjointOutC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineConjointGeneralC (dest, src, mask, width, CombineAOut);
-}
-
-static FASTCALL void
-fbCombineConjointOutReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineConjointGeneralC (dest, src, mask, width, CombineBOut);
-}
-
-static FASTCALL void
-fbCombineConjointAtopC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineConjointGeneralC (dest, src, mask, width, CombineAAtop);
-}
-
-static FASTCALL void
-fbCombineConjointAtopReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineConjointGeneralC (dest, src, mask, width, CombineBAtop);
-}
-
-static FASTCALL void
-fbCombineConjointXorC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    fbCombineConjointGeneralC (dest, src, mask, width, CombineXor);
-}
-
-static CombineFuncC fbCombineFuncC[] = {
-    fbCombineClearC,
-    fbCombineSrcC,
-    NULL, /* Dest */
-    fbCombineOverC,
-    fbCombineOverReverseC,
-    fbCombineInC,
-    fbCombineInReverseC,
-    fbCombineOutC,
-    fbCombineOutReverseC,
-    fbCombineAtopC,
-    fbCombineAtopReverseC,
-    fbCombineXorC,
-    fbCombineAddC,
-    fbCombineSaturateC,
-    NULL,
-    NULL,
-    fbCombineClearC,	    /* 0x10 */
-    fbCombineSrcC,
-    NULL, /* Dest */
-    fbCombineDisjointOverC,
-    fbCombineSaturateC, /* DisjointOverReverse */
-    fbCombineDisjointInC,
-    fbCombineDisjointInReverseC,
-    fbCombineDisjointOutC,
-    fbCombineDisjointOutReverseC,
-    fbCombineDisjointAtopC,
-    fbCombineDisjointAtopReverseC,
-    fbCombineDisjointXorC,  /* 0x1b */
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    fbCombineClearC,
-    fbCombineSrcC,
-    NULL, /* Dest */
-    fbCombineConjointOverC,
-    fbCombineConjointOverReverseC,
-    fbCombineConjointInC,
-    fbCombineConjointInReverseC,
-    fbCombineConjointOutC,
-    fbCombineConjointOutReverseC,
-    fbCombineConjointAtopC,
-    fbCombineConjointAtopReverseC,
-    fbCombineConjointXorC,
-};
-
-
-FbComposeFunctions composeFunctions = {
-    fbCombineFuncU,
-    fbCombineFuncC,
-    fbCombineMaskU
-};
-
-
-static void fbFetchSolid(PicturePtr pict, int x, int y, int width, CARD32 *buffer)
-{
-    FbBits *bits;
-    FbStride stride;
-    int bpp;
-    int xoff, yoff;
-    CARD32 color;
-    CARD32 *end;
-    fetchPixelProc fetch = fetchPixelProcForPicture(pict);
-    miIndexedPtr indexed = (miIndexedPtr) pict->pFormat->index.devPrivate;
-
-    fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff);
-    bits += yoff*stride + (xoff*bpp >> FB_SHIFT);
-
-    color = fetch(bits, 0, indexed);
-
-    end = buffer + width;
-    while (buffer < end)
-        *buffer++ = color;
-}
-
-static void fbFetch(PicturePtr pict, int x, int y, int width, CARD32 *buffer)
-{
-    FbBits *bits;
-    FbStride stride;
-    int bpp;
-    int xoff, yoff;
-    fetchProc fetch = fetchProcForPicture(pict);
-    miIndexedPtr indexed = (miIndexedPtr) pict->pFormat->index.devPrivate;
-
-    fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff);
-    x += xoff;
-    y += yoff;
-
-    bits += y*stride;
-
-    fetch(bits, x, width, buffer, indexed);
-}
-
-#define MOD(a,b) ((a) < 0 ? ((b) - ((-(a) - 1) % (b))) - 1 : (a) % (b))
-#define DIV(a,b) ((((a) < 0) == ((b) < 0)) ? (a) / (b) :\
-        ((a) - (b) + 1 - (((b) < 0) << 1)) / (b))
-
-
-static CARD32 gradientPixel(const SourcePictPtr pGradient, xFixed_48_16 pos, unsigned int spread)
-{
-    int ipos = (pos * PICT_GRADIENT_STOPTABLE_SIZE - 1) >> 16;
-
-    /* calculate the actual offset. */
-    if (ipos < 0 || ipos >= PICT_GRADIENT_STOPTABLE_SIZE) {
-        if (pGradient->type == SourcePictTypeConical || spread == RepeatNormal) {
-            ipos = ipos % PICT_GRADIENT_STOPTABLE_SIZE;
-            ipos = ipos < 0 ? PICT_GRADIENT_STOPTABLE_SIZE + ipos : ipos;
-
-        } else if (spread == RepeatReflect) {
-            const int limit = PICT_GRADIENT_STOPTABLE_SIZE * 2 - 1;
-            ipos = ipos % limit;
-            ipos = ipos < 0 ? limit + ipos : ipos;
-            ipos = ipos >= PICT_GRADIENT_STOPTABLE_SIZE ? limit - ipos : ipos;
-
-        } else if (spread == RepeatPad) {
-            if (ipos < 0)
-                ipos = 0;
-            else if (ipos >= PICT_GRADIENT_STOPTABLE_SIZE)
-                ipos = PICT_GRADIENT_STOPTABLE_SIZE-1;
-        } else { /* RepeatNone */
-            return 0;
-        }
-    }
-
-    assert(ipos >= 0);
-    assert(ipos < PICT_GRADIENT_STOPTABLE_SIZE);
-
-    return pGradient->linear.colorTable[ipos];
-}
-
-static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, CARD32 *buffer)
-{
-    SourcePictPtr pGradient = pict->pSourcePict;
-    CARD32 *end = buffer + width;
-
-    if (pGradient->type == SourcePictTypeSolidFill) {
-        register CARD32 color = pGradient->solidFill.color;
-        while (buffer < end) {
-            *buffer++ = color;
-        }
-    } else if (pGradient->type == SourcePictTypeLinear) {
-        PictVector v, unit;
-        xFixed_32_32 l;
-        xFixed_48_16 dx, dy, a, b, off;
-
-        /* reference point is the center of the pixel */
-        v.vector[0] = IntToxFixed(x) + xFixed1/2;
-        v.vector[1] = IntToxFixed(y) + xFixed1/2;
-        v.vector[2] = xFixed1;
-        if (pict->transform) {
-            if (!PictureTransformPoint3d (pict->transform, &v))
-                return;
-            unit.vector[0] = pict->transform->matrix[0][0];
-            unit.vector[1] = pict->transform->matrix[1][0];
-            unit.vector[2] = pict->transform->matrix[2][0];
-        } else {
-            unit.vector[0] = xFixed1;
-            unit.vector[1] = 0;
-            unit.vector[2] = 0;
-        }
-
-        dx = pGradient->linear.p2.x - pGradient->linear.p1.x;
-        dy = pGradient->linear.p2.y - pGradient->linear.p1.y;
-        l = dx*dx + dy*dy;
-        if (l != 0) {
-            a = (dx << 32) / l;
-            b = (dy << 32) / l;
-            off = (-a*pGradient->linear.p1.x - b*pGradient->linear.p1.y)>>16;
-        }
-        if (l == 0  || (unit.vector[2] == 0 && v.vector[2] == xFixed1)) {
-            xFixed_48_16 inc, t;
-            /* affine transformation only */
-            if (l == 0) {
-                t = 0;
-                inc = 0;
-            } else {
-                t = ((a*v.vector[0] + b*v.vector[1]) >> 16) + off;
-                inc = (a * unit.vector[0] + b * unit.vector[1]) >> 16;
-            }
-            while (buffer < end) {
-                *buffer++ = gradientPixel(pGradient, t, pict->repeatType);
-                t += inc;
-            }
-        } else {
-            /* projective transformation */
-            while (buffer < end) {
-                xFixed_48_16 t;
-                if (v.vector[2] == 0) {
-                    t = 0;
-                } else {
-                    xFixed_48_16 x, y;
-                    x = ((xFixed_48_16)v.vector[0] << 16) / v.vector[2];
-                    y = ((xFixed_48_16)v.vector[1] << 16) / v.vector[2];
-                    t = ((a*x + b*y) >> 16) + off;
-                }
-                *buffer++ = gradientPixel(pGradient, t, pict->repeatType);
-                v.vector[0] += unit.vector[0];
-                v.vector[1] += unit.vector[1];
-                v.vector[2] += unit.vector[2];
-            }
-        }
-    } else {
-        /* radial or conical */
-        Bool affine = TRUE;
-        double cx = 1.;
-        double cy = 0.;
-        double cz = 0.;
-        double rx = x;
-        double ry = y;
-        double rz = 1.;
-
-        if (pict->transform) {
-            PictVector v;
-            /* reference point is the center of the pixel */
-            v.vector[0] = IntToxFixed(x) + xFixed1/2;
-            v.vector[1] = IntToxFixed(y) + xFixed1/2;
-            v.vector[2] = xFixed1;
-            if (!PictureTransformPoint3d (pict->transform, &v))
-                return;
-
-            cx = pict->transform->matrix[0][0]/65536.;
-            cy = pict->transform->matrix[1][0]/65536.;
-            cz = pict->transform->matrix[2][0]/65536.;
-            rx = v.vector[0]/65536.;
-            ry = v.vector[1]/65536.;
-            rz = v.vector[2]/65536.;
-            affine = pict->transform->matrix[2][0] == 0 && v.vector[2] == xFixed1;
-        }
-
-        if (pGradient->type == SourcePictTypeRadial) {
-            if (affine) {
-                rx -= pGradient->radial.fx;
-                ry -= pGradient->radial.fy;
-
-                while (buffer < end) {
-                    double b = 2*(rx*pGradient->radial.dx + ry*pGradient->radial.dy);
-                    double c = -(rx*rx + ry*ry);
-                    double det = (b * b) - (4 * pGradient->radial.a * c);
-                    double s = (-b + sqrt(det))/(2. * pGradient->radial.a);
-                    *buffer = gradientPixel(pGradient,
-                                            (xFixed_48_16)((s*pGradient->radial.m + pGradient->radial.b)*65536),
-                                            pict->repeatType);
-                    ++buffer;
-                    rx += cx;
-                    ry += cy;
-                }
-            } else {
-                while (buffer < end) {
-                    double x, y;
-                    double b, c, det, s;
-                    if (rz != 0) {
-                        x = rx/rz;
-                        y = ry/rz;
-                    } else {
-                        x = y = 0.;
-                    }
-                    x -= pGradient->radial.fx;
-                    y -= pGradient->radial.fy;
-                    b = 2*(x*pGradient->radial.dx + y*pGradient->radial.dy);
-                    c = -(x*x + y*y);
-                    det = (b * b) - (4 * pGradient->radial.a * c);
-                    s = (-b + sqrt(det))/(2. * pGradient->radial.a);
-                    *buffer = gradientPixel(pGradient,
-                                            (xFixed_48_16)((s*pGradient->radial.m + pGradient->radial.b)*65536),
-                                            pict->repeatType);
-                    ++buffer;
-                    rx += cx;
-                    ry += cy;
-                    rz += cz;
-                }
-            }
-        } else /* SourcePictTypeConical */ {
-            double a = pGradient->conical.angle/(180.*65536);
-            if (affine) {
-                rx -= pGradient->conical.center.x/65536.;
-                ry -= pGradient->conical.center.y/65536.;
-
-                while (buffer < end) {
-                    double angle = atan2(ry, rx) + a;
-                    *buffer = gradientPixel(pGradient, (xFixed_48_16) (angle * (65536. / (2*M_PI))),
-                                            pict->repeatType);
-                    ++buffer;
-                    rx += cx;
-                    ry += cy;
-                }
-            } else {
-
-                while (buffer < end) {
-                    double x, y, angle;
-                    if (rz != 0) {
-                        x = rx/rz;
-                        y = ry/rz;
-                    } else {
-                        x = y = 0.;
-                    }
-                    x -= pGradient->conical.center.x/65536.;
-                    y -= pGradient->conical.center.y/65536.;
-                    angle = atan2(y, x) + a;
-                    *buffer = gradientPixel(pGradient, (xFixed_48_16) (angle * (65536. / (2*M_PI))),
-                                            pict->repeatType);
-                    ++buffer;
-                    rx += cx;
-                    ry += cy;
-                    rz += cz;
-                }
-            }
-        }
-    }
-}
-
-
-
-static void fbFetchTransformed(PicturePtr pict, int x, int y, int width, CARD32 *buffer)
-{
-    FbBits     *bits;
-    FbStride    stride;
-    int         bpp;
-    int         xoff, yoff, dx, dy;
-    fetchPixelProc   fetch;
-    PictVector	v;
-    PictVector  unit;
-    int         i;
-    BoxRec	box;
-    miIndexedPtr indexed = (miIndexedPtr) pict->pFormat->index.devPrivate;
-    Bool affine = TRUE;
-
-    fetch = fetchPixelProcForPicture(pict);
-
-    fbGetDrawable(pict->pDrawable, bits, stride, bpp, xoff, yoff);
-    x += xoff;
-    y += yoff;
-
-    dx = pict->pDrawable->x;
-    dy = pict->pDrawable->y;
-
-    /* reference point is the center of the pixel */
-    v.vector[0] = IntToxFixed(x - dx) + xFixed1 / 2;
-    v.vector[1] = IntToxFixed(y - dy) + xFixed1 / 2;
-    v.vector[2] = xFixed1;
-
-    /* when using convolution filters one might get here without a transform */
-    if (pict->transform) {
-        if (!PictureTransformPoint3d (pict->transform, &v))
-            return;
-        unit.vector[0] = pict->transform->matrix[0][0];
-        unit.vector[1] = pict->transform->matrix[1][0];
-        unit.vector[2] = pict->transform->matrix[2][0];
-        affine = v.vector[2] == xFixed1 && unit.vector[2] == 0;
-    } else {
-        unit.vector[0] = xFixed1;
-        unit.vector[1] = 0;
-        unit.vector[2] = 0;
-    }
-
-    if (pict->filter == PictFilterNearest)
-    {
-        if (pict->repeatType == RepeatNormal) {
-            if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) {
-                for (i = 0; i < width; ++i) {
-                    if (!v.vector[2]) {
-                        buffer[i] = 0;
-                    } else {
-                        if (!affine) {
-                            y = MOD(DIV(v.vector[1],v.vector[2]), pict->pDrawable->height);
-                            x = MOD(DIV(v.vector[0],v.vector[2]), pict->pDrawable->width);
-                        } else {
-                            y = MOD(v.vector[1]>>16, pict->pDrawable->height);
-                            x = MOD(v.vector[0]>>16, pict->pDrawable->width);
-                        }
-                        buffer[i] = fetch(bits + (y + dy)*stride, x + dx, indexed);
-                    }
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
-                }
-            } else {
-                for (i = 0; i < width; ++i) {
-                    if (!v.vector[2]) {
-                        buffer[i] = 0;
-                    } else {
-                        if (!affine) {
-                            y = MOD(DIV(v.vector[1],v.vector[2]), pict->pDrawable->height);
-                            x = MOD(DIV(v.vector[0],v.vector[2]), pict->pDrawable->width);
-                        } else {
-                            y = MOD(v.vector[1]>>16, pict->pDrawable->height);
-                            x = MOD(v.vector[0]>>16, pict->pDrawable->width);
-                        }
-                        if (POINT_IN_REGION (0, pict->pCompositeClip, x + dx, y + dy, &box))
-                            buffer[i] = fetch(bits + (y + dy)*stride, x + dx, indexed);
-                        else
-                            buffer[i] = 0;
-                    }
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
-                }
-            }
-        } else {
-            if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) {
-                box = pict->pCompositeClip->extents;
-                for (i = 0; i < width; ++i) {
-                    if (!v.vector[2]) {
-                        buffer[i] = 0;
-                    } else {
-                        if (!affine) {
-                            y = DIV(v.vector[1],v.vector[2]);
-                            x = DIV(v.vector[0],v.vector[2]);
-                        } else {
-                            y = v.vector[1]>>16;
-                            x = v.vector[0]>>16;
-                        }
-                        buffer[i] = ((x < box.x1-dx) | (x >= box.x2-dx) | (y < box.y1-dy) | (y >= box.y2-dy)) ?
-                                    0 : fetch(bits + (y + dy)*stride, x + dx, indexed);
-                    }
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
-                }
-            } else {
-                for (i = 0; i < width; ++i) {
-                    if (!v.vector[2]) {
-                        buffer[i] = 0;
-                    } else {
-                        if (!affine) {
-                            y = DIV(v.vector[1],v.vector[2]);
-                            x = DIV(v.vector[0],v.vector[2]);
-                        } else {
-                            y = v.vector[1]>>16;
-                            x = v.vector[0]>>16;
-                        }
-                        if (POINT_IN_REGION (0, pict->pCompositeClip, x + dx, y + dy, &box))
-                            buffer[i] = fetch(bits + (y + dy)*stride, x + dx, indexed);
-                        else
-                            buffer[i] = 0;
-                    }
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
-                }
-            }
-        }
-    } else if (pict->filter == PictFilterBilinear) {
-        /* adjust vector for maximum contribution at 0.5, 0.5 of each texel. */
-        v.vector[0] -= v.vector[2] / 2;
-        v.vector[1] -= v.vector[2] / 2;
-        unit.vector[0] -= unit.vector[2] / 2;
-        unit.vector[1] -= unit.vector[2] / 2;
-
-        if (pict->repeatType == RepeatNormal) {
-            if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) {
-                for (i = 0; i < width; ++i) {
-                    if (!v.vector[2]) {
-                        buffer[i] = 0;
-                    } else {
-                        int x1, x2, y1, y2, distx, idistx, disty, idisty;
-                        FbBits *b;
-                        CARD32 tl, tr, bl, br, r;
-                        CARD32 ft, fb;
-
-                        if (!affine) {
-                            xFixed_48_16 div;
-                            div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
-                            x1 = div >> 16;
-                            distx = ((xFixed)div >> 8) & 0xff;
-                            div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
-                            y1 = div >> 16;
-                            disty = ((xFixed)div >> 8) & 0xff;
-                        } else {
-                            x1 = v.vector[0] >> 16;
-                            distx = (v.vector[0] >> 8) & 0xff;
-                            y1 = v.vector[1] >> 16;
-                            disty = (v.vector[1] >> 8) & 0xff;
-                        }
-                        x2 = x1 + 1;
-                        y2 = y1 + 1;
-
-                        idistx = 256 - distx;
-                        idisty = 256 - disty;
-
-                        x1 = MOD (x1, pict->pDrawable->width);
-                        x2 = MOD (x2, pict->pDrawable->width);
-                        y1 = MOD (y1, pict->pDrawable->height);
-                        y2 = MOD (y2, pict->pDrawable->height);
-
-                        b = bits + (y1 + dy)*stride;
-
-                        tl = fetch(b, x1 + dx, indexed);
-                        tr = fetch(b, x2 + dx, indexed);
-                        b = bits + (y2 + dy)*stride;
-                        bl = fetch(b, x1 + dx, indexed);
-                        br = fetch(b, x2 + dx, indexed);
-
-                        ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx;
-                        fb = FbGet8(bl,0) * idistx + FbGet8(br,0) * distx;
-                        r = (((ft * idisty + fb * disty) >> 16) & 0xff);
-                        ft = FbGet8(tl,8) * idistx + FbGet8(tr,8) * distx;
-                        fb = FbGet8(bl,8) * idistx + FbGet8(br,8) * distx;
-                        r |= (((ft * idisty + fb * disty) >> 8) & 0xff00);
-                        ft = FbGet8(tl,16) * idistx + FbGet8(tr,16) * distx;
-                        fb = FbGet8(bl,16) * idistx + FbGet8(br,16) * distx;
-                        r |= (((ft * idisty + fb * disty)) & 0xff0000);
-                        ft = FbGet8(tl,24) * idistx + FbGet8(tr,24) * distx;
-                        fb = FbGet8(bl,24) * idistx + FbGet8(br,24) * distx;
-                        r |= (((ft * idisty + fb * disty) << 8) & 0xff000000);
-                        buffer[i] = r;
-                    }
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
-                }
-            } else {
-                for (i = 0; i < width; ++i) {
-                    if (!v.vector[2]) {
-                        buffer[i] = 0;
-                    } else {
-                        int x1, x2, y1, y2, distx, idistx, disty, idisty;
-                        FbBits *b;
-                        CARD32 tl, tr, bl, br, r;
-                        CARD32 ft, fb;
-
-                        if (!affine) {
-                            xFixed_48_16 div;
-                            div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
-                            x1 = div >> 16;
-                            distx = ((xFixed)div >> 8) & 0xff;
-                            div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
-                            y1 = div >> 16;
-                            disty = ((xFixed)div >> 8) & 0xff;
-                        } else {
-                            x1 = v.vector[0] >> 16;
-                            distx = (v.vector[0] >> 8) & 0xff;
-                            y1 = v.vector[1] >> 16;
-                            disty = (v.vector[1] >> 8) & 0xff;
-                        }
-                        x2 = x1 + 1;
-                        y2 = y1 + 1;
-
-                        idistx = 256 - distx;
-                        idisty = 256 - disty;
-
-                        x1 = MOD (x1, pict->pDrawable->width);
-                        x2 = MOD (x2, pict->pDrawable->width);
-                        y1 = MOD (y1, pict->pDrawable->height);
-                        y2 = MOD (y2, pict->pDrawable->height);
-
-                        b = bits + (y1 + dy)*stride;
-
-                        tl = POINT_IN_REGION(0, pict->pCompositeClip, x1 + dx, y1 + dy, &box)
-                             ? fetch(b, x1 + dx, indexed) : 0;
-                        tr = POINT_IN_REGION(0, pict->pCompositeClip, x2 + dx, y1 + dy, &box)
-                             ? fetch(b, x2 + dx, indexed) : 0;
-                        b = bits + (y2 + dy)*stride;
-                        bl = POINT_IN_REGION(0, pict->pCompositeClip, x1 + dx, y2 + dy, &box)
-                             ? fetch(b, x1 + dx, indexed) : 0;
-                        br = POINT_IN_REGION(0, pict->pCompositeClip, x2 + dx, y2 + dy, &box)
-                             ? fetch(b, x2 + dx, indexed) : 0;
-
-                        ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx;
-                        fb = FbGet8(bl,0) * idistx + FbGet8(br,0) * distx;
-                        r = (((ft * idisty + fb * disty) >> 16) & 0xff);
-                        ft = FbGet8(tl,8) * idistx + FbGet8(tr,8) * distx;
-                        fb = FbGet8(bl,8) * idistx + FbGet8(br,8) * distx;
-                        r |= (((ft * idisty + fb * disty) >> 8) & 0xff00);
-                        ft = FbGet8(tl,16) * idistx + FbGet8(tr,16) * distx;
-                        fb = FbGet8(bl,16) * idistx + FbGet8(br,16) * distx;
-                        r |= (((ft * idisty + fb * disty)) & 0xff0000);
-                        ft = FbGet8(tl,24) * idistx + FbGet8(tr,24) * distx;
-                        fb = FbGet8(bl,24) * idistx + FbGet8(br,24) * distx;
-                        r |= (((ft * idisty + fb * disty) << 8) & 0xff000000);
-                        buffer[i] = r;
-                    }
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
-                }
-            }
-        } else {
-            if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) {
-                box = pict->pCompositeClip->extents;
-                for (i = 0; i < width; ++i) {
-                    if (!v.vector[2]) {
-                        buffer[i] = 0;
-                    } else {
-                        int x1, x2, y1, y2, distx, idistx, disty, idisty, x_off;
-                        FbBits *b;
-                        CARD32 tl, tr, bl, br, r;
-                        Bool x1_out, x2_out, y1_out, y2_out;
-                        CARD32 ft, fb;
-
-                        if (!affine) {
-                            xFixed_48_16 div;
-                            div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
-                            x1 = div >> 16;
-                            distx = ((xFixed)div >> 8) & 0xff;
-                            div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
-                            y1 = div >> 16;
-                            disty = ((xFixed)div >> 8) & 0xff;
-                        } else {
-                            x1 = v.vector[0] >> 16;
-                            distx = (v.vector[0] >> 8) & 0xff;
-                            y1 = v.vector[1] >> 16;
-                            disty = (v.vector[1] >> 8) & 0xff;
-                        }
-                        x2 = x1 + 1;
-                        y2 = y1 + 1;
-
-                        idistx = 256 - distx;
-                        idisty = 256 - disty;
-
-                        b = bits + (y1 + dy)*stride;
-                        x_off = x1 + dx;
-
-                        x1_out = (x1 < box.x1-dx) | (x1 >= box.x2-dx);
-                        x2_out = (x2 < box.x1-dx) | (x2 >= box.x2-dx);
-                        y1_out = (y1 < box.y1-dy) | (y1 >= box.y2-dy);
-                        y2_out = (y2 < box.y1-dy) | (y2 >= box.y2-dy);
-
-                        tl = x1_out|y1_out ? 0 : fetch(b, x_off, indexed);
-                        tr = x2_out|y1_out ? 0 : fetch(b, x_off + 1, indexed);
-                        b += stride;
-                        bl = x1_out|y2_out ? 0 : fetch(b, x_off, indexed);
-                        br = x2_out|y2_out ? 0 : fetch(b, x_off + 1, indexed);
-
-                        ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx;
-                        fb = FbGet8(bl,0) * idistx + FbGet8(br,0) * distx;
-                        r = (((ft * idisty + fb * disty) >> 16) & 0xff);
-                        ft = FbGet8(tl,8) * idistx + FbGet8(tr,8) * distx;
-                        fb = FbGet8(bl,8) * idistx + FbGet8(br,8) * distx;
-                        r |= (((ft * idisty + fb * disty) >> 8) & 0xff00);
-                        ft = FbGet8(tl,16) * idistx + FbGet8(tr,16) * distx;
-                        fb = FbGet8(bl,16) * idistx + FbGet8(br,16) * distx;
-                        r |= (((ft * idisty + fb * disty)) & 0xff0000);
-                        ft = FbGet8(tl,24) * idistx + FbGet8(tr,24) * distx;
-                        fb = FbGet8(bl,24) * idistx + FbGet8(br,24) * distx;
-                        r |= (((ft * idisty + fb * disty) << 8) & 0xff000000);
-                        buffer[i] = r;
-                    }
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
-                }
-            } else {
-                for (i = 0; i < width; ++i) {
-                    if (!v.vector[2]) {
-                        buffer[i] = 0;
-                    } else {
-                        int x1, x2, y1, y2, distx, idistx, disty, idisty, x_off;
-                        FbBits *b;
-                        CARD32 tl, tr, bl, br, r;
-                        CARD32 ft, fb;
-
-                        if (!affine) {
-                            xFixed_48_16 div;
-                            div = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2];
-                            x1 = div >> 16;
-                            distx = ((xFixed)div >> 8) & 0xff;
-                            div = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2];
-                            y1 = div >> 16;
-                            disty = ((xFixed)div >> 8) & 0xff;
-                        } else {
-                            x1 = v.vector[0] >> 16;
-                            distx = (v.vector[0] >> 8) & 0xff;
-                            y1 = v.vector[1] >> 16;
-                            disty = (v.vector[1] >> 8) & 0xff;
-                        }
-                        x2 = x1 + 1;
-                        y2 = y1 + 1;
-
-                        idistx = 256 - distx;
-                        idisty = 256 - disty;
-
-                        b = bits + (y1 + dy)*stride;
-                        x_off = x1 + dx;
-
-                        tl = POINT_IN_REGION(0, pict->pCompositeClip, x1 + dx, y1 + dy, &box)
-                             ? fetch(b, x_off, indexed) : 0;
-                        tr = POINT_IN_REGION(0, pict->pCompositeClip, x2 + dx, y1 + dy, &box)
-                             ? fetch(b, x_off + 1, indexed) : 0;
-                        b += stride;
-                        bl = POINT_IN_REGION(0, pict->pCompositeClip, x1 + dx, y2 + dy, &box)
-                             ? fetch(b, x_off, indexed) : 0;
-                        br = POINT_IN_REGION(0, pict->pCompositeClip, x2 + dx, y2 + dy, &box)
-                             ? fetch(b, x_off + 1, indexed) : 0;
-
-                        ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx;
-                        fb = FbGet8(bl,0) * idistx + FbGet8(br,0) * distx;
-                        r = (((ft * idisty + fb * disty) >> 16) & 0xff);
-                        ft = FbGet8(tl,8) * idistx + FbGet8(tr,8) * distx;
-                        fb = FbGet8(bl,8) * idistx + FbGet8(br,8) * distx;
-                        r |= (((ft * idisty + fb * disty) >> 8) & 0xff00);
-                        ft = FbGet8(tl,16) * idistx + FbGet8(tr,16) * distx;
-                        fb = FbGet8(bl,16) * idistx + FbGet8(br,16) * distx;
-                        r |= (((ft * idisty + fb * disty)) & 0xff0000);
-                        ft = FbGet8(tl,24) * idistx + FbGet8(tr,24) * distx;
-                        fb = FbGet8(bl,24) * idistx + FbGet8(br,24) * distx;
-                        r |= (((ft * idisty + fb * disty) << 8) & 0xff000000);
-                        buffer[i] = r;
-                    }
-                    v.vector[0] += unit.vector[0];
-                    v.vector[1] += unit.vector[1];
-                    v.vector[2] += unit.vector[2];
-                }
-            }
-        }
-    } else if (pict->filter == PictFilterConvolution) {
-        xFixed *params = pict->filter_params;
-        INT32 cwidth = xFixedToInt(params[0]);
-        INT32 cheight = xFixedToInt(params[1]);
-        int xoff = (params[0] - xFixed1) >> 1;
-	int yoff = (params[1] - xFixed1) >> 1;
-        params += 2;
-        for (i = 0; i < width; ++i) {
-            if (!v.vector[2]) {
-                buffer[i] = 0;
-            } else {
-                int x1, x2, y1, y2, x, y;
-                INT32 srtot, sgtot, sbtot, satot;
-                xFixed *p = params;
-
-                if (!affine) {
-                    xFixed_48_16 tmp;
-                    tmp = ((xFixed_48_16)v.vector[0] << 16)/v.vector[2] - xoff;
-                    x1 = xFixedToInt(tmp);
-                    tmp = ((xFixed_48_16)v.vector[1] << 16)/v.vector[2] - yoff;
-                    y1 = xFixedToInt(tmp);
-                } else {
-                    x1 = xFixedToInt(v.vector[0] - xoff);
-                    y1 = xFixedToInt(v.vector[1] - yoff);
-                }
-                x2 = x1 + cwidth;
-                y2 = y1 + cheight;
-
-                srtot = sgtot = sbtot = satot = 0;
-
-                for (y = y1; y < y2; y++) {
-                    int ty = (pict->repeatType == RepeatNormal) ? MOD (y, pict->pDrawable->height) : y;
-                    for (x = x1; x < x2; x++) {
-                        if (*p) {
-                            int tx = (pict->repeatType == RepeatNormal) ? MOD (x, pict->pDrawable->width) : x;
-                            if (POINT_IN_REGION (0, pict->pCompositeClip, tx + dx, ty + dy, &box)) {
-                                FbBits *b = bits + (ty + dy)*stride;
-                                CARD32 c = fetch(b, tx + dx, indexed);
-
-                                srtot += Red(c) * *p;
-                                sgtot += Green(c) * *p;
-                                sbtot += Blue(c) * *p;
-                                satot += Alpha(c) * *p;
-                            }
-                        }
-                        p++;
-                    }
-                }
-
-		satot >>= 16;
-		srtot >>= 16;
-		sgtot >>= 16;
-		sbtot >>= 16;
-
-                if (satot < 0) satot = 0; else if (satot > 0xff) satot = 0xff;
-                if (srtot < 0) srtot = 0; else if (srtot > 0xff) srtot = 0xff;
-                if (sgtot < 0) sgtot = 0; else if (sgtot > 0xff) sgtot = 0xff;
-                if (sbtot < 0) sbtot = 0; else if (sbtot > 0xff) sbtot = 0xff;
-
-                buffer[i] = ((satot << 24) |
-                             (srtot << 16) |
-                             (sgtot <<  8) |
-                             (sbtot       ));
-            }
-            v.vector[0] += unit.vector[0];
-            v.vector[1] += unit.vector[1];
-            v.vector[2] += unit.vector[2];
-        }
-    }
-}
-
-
-static void fbFetchExternalAlpha(PicturePtr pict, int x, int y, int width, CARD32 *buffer)
-{
-    int i;
-    CARD32 _alpha_buffer[SCANLINE_BUFFER_LENGTH];
-    CARD32 *alpha_buffer = _alpha_buffer;
-
-    if (!pict->alphaMap) {
-        fbFetchTransformed(pict, x, y, width, buffer);
-	return;
-    }
-    if (width > SCANLINE_BUFFER_LENGTH)
-        alpha_buffer = (CARD32 *) malloc(width*sizeof(CARD32));
-
-    fbFetchTransformed(pict, x, y, width, buffer);
-    fbFetchTransformed(pict->alphaMap, x - pict->alphaOrigin.x, y - pict->alphaOrigin.y, width, alpha_buffer);
-    for (i = 0; i < width; ++i) {
-        int a = alpha_buffer[i]>>24;
-        buffer[i] = (a << 24)
-                 | (div_255(Red(buffer[i]) * a) << 16)
-                 | (div_255(Green(buffer[i]) * a) << 8)
-                 | (div_255(Blue(buffer[i]) * a));
-    }
-
-    if (alpha_buffer != _alpha_buffer)
-        free(alpha_buffer);
-}
-
-static void fbStore(PicturePtr pict, int x, int y, int width, CARD32 *buffer)
-{
-    FbBits *bits;
-    FbStride stride;
-    int bpp;
-    int xoff, yoff;
-    storeProc store = storeProcForPicture(pict);
-    miIndexedPtr indexed = (miIndexedPtr) pict->pFormat->index.devPrivate;
-
-    fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff);
-    x += xoff;
-    y += yoff;
-
-    bits += y*stride;
-    store(bits, buffer, x, width, indexed);
-}
-
-static void fbStoreExternalAlpha(PicturePtr pict, int x, int y, int width, CARD32 *buffer)
-{
-    FbBits *bits, *alpha_bits;
-    FbStride stride, astride;
-    int bpp, abpp;
-    int xoff, yoff;
-    int ax, ay;
-    storeProc store;
-    storeProc astore;
-    miIndexedPtr indexed = (miIndexedPtr) pict->pFormat->index.devPrivate;
-    miIndexedPtr aindexed;
-
-    if (!pict->alphaMap) {
-        fbStore(pict, x, y, width, buffer);
-	return;
-    }
-
-    store = storeProcForPicture(pict);
-    astore = storeProcForPicture(pict->alphaMap);
-    aindexed = (miIndexedPtr) pict->alphaMap->pFormat->index.devPrivate;
-
-    ax = x;
-    ay = y;
-
-    fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff);
-    x += xoff;
-    y += yoff;
-    fbGetDrawable (pict->alphaMap->pDrawable, alpha_bits, astride, abpp, xoff, yoff);
-    ax += xoff;
-    ay += yoff;
-
-    bits       += y*stride;
-    alpha_bits += (ay - pict->alphaOrigin.y)*astride;
-
-
-    store(bits, buffer, x, width, indexed);
-    astore(alpha_bits, buffer, ax - pict->alphaOrigin.x, width, aindexed);
-}
-
-typedef void (*scanStoreProc)(PicturePtr , int , int , int , CARD32 *);
-typedef void (*scanFetchProc)(PicturePtr , int , int , int , CARD32 *);
-
-static void
-fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer)
-{
-    CARD32 *src_buffer = scanline_buffer;
-    CARD32 *dest_buffer = src_buffer + data->width;
-    int i;
-    scanStoreProc store;
-    scanFetchProc fetchSrc = NULL, fetchMask = NULL, fetchDest = NULL;
-
-    if (data->op == PictOpClear)
-        fetchSrc = NULL;
-    else if (!data->src->pDrawable) {
-        if (data->src->pSourcePict)
-            fetchSrc = fbFetchSourcePict;
-    } else if (data->src->alphaMap)
-        fetchSrc = fbFetchExternalAlpha;
-    else if (data->src->repeatType == RepeatNormal &&
-             data->src->pDrawable->width == 1 && data->src->pDrawable->height == 1)
-        fetchSrc = fbFetchSolid;
-    else if (!data->src->transform && data->src->filter != PictFilterConvolution)
-        fetchSrc = fbFetch;
-    else
-        fetchSrc = fbFetchTransformed;
-
-    if (data->mask && data->op != PictOpClear) {
-        if (!data->mask->pDrawable) {
-            if (data->mask->pSourcePict)
-                fetchMask = fbFetchSourcePict;
-        } else if (data->mask->alphaMap)
-            fetchMask = fbFetchExternalAlpha;
-        else if (data->mask->repeatType == RepeatNormal
-                 && data->mask->pDrawable->width == 1 && data->mask->pDrawable->height == 1)
-            fetchMask = fbFetchSolid;
-        else if (!data->mask->transform && data->mask->filter != PictFilterConvolution)
-            fetchMask = fbFetch;
-        else
-            fetchMask = fbFetchTransformed;
-    } else {
-        fetchMask = NULL;
-    }
-
-    if (data->dest->alphaMap) {
-        fetchDest = fbFetchExternalAlpha;
-        store = fbStoreExternalAlpha;
-    } else {
-        fetchDest = fbFetch;
-        store = fbStore;
-    }
-    if (data->op == PictOpClear || data->op == PictOpSrc)
-        fetchDest = NULL;
-
-    if (fetchSrc && fetchMask && data->mask && data->mask->componentAlpha && PICT_FORMAT_RGB(data->mask->format)) {
-        CARD32 *mask_buffer = dest_buffer + data->width;
-        CombineFuncC compose = composeFunctions.combineC[data->op];
-        if (!compose)
-            return;
-
-        for (i = 0; i < data->height; ++i)
-        {
-            /* fill first half of scanline with source */
-            fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, src_buffer);
-            fetchMask(data->mask, data->xMask, data->yMask + i, data->width, mask_buffer);
-
-            /* fill dest into second half of scanline */
-            if (fetchDest)
-                fetchDest(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer);
-
-            /* blend */
-            compose(dest_buffer, src_buffer, mask_buffer, data->width);
-
-            /* write back */
-            store(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer);
-        }
-    } else {
-
-        CombineFuncU compose = composeFunctions.combineU[data->op];
-        if (!compose)
-            return;
-
-        if (fetchSrc == fbFetchSolid && (!fetchMask || fetchMask == fbFetchSolid)) {
-            fetchSrc(data->src, data->xSrc, data->ySrc, data->width, src_buffer);
-            if (fetchMask) {
-                fetchMask(data->mask, data->xMask, data->yMask, data->width, dest_buffer);
-                composeFunctions.combineMaskU(src_buffer, dest_buffer, data->width);
-            }
-            fetchSrc = NULL;
-            fetchMask = NULL;
-        }
-
-        for (i = 0; i < data->height; ++i)
-        {
-            /* fill first half of scanline with source */
-            if (fetchSrc) {
-                fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, src_buffer);
-
-                /* add in mask */
-                if (fetchMask) {
-                    fetchMask(data->mask, data->xMask, data->yMask + i, data->width, dest_buffer);
-                    composeFunctions.combineMaskU(src_buffer, dest_buffer, data->width);
-                }
-            }
-
-            /* fill dest into second half of scanline */
-            if (fetchDest)
-                fetchDest(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer);
-
-            /* blend */
-            compose(dest_buffer, src_buffer, data->width);
-
-            /* write back */
-            store(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer);
-        }
-    }
-}
-
-void
-fbCompositeGeneral (CARD8	op,
-		    PicturePtr	pSrc,
-		    PicturePtr	pMask,
-		    PicturePtr	pDst,
-		    INT16	xSrc,
-		    INT16	ySrc,
-		    INT16	xMask,
-		    INT16	yMask,
-		    INT16	xDst,
-		    INT16	yDst,
-		    CARD16	width,
-		    CARD16	height)
-{
-    RegionRec	    region;
-    int		    n;
-    BoxPtr	    pbox;
-    Bool	    srcRepeat = FALSE;
-    Bool	    maskRepeat = FALSE;
-    int		    w, h;
-    CARD32 _scanline_buffer[SCANLINE_BUFFER_LENGTH*3];
-    CARD32 *scanline_buffer = _scanline_buffer;
-    FbComposeData compose_data;
-    
-    if (pSrc->pDrawable)
-        srcRepeat = pSrc->repeatType == RepeatNormal && !pSrc->transform
-                    && (pSrc->pDrawable->width != 1 || pSrc->pDrawable->height != 1);
-
-    if (pMask && pMask->pDrawable)
-	maskRepeat = pMask->repeatType == RepeatNormal && !pMask->transform
-                     && (pMask->pDrawable->width != 1 || pMask->pDrawable->height != 1);
-
-    if (op == PictOpOver && !pMask && !pSrc->transform && !PICT_FORMAT_A(pSrc->format) && !pSrc->alphaMap)
-        op = PictOpSrc;
-
-    if (!miComputeCompositeRegion (&region,
-				   pSrc,
-				   pMask,
-				   pDst,
-				   xSrc,
-				   ySrc,
-				   xMask,
-				   yMask,
-				   xDst,
-				   yDst,
-				   width,
-				   height))
-	    return;
-
-    compose_data.op = op;
-    compose_data.src = pSrc;
-    compose_data.mask = pMask;
-    compose_data.dest = pDst;
-    if (width > SCANLINE_BUFFER_LENGTH)
-        scanline_buffer = (CARD32 *) malloc(width * 3 * sizeof(CARD32));
-
-    n = REGION_NUM_RECTS (&region);
-    pbox = REGION_RECTS (&region);
-    while (n--)
-    {
-	h = pbox->y2 - pbox->y1;
-	compose_data.ySrc = pbox->y1 - yDst + ySrc;
-	compose_data.yMask = pbox->y1 - yDst + yMask;
-	compose_data.yDest = pbox->y1;
-	while (h)
-	{
-	    compose_data.height = h;
-	    w = pbox->x2 - pbox->x1;
-	    compose_data.xSrc = pbox->x1 - xDst + xSrc;
-	    compose_data.xMask = pbox->x1 - xDst + xMask;
-	    compose_data.xDest = pbox->x1;
-	    if (maskRepeat)
-	    {
-		compose_data.yMask = mod (compose_data.yMask, pMask->pDrawable->height);
-		if (compose_data.height > pMask->pDrawable->height - compose_data.yMask)
-		    compose_data.height = pMask->pDrawable->height - compose_data.yMask;
-	    }
-	    if (srcRepeat)
-	    {
-		compose_data.ySrc = mod (compose_data.ySrc, pSrc->pDrawable->height);
-		if (compose_data.height > pSrc->pDrawable->height - compose_data.ySrc)
-		    compose_data.height = pSrc->pDrawable->height - compose_data.ySrc;
-	    }
-	    while (w)
-	    {
-		compose_data.width = w;
-		if (maskRepeat)
-		{
-		    compose_data.xMask = mod (compose_data.xMask, pMask->pDrawable->width);
-		    if (compose_data.width > pMask->pDrawable->width - compose_data.xMask)
-			compose_data.width = pMask->pDrawable->width - compose_data.xMask;
-		}
-		if (srcRepeat)
-		{
-		    compose_data.xSrc = mod (compose_data.xSrc, pSrc->pDrawable->width);
-		    if (compose_data.width > pSrc->pDrawable->width - compose_data.xSrc)
-			compose_data.width = pSrc->pDrawable->width - compose_data.xSrc;
-		}
-		fbCompositeRect(&compose_data, scanline_buffer);
-		w -= compose_data.width;
-		compose_data.xSrc += compose_data.width;
-		compose_data.xMask += compose_data.width;
-		compose_data.xDest += compose_data.width;
-	    }
-	    h -= compose_data.height;
-	    compose_data.ySrc += compose_data.height;
-	    compose_data.yMask += compose_data.height;
-	    compose_data.yDest += compose_data.height;
-    }
-	pbox++;
-    }
-    REGION_UNINIT (pDst->pDrawable->pScreen, &region);
-
-    if (scanline_buffer != _scanline_buffer)
-        free(scanline_buffer);
-}
-
-#endif
diff --git a/fb/fbcopy.c b/fb/fbcopy.c
index 0d1cb7f..68f403f 100644
--- a/fb/fbcopy.c
+++ b/fb/fbcopy.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbcopy.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -29,7 +27,6 @@
 #include <stdlib.h>
 
 #include "fb.h"
-#include "fbmmx.h"
 
 void
 fbCopyNtoN (DrawablePtr	pSrcDrawable,
@@ -60,21 +57,17 @@ fbCopyNtoN (DrawablePtr	pSrcDrawable,
 
     while (nbox--)
     {
-#ifdef USE_MMX
+#ifndef FB_ACCESS_WRAPPER /* pixman_blt() doesn't support accessors yet */
 	if (pm == FB_ALLONES && alu == GXcopy && !reverse &&
-	    !upsidedown && fbHaveMMX())
+	    !upsidedown)
 	{
-	    if (!fbCopyAreammx (pSrcDrawable,
-				pDstDrawable,
-				
-				(pbox->x1 + dx),
-				(pbox->y1 + dy),
-				
-				(pbox->x1),
-				(pbox->y1),
-				
-				(pbox->x2 - pbox->x1),
-				(pbox->y2 - pbox->y1)))
+	    if (!pixman_blt ((uint32_t *)src, (uint32_t *)dst, srcStride, dstStride, srcBpp, dstBpp,
+			     (pbox->x1 + dx + srcXoff),
+			     (pbox->y1 + dy + srcYoff),
+			     (pbox->x1 + dstXoff),
+			     (pbox->y1 + dstYoff),
+			     (pbox->x2 - pbox->x1),
+			     (pbox->y2 - pbox->y1)))
 		goto fallback;
 	    else
 		goto next;
@@ -98,11 +91,13 @@ fbCopyNtoN (DrawablePtr	pSrcDrawable,
 	       
 	       reverse,
 	       upsidedown);
-#ifdef USE_MMX
+#ifndef FB_ACCESS_WRAPPER
     next:
 #endif
 	pbox++;
     }    
+    fbFinishAccess (pDstDrawable);
+    fbFinishAccess (pSrcDrawable);
 }
 
 void
@@ -173,6 +168,9 @@ fbCopy1toN (DrawablePtr	pSrcDrawable,
 	}
 	pbox++;
     }
+
+    fbFinishAccess (pDstDrawable);
+    fbFinishAccess (pSrcDrawable);
 }
 
 void
@@ -221,6 +219,8 @@ fbCopyNto1 (DrawablePtr	pSrcDrawable,
 			(FbStip) pPriv->and, (FbStip) pPriv->xor,
 			(FbStip) pPriv->bgand, (FbStip) pPriv->bgxor,
 			bitplane);
+	    fbFinishAccess (pDstDrawable);
+	    fbFinishAccess (pSrcDrawable);
 	}
 	else
 	{
@@ -281,6 +281,9 @@ fbCopyNto1 (DrawablePtr	pSrcDrawable,
 		      pPriv->and, pPriv->xor,
 		      pPriv->bgand, pPriv->bgxor);
 	    xfree (tmp);
+
+	    fbFinishAccess (pDstDrawable);
+	    fbFinishAccess (pSrcDrawable);
 	}
 	pbox++;
     }
diff --git a/fb/fbedge.c b/fb/fbedge.c
deleted file mode 100644
index b6ca829..0000000
--- a/fb/fbedge.c
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * $Id$
- *
- * Copyright © 2004 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <string.h>
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include "fb.h"
-
-#ifdef RENDER
-
-#include "picturestr.h"
-#include "mipict.h"
-#include "renderedge.h"
-#include "fbpict.h"
-
-/*
- * 4 bit alpha
- */
-
-#define N_BITS	4
-#define rasterizeEdges	fbRasterizeEdges4
-
-#if BITMAP_BIT_ORDER == LSBFirst
-#define Shift4(o)	((o) << 2)
-#else
-#define Shift4(o)	((1-(o)) << 2)
-#endif
-
-#define Get4(x,o)	(((x) >> Shift4(o)) & 0xf)
-#define Put4(x,o,v)	(((x) & ~(0xf << Shift4(o))) | (((v) & 0xf) << Shift4(o)))
-
-#define DefineAlpha(line,x) \
-    CARD8   *__ap = (CARD8 *) line + ((x) >> 1); \
-    int	    __ao = (x) & 1
-
-#define StepAlpha	((__ap += __ao), (__ao ^= 1))
-
-#define AddAlpha(a) {						\
-    CARD8   __o = *__ap;					\
-    CARD8   __a = (a) + Get4(__o, __ao);			\
-    *__ap = Put4 (__o, __ao, __a | (0 - ((__a) >> 4)));		\
-}
-
-#include "fbedgeimp.h"
-
-#undef AddAlpha
-#undef StepAlpha
-#undef DefineAlpha
-#undef rasterizeEdges
-#undef N_BITS
-
-
-/*
- * 1 bit alpha
- */
-
-#define N_BITS 1
-#define rasterizeEdges	fbRasterizeEdges1
-
-#include "fbedgeimp.h"
-
-#undef rasterizeEdges
-#undef N_BITS
-
-/*
- * 8 bit alpha
- */
-
-static INLINE CARD8
-clip255 (int x)
-{
-    if (x > 255) return 255;
-    return x;
-}
-
-static INLINE void
-add_saturate_8 (CARD8 *buf, int value, int length)
-{
-    while (length--)
-    {
-        *buf = clip255 (*buf + value);
-        buf++;
-    }
-}
-
-/*
- * We want to detect the case where we add the same value to a long
- * span of pixels.  The triangles on the end are filled in while we
- * count how many sub-pixel scanlines contribute to the middle section.
- *
- *                 +--------------------------+
- *  fill_height =|   \                      /
- *                     +------------------+
- *                      |================|
- *                   fill_start       fill_end
- */
-static void
-fbRasterizeEdges8 (FbBits	*buf,
-		   int		width,
-		   int		stride,
-		   RenderEdge	*l,
-		   RenderEdge	*r,
-		   xFixed	t,
-		   xFixed	b)
-{
-    xFixed  y = t;
-    FbBits  *line;
-    int fill_start = -1, fill_end = -1;
-    int fill_size = 0;
-
-    line = buf + xFixedToInt (y) * stride;
-
-    for (;;)
-    {
-        CARD8 *ap = (CARD8 *) line;
-	xFixed	lx, rx;
-	int	lxi, rxi;
-	
-	/* clip X */
-	lx = l->x;
-	if (lx < 0)
-	    lx = 0;
-	rx = r->x;
-	if (xFixedToInt (rx) >= width)
-	    rx = IntToxFixed (width);
-	
-	/* Skip empty (or backwards) sections */
-	if (rx > lx)
-	{
-            int lxs, rxs;
-
-	    /* Find pixel bounds for span. */
-	    lxi = xFixedToInt (lx);
-	    rxi = xFixedToInt (rx);
-
-            /* Sample coverage for edge pixels */
-            lxs = RenderSamplesX (lx, 8);
-            rxs = RenderSamplesX (rx, 8);
-
-            /* Add coverage across row */
-            if (lxi == rxi)
-            {
-                ap[lxi] = clip255 (ap[lxi] + rxs - lxs);
-            }
-            else
-            {
-                ap[lxi] = clip255 (ap[lxi] + N_X_FRAC(8) - lxs);
-
-                /* Move forward so that lxi/rxi is the pixel span */
-                lxi++;
-
-                /* Don't bother trying to optimize the fill unless
-                 * the span is longer than 4 pixels. */
-                if (rxi - lxi > 4)
-                {
-                    if (fill_start < 0)
-                    {
-                        fill_start = lxi;
-                        fill_end = rxi;
-                        fill_size++;
-                    }
-                    else
-                    {
-                        if (lxi >= fill_end || rxi < fill_start)
-                        {
-                            /* We're beyond what we saved, just fill it */
-                            add_saturate_8 (ap + fill_start,
-                                            fill_size * N_X_FRAC(8),
-                                            fill_end - fill_start);
-                            fill_start = lxi;
-                            fill_end = rxi;
-                            fill_size = 1;
-                        }
-                        else
-                        {
-                            /* Update fill_start */
-                            if (lxi > fill_start)
-                            {
-                                add_saturate_8 (ap + fill_start,
-                                                fill_size * N_X_FRAC(8),
-                                                lxi - fill_start);
-                                fill_start = lxi;
-                            }
-                            else if (lxi < fill_start)
-                            {
-                                add_saturate_8 (ap + lxi, N_X_FRAC(8),
-                                                fill_start - lxi);
-                            }
-
-                            /* Update fill_end */
-                            if (rxi < fill_end)
-                            {
-                                add_saturate_8 (ap + rxi,
-                                                fill_size * N_X_FRAC(8),
-                                                fill_end - rxi);
-                                fill_end = rxi;
-                            }
-                            else if (fill_end < rxi)
-                            {
-                                add_saturate_8 (ap + fill_end,
-                                                N_X_FRAC(8),
-                                                rxi - fill_end);
-                            }
-                            fill_size++;
-                        }
-                    }
-                }
-                else
-                {
-                    add_saturate_8 (ap + lxi, N_X_FRAC(8), rxi - lxi);
-                }
-
-                /* Do not add in a 0 alpha here. This check is
-                 * necessary to avoid a buffer overrun, (when rx
-                 * is exactly on a pixel boundary). */
-                if (rxs)
-                    ap[rxi] = clip255 (ap[rxi] + rxs);
-            }
-	}
-
-	if (y == b) {
-            /* We're done, make sure we clean up any remaining fill. */
-            if (fill_start != fill_end) {
-                if (fill_size == N_Y_FRAC(8))
-                {
-                    memset (ap + fill_start, 0xff, fill_end - fill_start);
-                }
-                else
-                {
-                    add_saturate_8 (ap + fill_start, fill_size * N_X_FRAC(8),
-                                    fill_end - fill_start);
-                }
-            }
-	    break;
-        }
-
-	if (xFixedFrac (y) != Y_FRAC_LAST(8))
-	{
-	    RenderEdgeStepSmall (l);
-	    RenderEdgeStepSmall (r);
-	    y += STEP_Y_SMALL(8);
-	}
-	else
-	{
-	    RenderEdgeStepBig (l);
-	    RenderEdgeStepBig (r);
-	    y += STEP_Y_BIG(8);
-            if (fill_start != fill_end)
-            {
-                if (fill_size == N_Y_FRAC(8))
-                {
-                    memset (ap + fill_start, 0xff, fill_end - fill_start);
-                }
-                else
-                {
-                    add_saturate_8 (ap + fill_start, fill_size * N_X_FRAC(8),
-                                    fill_end - fill_start);
-                }
-                fill_start = fill_end = -1;
-                fill_size = 0;
-            }
-	    line += stride;
-	}
-    }
-}
-
-void
-fbRasterizeEdges (FbBits	*buf,
-		  int		bpp,
-		  int		width,
-		  int		stride,
-		  RenderEdge	*l,
-		  RenderEdge	*r,
-		  xFixed	t,
-		  xFixed	b)
-{
-    switch (bpp) {
-    case 1:
-	fbRasterizeEdges1 (buf, width, stride, l, r, t, b);
-	break;
-    case 4:
-	fbRasterizeEdges4 (buf, width, stride, l, r, t, b);
-	break;
-    case 8:
-	fbRasterizeEdges8 (buf, width, stride, l, r, t, b);
-	break;
-    }
-}
-
-#endif /* RENDER */
diff --git a/fb/fbedgeimp.h b/fb/fbedgeimp.h
deleted file mode 100644
index 8773935..0000000
--- a/fb/fbedgeimp.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * $Id$
- *
- * Copyright © 2004 Keith Packard
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifndef rasterizeSpan
-#endif
-
-static void
-rasterizeEdges (FbBits		*buf,
-		int		width,
-		int		stride,
-		RenderEdge	*l,
-		RenderEdge	*r,
-		xFixed		t,
-		xFixed		b)
-{
-    xFixed  y = t;
-    FbBits  *line;
-    
-    line = buf + xFixedToInt (y) * stride;
-    
-    for (;;)
-    {
-	xFixed	lx, rx;
-	int	lxi, rxi;
-	
-	/* clip X */
-	lx = l->x;
-	if (lx < 0)
-	    lx = 0;
-	rx = r->x;
-	if (xFixedToInt (rx) >= width)
-	    rx = IntToxFixed (width);
-	
-	/* Skip empty (or backwards) sections */
-	if (rx > lx)
-	{
-
-	    /* Find pixel bounds for span */
-	    lxi = xFixedToInt (lx);
-	    rxi = xFixedToInt (rx);
-
-#if N_BITS == 1
-	    {
-		FbBits  *a = line;
-		FbBits  startmask, endmask;
-		int	    nmiddle;
-		int	    width = rxi - lxi;
-		int	    x = lxi;
-
-		a += x >> FB_SHIFT;
-		x &= FB_MASK;
-
-		FbMaskBits (x, width, startmask, nmiddle, endmask);
-		if (startmask)
-		    *a++ |= startmask;
-		while (nmiddle--)
-		    *a++ = FB_ALLONES;
-		if (endmask)
-		    *a |= endmask;
-	    }
-#else
-	    {
-		DefineAlpha(line,lxi);
-		int	    lxs, rxs;
-
-		/* Sample coverage for edge pixels */
-		lxs = RenderSamplesX (lx, N_BITS);
-		rxs = RenderSamplesX (rx, N_BITS);
-
-		/* Add coverage across row */
-		if (lxi == rxi)
-		{
-		    AddAlpha (rxs - lxs);
-		}
-		else
-		{
-		    int	xi;
-
-		    AddAlpha (N_X_FRAC(N_BITS) - lxs);
-		    StepAlpha;
-		    for (xi = lxi + 1; xi < rxi; xi++)
-		    {
-			AddAlpha (N_X_FRAC(N_BITS));
-			StepAlpha;
-		    }
-		    /* Do not add in a 0 alpha here. This check is necessary
-		     * to avoid a buffer overrun when rx is exactly on a pixel
-		     * boundary.
-		     */
-		    if (rxs != 0)
-			AddAlpha (rxs);
-		}
-	    }
-#endif
-	}
-
-	if (y == b)
-	    break;
-
-#if N_BITS > 1
-	if (xFixedFrac (y) != Y_FRAC_LAST(N_BITS))
-	{
-	    RenderEdgeStepSmall (l);
-	    RenderEdgeStepSmall (r);
-	    y += STEP_Y_SMALL(N_BITS);
-	}
-	else
-#endif
-	{
-	    RenderEdgeStepBig (l);
-	    RenderEdgeStepBig (r);
-	    y += STEP_Y_BIG(N_BITS);
-	    line += stride;
-	}
-    }
-}
-
-#undef rasterizeSpan
diff --git a/fb/fbfill.c b/fb/fbfill.c
index ad5025c..831b1ce 100644
--- a/fb/fbfill.c
+++ b/fb/fbfill.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbfill.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -27,7 +25,6 @@
 #endif
 
 #include "fb.h"
-#include "fbmmx.h"
 
 void
 fbFill (DrawablePtr pDrawable,
@@ -47,17 +44,18 @@ fbFill (DrawablePtr pDrawable,
 
     switch (pGC->fillStyle) {
     case FillSolid:
-#ifdef USE_MMX
-	if (!pPriv->and && fbHaveMMX())
-	    if (fbSolidFillmmx (pDrawable, x, y, width, height, pPriv->xor))
-		return;
+#ifndef FB_ACCESS_WRAPPER
+	if (pPriv->and || !pixman_fill ((uint32_t *)dst, dstStride, dstBpp,
+					x + dstXoff, y + dstYoff,
+					width, height,
+					pPriv->xor))
 #endif	    
-	fbSolid (dst + (y + dstYoff) * dstStride, 
-		 dstStride, 
-		 (x + dstXoff) * dstBpp,
-		 dstBpp,
-		 width * dstBpp, height,
-		 pPriv->and, pPriv->xor);
+	    fbSolid (dst + (y + dstYoff) * dstStride, 
+		     dstStride, 
+		     (x + dstXoff) * dstBpp,
+		     dstBpp,
+		     width * dstBpp, height,
+		     pPriv->and, pPriv->xor);
 	break;
     case FillStippled:
     case FillOpaqueStippled: {
@@ -92,6 +90,7 @@ fbFill (DrawablePtr pDrawable,
 		    
 		    (pGC->patOrg.x + pDrawable->x + dstXoff),
 		    pGC->patOrg.y + pDrawable->y - y);
+	    fbFinishAccess (&pStip->drawable);
 	}
 	else
 	{
@@ -129,6 +128,7 @@ fbFill (DrawablePtr pDrawable,
 		       bgand, bgxor,
 		       pGC->patOrg.x + pDrawable->x + dstXoff,
 		       pGC->patOrg.y + pDrawable->y - y);
+	    fbFinishAccess (&pStip->drawable);
 	}
 	break;
     }
@@ -157,10 +157,12 @@ fbFill (DrawablePtr pDrawable,
 		dstBpp,
 		(pGC->patOrg.x + pDrawable->x + dstXoff) * dstBpp,
 		pGC->patOrg.y + pDrawable->y - y);
+	fbFinishAccess (&pTile->drawable);
 	break;
     }
     }
     fbValidateDrawable (pDrawable);
+    fbFinishAccess (pDrawable);
 }
 
 void
@@ -209,23 +211,20 @@ fbSolidBoxClipped (DrawablePtr	pDrawable,
 	if (partY2 <= partY1)
 	    continue;
 
-#ifdef USE_MMX
-	if (!and && fbHaveMMX())
-	{
-		if (fbSolidFillmmx (pDrawable,
-		                    partX1, partY1,
-				    (partX2 - partX1), (partY2 - partY1),
-				    xor))
-			return;
-	}
+#ifndef FB_ACCESS_WRAPPER
+	if (and || !pixman_fill ((uint32_t *)dst, dstStride, dstBpp,
+				 partX1 + dstXoff, partY1 + dstYoff,
+				 (partX2 - partX1), (partY2 - partY1),
+				 xor))
 #endif
-	fbSolid (dst + (partY1 + dstYoff) * dstStride,
-		 dstStride,
-		 (partX1 + dstXoff) * dstBpp,
-		 dstBpp,
-
-		 (partX2 - partX1) * dstBpp,
-		 (partY2 - partY1),
-		 and, xor);
+	    fbSolid (dst + (partY1 + dstYoff) * dstStride,
+		     dstStride,
+		     (partX1 + dstXoff) * dstBpp,
+		     dstBpp,
+		     
+		     (partX2 - partX1) * dstBpp,
+		     (partY2 - partY1),
+		     and, xor);
     }
+    fbFinishAccess (pDrawable);
 }
diff --git a/fb/fbfillrect.c b/fb/fbfillrect.c
index f404044..4e4edb3 100644
--- a/fb/fbfillrect.c
+++ b/fb/fbfillrect.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbfillrect.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
diff --git a/fb/fbfillsp.c b/fb/fbfillsp.c
index 77e4772..5d21472 100644
--- a/fb/fbfillsp.c
+++ b/fb/fbfillsp.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbfillsp.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
diff --git a/fb/fbgc.c b/fb/fbgc.c
index 5b55810..fda391b 100644
--- a/fb/fbgc.c
+++ b/fb/fbgc.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbgc.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -106,16 +104,18 @@ fbPadPixmap (PixmapPtr pPixmap)
     mask = FbBitsMask (0, width);
     while (height--)
     {
-	b = *bits & mask;
+	b = READ(bits) & mask;
 	w = width;
 	while (w < FB_UNIT)
 	{
 	    b = b | FbScrRight(b, w);
 	    w <<= 1;
 	}
-	*bits = b;
+	WRITE(bits, b);
 	bits += stride;
     }
+
+    fbFinishAccess (&pPixmap->drawable);
 }
 
 /*
@@ -153,7 +153,7 @@ fbLineRepeat (FbBits *bits, int len, int width)
     width = (width + FB_UNIT-1) >> FB_SHIFT;
     bits++;
     while (--width)
-	if (*bits != first)
+	if (READ(bits) != first)
 	    return FALSE;
     return TRUE;
 }
@@ -183,10 +183,13 @@ fbCanEvenStipple (PixmapPtr pStipple, int bpp)
     /* check to see that the stipple repeats horizontally */
     while (h--)
     {
-	if (!fbLineRepeat (bits, len, pStipple->drawable.width))
+	if (!fbLineRepeat (bits, len, pStipple->drawable.width)) {
+	    fbFinishAccess (&pStipple->drawable);
 	    return FALSE;
+	}
 	bits += stride;
     }
+    fbFinishAccess (&pStipple->drawable);
     return TRUE;
 }
 
diff --git a/fb/fbgetsp.c b/fb/fbgetsp.c
index f77ea8c..6402c6c 100644
--- a/fb/fbgetsp.c
+++ b/fb/fbgetsp.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbgetsp.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -84,4 +82,6 @@ fbGetSpans(DrawablePtr	pDrawable,
 	ppt++;
 	pwidth++;
     }
+
+    fbFinishAccess (pDrawable);
 }
diff --git a/fb/fbglyph.c b/fb/fbglyph.c
index 8e81940..2c19b74 100644
--- a/fb/fbglyph.c
+++ b/fb/fbglyph.c
@@ -62,11 +62,11 @@ fbGlyphIn (RegionPtr	pRegion,
 #ifdef FB_24BIT
 #ifndef FBNOPIXADDR
 
-#define WRITE1(d,n,fg)	((d)[n] = (CARD8) fg)
-#define WRITE2(d,n,fg)	(*(CARD16 *) &(d[n]) = (CARD16) fg)
-#define WRITE4(d,n,fg)	(*(CARD32 *) &(d[n]) = (CARD32) fg)
+#define WRITE1(d,n,fg)	WRITE((d) + (n), (CARD8) fg)
+#define WRITE2(d,n,fg)	WRITE((CARD16 *) &(d[n]), (CARD16) fg)
+#define WRITE4(d,n,fg)	WRITE((CARD32 *) &(d[n]), (CARD32) fg)
 #if FB_UNIT == 6 && IMAGE_BYTE_ORDER == LSBFirst
-#define WRITE8(d)	(*(FbBits *) &(d[0]) = fg)
+#define WRITE8(d)	WRITE((FbBits *) &(d[0]), fg)
 #else
 #define WRITE8(d)	WRITE4(d,0,_ABCA), WRITE4(d,4,_BCAB)
 #endif
@@ -157,7 +157,7 @@ fbGlyph24 (FbBits   *dstBits,
     lshift = 4 - shift;
     while (height--)
     {
-	bits = *stipple++;
+	bits = READ(stipple++);
 	n = lshift;
 	dst = dstLine;
 	while (bits)
@@ -284,7 +284,7 @@ fbPolyGlyphBlt (DrawablePtr	pDrawable,
     glyph = 0;
     if (pGC->fillStyle == FillSolid && pPriv->and == 0)
     {
-	fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+	dstBpp = pDrawable->bitsPerPixel;
 	switch (dstBpp) {
 	case 8:	    glyph = fbGlyph8; break;
 	case 16:    glyph = fbGlyph16; break;
@@ -312,6 +312,7 @@ fbPolyGlyphBlt (DrawablePtr	pDrawable,
 	    if (glyph && gWidth <= sizeof (FbStip) * 8 &&
 		fbGlyphIn (fbGetCompositeClip(pGC), gx, gy, gWidth, gHeight))
 	    {
+		fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
 		(*glyph) (dst + (gy + dstYoff) * dstStride,
 			  dstStride,
 			  dstBpp,
@@ -319,6 +320,7 @@ fbPolyGlyphBlt (DrawablePtr	pDrawable,
 			  pPriv->xor,
 			  gx + dstXoff,
 			  gHeight);
+		fbFinishAccess (pDrawable);
 	    }
 	    else
 #endif
@@ -375,7 +377,7 @@ fbImageGlyphBlt (DrawablePtr	pDrawable,
     glyph = 0;
     if (pPriv->and == 0)
     {
-	fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
+	dstBpp = pDrawable->bitsPerPixel;
 	switch (dstBpp) {
 	case 8:	    glyph = fbGlyph8; break;
 	case 16:    glyph = fbGlyph16; break;
@@ -443,6 +445,7 @@ fbImageGlyphBlt (DrawablePtr	pDrawable,
 	    if (glyph && gWidth <= sizeof (FbStip) * 8 &&
 		fbGlyphIn (fbGetCompositeClip(pGC), gx, gy, gWidth, gHeight))
 	    {
+		fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
 		(*glyph) (dst + (gy + dstYoff) * dstStride,
 			  dstStride,
 			  dstBpp,
@@ -450,6 +453,7 @@ fbImageGlyphBlt (DrawablePtr	pDrawable,
 			  pPriv->fg,
 			  gx + dstXoff,
 			  gHeight);
+		fbFinishAccess (pDrawable);
 	    }
 	    else
 #endif
diff --git a/fb/fbimage.c b/fb/fbimage.c
index 3b4a07c..2b9ac27 100644
--- a/fb/fbimage.c
+++ b/fb/fbimage.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbimage.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -170,6 +168,8 @@ fbPutZImage (DrawablePtr	pDrawable,
 		   pm,
 		   dstBpp);
     }
+
+    fbFinishAccess (pDrawable);
 }
 	     
 void
@@ -277,6 +277,8 @@ fbPutXYImage (DrawablePtr	pDrawable,
 		      fgand, fgxor, bgand, bgxor);
 	}
     }
+
+    fbFinishAccess (pDrawable);
 }
 
 void
@@ -361,4 +363,6 @@ fbGetImage (DrawablePtr	    pDrawable,
 		    fbXorStip(GXcopy,0,FB_STIP_ALLONES),
 		    planeMask);
     }
+
+    fbFinishAccess (pDrawable);
 }
diff --git a/fb/fbline.c b/fb/fbline.c
index 8e99dd9..2cee123 100644
--- a/fb/fbline.c
+++ b/fb/fbline.c
@@ -1,6 +1,4 @@
 /*
- * $XFree86$
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
diff --git a/fb/fbmmx.c b/fb/fbmmx.c
deleted file mode 100644
index f74930a..0000000
--- a/fb/fbmmx.c
+++ /dev/null
@@ -1,2314 +0,0 @@
-/*
- * Copyright © 2004, 2005 Red Hat, Inc.
- * Copyright © 2004 Nicholas Miell
- * Copyright © 2005 Trolltech AS
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Red Hat not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  Red Hat makes no representations about the
- * suitability of this software for any purpose.  It is provided "as is"
- * without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Author:  Søren Sandmann (sandmann at redhat.com)
- * Minor Improvements: Nicholas Miell (nmiell at gmail.com)
- * MMX code paths for fbcompose.c by Lars Knoll (lars at trolltech.com) 
- *
- * Based on work by Owen Taylor
- */
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifdef USE_MMX
-
-#if defined(__amd64__) || defined(__x86_64__)
-#define USE_SSE
-#endif
-
-#include <mmintrin.h>
-#ifdef USE_SSE
-#include <xmmintrin.h> /* for _mm_shuffle_pi16 and _MM_SHUFFLE */
-#endif
-
-#ifdef RENDER
-
-#include "fb.h"
-#include "fbmmx.h"
-
-#include "picturestr.h"
-#include "mipict.h"
-#include "fbpict.h"
-
-#define noVERBOSE
-
-#ifdef VERBOSE
-#define CHECKPOINT() ErrorF ("at %s %d\n", __FUNCTION__, __LINE__)
-#else
-#define CHECKPOINT()
-#endif
-
-/* Notes about writing mmx code
- *
- * give memory operands as the second operand. If you give it as the
- * first, gcc will first load it into a register, then use that
- * register
- *
- *   ie. use
- *
- *         _mm_mullo_pi16 (x, mmx_constant);
- *
- *   not
- *
- *         _mm_mullo_pi16 (mmx_constant, x);
- *
- * Also try to minimize dependencies. i.e. when you need a value, try
- * to calculate it from a value that was calculated as early as
- * possible.
- */
-
-/* --------------- MMX primitivess ------------------------------------ */
-
-typedef unsigned long long ullong;
-
-typedef struct
-{
-    ullong mmx_4x00ff;
-    ullong mmx_4x0080;
-    ullong mmx_565_rgb;
-    ullong mmx_565_unpack_multiplier;
-    ullong mmx_565_r;
-    ullong mmx_565_g;
-    ullong mmx_565_b;
-    ullong mmx_mask_0;
-    ullong mmx_mask_1;
-    ullong mmx_mask_2;
-    ullong mmx_mask_3;
-    ullong mmx_full_alpha;
-    ullong mmx_ffff0000ffff0000;
-    ullong mmx_0000ffff00000000;
-    ullong mmx_000000000000ffff;
-} MMXData;
-
-static const MMXData c =
-{
-    .mmx_4x00ff =			0x00ff00ff00ff00ffULL,
-    .mmx_4x0080 =			0x0080008000800080ULL,
-    .mmx_565_rgb =			0x000001f0003f001fULL,
-    .mmx_565_r =			0x000000f800000000ULL,
-    .mmx_565_g =			0x0000000000fc0000ULL,
-    .mmx_565_b =			0x00000000000000f8ULL,
-    .mmx_mask_0 =			0xffffffffffff0000ULL,
-    .mmx_mask_1 =			0xffffffff0000ffffULL,
-    .mmx_mask_2 =			0xffff0000ffffffffULL,
-    .mmx_mask_3 =			0x0000ffffffffffffULL,
-    .mmx_full_alpha =			0x00ff000000000000ULL,
-    .mmx_565_unpack_multiplier =	0x0000008404100840ULL,
-    .mmx_ffff0000ffff0000 =		0xffff0000ffff0000ULL,
-    .mmx_0000ffff00000000 =		0x0000ffff00000000ULL,
-    .mmx_000000000000ffff =		0x000000000000ffffULL,
-};
-
-#define MC(x) ((__m64) c.mmx_##x)
-
-static __inline__ __m64
-shift (__m64 v, int s)
-{
-    if (s > 0)
-	return _mm_slli_si64 (v, s);
-    else if (s < 0)
-	return _mm_srli_si64 (v, -s);
-    else
-	return v;
-}
-
-static __inline__ __m64
-negate (__m64 mask)
-{
-    return _mm_xor_si64 (mask, MC(4x00ff));
-}
-
-static __inline__ __m64
-pix_multiply (__m64 a, __m64 b)
-{
-    __m64 res;
-    
-    res = _mm_mullo_pi16 (a, b);
-    res = _mm_adds_pu16 (res, MC(4x0080));
-    res = _mm_adds_pu16 (res, _mm_srli_pi16 (res, 8));
-    res = _mm_srli_pi16 (res, 8);
-    
-    return res;
-}
-
-static __inline__ __m64
-pix_add (__m64 a, __m64 b)
-{
-    return  _mm_adds_pu8 (a, b);
-}
-
-#ifdef USE_SSE
-
-static __inline__ __m64
-expand_alpha (__m64 pixel)
-{
-    return _mm_shuffle_pi16 (pixel, _MM_SHUFFLE(3, 3, 3, 3));
-}
-
-static __inline__ __m64
-expand_alpha_rev (__m64 pixel)
-{
-    return _mm_shuffle_pi16 (pixel, _MM_SHUFFLE(0, 0, 0, 0));
-}    
-
-static __inline__ __m64
-invert_colors (__m64 pixel)
-{
-    return _mm_shuffle_pi16 (pixel, _MM_SHUFFLE(3, 0, 1, 2));
-}
-
-#else
-
-static __inline__ __m64
-expand_alpha (__m64 pixel)
-{
-    __m64 t1, t2;
-    
-    t1 = shift (pixel, -48);
-    t2 = shift (t1, 16);
-    t1 = _mm_or_si64 (t1, t2);
-    t2 = shift (t1, 32);
-    t1 = _mm_or_si64 (t1, t2);
-
-    return t1;
-}
-
-static __inline__ __m64
-expand_alpha_rev (__m64 pixel)
-{
-    __m64 t1, t2;
-
-    /* move alpha to low 16 bits and zero the rest */
-    t1 = shift (pixel,  48);
-    t1 = shift (t1, -48);
-
-    t2 = shift (t1, 16);
-    t1 = _mm_or_si64 (t1, t2);
-    t2 = shift (t1, 32);
-    t1 = _mm_or_si64 (t1, t2);
-
-    return t1;
-}
-
-static __inline__ __m64
-invert_colors (__m64 pixel)
-{
-    __m64 x, y, z;
-
-    x = y = z = pixel;
-
-    x = _mm_and_si64 (x, MC(ffff0000ffff0000));
-    y = _mm_and_si64 (y, MC(000000000000ffff));
-    z = _mm_and_si64 (z, MC(0000ffff00000000));
-
-    y = shift (y, 32);
-    z = shift (z, -32);
-
-    x = _mm_or_si64 (x, y);
-    x = _mm_or_si64 (x, z);
-
-    return x;
-}
-
-#endif
-
-static __inline__ __m64
-over (__m64 src, __m64 srca, __m64 dest)
-{
-    return  _mm_adds_pu8 (src, pix_multiply(dest, negate(srca)));
-}
-
-static __inline__ __m64
-over_rev_non_pre (__m64 src, __m64 dest)
-{
-    __m64 srca = expand_alpha (src);
-    __m64 srcfaaa = _mm_or_si64 (srca, MC(full_alpha));
-    
-    return over(pix_multiply(invert_colors(src), srcfaaa), srca, dest);
-}
-
-static __inline__ __m64
-in (__m64 src,
-    __m64 mask)
-{
-    return pix_multiply (src, mask);
-}
-
-static __inline__ __m64
-in_over (__m64 src,
-	 __m64 srca,
-	 __m64 mask,
-	 __m64 dest)
-{
-    return over(in(src, mask), pix_multiply(srca, mask), dest);
-}
-
-static __inline__ __m64
-load8888 (CARD32 v)
-{
-    return _mm_unpacklo_pi8 (_mm_cvtsi32_si64 (v), _mm_setzero_si64());
-}
-
-static __inline__ __m64
-pack8888 (__m64 lo, __m64 hi)
-{
-    return _mm_packs_pu16 (lo, hi);
-}
-
-static __inline__ CARD32
-store8888 (__m64 v)
-{
-    return _mm_cvtsi64_si32(pack8888(v, _mm_setzero_si64()));
-}
-
-/* Expand 16 bits positioned at @pos (0-3) of a mmx register into
- *
- *    00RR00GG00BB
- * 
- * --- Expanding 565 in the low word ---
- * 
- * m = (m << (32 - 3)) | (m << (16 - 5)) | m;
- * m = m & (01f0003f001f);
- * m = m * (008404100840);
- * m = m >> 8;
- * 
- * Note the trick here - the top word is shifted by another nibble to
- * avoid it bumping into the middle word
- */
-static __inline__ __m64
-expand565 (__m64 pixel, int pos)
-{
-    __m64 p = pixel;
-    __m64 t1, t2;
-    
-    /* move pixel to low 16 bit and zero the rest */
-    p = shift (shift (p, (3 - pos) * 16), -48); 
-    
-    t1 = shift (p, 36 - 11);
-    t2 = shift (p, 16 - 5);
-    
-    p = _mm_or_si64 (t1, p);
-    p = _mm_or_si64 (t2, p);
-    p = _mm_and_si64 (p, MC(565_rgb));
-    
-    pixel = _mm_mullo_pi16 (p, MC(565_unpack_multiplier));
-    return _mm_srli_pi16 (pixel, 8);
-}
-
-static __inline__ __m64
-expand8888 (__m64 in, int pos)
-{
-    if (pos == 0)
-	return _mm_unpacklo_pi8 (in, _mm_setzero_si64());
-    else
-	return _mm_unpackhi_pi8 (in, _mm_setzero_si64());
-}
-
-static __inline__ __m64
-pack565 (__m64 pixel, __m64 target, int pos)
-{
-    __m64 p = pixel;
-    __m64 t = target;
-    __m64 r, g, b;
-    
-    r = _mm_and_si64 (p, MC(565_r));
-    g = _mm_and_si64 (p, MC(565_g));
-    b = _mm_and_si64 (p, MC(565_b));
-    
-    r = shift (r, - (32 - 8) + pos * 16);
-    g = shift (g, - (16 - 3) + pos * 16);
-    b = shift (b, - (0  + 3) + pos * 16);
-    
-    if (pos == 0)
-	t = _mm_and_si64 (t, MC(mask_0));
-    else if (pos == 1)
-	t = _mm_and_si64 (t, MC(mask_1));
-    else if (pos == 2)
-	t = _mm_and_si64 (t, MC(mask_2));
-    else if (pos == 3)
-	t = _mm_and_si64 (t, MC(mask_3));
-    
-    p = _mm_or_si64 (r, t);
-    p = _mm_or_si64 (g, p);
-    
-    return _mm_or_si64 (b, p);
-}
-
-static __inline__ __m64
-pix_add_mul (__m64 x, __m64 a, __m64 y, __m64 b)
-{
-    x = _mm_mullo_pi16 (x, a);                  
-    y = _mm_mullo_pi16 (y, b);                  
-    x = _mm_srli_pi16(x, 1);                    
-    y = _mm_srli_pi16(y, 1);                    
-    x = _mm_adds_pu16 (x, y);                    
-    x = _mm_adds_pu16 (x, _mm_srli_pi16 (x, 8)); 
-    x = _mm_adds_pu16 (x, MC(4x0080));
-    x = _mm_srli_pi16 (x, 7);
-
-    return x;
-}
-
-/* --------------- MMX code patch for fbcompose.c --------------------- */
-
-static FASTCALL void
-mmxCombineMaskU (CARD32 *src, const CARD32 *mask, int width)
-{
-    const CARD32 *end = mask + width;
-    while (mask < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        a = expand_alpha(a);
-        s = pix_multiply(s, a);
-        *src = store8888(s);
-        ++src;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-
-static FASTCALL void
-mmxCombineOverU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end = dest + width;
-
-    while (dest < end) {
-        __m64 s, sa;
-	s = load8888(*src);
-	sa = expand_alpha(s);
-	*dest = store8888(over(s, sa, load8888(*dest)));
-        ++dest;
-        ++src;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineOverReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end = dest + width;
-
-    while (dest < end) {
-	__m64 d, da;
-	d = load8888(*dest);
-	da = expand_alpha(d);
-	*dest = store8888(over (d, da, load8888(*src)));
-        ++dest;
-        ++src;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineInU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end = dest + width;
-
-    while (dest < end) {
-        __m64 x, a;
-        x = load8888(*src);
-        a = load8888(*dest);
-        a = expand_alpha(a);
-        x = pix_multiply(x, a);
-        *dest = store8888(x);
-        ++dest;
-        ++src;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineInReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end = dest + width;
-
-    while (dest < end) {
-        __m64 x, a;
-        x = load8888(*dest);
-        a = load8888(*src);
-        a = expand_alpha(a);
-        x = pix_multiply(x, a);
-        *dest = store8888(x);
-        ++dest;
-        ++src;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineOutU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end = dest + width;
-
-    while (dest < end) {
-        __m64 x, a;
-        x = load8888(*src);
-        a = load8888(*dest);
-        a = expand_alpha(a);
-        a = negate(a);
-        x = pix_multiply(x, a);
-        *dest = store8888(x);
-        ++dest;
-        ++src;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineOutReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end = dest + width;
-
-    while (dest < end) {
-        __m64 x, a;
-        x = load8888(*dest);
-        a = load8888(*src);
-        a = expand_alpha(a);
-        a = negate(a);
-        x = pix_multiply(x, a);
-        *dest = store8888(x);
-        ++dest;
-        ++src;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineAtopU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end = dest + width;
-
-    while (dest < end) {
-        __m64 s, da, d, sia;
-        s = load8888(*src);
-        d = load8888(*dest);
-        sia = expand_alpha(s);
-        sia = negate(sia);
-        da = expand_alpha(d);
-        s = pix_add_mul (s, da, d, sia);
-        *dest = store8888(s);
-        ++dest;
-        ++src;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineAtopReverseU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end;
-
-    end = dest + width;
-
-    while (dest < end) {
-        __m64 s, dia, d, sa;
-        s = load8888(*src);
-        d = load8888(*dest);
-        sa = expand_alpha(s);
-        dia = expand_alpha(d);
-        dia = negate(dia);
-	s = pix_add_mul (s, dia, d, sa);
-        *dest = store8888(s);
-        ++dest;
-        ++src;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineXorU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end = dest + width;
-
-    while (dest < end) {
-        __m64 s, dia, d, sia;
-        s = load8888(*src);
-        d = load8888(*dest);
-        sia = expand_alpha(s);
-        dia = expand_alpha(d);
-        sia = negate(sia);
-        dia = negate(dia);
-	s = pix_add_mul (s, dia, d, sia);
-        *dest = store8888(s);
-        ++dest;
-        ++src;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineAddU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end = dest + width;
-    while (dest < end) {
-        __m64 s, d;
-        s = load8888(*src);
-        d = load8888(*dest);
-        s = pix_add(s, d);
-        *dest = store8888(s);
-        ++dest;
-        ++src;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineSaturateU (CARD32 *dest, const CARD32 *src, int width)
-{
-    const CARD32 *end = dest + width;
-    while (dest < end) {
-        CARD32 s = *src;
-        CARD32 d = *dest;
-        __m64 ms = load8888(s);
-        __m64 md = load8888(d);
-        CARD32 sa = s >> 24;
-        CARD32 da = ~d >> 24;
-
-        if (sa > da) {
-            __m64 msa = load8888(FbIntDiv(da, sa));
-            msa = expand_alpha_rev(msa);
-            ms = pix_multiply(ms, msa);
-        }
-        md = pix_add(md, ms);
-        *dest = store8888(md);
-        ++src;
-        ++dest;
-    }
-    _mm_empty();
-}
-
-
-static FASTCALL void
-mmxCombineSrcC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        s = pix_multiply(s, a);
-        *dest = store8888(s);
-        ++src;
-        ++mask;
-        ++dest;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineOverC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        __m64 d = load8888(*dest);
-        __m64 sa = expand_alpha(s);
-	
-	*dest = store8888(in_over (s, sa, a, d));
-	
-        ++src;
-        ++dest;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineOverReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        __m64 d = load8888(*dest);
-        __m64 da = expand_alpha(d);
-
-	*dest = store8888(over (d, da, in (s, a)));
-	
-        ++src;
-        ++dest;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-
-static FASTCALL void
-mmxCombineInC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        __m64 d = load8888(*dest);
-        __m64 da = expand_alpha(d);
-        s = pix_multiply(s, a);
-        s = pix_multiply(s, da);
-        *dest = store8888(s);
-        ++src;
-        ++dest;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineInReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        __m64 d = load8888(*dest);
-        __m64 sa = expand_alpha(s);
-        a = pix_multiply(a, sa);
-        d = pix_multiply(d, a);
-        *dest = store8888(d);
-        ++src;
-        ++dest;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineOutC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        __m64 d = load8888(*dest);
-        __m64 da = expand_alpha(d);
-        da = negate(da);
-        s = pix_multiply(s, a);
-        s = pix_multiply(s, da);
-        *dest = store8888(s);
-        ++src;
-        ++dest;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineOutReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        __m64 d = load8888(*dest);
-        __m64 sa = expand_alpha(s);
-        a = pix_multiply(a, sa);
-        a = negate(a);
-        d = pix_multiply(d, a);
-        *dest = store8888(d);
-        ++src;
-        ++dest;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineAtopC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        __m64 d = load8888(*dest);
-        __m64 da = expand_alpha(d);
-        __m64 sa = expand_alpha(s); 
-        s = pix_multiply(s, a);
-        a = pix_multiply(a, sa);
-        a = negate(a);
-	d = pix_add_mul (d, a, s, da);
-        *dest = store8888(d);
-        ++src;
-        ++dest;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineAtopReverseC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        __m64 d = load8888(*dest);
-        __m64 da = expand_alpha(d);
-        __m64 sa = expand_alpha(s);
-        s = pix_multiply(s, a);
-        a = pix_multiply(a, sa);
-        da = negate(da);
-	d = pix_add_mul (d, a, s, da);
-        *dest = store8888(d);
-        ++src;
-        ++dest;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineXorC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        __m64 d = load8888(*dest);
-        __m64 da = expand_alpha(d);
-        __m64 sa = expand_alpha(s);
-        s = pix_multiply(s, a);
-        a = pix_multiply(a, sa);
-        da = negate(da);
-        a = negate(a);
-	d = pix_add_mul (d, a, s, da);
-        *dest = store8888(d);
-        ++src;
-        ++dest;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-static FASTCALL void
-mmxCombineAddC (CARD32 *dest, CARD32 *src, CARD32 *mask, int width)
-{
-    const CARD32 *end = src + width;
-    while (src < end) {
-        __m64 a = load8888(*mask);
-        __m64 s = load8888(*src);
-        __m64 d = load8888(*dest);
-        s = pix_multiply(s, a);
-        d = pix_add(s, d);
-        *dest = store8888(d);
-        ++src;
-        ++dest;
-        ++mask;
-    }
-    _mm_empty();
-}
-
-extern FbComposeFunctions composeFunctions;
-
-void fbComposeSetupMMX(void)
-{
-    /* check if we have MMX support and initialize accordingly */
-    if (fbHaveMMX()) {
-        composeFunctions.combineU[PictOpOver] = mmxCombineOverU;
-        composeFunctions.combineU[PictOpOverReverse] = mmxCombineOverReverseU;
-        composeFunctions.combineU[PictOpIn] = mmxCombineInU;
-        composeFunctions.combineU[PictOpInReverse] = mmxCombineInReverseU;
-        composeFunctions.combineU[PictOpOut] = mmxCombineOutU;
-        composeFunctions.combineU[PictOpOutReverse] = mmxCombineOutReverseU;
-        composeFunctions.combineU[PictOpAtop] = mmxCombineAtopU;
-        composeFunctions.combineU[PictOpAtopReverse] = mmxCombineAtopReverseU;
-        composeFunctions.combineU[PictOpXor] = mmxCombineXorU;
-        composeFunctions.combineU[PictOpAdd] = mmxCombineAddU;
-        composeFunctions.combineU[PictOpSaturate] = mmxCombineSaturateU;
-
-        composeFunctions.combineC[PictOpSrc] = mmxCombineSrcC;
-        composeFunctions.combineC[PictOpOver] = mmxCombineOverC;
-        composeFunctions.combineC[PictOpOverReverse] = mmxCombineOverReverseC;
-        composeFunctions.combineC[PictOpIn] = mmxCombineInC;
-        composeFunctions.combineC[PictOpInReverse] = mmxCombineInReverseC;
-        composeFunctions.combineC[PictOpOut] = mmxCombineOutC;
-        composeFunctions.combineC[PictOpOutReverse] = mmxCombineOutReverseC;
-        composeFunctions.combineC[PictOpAtop] = mmxCombineAtopC;
-        composeFunctions.combineC[PictOpAtopReverse] = mmxCombineAtopReverseC;
-        composeFunctions.combineC[PictOpXor] = mmxCombineXorC;
-        composeFunctions.combineC[PictOpAdd] = mmxCombineAddC;
-
-        composeFunctions.combineMaskU = mmxCombineMaskU;
-    } 
-}
-
-
-/* ------------------ MMX code paths called from fbpict.c ----------------------- */
-
-void
-fbCompositeSolid_nx8888mmx (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;
-    CARD32	*dstLine, *dst;
-    CARD16	w;
-    FbStride	dstStride;
-    __m64	vsrc, vsrca;
-    
-    CHECKPOINT();
-    
-    fbComposeGetSolid(pSrc, src, pDst->format);
-    
-    if (src >> 24 == 0)
-	return;
-    
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-    
-    vsrc = load8888 (src);
-    vsrca = expand_alpha (vsrc);
-    
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	w = width;
-	
-	CHECKPOINT();
-	
-	while (w && (unsigned long)dst & 7)
-	{
-	    *dst = store8888(over(vsrc, vsrca, load8888(*dst)));
-	    
-	    w--;
-	    dst++;
-	}
-	
-	while (w >= 2)
-	{
-	    __m64 vdest;
-	    __m64 dest0, dest1;
-	    
-	    vdest = *(__m64 *)dst;
-	    
-	    dest0 = over(vsrc, vsrca, expand8888(vdest, 0));
-	    dest1 = over(vsrc, vsrca, expand8888(vdest, 1));
-	    
-	    *(__m64 *)dst = pack8888(dest0, dest1);
-	    
-	    dst += 2;
-	    w -= 2;
-	}
-	
-	CHECKPOINT();
-	
-	while (w)
-	{
-	    *dst = store8888(over(vsrc, vsrca, load8888(*dst)));
-	    
-	    w--;
-	    dst++;
-	}
-    }
-    
-    _mm_empty();
-}
-
-void
-fbCompositeSolid_nx0565mmx (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;
-    CARD16	*dstLine, *dst;
-    CARD16	w;
-    FbStride	dstStride;
-    __m64	vsrc, vsrca;
-    
-    CHECKPOINT();
-    
-    fbComposeGetSolid(pSrc, src, pDst->format);
-    
-    if (src >> 24 == 0)
-	return;
-    
-    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
-    
-    vsrc = load8888 (src);
-    vsrca = expand_alpha (vsrc);
-    
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	w = width;
-	
-	CHECKPOINT();
-	
-	while (w && (unsigned long)dst & 7)
-	{
-	    ullong d = *dst;
-	    __m64 vdest = expand565 ((__m64)d, 0);
-	    vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0);
-	    *dst = (ullong)vdest;
-	    
-	    w--;
-	    dst++;
-	}
-	
-	while (w >= 4)
-	{
-	    __m64 vdest;
-	    
-	    vdest = *(__m64 *)dst;
-	    
-	    vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 0)), vdest, 0);
-	    vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 1)), vdest, 1);
-	    vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 2)), vdest, 2);
-	    vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 3)), vdest, 3);
-	    
-	    *(__m64 *)dst = vdest;
-	    
-	    dst += 4;
-	    w -= 4;
-	}
-	
-	CHECKPOINT();
-	
-	while (w)
-	{
-	    ullong d = *dst;
-	    __m64 vdest = expand565 ((__m64)d, 0);
-	    vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0);
-	    *dst = (ullong)vdest;
-	    
-	    w--;
-	    dst++;
-	}
-    }
-    
-    _mm_empty();
-}
-
-void
-fbCompositeSolidMask_nx8888x8888Cmmx (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, srca;
-    CARD32	*dstLine;
-    CARD32	*maskLine;
-    FbStride	dstStride, maskStride;
-    __m64	vsrc, vsrca;
-    
-    CHECKPOINT();
-    
-    fbComposeGetSolid(pSrc, src, pDst->format);
-    
-    srca = src >> 24;
-    if (srca == 0)
-	return;
-    
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-    fbComposeGetStart (pMask, xMask, yMask, CARD32, maskStride, maskLine, 1);
-    
-    vsrc = load8888(src);
-    vsrca = expand_alpha(vsrc);
-    
-    while (height--)
-    {
-	int twidth = width;
-	CARD32 *p = (CARD32 *)maskLine;
-	CARD32 *q = (CARD32 *)dstLine;
-	
-	while (twidth && (unsigned long)q & 7)
-	{
-	    CARD32 m = *(CARD32 *)p;
-	    
-	    if (m)
-	    {
-		__m64 vdest = load8888(*q);
-		vdest = in_over(vsrc, vsrca, load8888(m), vdest);
-		*q = store8888(vdest);
-	    }
-	    
-	    twidth--;
-	    p++;
-	    q++;
-	}
-	
-	while (twidth >= 2)
-	{
-	    CARD32 m0, m1;
-	    m0 = *p;
-	    m1 = *(p + 1);
-	    
-	    if (m0 | m1)
-	    {
-		__m64 dest0, dest1;
-		__m64 vdest = *(__m64 *)q;
-		
-		dest0 = in_over(vsrc, vsrca, load8888(m0),
-				expand8888 (vdest, 0));
-		dest1 = in_over(vsrc, vsrca, load8888(m1),
-				expand8888 (vdest, 1));
-		
-		*(__m64 *)q = pack8888(dest0, dest1);
-	    }
-	    
-	    p += 2;
-	    q += 2;
-	    twidth -= 2;
-	}
-	
-	while (twidth)
-	{
-	    CARD32 m = *(CARD32 *)p;
-	    
-	    if (m)
-	    {
-		__m64 vdest = load8888(*q);
-		vdest = in_over(vsrc, vsrca, load8888(m), vdest);
-		*q = store8888(vdest);
-	    }
-	    
-	    twidth--;
-	    p++;
-	    q++;
-	}
-	
-	dstLine += dstStride;
-	maskLine += maskStride;
-    }
-    
-    _mm_empty();
-}
-
-void
-fbCompositeSrc_8888x8x8888mmx (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	*dstLine, *dst;
-    CARD32	*srcLine, *src;
-    CARD8	*maskLine;
-    CARD32	mask;
-    __m64	vmask;
-    FbStride	dstStride, srcStride, maskStride;
-    CARD16	w;
-    __m64  srca;
-    
-    CHECKPOINT();
-    
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
-    fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
-
-    mask = *maskLine << 24 | *maskLine << 16 | *maskLine << 8 | *maskLine;
-    vmask = load8888 (mask);
-    srca = MC(4x00ff);
-    
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-
-	while (w && (unsigned long)dst & 7)
-	{
-	    __m64 s = load8888 (*src);
-	    __m64 d = load8888 (*dst);
-	    
-	    *dst = store8888 (in_over (s, srca, vmask, d));
-	    
-	    w--;
-	    dst++;
-	    src++;
-	}
-
-	while (w >= 16)
-	{
-	    __m64 vd0 = *(__m64 *)(dst + 0);
-	    __m64 vd1 = *(__m64 *)(dst + 2);
-	    __m64 vd2 = *(__m64 *)(dst + 4);
-	    __m64 vd3 = *(__m64 *)(dst + 6);
-	    __m64 vd4 = *(__m64 *)(dst + 8);
-	    __m64 vd5 = *(__m64 *)(dst + 10);
-	    __m64 vd6 = *(__m64 *)(dst + 12);
-	    __m64 vd7 = *(__m64 *)(dst + 14);
-
-	    __m64 vs0 = *(__m64 *)(src + 0);
-	    __m64 vs1 = *(__m64 *)(src + 2);
-	    __m64 vs2 = *(__m64 *)(src + 4);
-	    __m64 vs3 = *(__m64 *)(src + 6);
-	    __m64 vs4 = *(__m64 *)(src + 8);
-	    __m64 vs5 = *(__m64 *)(src + 10);
-	    __m64 vs6 = *(__m64 *)(src + 12);
-	    __m64 vs7 = *(__m64 *)(src + 14);
-
-	    vd0 = (__m64)pack8888 (
-		in_over (expand8888 (vs0, 0), srca, vmask, expand8888 (vd0, 0)),
-		in_over (expand8888 (vs0, 1), srca, vmask, expand8888 (vd0, 1)));
-	
-	    vd1 = (__m64)pack8888 (
-		in_over (expand8888 (vs1, 0), srca, vmask, expand8888 (vd1, 0)),
-		in_over (expand8888 (vs1, 1), srca, vmask, expand8888 (vd1, 1)));
-	
-	    vd2 = (__m64)pack8888 (
-		in_over (expand8888 (vs2, 0), srca, vmask, expand8888 (vd2, 0)),
-		in_over (expand8888 (vs2, 1), srca, vmask, expand8888 (vd2, 1)));
-	
-	    vd3 = (__m64)pack8888 (
-		in_over (expand8888 (vs3, 0), srca, vmask, expand8888 (vd3, 0)),
-		in_over (expand8888 (vs3, 1), srca, vmask, expand8888 (vd3, 1)));
-	
-	    vd4 = (__m64)pack8888 (
-		in_over (expand8888 (vs4, 0), srca, vmask, expand8888 (vd4, 0)),
-		in_over (expand8888 (vs4, 1), srca, vmask, expand8888 (vd4, 1)));
-	
-	    vd5 = (__m64)pack8888 (
-		in_over (expand8888 (vs5, 0), srca, vmask, expand8888 (vd5, 0)),
-		in_over (expand8888 (vs5, 1), srca, vmask, expand8888 (vd5, 1)));
-	
-	    vd6 = (__m64)pack8888 (
-		in_over (expand8888 (vs6, 0), srca, vmask, expand8888 (vd6, 0)),
-		in_over (expand8888 (vs6, 1), srca, vmask, expand8888 (vd6, 1)));
-	
-	    vd7 = (__m64)pack8888 (
-		in_over (expand8888 (vs7, 0), srca, vmask, expand8888 (vd7, 0)),
-		in_over (expand8888 (vs7, 1), srca, vmask, expand8888 (vd7, 1)));
-
-    	    *(__m64 *)(dst + 0) = vd0;
-	    *(__m64 *)(dst + 2) = vd1;
-	    *(__m64 *)(dst + 4) = vd2;
-	    *(__m64 *)(dst + 6) = vd3;
-	    *(__m64 *)(dst + 8) = vd4;
-	    *(__m64 *)(dst + 10) = vd5;
-	    *(__m64 *)(dst + 12) = vd6;
-	    *(__m64 *)(dst + 14) = vd7;
-	
-	    w -= 16;
-	    dst += 16;
-	    src += 16;
-	}
-	
-	while (w)
-	{
-	    __m64 s = load8888 (*src);
-	    __m64 d = load8888 (*dst);
-	    
-	    *dst = store8888 (in_over (s, srca, vmask, d));
-	    
-	    w--;
-	    dst++;
-	    src++;
-	}
-    }
-
-    _mm_empty(); 
-}
-
-void
-fbCompositeSrc_8888x8888mmx (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	*dstLine, *dst;
-    CARD32	*srcLine, *src;
-    FbStride	dstStride, srcStride;
-    CARD16	w;
-    __m64  srca;
-    
-    CHECKPOINT();
-    
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
-
-    srca = MC (4x00ff);
-    
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-
-	while (w && (unsigned long)dst & 7)
-	{
-	    __m64 s = load8888 (*src);
-	    __m64 d = load8888 (*dst);
-	    
-	    *dst = store8888 (over (s, expand_alpha (s), d));
-	    
-	    w--;
-	    dst++;
-	    src++;
-	}
-
-	while (w >= 2)
-	{
-	    __m64 vd = *(__m64 *)(dst + 0);
-	    __m64 vs = *(__m64 *)(src + 0);
-	    __m64 vs0 = expand8888 (vs, 0);
-	    __m64 vs1 = expand8888 (vs, 1);
-
-	    *(__m64 *)dst = (__m64)pack8888 (
-		over (vs0, expand_alpha (vs0), expand8888 (vd, 0)),
-		over (vs1, expand_alpha (vs1), expand8888 (vd, 1)));
-	    
-	    w -= 2;
-	    dst += 2;
-	    src += 2;
-	}
-	
-	while (w)
-	{
-	    __m64 s = load8888 (*src);
-	    __m64 d = load8888 (*dst);
-	    
-	    *dst = store8888 (over (s, expand_alpha (s), d));
-	    
-	    w--;
-	    dst++;
-	    src++;
-	}
-    }
-
-    _mm_empty(); 
-}
-
-void
-fbCompositeSolidMask_nx8x8888mmx (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, srca;
-    CARD32	*dstLine, *dst;
-    CARD8	*maskLine, *mask;
-    FbStride	dstStride, maskStride;
-    CARD16	w;
-    __m64	vsrc, vsrca;
-    ullong	srcsrc;
-    
-    CHECKPOINT();
-    
-    fbComposeGetSolid(pSrc, src, pDst->format);
-    
-    srca = src >> 24;
-    if (srca == 0)
-	return;
-    
-    srcsrc = (unsigned long long)src << 32 | src;
-    
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-    fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
-    
-    vsrc = load8888 (src);
-    vsrca = expand_alpha (vsrc);
-    
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	mask = maskLine;
-	maskLine += maskStride;
-	w = width;
-	
-	CHECKPOINT();
-	
-	while (w && (unsigned long)dst & 7)
-	{
-	    ullong m = *mask;
-	    
-	    if (m)
-	    {
-		__m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), load8888(*dst));
-		*dst = store8888(vdest);
-	    }
-	    
-	    w--;
-	    mask++;
-	    dst++;
-	}
-	
-	CHECKPOINT();
-	
-	while (w >= 2)
-	{
-	    ullong m0, m1;
-	    m0 = *mask;
-	    m1 = *(mask + 1);
-	    
-	    if (srca == 0xff && (m0 & m1) == 0xff)
-	    {
-		*(unsigned long long *)dst = srcsrc;
-	    }
-	    else if (m0 | m1)
-	    {
-		__m64 vdest;
-		__m64 dest0, dest1;
-		
-		vdest = *(__m64 *)dst;
-		
-		dest0 = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m0), expand8888(vdest, 0));
-		dest1 = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m1), expand8888(vdest, 1));
-		
-		*(__m64 *)dst = pack8888(dest0, dest1);
-	    }
-	    
-	    mask += 2;
-	    dst += 2;
-	    w -= 2;
-	}
-	
-	CHECKPOINT();
-	
-	while (w)
-	{
-	    ullong m = *mask;
-	    
-	    if (m)
-	    {
-		__m64 vdest = load8888(*dst);
-		vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), vdest);
-		*dst = store8888(vdest);
-	    }
-	    
-	    w--;
-	    mask++;
-	    dst++;
-	}
-    }
-    
-    _mm_empty();
-}
-
-
-void
-fbCompositeSolidMask_nx8x0565mmx (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, srca;
-    CARD16	*dstLine, *dst;
-    CARD8	*maskLine, *mask;
-    FbStride	dstStride, maskStride;
-    CARD16	w;
-    __m64	vsrc, vsrca;
-    unsigned long long srcsrcsrcsrc, src16;
-    
-    CHECKPOINT();
-    
-    fbComposeGetSolid(pSrc, src, pDst->format);
-    
-    srca = src >> 24;
-    if (srca == 0)
-	return;
-    
-    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
-    fbComposeGetStart (pMask, xMask, yMask, CARD8, maskStride, maskLine, 1);
-    
-    vsrc = load8888 (src);
-    vsrca = expand_alpha (vsrc);
-    
-    src16 = (ullong)pack565(vsrc, _mm_setzero_si64(), 0);
-    
-    srcsrcsrcsrc = (ullong)src16 << 48 | (ullong)src16 << 32 |
-	(ullong)src16 << 16 | (ullong)src16;
-    
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	mask = maskLine;
-	maskLine += maskStride;
-	w = width;
-	
-	CHECKPOINT();
-	
-	while (w && (unsigned long)dst & 7)
-	{
-	    ullong m = *mask;
-	    
-	    if (m)
-	    {
-		ullong d = *dst;
-		__m64 vd = (__m64)d;
-		__m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), expand565(vd, 0));
-		*dst = (ullong)pack565(vdest, _mm_setzero_si64(), 0);
-	    }
-	    
-	    w--;
-	    mask++;
-	    dst++;
-	}
-	
-	CHECKPOINT();
-	
-	while (w >= 4)
-	{
-	    ullong m0, m1, m2, m3;
-	    m0 = *mask;
-	    m1 = *(mask + 1);
-	    m2 = *(mask + 2);
-	    m3 = *(mask + 3);
-	    
-	    if (srca == 0xff && (m0 & m1 & m2 & m3) == 0xff)
-	    {
-		*(unsigned long long *)dst = srcsrcsrcsrc;
-	    }
-	    else if (m0 | m1 | m2 | m3)
-	    {
-		__m64 vdest;
-		__m64 vm0, vm1, vm2, vm3;
-		
-		vdest = *(__m64 *)dst;
-		
-		vm0 = (__m64)m0;
-		vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm0), expand565(vdest, 0)), vdest, 0);
-		vm1 = (__m64)m1;
-		vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm1), expand565(vdest, 1)), vdest, 1);
-		vm2 = (__m64)m2;
-		vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm2), expand565(vdest, 2)), vdest, 2);
-		vm3 = (__m64)m3;
-		vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm3), expand565(vdest, 3)), vdest, 3);
-		
-		*(__m64 *)dst = vdest;
-	    }
-	    
-	    w -= 4;
-	    mask += 4;
-	    dst += 4;
-	}
-	
-	CHECKPOINT();
-	
-	while (w)
-	{
-	    ullong m = *mask;
-	    
-	    if (m)
-	    {
-		ullong d = *dst;
-		__m64 vd = (__m64)d;
-		__m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev ((__m64)m), expand565(vd, 0));
-		*dst = (ullong)pack565(vdest, _mm_setzero_si64(), 0);
-	    }
-	    
-	    w--;
-	    mask++;
-	    dst++;
-	}
-    }
-    
-    _mm_empty();
-}
-
-void
-fbCompositeSrc_8888RevNPx0565mmx (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;
-    CARD32	*srcLine, *src;
-    FbStride	dstStride, srcStride;
-    CARD16	w;
-    
-    CHECKPOINT();
-    
-    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
-    
-    assert (pSrc->pDrawable == pMask->pDrawable);
-    
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-	
-	CHECKPOINT();
-	
-	while (w && (unsigned long)dst & 7)
-	{
-	    __m64 vsrc = load8888 (*src);
-	    ullong d = *dst;
-	    __m64 vdest = expand565 ((__m64)d, 0);
-	    
-	    vdest = pack565(over_rev_non_pre(vsrc, vdest), vdest, 0);
-	    
-	    *dst = (ullong)vdest;
-	    
-	    w--;
-	    dst++;
-	    src++;
-	}
-	
-	CHECKPOINT();
-	
-	while (w >= 4)
-	{
-	    CARD32 s0, s1, s2, s3;
-	    unsigned char a0, a1, a2, a3;
-	    
-	    s0 = *src;
-	    s1 = *(src + 1);
-	    s2 = *(src + 2);
-	    s3 = *(src + 3);
-	    
-	    a0 = (s0 >> 24);
-	    a1 = (s1 >> 24);
-	    a2 = (s2 >> 24);
-	    a3 = (s3 >> 24);
-	    
-	    if ((a0 & a1 & a2 & a3) == 0xFF)
-	    {
-		__m64 vdest;
-		vdest = pack565(invert_colors(load8888(s0)), _mm_setzero_si64(), 0);
-		vdest = pack565(invert_colors(load8888(s1)), vdest, 1);
-		vdest = pack565(invert_colors(load8888(s2)), vdest, 2);
-		vdest = pack565(invert_colors(load8888(s3)), vdest, 3);
-		
-		*(__m64 *)dst = vdest;
-	    }
-	    else if (a0 | a1 | a2 | a3)
-	    {
-		__m64 vdest = *(__m64 *)dst;
-		
-		vdest = pack565(over_rev_non_pre(load8888(s0), expand565(vdest, 0)), vdest, 0);
-	        vdest = pack565(over_rev_non_pre(load8888(s1), expand565(vdest, 1)), vdest, 1);
-		vdest = pack565(over_rev_non_pre(load8888(s2), expand565(vdest, 2)), vdest, 2);
-		vdest = pack565(over_rev_non_pre(load8888(s3), expand565(vdest, 3)), vdest, 3);
-		
-		*(__m64 *)dst = vdest;
-	    }
-	    
-	    w -= 4;
-	    dst += 4;
-	    src += 4;
-	}
-	
-	CHECKPOINT();
-	
-	while (w)
-	{
-	    __m64 vsrc = load8888 (*src);
-	    ullong d = *dst;
-	    __m64 vdest = expand565 ((__m64)d, 0);
-	    
-	    vdest = pack565(over_rev_non_pre(vsrc, vdest), vdest, 0);
-	    
-	    *dst = (ullong)vdest;
-	    
-	    w--;
-	    dst++;
-	    src++;
-	}
-    }
-    
-    _mm_empty();
-}
-
-/* "8888RevNP" is GdkPixbuf's format: ABGR, non premultiplied */
-
-void
-fbCompositeSrc_8888RevNPx8888mmx (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	*dstLine, *dst;
-    CARD32	*srcLine, *src;
-    FbStride	dstStride, srcStride;
-    CARD16	w;
-    
-    CHECKPOINT();
-    
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
-    
-    assert (pSrc->pDrawable == pMask->pDrawable);
-    
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-	
-	while (w && (unsigned long)dst & 7)
-	{
-	    __m64 s = load8888 (*src);
-	    __m64 d = load8888 (*dst);
-	    
-	    *dst = store8888 (over_rev_non_pre (s, d));
-	    
-	    w--;
-	    dst++;
-	    src++;
-	}
-	
-	while (w >= 2)
-	{
-	    ullong s0, s1;
-	    unsigned char a0, a1;
-	    __m64 d0, d1;
-	    
-	    s0 = *src;
-	    s1 = *(src + 1);
-	    
-	    a0 = (s0 >> 24);
-	    a1 = (s1 >> 24);
-	    
-	    if ((a0 & a1) == 0xFF)
-	    {
-		d0 = invert_colors(load8888(s0));
-		d1 = invert_colors(load8888(s1));
-		
-		*(__m64 *)dst = pack8888 (d0, d1);
-	    }
-	    else if (a0 | a1)
-	    {
-		__m64 vdest = *(__m64 *)dst;
-		
-		d0 = over_rev_non_pre (load8888(s0), expand8888 (vdest, 0));
-		d1 = over_rev_non_pre (load8888(s1), expand8888 (vdest, 1));
-		
-		*(__m64 *)dst = pack8888 (d0, d1);
-	    }
-	    
-	    w -= 2;
-	    dst += 2;
-	    src += 2;
-	}
-	
-	while (w)
-	{
-	    __m64 s = load8888 (*src);
-	    __m64 d = load8888 (*dst);
-	    
-	    *dst = store8888 (over_rev_non_pre (s, d));
-	    
-	    w--;
-	    dst++;
-	    src++;
-	}
-    }
-    
-    _mm_empty();
-}
-
-void
-fbCompositeSolidMask_nx8888x0565Cmmx (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, srca;
-    CARD16	*dstLine;
-    CARD32	*maskLine;
-    FbStride	dstStride, maskStride;
-    __m64  vsrc, vsrca;
-    
-    CHECKPOINT();
-    
-    fbComposeGetSolid(pSrc, src, pDst->format);
-    
-    srca = src >> 24;
-    if (srca == 0)
-	return;
-    
-    fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
-    fbComposeGetStart (pMask, xMask, yMask, CARD32, maskStride, maskLine, 1);
-    
-    vsrc = load8888 (src);
-    vsrca = expand_alpha (vsrc);
-    
-    while (height--)
-    {
-	int twidth = width;
-	CARD32 *p = (CARD32 *)maskLine;
-	CARD16 *q = (CARD16 *)dstLine;
-	
-	while (twidth && ((unsigned long)q & 7))
-	{
-	    CARD32 m = *(CARD32 *)p;
-	    
-	    if (m)
-	    {
-		ullong d = *q;
-		__m64 vdest = expand565 ((__m64)d, 0);
-		vdest = pack565 (in_over (vsrc, vsrca, load8888 (m), vdest), vdest, 0);
-		*q = (ullong)vdest;
-	    }
-	    
-	    twidth--;
-	    p++;
-	    q++;
-	}
-	
-	while (twidth >= 4)
-	{
-	    CARD32 m0, m1, m2, m3;
-	    
-	    m0 = *p;
-	    m1 = *(p + 1);
-	    m2 = *(p + 2);
-	    m3 = *(p + 3);
-	    
-	    if ((m0 | m1 | m2 | m3))
-	    {
-		__m64 vdest = *(__m64 *)q;
-		
-		vdest = pack565(in_over(vsrc, vsrca, load8888(m0), expand565(vdest, 0)), vdest, 0);
-		vdest = pack565(in_over(vsrc, vsrca, load8888(m1), expand565(vdest, 1)), vdest, 1);
-		vdest = pack565(in_over(vsrc, vsrca, load8888(m2), expand565(vdest, 2)), vdest, 2);
-		vdest = pack565(in_over(vsrc, vsrca, load8888(m3), expand565(vdest, 3)), vdest, 3);
-		
-		*(__m64 *)q = vdest;
-	    }
-	    twidth -= 4;
-	    p += 4;
-	    q += 4;
-	}
-	
-	while (twidth)
-	{
-	    CARD32 m;
-	    
-	    m = *(CARD32 *)p;
-	    if (m)
-	    {
-		ullong d = *q;
-		__m64 vdest = expand565((__m64)d, 0);
-		vdest = pack565 (in_over(vsrc, vsrca, load8888(m), vdest), vdest, 0);
-		*q = (ullong)vdest;
-	    }
-	    
-	    twidth--;
-	    p++;
-	    q++;
-	}
-	
-	maskLine += maskStride;
-	dstLine += dstStride;
-    }
-    
-    _mm_empty ();
-}
-
-void
-fbCompositeSrcAdd_8000x8000mmx (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;
-    CARD8	*srcLine, *src;
-    FbStride	dstStride, srcStride;
-    CARD16	w;
-    CARD8	s, d;
-    CARD16	t;
-    
-    CHECKPOINT();
-    
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD8, srcStride, srcLine, 1);
-    fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 1);
-    
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-	
-	while (w && (unsigned long)dst & 7)
-	{
-	    s = *src;
-	    d = *dst;
-	    t = d + s;
-	    s = t | (0 - (t >> 8));
-	    *dst = s;
-	    
-	    dst++;
-	    src++;
-	    w--;
-	}
-	
-	while (w >= 8)
-	{
-	    *(__m64*)dst = _mm_adds_pu8(*(__m64*)src, *(__m64*)dst);
-	    dst += 8;
-	    src += 8;
-	    w -= 8;
-	}
-	
-	while (w)
-	{
-	    s = *src;
-	    d = *dst;
-	    t = d + s;
-	    s = t | (0 - (t >> 8));
-	    *dst = s;
-	    
-	    dst++;
-	    src++;
-	    w--;
-	}
-    }
-    
-    _mm_empty();
-}
-
-void
-fbCompositeSrcAdd_8888x8888mmx (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	*dstLine, *dst;
-    CARD32	*srcLine, *src;
-    FbStride	dstStride, srcStride;
-    CARD16	w;
-    
-    CHECKPOINT();
-    
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-    
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-	
-	while (w && (unsigned long)dst & 7)
-	{
-	    *dst = _mm_cvtsi64_si32(_mm_adds_pu8(_mm_cvtsi32_si64(*src),
-						 _mm_cvtsi32_si64(*dst)));
-	    dst++;
-	    src++;
-	    w--;
-	}
-	
-	while (w >= 2)
-	{
-	    *(ullong*)dst = (ullong) _mm_adds_pu8(*(__m64*)src, *(__m64*)dst);
-	    dst += 2;
-	    src += 2;
-	    w -= 2;
-	}
-	
-	if (w)
-	{
-	    *dst = _mm_cvtsi64_si32(_mm_adds_pu8(_mm_cvtsi32_si64(*src),
-						 _mm_cvtsi32_si64(*dst)));
-	    
-	}
-    }
-    
-    _mm_empty();
-}
-
-Bool
-fbSolidFillmmx (DrawablePtr	pDraw,
-		int		x,
-		int		y,
-		int		width,
-		int		height,
-		FbBits		xor)
-{ 
-    FbStride	stride;
-    int		bpp;
-    ullong	fill;
-    __m64	vfill;
-    CARD32	byte_width;
-    CARD8	*byte_line;
-    FbBits      *bits;
-    int		xoff, yoff;
-    __m64	v1, v2, v3, v4, v5, v6, v7;
-    
-    CHECKPOINT();
-    
-    fbGetDrawable(pDraw, bits, stride, bpp, xoff, yoff);
-    
-    if (bpp == 16 && (xor >> 16 != (xor & 0xffff)))
-	return FALSE;
-    
-    if (bpp != 16 && bpp != 32)
-	return FALSE;
-    
-    if (bpp == 16)
-    {
-	stride = stride * sizeof (FbBits) / 2;
-	byte_line = (CARD8 *)(((CARD16 *)bits) + stride * (y + yoff) + (x + xoff));
-	byte_width = 2 * width;
-	stride *= 2;
-    }
-    else
-    {
-	stride = stride * sizeof (FbBits) / 4;
-	byte_line = (CARD8 *)(((CARD32 *)bits) + stride * (y + yoff) + (x + xoff));
-	byte_width = 4 * width;
-	stride *= 4;
-    }
-    
-    fill = ((ullong)xor << 32) | xor;
-    vfill = (__m64)fill;
-    
-    __asm__ (
-	"movq		%7,	%0\n"
-	"movq		%7,	%1\n"
-	"movq		%7,	%2\n"
-	"movq		%7,	%3\n"
-	"movq		%7,	%4\n"
-	"movq		%7,	%5\n"
-	"movq		%7,	%6\n"
-	: "=y" (v1), "=y" (v2), "=y" (v3),
-	  "=y" (v4), "=y" (v5), "=y" (v6), "=y" (v7)
-	: "y" (vfill));
-    
-    while (height--)
-    {
-	int w;
-	CARD8 *d = byte_line;
-	byte_line += stride;
-	w = byte_width;
-	
-	while (w >= 2 && ((unsigned long)d & 3))
-	{
-	    *(CARD16 *)d = xor;
-	    w -= 2;
-	    d += 2;
-	}
-	
-	while (w >= 4 && ((unsigned long)d & 7))
-	{
-	    *(CARD32 *)d = xor;
-	    
-	    w -= 4;
-	    d += 4;
-	}
-
-	while (w >= 64)
-	{
-	    __asm__ (
-		"movq	%1,	  (%0)\n"
-		"movq	%2,	 8(%0)\n"
-		"movq	%3,	16(%0)\n"
-		"movq	%4,	24(%0)\n"
-		"movq	%5,	32(%0)\n"
-		"movq	%6,	40(%0)\n"
-		"movq	%7,	48(%0)\n"
-		"movq	%8,	56(%0)\n"
-		:
-		: "r" (d),
-		  "y" (vfill), "y" (v1), "y" (v2), "y" (v3),
-		  "y" (v4), "y" (v5), "y" (v6), "y" (v7)
-		: "memory");
-	    
-	    w -= 64;
-	    d += 64;
-	}
-	
-	while (w >= 4)
-	{
-	    *(CARD32 *)d = xor;
-	    
-	    w -= 4;
-	    d += 4;
-	}
-	if (w >= 2)
-	{
-	    *(CARD16 *)d = xor;
-	    w -= 2;
-	    d += 2;
-	}
-    }
-    
-    _mm_empty();
-    return TRUE;
-}
-
-Bool
-fbCopyAreammx (DrawablePtr	pSrc,
-	       DrawablePtr	pDst,
-	       int		src_x,
-	       int		src_y,
-	       int		dst_x,
-	       int		dst_y,
-	       int		width,
-	       int		height)
-{
-    FbBits *	src_bits;
-    FbStride	src_stride;
-    int		src_bpp;
-    int		src_xoff;
-    int		src_yoff;
-
-    FbBits *	dst_bits;
-    FbStride	dst_stride;
-    int		dst_bpp;
-    int		dst_xoff;
-    int		dst_yoff;
-
-    CARD8 *	src_bytes;
-    CARD8 *	dst_bytes;
-    int		byte_width;
-    
-    fbGetDrawable(pSrc, src_bits, src_stride, src_bpp, src_xoff, src_yoff);
-    fbGetDrawable(pDst, dst_bits, dst_stride, dst_bpp, dst_xoff, dst_yoff);
-
-    if (src_bpp != dst_bpp)
-	return FALSE;
-    
-    if (src_bpp == 16)
-    {
-	src_stride = src_stride * sizeof (FbBits) / 2;
-	dst_stride = dst_stride * sizeof (FbBits) / 2;
-	src_bytes = (CARD8 *)(((CARD16 *)src_bits) + src_stride * (src_y + src_yoff) + (src_x + src_xoff));
-	dst_bytes = (CARD8 *)(((CARD16 *)dst_bits) + dst_stride * (dst_y + dst_yoff) + (dst_x + dst_xoff));
-	byte_width = 2 * width;
-	src_stride *= 2;
-	dst_stride *= 2;
-    } else if (src_bpp == 32) {
-	src_stride = src_stride * sizeof (FbBits) / 4;
-	dst_stride = dst_stride * sizeof (FbBits) / 4;
-	src_bytes = (CARD8 *)(((CARD32 *)src_bits) + src_stride * (src_y + src_yoff) + (src_x + src_xoff));
-	dst_bytes = (CARD8 *)(((CARD32 *)dst_bits) + dst_stride * (dst_y + dst_yoff) + (dst_x + dst_xoff));
-	byte_width = 4 * width;
-	src_stride *= 4;
-	dst_stride *= 4;
-    } else {
-	return FALSE;
-    }
-
-    while (height--)
-    {
-	int w;
-	CARD8 *s = src_bytes;
-	CARD8 *d = dst_bytes;
-	src_bytes += src_stride;
-	dst_bytes += dst_stride;
-	w = byte_width;
-	
-	while (w >= 2 && ((unsigned long)d & 3))
-	{
-	    *(CARD16 *)d = *(CARD16 *)s;
-	    w -= 2;
-	    s += 2;
-	    d += 2;
-	}
-	
-	while (w >= 4 && ((unsigned long)d & 7))
-	{
-	    *(CARD32 *)d = *(CARD32 *)s;
-	    
-	    w -= 4;
-	    s += 4;
-	    d += 4;
-	}
-	
-	while (w >= 64)
-	{
-	    __asm__ (
-		"movq	  (%1),	  %%mm0\n"
-		"movq	 8(%1),	  %%mm1\n"
-		"movq	16(%1),	  %%mm2\n"
-		"movq	24(%1),	  %%mm3\n"
-		"movq	32(%1),	  %%mm4\n"
-		"movq	40(%1),	  %%mm5\n"
-		"movq	48(%1),	  %%mm6\n"
-		"movq	56(%1),	  %%mm7\n"
-
-		"movq	%%mm0,	  (%0)\n"
-		"movq	%%mm1,	 8(%0)\n"
-		"movq	%%mm2,	16(%0)\n"
-		"movq	%%mm3,	24(%0)\n"
-		"movq	%%mm4,	32(%0)\n"
-		"movq	%%mm5,	40(%0)\n"
-		"movq	%%mm6,	48(%0)\n"
-		"movq	%%mm7,	56(%0)\n"
-		:
-		: "r" (d), "r" (s)
-		: "memory",
-		  "%mm0", "%mm1", "%mm2", "%mm3",
-		  "%mm4", "%mm5", "%mm6", "%mm7");
-	    
-	    w -= 64;
-	    s += 64;
-	    d += 64;
-	}
-	while (w >= 4)
-	{
-	    *(CARD32 *)d = *(CARD32 *)s;
-
-	    w -= 4;
-	    s += 4;
-	    d += 4;
-	}
-	if (w >= 2)
-	{
-	    *(CARD16 *)d = *(CARD16 *)s;
-	    w -= 2;
-	    s += 2;
-	    d += 2;
-	}
-    }
-    
-    _mm_empty();
-    return TRUE;
-}
-
-void
-fbCompositeCopyAreammx (CARD8		op,
-			PicturePtr	pSrc,
-			PicturePtr	pMask,
-			PicturePtr	pDst,
-			INT16		xSrc,
-			INT16		ySrc,
-			INT16		xMask,
-			INT16		yMask,
-			INT16		xDst,
-			INT16		yDst,
-			CARD16		width,
-			CARD16		height)
-{
-    fbCopyAreammx (pSrc->pDrawable,
-		   pDst->pDrawable,
-		   xSrc, ySrc,
-		   xDst, yDst,
-		   width, height);
-}
-
-
-
-
-#endif /* RENDER */
-#endif /* USE_MMX */
diff --git a/fb/fbmmx.h b/fb/fbmmx.h
deleted file mode 100644
index 34718e3..0000000
--- a/fb/fbmmx.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright © 2004 Red Hat, Inc.
- * Copyright © 2005 Trolltech AS
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Red Hat not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  Red Hat makes no representations about the
- * suitability of this software for any purpose.  It is provided "as is"
- * without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Author:  Søren Sandmann (sandmann at redhat.com)
- *          Lars Knoll (lars at trolltech.com)
- * 
- * Based on work by Owen Taylor
- */
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#ifdef USE_MMX
-
-#if !defined(__amd64__) && !defined(__x86_64__)
-Bool fbHaveMMX(void);
-#else
-#define fbHaveMMX() TRUE
-#endif
-
-#else
-#define fbHaveMMX() FALSE
-#endif
-
-#ifdef USE_MMX
-
-void fbComposeSetupMMX(void);
-
-void fbCompositeSolidMask_nx8888x0565Cmmx (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 fbCompositeSrcAdd_8888x8888mmx (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 fbCompositeSrc_8888x8888mmx (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 fbCompositeSolidMask_nx8888x8888Cmmx (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 fbCompositeSolidMask_nx8x8888mmx (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 fbCompositeSrcAdd_8000x8000mmx (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 fbCompositeSrc_8888RevNPx8888mmx (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 fbCompositeSrc_8888RevNPx0565mmx (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 fbCompositeSolid_nx8888mmx (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 fbCompositeSolid_nx0565mmx (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 fbCompositeSolidMask_nx8x0565mmx (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 fbCompositeSrc_8888x8x8888mmx (CARD8	op,
-				    PicturePtr  pSrc,
-				    PicturePtr  pMask,
-				    PicturePtr  pDst,
-				    INT16	xSrc,
-				    INT16	ySrc,
-				    INT16       xMask,
-				    INT16       yMask,
-				    INT16       xDst,
-				    INT16       yDst,
-				    CARD16      width,
-				    CARD16      height);
-Bool fbCopyAreammx (DrawablePtr	pSrc,
-		    DrawablePtr	pDst,
-		    int		src_x,
-		    int		src_y,
-		    int		dst_x,
-		    int		dst_y,
-		    int		width,
-		    int		height);
-void fbCompositeCopyAreammx (CARD8	op,
-			     PicturePtr	pSrc,
-			     PicturePtr	pMask,
-			     PicturePtr	pDst,
-			     INT16	xSrc,
-			     INT16      ySrc,
-			     INT16      xMask,
-			     INT16      yMask,
-			     INT16      xDst,
-			     INT16      yDst,
-			     CARD16     width,
-			     CARD16     height);
-Bool fbSolidFillmmx (DrawablePtr	pDraw,
-		     int		x,
-		     int		y,
-		     int		width,
-		     int		height,
-		     FbBits		xor);
-
-#endif /* USE_MMX */
diff --git a/fb/fboverlay.c b/fb/fboverlay.c
index 1e3d756..5d7481e 100644
--- a/fb/fboverlay.c
+++ b/fb/fboverlay.c
@@ -413,11 +413,7 @@ fbOverlayFinishScreenInit(ScreenPtr	pScreen,
 	return FALSE;
     if (! miScreenInit(pScreen, 0, xsize, ysize, dpix, dpiy, 0,
 			depth1, ndepths, depths,
-			defaultVisual, nvisuals, visuals
-#ifdef FB_OLD_MISCREENINIT
-		       , (miBSFuncPtr) 0
-#endif
-		       ))
+			defaultVisual, nvisuals, visuals))
 	return FALSE;
     /* MI thinks there's no frame buffer */
 #ifdef MITSHM
diff --git a/fb/fbpict.c b/fb/fbpict.c
index 5f7289a..85b5171 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -1,6 +1,7 @@
 /*
  *
  * Copyright © 2000 SuSE, Inc.
+ * Copyright © 2007 Red Hat, Inc.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -35,924 +36,36 @@
 #include "picturestr.h"
 #include "mipict.h"
 #include "fbpict.h"
-#include "fbmmx.h"
 
-CARD32
-fbOver (CARD32 x, CARD32 y)
-{
-    CARD16  a = ~x >> 24;
-    CARD16  t;
-    CARD32  m,n,o,p;
-
-    m = FbOverU(x,y,0,a,t);
-    n = FbOverU(x,y,8,a,t);
-    o = FbOverU(x,y,16,a,t);
-    p = FbOverU(x,y,24,a,t);
-    return m|n|o|p;
-}
-
-CARD32
-fbOver24 (CARD32 x, CARD32 y)
-{
-    CARD16  a = ~x >> 24;
-    CARD16  t;
-    CARD32  m,n,o;
-
-    m = FbOverU(x,y,0,a,t);
-    n = FbOverU(x,y,8,a,t);
-    o = FbOverU(x,y,16,a,t);
-    return m|n|o;
-}
-
-CARD32
-fbIn (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 = FbInU(x,24,a,t);
-    return m|n|o|p;
-}
-
-/*
- * Naming convention:
- *
- *  opSRCxMASKxDST
- */
-
-void
-fbCompositeSolidMask_nx8x8888 (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, srca;
-    CARD32	*dstLine, *dst, d, dstMask;
-    CARD8	*maskLine, *mask, m;
-    FbStride	dstStride, maskStride;
-    CARD16	w;
-
-    fbComposeGetSolid(pSrc, src, pDst->format);
-
-    dstMask = FbFullMask (pDst->pDrawable->depth);
-    srca = src >> 24;
-    if (src == 0)
-	return;
-
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, 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 = src & dstMask;
-		else
-		    *dst = fbOver (src, *dst) & dstMask;
-	    }
-	    else if (m)
-	    {
-		d = fbIn (src, m);
-		*dst = fbOver (d, *dst) & dstMask;
-	    }
-	    dst++;
-	}
-    }
-}
-
-void
-fbCompositeSolidMask_nx8888x8888C (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, srca;
-    CARD32	*dstLine, *dst, d, dstMask;
-    CARD32	*maskLine, *mask, ma;
-    FbStride	dstStride, maskStride;
-    CARD16	w;
-    CARD32	m, n, o, p;
-
-    fbComposeGetSolid(pSrc, src, pDst->format);
-
-    dstMask = FbFullMask (pDst->pDrawable->depth);
-    srca = src >> 24;
-    if (src == 0)
-	return;
-
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, 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--)
-	{
-	    ma = *mask++;
-	    if (ma == 0xffffffff)
-	    {
-		if (srca == 0xff)
-		    *dst = src & dstMask;
-		else
-		    *dst = fbOver (src, *dst) & dstMask;
-	    }
-	    else if (ma)
-	    {
-		d = *dst;
-#define FbInOverC(src,srca,msk,dst,i,result) { \
-    CARD16  __a = FbGet8(msk,i); \
-    CARD32  __t, __ta; \
-    CARD32  __i; \
-    __t = FbIntMult (FbGet8(src,i), __a,__i); \
-    __ta = (CARD8) ~FbIntMult (srca, __a,__i); \
-    __t = __t + FbIntMult(FbGet8(dst,i),__ta,__i); \
-    __t = (CARD32) (CARD8) (__t | (-(__t >> 8))); \
-    result = __t << (i); \
-}
-		FbInOverC (src, srca, ma, d, 0, m);
-		FbInOverC (src, srca, ma, d, 8, n);
-		FbInOverC (src, srca, ma, d, 16, o);
-		FbInOverC (src, srca, ma, d, 24, p);
-		*dst = m|n|o|p;
-	    }
-	    dst++;
-	}
-    }
-}
-
-void
-fbCompositeSolidMask_nx8x0888 (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, srca;
-    CARD8	*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, 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 = *mask++;
-	    if (m == 0xff)
-	    {
-		if (srca == 0xff)
-		    d = src;
-		else
-		{
-		    d = Fetch24(dst);
-		    d = fbOver24 (src, d);
-		}
-		Store24(dst,d);
-	    }
-	    else if (m)
-	    {
-		d = fbOver24 (fbIn(src,m), Fetch24(dst));
-		Store24(dst,d);
-	    }
-	    dst += 3;
-	}
-    }
-}
-
-void
-fbCompositeSolidMask_nx8x0565 (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, 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 = *mask++;
-	    if (m == 0xff)
-	    {
-		if (srca == 0xff)
-		    d = src;
-		else
-		{
-		    d = *dst;
-		    d = fbOver24 (src, cvt0565to8888(d));
-		}
-		*dst = cvt8888to0565(d);
-	    }
-	    else if (m)
-	    {
-		d = *dst;
-		d = fbOver24 (fbIn(src,m), cvt0565to8888(d));
-		*dst = cvt8888to0565(d);
-	    }
-	    dst++;
-	}
-    }
-}
-
-void
-fbCompositeSolidMask_nx8888x0565C (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, srca;
-    CARD16	src16;
-    CARD16	*dstLine, *dst;
-    CARD32	d;
-    CARD32	*maskLine, *mask, ma;
-    FbStride	dstStride, maskStride;
-    CARD16	w;
-    CARD32	m, n, o;
-
-    fbComposeGetSolid(pSrc, src, pDst->format);
-
-    srca = src >> 24;
-    if (src == 0)
-	return;
-
-    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--)
-	{
-	    ma = *mask++;
-	    if (ma == 0xffffffff)
-	    {
-		if (srca == 0xff)
-		{
-		    *dst = src16;
-		}
-		else
-		{
-		    d = *dst;
-		    d = fbOver24 (src, cvt0565to8888(d));
-		    *dst = cvt8888to0565(d);
-		}
-	    }
-	    else if (ma)
-	    {
-		d = *dst;
-		d = cvt0565to8888(d);
-		FbInOverC (src, srca, ma, d, 0, m);
-		FbInOverC (src, srca, ma, d, 8, n);
-		FbInOverC (src, srca, ma, d, 16, o);
-		d = m|n|o;
-		*dst = cvt8888to0565(d);
-	    }
-	    dst++;
-	}
-    }
-}
-
-void
-fbCompositeSrc_8888x8888 (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	*dstLine, *dst, dstMask;
-    CARD32	*srcLine, *src, s;
-    FbStride	dstStride, srcStride;
-    CARD8	a;
-    CARD16	w;
-
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
-
-    dstMask = FbFullMask (pDst->pDrawable->depth);
-
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-
-	while (w--)
-	{
-	    s = *src++;
-	    a = s >> 24;
-	    if (a == 0xff)
-		*dst = s & dstMask;
-	    else if (a)
-		*dst = fbOver (s, *dst) & dstMask;
-	    dst++;
-	}
-    }
-}
-
-void
-fbCompositeSrc_8888x0888 (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;
-    CARD32	d;
-    CARD32	*srcLine, *src, s;
-    CARD8	a;
-    FbStride	dstStride, srcStride;
-    CARD16	w;
-
-    fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 3);
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
-
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-
-	while (w--)
-	{
-	    s = *src++;
-	    a = s >> 24;
-	    if (a)
-	    {
-		if (a == 0xff)
-		    d = s;
-		else
-		    d = fbOver24 (s, Fetch24(dst));
-		Store24(dst,d);
-	    }
-	    dst += 3;
-	}
-    }
-}
-
-void
-fbCompositeSrc_8888x0565 (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;
-    CARD32	d;
-    CARD32	*srcLine, *src, s;
-    CARD8	a;
-    FbStride	dstStride, srcStride;
-    CARD16	w;
-
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, 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 = *src++;
-	    a = s >> 24;
-	    if (a)
-	    {
-		if (a == 0xff)
-		    d = s;
-		else
-		{
-		    d = *dst;
-		    d = fbOver24 (s, cvt0565to8888(d));
-		}
-		*dst = cvt8888to0565(d);
-	    }
-	    dst++;
-	}
-    }
-}
-
-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--)
-	    *dst++ = *src++;
-    }
-}
-
-void
-fbCompositeSrcAdd_8000x8000 (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;
-    CARD8	*srcLine, *src;
-    FbStride	dstStride, srcStride;
-    CARD16	w;
-    CARD8	s, d;
-    CARD16	t;
-
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD8, srcStride, srcLine, 1);
-    fbComposeGetStart (pDst, xDst, yDst, CARD8, dstStride, dstLine, 1);
-
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-
-	while (w--)
-	{
-	    s = *src++;
-	    if (s)
-	    {
-		if (s != 0xff)
-		{
-		    d = *dst;
-		    t = d + s;
-		    s = t | (0 - (t >> 8));
-		}
-		*dst = s;
-	    }
-	    dst++;
-	}
-    }
-}
-
-void
-fbCompositeSrcAdd_8888x8888 (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	*dstLine, *dst;
-    CARD32	*srcLine, *src;
-    FbStride	dstStride, srcStride;
-    CARD16	w;
-    CARD32	s, d;
-    CARD16	t;
-    CARD32	m,n,o,p;
-
-    fbComposeGetStart (pSrc, xSrc, ySrc, CARD32, srcStride, srcLine, 1);
-    fbComposeGetStart (pDst, xDst, yDst, CARD32, dstStride, dstLine, 1);
-
-    while (height--)
-    {
-	dst = dstLine;
-	dstLine += dstStride;
-	src = srcLine;
-	srcLine += srcStride;
-	w = width;
-
-	while (w--)
-	{
-	    s = *src++;
-	    if (s)
-	    {
-		if (s != 0xffffffff)
-		{
-		    d = *dst;
-		    if (d)
-		    {
-			m = FbAdd(s,d,0,t);
-			n = FbAdd(s,d,8,t);
-			o = FbAdd(s,d,16,t);
-			p = FbAdd(s,d,24,t);
-			s = m|n|o|p;
-		    }
-		}
-		*dst = s;
-	    }
-	    dst++;
-	}
-    }
-}
-
-void
-fbCompositeSrcAdd_1000x1000 (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	*dstBits, *srcBits;
-    FbStride	dstStride, srcStride;
-    int		dstBpp, srcBpp;
-    int		dstXoff, dstYoff;
-    int		srcXoff, srcYoff;
-
-    fbGetDrawable(pSrc->pDrawable, srcBits, srcStride, srcBpp, srcXoff, srcYoff);
-
-    fbGetDrawable(pDst->pDrawable, dstBits, dstStride, dstBpp, dstXoff, dstYoff);
-
-    fbBlt (srcBits + srcStride * (ySrc + srcYoff),
-	   srcStride,
-	   xSrc + srcXoff,
-
-	   dstBits + dstStride * (yDst + dstYoff),
-	   dstStride,
-	   xDst + dstXoff,
-
-	   width,
-	   height,
-
-	   GXor,
-	   FB_ALLONES,
-	   srcBpp,
-
-	   FALSE,
-	   FALSE);
-}
-
-void
-fbCompositeSolidMask_nx1xn (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	*dstBits;
-    FbStip	*maskBits;
-    FbStride	dstStride, maskStride;
-    int		dstBpp, maskBpp;
-    int		dstXoff, dstYoff;
-    int		maskXoff, maskYoff;
-    FbBits	src;
-
-    fbComposeGetSolid(pSrc, src, pDst->format);
-
-    if ((src & 0xff000000) != 0xff000000)
-    {
-	fbCompositeGeneral  (op, pSrc, pMask, pDst,
-			     xSrc, ySrc, xMask, yMask, xDst, yDst,
-			     width, height);
-	return;
-    }
-    fbGetStipDrawable (pMask->pDrawable, maskBits, maskStride, maskBpp, maskXoff, maskYoff);
-    fbGetDrawable (pDst->pDrawable, dstBits, dstStride, dstBpp, dstXoff, dstYoff);
-
-    switch (dstBpp) {
-    case 32:
-	break;
-    case 24:
-	break;
-    case 16:
-	src = cvt8888to0565(src);
-	break;
-    }
-
-    src = fbReplicatePixel (src, dstBpp);
-
-    fbBltOne (maskBits + maskStride * (yMask + maskYoff),
-	      maskStride,
-	      xMask + maskXoff,
-
-	      dstBits + dstStride * (yDst + dstYoff),
-	      dstStride,
-	      (xDst + dstXoff) * dstBpp,
-	      dstBpp,
-
-	      width * dstBpp,
-	      height,
-
-	      0x0,
-	      src,
-	      FB_ALLONES,
-	      0x0);
-}
-
-# define mod(a,b)	((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b))
+#define mod(a,b) ((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b))
 
 void
 fbWalkCompositeRegion (CARD8 op,
-                       PicturePtr pSrc,
-                       PicturePtr pMask,
-                       PicturePtr pDst,
-                       INT16 xSrc,
-                       INT16 ySrc,
-                       INT16 xMask,
-                       INT16 yMask,
-                       INT16 xDst,
-                       INT16 yDst,
-                       CARD16 width,
-                       CARD16 height,
-                       Bool srcRepeat,
-                       Bool maskRepeat,
-                       CompositeFunc compositeRect)
-{
-  RegionRec       region;
-  int             n;
-  BoxPtr          pbox;
-  int             w, h, w_this, h_this;
-  int             x_msk, y_msk, x_src, y_src, x_dst, y_dst;
-    
-  xDst += pDst->pDrawable->x;
-  yDst += pDst->pDrawable->y;
-  if (pSrc->pDrawable)
-    {
-      xSrc += pSrc->pDrawable->x;
-      ySrc += pSrc->pDrawable->y;
-    }
-  if (pMask && pMask->pDrawable)
-    {
-      xMask += pMask->pDrawable->x;
-      yMask += pMask->pDrawable->y;
-    }
-
-  if (!miComputeCompositeRegion (&region, pSrc, pMask, pDst, xSrc, ySrc,
-				 xMask, yMask, xDst, yDst, width, height))
-    return;
-    
-  n = REGION_NUM_RECTS (&region);
-  pbox = REGION_RECTS (&region);
-  while (n--)
-    {
-      h = pbox->y2 - pbox->y1;
-      y_src = pbox->y1 - yDst + ySrc;
-      y_msk = pbox->y1 - yDst + yMask;
-      y_dst = pbox->y1;
-      while (h)
-        {
-	  h_this = h;
-	  w = pbox->x2 - pbox->x1;
-	  x_src = pbox->x1 - xDst + xSrc;
-	  x_msk = pbox->x1 - xDst + xMask;
-	  x_dst = pbox->x1;
-	  if (maskRepeat)
-            {
-	      y_msk = mod (y_msk - pMask->pDrawable->y, pMask->pDrawable->height);
-	      if (h_this > pMask->pDrawable->height - y_msk)
-		h_this = pMask->pDrawable->height - y_msk;
-	      y_msk += pMask->pDrawable->y;
-            }
-	  if (srcRepeat)
-            {
-	      y_src = mod (y_src - pSrc->pDrawable->y, pSrc->pDrawable->height);
-	      if (h_this > pSrc->pDrawable->height - y_src)
-		h_this = pSrc->pDrawable->height - y_src;
-	      y_src += pSrc->pDrawable->y;
-            }
-	  while (w)
-            {
-	      w_this = w;
-	      if (maskRepeat)
-                {
-		  x_msk = mod (x_msk - pMask->pDrawable->x, pMask->pDrawable->width);
-		  if (w_this > pMask->pDrawable->width - x_msk)
-		    w_this = pMask->pDrawable->width - x_msk;
-		  x_msk += pMask->pDrawable->x;
-                }
-	      if (srcRepeat)
-                {
-		  x_src = mod (x_src - pSrc->pDrawable->x, pSrc->pDrawable->width);
-		  if (w_this > pSrc->pDrawable->width - x_src)
-		    w_this = pSrc->pDrawable->width - x_src;
-		  x_src += pSrc->pDrawable->x;
-		}
-	      (*compositeRect) (op, pSrc, pMask, pDst,
-				x_src, y_src, x_msk, y_msk, x_dst, y_dst,
-				w_this, h_this);
-	      w -= w_this;
-	      x_src += w_this;
-	      x_msk += w_this;
-	      x_dst += w_this;
-            }
-	  h -= h_this;
-	  y_src += h_this;
-	  y_msk += h_this;
-	  y_dst += h_this;
-        }
-      pbox++;
-    }
-  REGION_UNINIT (pDst->pDrawable->pScreen, &region);
-}
-
-void
-fbComposite (CARD8      op,
-	     PicturePtr pSrc,
-	     PicturePtr pMask,
-	     PicturePtr pDst,
-	     INT16      xSrc,
-	     INT16      ySrc,
-	     INT16      xMask,
-	     INT16      yMask,
-	     INT16      xDst,
-	     INT16      yDst,
-	     CARD16     width,
-	     CARD16     height)
+		       PicturePtr pSrc,
+		       PicturePtr pMask,
+		       PicturePtr pDst,
+		       INT16 xSrc,
+		       INT16 ySrc,
+		       INT16 xMask,
+		       INT16 yMask,
+		       INT16 xDst,
+		       INT16 yDst,
+		       CARD16 width,
+		       CARD16 height,
+		       Bool srcRepeat,
+		       Bool maskRepeat,
+		       CompositeFunc compositeRect)
 {
     RegionRec	    region;
     int		    n;
     BoxPtr	    pbox;
-    CompositeFunc   func = NULL;
-    Bool	    srcRepeat = pSrc->pDrawable && pSrc->repeat;
-    Bool	    maskRepeat = FALSE;
-    Bool	    srcAlphaMap = pSrc->alphaMap != 0;
-    Bool	    maskAlphaMap = FALSE;
-    Bool	    dstAlphaMap = pDst->alphaMap != 0;
-    int		    x_msk, y_msk, x_src, y_src, x_dst, y_dst;
     int		    w, h, w_this, h_this;
-
-#ifdef USE_MMX
-    static Bool mmx_setup = FALSE;
-    if (!mmx_setup) {
-        fbComposeSetupMMX();
-        mmx_setup = TRUE;
-    }
-#endif
-        
+    int		    x_msk, y_msk, x_src, y_src, x_dst, y_dst;
+    
     xDst += pDst->pDrawable->x;
     yDst += pDst->pDrawable->y;
-    if (pSrc->pDrawable) {
+    if (pSrc->pDrawable)
+    {
         xSrc += pSrc->pDrawable->x;
         ySrc += pSrc->pDrawable->y;
     }
@@ -960,431 +73,12 @@ fbComposite (CARD8      op,
     {
 	xMask += pMask->pDrawable->x;
 	yMask += pMask->pDrawable->y;
-	maskRepeat = pMask->repeat == RepeatNormal;
-	maskAlphaMap = pMask->alphaMap != 0;
     }
 
-    if (pSrc->pDrawable && (!pMask || pMask->pDrawable)
-        && !pSrc->transform && !(pMask && pMask->transform)
-        && !maskAlphaMap && !srcAlphaMap && !dstAlphaMap
-        && (pSrc->filter != PictFilterConvolution)
-        && (!pMask || pMask->filter != PictFilterConvolution))
-    switch (op) {
-    case PictOpSrc:
-#ifdef USE_MMX
-	if (!pMask && pSrc->format == pDst->format &&
-	    pSrc->format != PICT_a8 && pSrc->pDrawable != pDst->pDrawable)
-	{
-	    func = fbCompositeCopyAreammx;
-	}
-#endif
-	break;
-    case PictOpOver:
-	if (pMask)
-	{
-	    if (fbCanGetSolid(pSrc) &&
-		!maskRepeat)
-	    {
-		srcRepeat = FALSE;
-		if (PICT_FORMAT_COLOR(pSrc->format)) {
-		    switch (pMask->format) {
-		    case PICT_a8:
-			switch (pDst->format) {
-			case PICT_r5g6b5:
-			case PICT_b5g6r5:
-#ifdef USE_MMX
-			    if (fbHaveMMX())
-				func = fbCompositeSolidMask_nx8x0565mmx;
-			    else
-#endif
-				func = fbCompositeSolidMask_nx8x0565;
-			    break;
-			case PICT_r8g8b8:
-			case PICT_b8g8r8:
-			    func = fbCompositeSolidMask_nx8x0888;
-			    break;
-			case PICT_a8r8g8b8:
-			case PICT_x8r8g8b8:
-			case PICT_a8b8g8r8:
-			case PICT_x8b8g8r8:
-#ifdef USE_MMX
-			    if (fbHaveMMX())
-				func = fbCompositeSolidMask_nx8x8888mmx;
-			    else
-#endif
-				func = fbCompositeSolidMask_nx8x8888;
-			    break;
-			default:
-			    break;
-			}
-			break;
-		    case PICT_a8r8g8b8:
-			if (pMask->componentAlpha) {
-			    switch (pDst->format) {
-			    case PICT_a8r8g8b8:
-			    case PICT_x8r8g8b8:
-#ifdef USE_MMX
-				if (fbHaveMMX())
-				    func = fbCompositeSolidMask_nx8888x8888Cmmx;
-				else
-#endif
-				    func = fbCompositeSolidMask_nx8888x8888C;
-				break;
-			    case PICT_r5g6b5:
-#ifdef USE_MMX
-				if (fbHaveMMX())
-				    func = fbCompositeSolidMask_nx8888x0565Cmmx;
-				else
-#endif
-				    func = fbCompositeSolidMask_nx8888x0565C;
-				break;
-			    default:
-				break;
-			    }
-			}
-			break;
-		    case PICT_a8b8g8r8:
-			if (pMask->componentAlpha) {
-			    switch (pDst->format) {
-			    case PICT_a8b8g8r8:
-			    case PICT_x8b8g8r8:
-#ifdef USE_MMX
-				if (fbHaveMMX())
-				    func = fbCompositeSolidMask_nx8888x8888Cmmx;
-				else
-#endif
-				    func = fbCompositeSolidMask_nx8888x8888C;
-				break;
-			    case PICT_b5g6r5:
-#ifdef USE_MMX
-				if (fbHaveMMX())
-				    func = fbCompositeSolidMask_nx8888x0565Cmmx;
-				else
-#endif
-				    func = fbCompositeSolidMask_nx8888x0565C;
-				break;
-			    default:
-				break;
-			    }
-			}
-			break;
-		    case PICT_a1:
-			switch (pDst->format) {
-			case PICT_r5g6b5:
-			case PICT_b5g6r5:
-			case PICT_r8g8b8:
-			case PICT_b8g8r8:
-			case PICT_a8r8g8b8:
-			case PICT_x8r8g8b8:
-			case PICT_a8b8g8r8:
-			case PICT_x8b8g8r8:
-			    func = fbCompositeSolidMask_nx1xn;
-			    break;
-			default:
-			    break;
-			}
-			break;
-		    default:
-			break;
-		    }
-		default:
-		    break;
-		}
-	    }
-	    else if (! srcRepeat) /* has mask and non-repeating source */
-	    {
-		if (pSrc->pDrawable == pMask->pDrawable &&
-		    xSrc == xMask && ySrc == yMask &&
-		    !pMask->componentAlpha && !maskRepeat)
-		{
-		    /* source == mask: non-premultiplied data */
-		    switch (pSrc->format) {
-		    case PICT_x8b8g8r8:
-			switch (pMask->format) {
-			case PICT_a8r8g8b8:
-			case PICT_a8b8g8r8:
-			    switch (pDst->format) {
-			    case PICT_a8r8g8b8:
-			    case PICT_x8r8g8b8:
-#ifdef USE_MMX
-				if (fbHaveMMX())
-				    func = fbCompositeSrc_8888RevNPx8888mmx;
-#endif
-				break;
-			    case PICT_r5g6b5:
-#ifdef USE_MMX
-				if (fbHaveMMX())
-				    func = fbCompositeSrc_8888RevNPx0565mmx;
-#endif
-				break;
-			    default:
-				break;
-			    }
-			    break;
-			default:
-			    break;
-			}
-			break;
-		    case PICT_x8r8g8b8:
-			switch (pMask->format) {
-			case PICT_a8r8g8b8:
-			case PICT_a8b8g8r8:
-			    switch (pDst->format) {
-			    case PICT_a8b8g8r8:
-			    case PICT_x8b8g8r8:
-#ifdef USE_MMX
-				if (fbHaveMMX())
-				    func = fbCompositeSrc_8888RevNPx8888mmx;
-#endif
-				break;
-			    case PICT_r5g6b5:
-#ifdef USE_MMX
-				if (fbHaveMMX())
-				    func = fbCompositeSrc_8888RevNPx0565mmx;
-#endif
-				break;
-			    default:
-				break;
-			    }
-			    break;
-			default:
-			    break;
-			}
-			break;
-		    default:
-			break;
-		    }
-		    break;
-		}
-		else
-		{
-		    /* non-repeating source, repeating mask => translucent window */
-		    if (fbCanGetSolid(pMask))
-		    {
-			if (pSrc->format == PICT_x8r8g8b8 &&
-			    pDst->format == PICT_x8r8g8b8 &&
-			    pMask->format == PICT_a8)
-			{
-#ifdef USE_MMX
-			    if (fbHaveMMX())
-				func = fbCompositeSrc_8888x8x8888mmx;
-#endif
-			}
-		    }
-		}
-	    }
-	}
-	else /* no mask */
-	{
-	    if (fbCanGetSolid(pSrc))
-	    {
-		/* no mask and repeating source */
-		switch (pSrc->format) {
-		case PICT_a8r8g8b8:
-		    switch (pDst->format) {
-		    case PICT_a8r8g8b8:
-		    case PICT_x8r8g8b8:
-#ifdef USE_MMX
-			if (fbHaveMMX())
-			{
-			    srcRepeat = FALSE;
-			    func = fbCompositeSolid_nx8888mmx;
-			}
-#endif
-			break;
-		    case PICT_r5g6b5:
-#ifdef USE_MMX
-			if (fbHaveMMX())
-			{
-			    srcRepeat = FALSE;
-			    func = fbCompositeSolid_nx0565mmx;
-			}
-#endif
-			break;
-		    default:
-			break;
-		    }
-		    break;
-		default:
-		    break;
-		}
-	    }
-	    else if (! srcRepeat)
-	    {
-		switch (pSrc->format) {
-		case PICT_a8r8g8b8:
-		    switch (pDst->format) {
-		    case PICT_a8r8g8b8:
-		    case PICT_x8r8g8b8:
-#ifdef USE_MMX
-			if (fbHaveMMX())
-			    func = fbCompositeSrc_8888x8888mmx;
-			else
-#endif
-			    func = fbCompositeSrc_8888x8888;
-			break;
-		    case PICT_r8g8b8:
-			func = fbCompositeSrc_8888x0888;
-			break;
-		    case PICT_r5g6b5:
-			func = fbCompositeSrc_8888x0565;
-			break;
-		    default:
-			break;
-		    }
-		    break;
-		case PICT_x8r8g8b8:
-		    switch (pDst->format) {
-		    case PICT_a8r8g8b8:
-		    case PICT_x8r8g8b8:
-#ifdef USE_MMX
-			if (fbHaveMMX())
-			    func = fbCompositeCopyAreammx;
-#endif
-			break;
-		    default:
-			break;
-		    }
-		case PICT_x8b8g8r8:
-		    switch (pDst->format) {
-		    case PICT_a8b8g8r8:
-		    case PICT_x8b8g8r8:
-#ifdef USE_MMX
-			if (fbHaveMMX())
-			    func = fbCompositeCopyAreammx;
-#endif
-			break;
-		    default:
-			break;
-		    }
-		    break;
-		case PICT_a8b8g8r8:
-		    switch (pDst->format) {
-		    case PICT_a8b8g8r8:
-		    case PICT_x8b8g8r8:
-#ifdef USE_MMX
-			if (fbHaveMMX())
-			    func = fbCompositeSrc_8888x8888mmx;
-			else
-#endif
-			    func = fbCompositeSrc_8888x8888;
-			break;
-		    case PICT_b8g8r8:
-			func = fbCompositeSrc_8888x0888;
-			break;
-		    case PICT_b5g6r5:
-			func = fbCompositeSrc_8888x0565;
-			break;
-		    default:
-			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;
-		}
-	    }
-	}
-	break;
-    case PictOpAdd:
-	if (pMask == 0)
-	{
-	    switch (pSrc->format) {
-	    case PICT_a8r8g8b8:
-		switch (pDst->format) {
-		case PICT_a8r8g8b8:
-#ifdef USE_MMX
-		    if (fbHaveMMX())
-			func = fbCompositeSrcAdd_8888x8888mmx;
-		    else
-#endif
-			func = fbCompositeSrcAdd_8888x8888;
-		    break;
-		default:
-		    break;
-		}
-		break;
-	    case PICT_a8b8g8r8:
-		switch (pDst->format) {
-		case PICT_a8b8g8r8:
-#ifdef USE_MMX
-		    if (fbHaveMMX())
-			func = fbCompositeSrcAdd_8888x8888mmx;
-		    else
-#endif
-			func = fbCompositeSrcAdd_8888x8888;
-		    break;
-		default:
-		    break;
-		}
-		break;
-	    case PICT_a8:
-		switch (pDst->format) {
-		case PICT_a8:
-#ifdef USE_MMX
-		    if (fbHaveMMX())
-			func = fbCompositeSrcAdd_8000x8000mmx;
-		    else
-#endif
-			func = fbCompositeSrcAdd_8000x8000;
-		    break;
-		default:
-		    break;
-		}
-		break;
-	    case PICT_a1:
-		switch (pDst->format) {
-		case PICT_a1:
-		    func = fbCompositeSrcAdd_1000x1000;
-		    break;
-		default:
-		    break;
-		}
-		break;
-	    default:
-		break;
-	    }
-	}
-	break;
-    }
-
-    if (!func) {
-         /* no fast path, use the general code */
-         fbCompositeGeneral(op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, width, height);
-         return;
-    }
-
-    if (!miComputeCompositeRegion (&region,
- 				   pSrc,
- 				   pMask,
- 				   pDst,
- 				   xSrc,
- 				   ySrc,
- 				   xMask,
- 				   yMask,
- 				   xDst,
- 				   yDst,
- 				   width,
-                                   height))
+    if (!miComputeCompositeRegion (&region, pSrc, pMask, pDst, xSrc, ySrc,
+				   xMask, yMask, xDst, yDst, width, height))
         return;
-
+    
     n = REGION_NUM_RECTS (&region);
     pbox = REGION_RECTS (&region);
     while (n--)
@@ -1431,9 +125,9 @@ fbComposite (CARD8      op,
 			w_this = pSrc->pDrawable->width - x_src;
 		    x_src += pSrc->pDrawable->x;
 		}
-		(*func) (op, pSrc, pMask, pDst,
-			 x_src, y_src, x_msk, y_msk, x_dst, y_dst,
-			 w_this, h_this);
+		(*compositeRect) (op, pSrc, pMask, pDst,
+				  x_src, y_src, x_msk, y_msk, x_dst, y_dst,
+				  w_this, h_this);
 		w -= w_this;
 		x_src += w_this;
 		x_msk += w_this;
@@ -1449,166 +143,329 @@ fbComposite (CARD8      op,
     REGION_UNINIT (pDst->pDrawable->pScreen, &region);
 }
 
-#endif /* RENDER */
-
-Bool
-fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
+void
+fbComposite (CARD8      op,
+	     PicturePtr pSrc,
+	     PicturePtr pMask,
+	     PicturePtr pDst,
+	     INT16      xSrc,
+	     INT16      ySrc,
+	     INT16      xMask,
+	     INT16      yMask,
+	     INT16      xDst,
+	     INT16      yDst,
+	     CARD16     width,
+	     CARD16     height)
 {
+    pixman_image_t *src, *mask, *dest;
+    
+    xDst += pDst->pDrawable->x;
+    yDst += pDst->pDrawable->y;
+    if (pSrc->pDrawable)
+    {
+        xSrc += pSrc->pDrawable->x;
+        ySrc += pSrc->pDrawable->y;
+    }
+    if (pMask && pMask->pDrawable)
+    {
+	xMask += pMask->pDrawable->x;
+	yMask += pMask->pDrawable->y;
+    }
 
-#ifdef RENDER
+    miCompositeSourceValidate (pSrc, xSrc, ySrc, width, height);
+    if (pMask)
+	miCompositeSourceValidate (pMask, xMask, yMask, width, height);
+    
+    src = image_from_pict (pSrc, TRUE);
+    mask = image_from_pict (pMask, TRUE);
+    dest = image_from_pict (pDst, TRUE);
 
-    PictureScreenPtr    ps;
+    if (src && dest && !(pMask && !mask))
+    {
+	pixman_image_composite (op, src, mask, dest,
+				xSrc, ySrc, xMask, yMask, xDst, yDst,
+				width, height);
+    }
 
-    if (!miPictureInit (pScreen, formats, nformats))
-	return FALSE;
-    ps = GetPictureScreen(pScreen);
-    ps->Composite = fbComposite;
-    ps->Glyphs = miGlyphs;
-    ps->CompositeRects = miCompositeRects;
-    ps->RasterizeTrapezoid = fbRasterizeTrapezoid;
-    ps->AddTraps = fbAddTraps;
-    ps->AddTriangles = fbAddTriangles;
+    free_pixman_pict (pSrc, src);
+    free_pixman_pict (pMask, mask);
+    free_pixman_pict (pDst, dest);
+}
+
+void
+fbCompositeGeneral (CARD8	op,
+		    PicturePtr	pSrc,
+		    PicturePtr	pMask,
+		    PicturePtr	pDst,
+		    INT16	xSrc,
+		    INT16	ySrc,
+		    INT16	xMask,
+		    INT16	yMask,
+		    INT16	xDst,
+		    INT16	yDst,
+		    CARD16	width,
+		    CARD16	height)
+{
+    fbComposite (op, pSrc, pMask, pDst,
+			xSrc, ySrc, xMask, yMask, xDst, yDst,
+			width, height);
+}
 
 #endif /* RENDER */
 
-    return TRUE;
+static pixman_image_t *
+create_solid_fill_image (PicturePtr pict)
+{
+    PictSolidFill *solid = &pict->pSourcePict->solidFill;
+    pixman_color_t color;
+    CARD32 a, r, g, b;
+    
+    a = (solid->color & 0xff000000) >> 24;
+    r = (solid->color & 0x00ff0000) >> 16;
+    g = (solid->color & 0x0000ff00) >>  8;
+    b = (solid->color & 0x000000ff) >>  0;
+    
+    color.alpha = (a << 8) | a;
+    color.red =   (r << 8) | r;
+    color.green = (g << 8) | g;
+    color.blue =  (b << 8) | b;
+    
+    return pixman_image_create_solid_fill (&color);
 }
 
-#ifdef USE_MMX
-/* The CPU detection code needs to be in a file not compiled with
- * "-mmmx -msse", as gcc would generate CMOV instructions otherwise
- * that would lead to SIGILL instructions on old CPUs that don't have
- * it.
- */
-#if !defined(__amd64__) && !defined(__x86_64__)
+static pixman_image_t *
+create_linear_gradient_image (PictGradient *gradient)
+{
+    PictLinearGradient *linear = (PictLinearGradient *)gradient;
+    pixman_point_fixed_t p1;
+    pixman_point_fixed_t p2;
+    
+    p1.x = linear->p1.x;
+    p1.y = linear->p1.y;
+    p2.x = linear->p2.x;
+    p2.y = linear->p2.y;
+    
+    return pixman_image_create_linear_gradient (
+	&p1, &p2, (pixman_gradient_stop_t *)gradient->stops, gradient->nstops);
+}
 
-#ifdef HAVE_GETISAX
-#include <sys/auxv.h>
-#endif
+static pixman_image_t *
+create_radial_gradient_image (PictGradient *gradient)
+{
+    PictRadialGradient *radial = (PictRadialGradient *)gradient;
+    pixman_point_fixed_t c1;
+    pixman_point_fixed_t c2;
+    
+    c1.x = radial->c1.x;
+    c1.y = radial->c1.y;
+    c2.x = radial->c2.x;
+    c2.y = radial->c2.y;
+    
+    return pixman_image_create_radial_gradient (
+	&c1, &c2, radial->c1.radius,
+	radial->c2.radius,
+	(pixman_gradient_stop_t *)gradient->stops, gradient->nstops);
+}
+
+static pixman_image_t *
+create_conical_gradient_image (PictGradient *gradient)
+{
+    PictConicalGradient *conical = (PictConicalGradient *)gradient;
+    pixman_point_fixed_t center;
+    
+    center.x = conical->center.x;
+    center.y = conical->center.y;
+    
+    return pixman_image_create_conical_gradient (
+	&center, conical->angle, (pixman_gradient_stop_t *)gradient->stops,
+	gradient->nstops);
+}
 
-enum CPUFeatures {
-    NoFeatures = 0,
-    MMX = 0x1,
-    MMX_Extensions = 0x2, 
-    SSE = 0x6,
-    SSE2 = 0x8,
-    CMOV = 0x10
-};
+static pixman_image_t *
+create_bits_picture (PicturePtr pict,
+		     Bool       has_clip)
+{
+    FbBits *bits;
+    FbStride stride;
+    int bpp, xoff, yoff;
+    pixman_image_t *image;
+    
+    fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff);
 
-static unsigned int detectCPUFeatures(void) {
-    unsigned int features = 0;
-    unsigned int result;
+    bits = (CARD8*)bits + yoff * stride * sizeof(FbBits) + xoff * (bpp / 8);
 
-#ifdef HAVE_GETISAX
-    if (getisax(&result, 1)) {
-        if (result & AV_386_CMOV)
-            features |= CMOV;
-        if (result & AV_386_MMX)
-            features |= MMX;
-        if (result & AV_386_AMD_MMX)
-            features |= MMX_Extensions;
-        if (result & AV_386_SSE)
-            features |= SSE;
-        if (result & AV_386_SSE2)
-            features |= SSE2;
-    }
+    image = pixman_image_create_bits (
+	pict->format,
+	pict->pDrawable->width, pict->pDrawable->height,
+	(uint32_t *)bits, stride * sizeof (FbStride));
+    
+    
+#ifdef FB_ACCESS_WRAPPER
+#if FB_SHIFT==5
+    
+    pixman_image_set_accessors (image,
+				(pixman_read_memory_func_t)wfbReadMemory,
+				(pixman_write_memory_func_t)wfbWriteMemory);
+    
 #else
-    char vendor[13];
-    vendor[0] = 0;
-    vendor[12] = 0;
-    /* see p. 118 of amd64 instruction set manual Vol3 */
-    /* We need to be careful about the handling of %ebx and
-     * %esp here. We can't declare either one as clobbered
-     * since they are special registers (%ebx is the "PIC
-     * register" holding an offset to global data, %esp the
-     * stack pointer), so we need to make sure they have their
-     * original values when we access the output operands.
+    
+#error The pixman library only works when FbBits is 32 bits wide
+    
+#endif
+#endif
+    
+    /* pCompositeClip is undefined for source pictures, so
+     * only set the clip region for pictures with drawables
      */
-    __asm__ ("pushf\n"
-             "pop %%eax\n"
-             "mov %%eax, %%ecx\n"
-             "xor $0x00200000, %%eax\n"
-             "push %%eax\n"
-             "popf\n"
-             "pushf\n"
-             "pop %%eax\n"
-             "mov $0x0, %%edx\n"
-             "xor %%ecx, %%eax\n"
-             "jz 1f\n"
+    if (has_clip)
+    {
+	if (pict->clientClipType != CT_NONE)
+	    pixman_image_set_has_client_clip (image, TRUE);
+	
+	pixman_image_set_clip_region (image, pict->pCompositeClip);
+    }
+    
+    /* Indexed table */
+    if (pict->pFormat->index.devPrivate)
+	pixman_image_set_indexed (image, pict->pFormat->index.devPrivate);
 
-             "mov $0x00000000, %%eax\n"
-	     "push %%ebx\n"
-             "cpuid\n"
-             "mov %%ebx, %%eax\n"
-	     "pop %%ebx\n"
-	     "mov %%eax, %1\n"
-             "mov %%edx, %2\n"
-             "mov %%ecx, %3\n"
-             "mov $0x00000001, %%eax\n"
-	     "push %%ebx\n"
-             "cpuid\n"
-	     "pop %%ebx\n"
-             "1:\n"
-             "mov %%edx, %0\n"
-             : "=r" (result), 
-               "=m" (vendor[0]), 
-               "=m" (vendor[4]), 
-               "=m" (vendor[8])
-             :
-             : "%eax", "%ecx", "%edx"
-        );
+    return image;
+}
 
-    if (result) {
-        /* result now contains the standard feature bits */
-        if (result & (1 << 15))
-            features |= CMOV;
-        if (result & (1 << 23))
-            features |= MMX;
-        if (result & (1 << 25))
-            features |= SSE;
-        if (result & (1 << 26))
-            features |= SSE2;
-        if ((result & MMX) && !(result & SSE) && (strcmp(vendor, "AuthenticAMD") == 0)) {
-            /* check for AMD MMX extensions */
+static void
+set_image_properties (pixman_image_t *image, PicturePtr pict)
+{
+    pixman_repeat_t repeat;
+    pixman_filter_t filter;
+    
+    if (pict->transform)
+    {
+	pixman_image_set_transform (
+	    image, (pixman_transform_t *)pict->transform);
+    }
+    
+    switch (pict->repeatType)
+    {
+    default:
+    case RepeatNone:
+	repeat = PIXMAN_REPEAT_NONE;
+	break;
+	
+    case RepeatPad:
+	repeat = PIXMAN_REPEAT_PAD;
+	break;
+	
+    case RepeatNormal:
+	repeat = PIXMAN_REPEAT_NORMAL;
+	break;
+	
+    case RepeatReflect:
+	repeat = PIXMAN_REPEAT_REFLECT;
+	break;
+    }
+    
+    pixman_image_set_repeat (image, repeat);
+    
+    if (pict->alphaMap)
+    {
+	pixman_image_t *alpha_map = image_from_pict (pict->alphaMap, TRUE);
+	
+	pixman_image_set_alpha_map (
+	    image, alpha_map, pict->alphaOrigin.x, pict->alphaOrigin.y);
+	
+	free_pixman_pict (pict->alphaMap, alpha_map);
+    }
+    
+    pixman_image_set_component_alpha (image, pict->componentAlpha);
 
-            unsigned int result;            
-            __asm__("push %%ebx\n"
-                    "mov $0x80000000, %%eax\n"
-                    "cpuid\n"
-                    "xor %%edx, %%edx\n"
-                    "cmp $0x1, %%eax\n"
-                    "jge 2f\n"
-                    "mov $0x80000001, %%eax\n"
-                    "cpuid\n"
-                    "2:\n"
-                    "pop %%ebx\n"
-                    "mov %%edx, %0\n"
-                    : "=r" (result)
-                    :
-                    : "%eax", "%ecx", "%edx"
-                );
-            if (result & (1<<22))
-                features |= MMX_Extensions;
-        }
+    switch (pict->filter)
+    {
+    default:
+    case PictFilterNearest:
+    case PictFilterFast:
+	filter = PIXMAN_FILTER_NEAREST;
+	break;
+	
+    case PictFilterBilinear:
+    case PictFilterGood:
+	filter = PIXMAN_FILTER_BILINEAR;
+	break;
+	
+    case PictFilterConvolution:
+	filter = PIXMAN_FILTER_CONVOLUTION;
+	break;
     }
-#endif /* HAVE_GETISAX */
-    return features;
+    
+    pixman_image_set_filter (image, filter, (pixman_fixed_t *)pict->filter_params, pict->filter_nparams);
+    pixman_image_set_source_clipping (image, TRUE);
 }
 
-Bool
-fbHaveMMX (void)
+pixman_image_t *
+image_from_pict (PicturePtr pict,
+		 Bool has_clip)
 {
-    static Bool initialized = FALSE;
-    static Bool mmx_present;
+    pixman_image_t *image = NULL;
+
+    if (!pict)
+	return NULL;
 
-    if (!initialized)
+    if (pict->pDrawable)
     {
-        unsigned int features = detectCPUFeatures();
-	mmx_present = (features & (MMX|MMX_Extensions)) == (MMX|MMX_Extensions);
-        initialized = TRUE;
+	image = create_bits_picture (pict, has_clip);
     }
+    else if (pict->pSourcePict)
+    {
+	SourcePict *sp = pict->pSourcePict;
+	
+	if (sp->type == SourcePictTypeSolidFill)
+	{
+	    image = create_solid_fill_image (pict);
+	}
+	else
+	{
+	    PictGradient *gradient = &pict->pSourcePict->gradient;
+	    
+	    if (sp->type == SourcePictTypeLinear)
+		image = create_linear_gradient_image (gradient);
+	    else if (sp->type == SourcePictTypeRadial)
+		image = create_radial_gradient_image (gradient);
+	    else if (sp->type == SourcePictTypeConical)
+		image = create_conical_gradient_image (gradient);
+	}
+    }
+    
+    if (image)
+	set_image_properties (image, pict);
     
-    return mmx_present;
+    return image;
+}
+
+void
+free_pixman_pict (PicturePtr pict, pixman_image_t *image)
+{
+    if (image && pixman_image_unref (image) && pict->pDrawable)
+	fbFinishAccess (pict->pDrawable);
+}
+
+Bool
+fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
+{
+
+#ifdef RENDER
+
+    PictureScreenPtr    ps;
+
+    if (!miPictureInit (pScreen, formats, nformats))
+	return FALSE;
+    ps = GetPictureScreen(pScreen);
+    ps->Composite = fbComposite;
+    ps->Glyphs = miGlyphs;
+    ps->CompositeRects = miCompositeRects;
+    ps->RasterizeTrapezoid = fbRasterizeTrapezoid;
+    ps->AddTraps = fbAddTraps;
+    ps->AddTriangles = fbAddTriangles;
+
+#endif /* RENDER */
+
+    return TRUE;
 }
-#endif /* __amd64__ */
-#endif
diff --git a/fb/fbpict.h b/fb/fbpict.h
index b90863e..b4c1dcf 100644
--- a/fb/fbpict.h
+++ b/fb/fbpict.h
@@ -114,14 +114,22 @@ fbCanGetSolid(PicturePtr pict)
     fbGetDrawable((pict)->pDrawable,__bits__,__stride__,__bpp__,__xoff__,__yoff__); \
     switch (__bpp__) { \
     case 32: \
-	(bits) = *(CARD32 *) __bits__; \
+	(bits) = READ((CARD32 *) __bits__); \
 	break; \
     case 24: \
 	(bits) = Fetch24 ((CARD8 *) __bits__); \
 	break; \
     case 16: \
-	(bits) = *(CARD16 *) __bits__; \
-	(bits) = cvt0565to8888(bits); \
+	(bits) = READ((CARD16 *) __bits__); \
+	(bits) = cvt0565to0888(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; \
@@ -137,6 +145,7 @@ fbCanGetSolid(PicturePtr pict)
     /* manage missing src alpha */ \
     if ((pict)->pFormat->direct.alphaMask == 0) \
 	(bits) |= 0xff000000; \
+    fbFinishAccess ((pict)->pDrawable); \
 }
 
 #define fbComposeGetStart(pict,x,y,type,stride,line,mul) {\
@@ -152,28 +161,28 @@ 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)))
 
 #if IMAGE_BYTE_ORDER == MSBFirst
 #define Fetch24(a)  ((unsigned long) (a) & 1 ? \
-		     ((*(a) << 16) | *((CARD16 *) ((a)+1))) : \
-		     ((*((CARD16 *) (a)) << 8) | *((a)+2)))
+		     ((READ(a) << 16) | READ((CARD16 *) ((a)+1))) : \
+		     ((READ((CARD16 *) (a)) << 8) | READ((a)+2)))
 #define Store24(a,v) ((unsigned long) (a) & 1 ? \
-		      ((*(a) = (CARD8) ((v) >> 16)), \
-		       (*((CARD16 *) ((a)+1)) = (CARD16) (v))) : \
-		      ((*((CARD16 *) (a)) = (CARD16) ((v) >> 8)), \
-		       (*((a)+2) = (CARD8) (v))))
+		      (WRITE(a, (CARD8) ((v) >> 16)), \
+		       WRITE((CARD16 *) ((a)+1), (CARD16) (v))) : \
+		      (WRITE((CARD16 *) (a), (CARD16) ((v) >> 8)), \
+		       WRITE((a)+2, (CARD8) (v))))
 #else
 #define Fetch24(a)  ((unsigned long) (a) & 1 ? \
-		     ((*(a)) | (*((CARD16 *) ((a)+1)) << 8)) : \
-		     ((*((CARD16 *) (a))) | (*((a)+2) << 16)))
+		     (READ(a) | (READ((CARD16 *) ((a)+1)) << 8)) : \
+		     (READ((CARD16 *) (a)) | (READ((a)+2) << 16)))
 #define Store24(a,v) ((unsigned long) (a) & 1 ? \
-		      ((*(a) = (CARD8) (v)), \
-		       (*((CARD16 *) ((a)+1)) = (CARD16) ((v) >> 8))) : \
-		      ((*((CARD16 *) (a)) = (CARD16) (v)),\
-		       (*((a)+2) = (CARD8) ((v) >> 16))))
+		      (WRITE(a, (CARD8) (v)), \
+		       WRITE((CARD16 *) ((a)+1), (CARD16) ((v) >> 8))) : \
+		      (WRITE((CARD16 *) (a), (CARD16) (v)),\
+		       WRITE((a)+2, (CARD8) ((v) >> 16))))
 #endif
 		      
 /*
@@ -374,6 +383,9 @@ typedef struct _FbComposeData {
     CARD16	height;
 } FbComposeData;
 
+void
+fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer);
+
 typedef FASTCALL void (*CombineMaskU) (CARD32 *src, const CARD32 *mask, int width);
 typedef FASTCALL void (*CombineFuncU) (CARD32 *dest, const CARD32 *src, int width);
 typedef FASTCALL void (*CombineFuncC) (CARD32 *dest, CARD32 *src, CARD32 *mask, int width);
@@ -400,210 +412,7 @@ fbCompositeGeneral (CARD8	op,
 		    CARD16	width,
 		    CARD16	height);
 
-
-/* fbedge.c */
-void
-fbRasterizeEdges (FbBits	*buf,
-		  int		bpp,
-		  int		width,
-		  int		stride,
-		  RenderEdge	*l,
-		  RenderEdge	*r,
-		  xFixed	t,
-		  xFixed	b);
-
 /* fbpict.c */
-CARD32
-fbOver (CARD32 x, CARD32 y);
-
-CARD32
-fbOver24 (CARD32 x, CARD32 y);
-
-CARD32
-fbIn (CARD32 x, CARD8 y);
-
-void
-fbCompositeSolidMask_nx8x8888 (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
-fbCompositeSolidMask_nx8x0888 (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
-fbCompositeSolidMask_nx8888x8888C (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
-fbCompositeSolidMask_nx8x0565 (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
-fbCompositeSolidMask_nx8888x0565C (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
-fbCompositeSrc_8888x8888 (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
-fbCompositeSrc_8888x0888 (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
-fbCompositeSrc_8888x0565 (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
-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);
-
-void
-fbCompositeSrcAdd_8000x8000 (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
-fbCompositeSrcAdd_8888x8888 (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
-fbCompositeSrcAdd_1000x1000 (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
-fbCompositeSolidMask_nx1xn (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,
@@ -618,19 +427,18 @@ fbComposite (CARD8      op,
 	     CARD16     width,
 	     CARD16     height);
 
-
-typedef void    (*CompositeFunc) (CARD8      op,
-                                  PicturePtr pSrc,
-                                  PicturePtr pMask,
-                                  PicturePtr pDst,
-                                  INT16      xSrc,
-                                  INT16      ySrc,
-                                  INT16      xMask,
+typedef void	(*CompositeFunc) (CARD8      op,
+				  PicturePtr pSrc,
+				  PicturePtr pMask,
+				  PicturePtr pDst,
+				  INT16      xSrc,
+				  INT16      ySrc,
+				  INT16      xMask,
                                   INT16      yMask,
-                                  INT16      xDst,
-                                  INT16      yDst,
-                                  CARD16     width,
-                                  CARD16     height);
+				  INT16      xDst,
+				  INT16      yDst,
+				  CARD16     width,
+				  CARD16     height);
 
 void
 fbWalkCompositeRegion (CARD8 op,
diff --git a/fb/fbpixmap.c b/fb/fbpixmap.c
index a554584..88f693e 100644
--- a/fb/fbpixmap.c
+++ b/fb/fbpixmap.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbpixmap.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -43,11 +41,7 @@ fbCreatePixmapBpp (ScreenPtr pScreen, int width, int height, int depth, int bpp)
     if (paddedWidth / 4 > 32767 || height > 32767)
 	return NullPixmap;
     datasize = height * paddedWidth;
-#ifdef PIXPRIV
     base = pScreen->totalPixmapSize;
-#else
-    base = sizeof (PixmapRec);
-#endif
     adjust = 0;
     if (base & 7)
 	adjust = 8 - (base & 7);
@@ -160,6 +154,8 @@ fbPixmapToRegion(PixmapPtr pPix)
     FirstRect = REGION_BOXPTR(pReg);
     rects = FirstRect;
 
+    fbPrepareAccess(&pPix->drawable);
+
     pwLine = (FbBits *) pPix->devPrivate.ptr;
     nWidth = pPix->devKind >> (FB_SHIFT-3);
 
@@ -174,7 +170,7 @@ fbPixmapToRegion(PixmapPtr pPix)
 	irectLineStart = rects - FirstRect;
 	/* If the Screen left most bit of the word is set, we're starting in
 	 * a box */
-	if(*pw & mask0)
+	if(READ(pw) & mask0)
 	{
 	    fInBox = TRUE;
 	    rx1 = 0;
@@ -185,7 +181,7 @@ fbPixmapToRegion(PixmapPtr pPix)
 	pwLineEnd = pw + (width >> FB_SHIFT);
 	for (base = 0; pw < pwLineEnd; base += FB_UNIT)
 	{
-	    w = *pw++;
+	    w = READ(pw++);
 	    if (fInBox)
 	    {
 		if (!~w)
@@ -226,7 +222,7 @@ fbPixmapToRegion(PixmapPtr pPix)
 	if(width & FB_MASK)
 	{
 	    /* Process final partial word on line */
-	    w = *pw++;
+	    w = READ(pw++);
 	    for(ib = 0; ib < (width & FB_MASK); ib++)
 	    {
 	        /* If the Screen left most bit of the word is set, we're
@@ -311,6 +307,8 @@ fbPixmapToRegion(PixmapPtr pPix)
 	    pReg->data = (RegDataPtr)NULL;
 	}
     }
+
+    fbFinishAccess(&pPix->drawable);
 #ifdef DEBUG
     if (!miValidRegion(pReg))
 	FatalError("Assertion failed file %s, line %d: expr\n", __FILE__, __LINE__);
@@ -318,15 +316,6 @@ fbPixmapToRegion(PixmapPtr pPix)
     return(pReg);
 }
 
-int fb_null_pointer(char *file, unsigned int line) {
-  ErrorF("%s:%u: null pointer (break on fb_null_pointer to debug)\n", file, line);
-#ifdef FB_DEBUG
-  return 0; // ignore error, die horrible death
-#else
-  return 1; // harmlessly return to caller, hope we don't crash later
-#endif
-}
-
 #ifdef FB_DEBUG
 
 #ifndef WIN32
@@ -366,14 +355,12 @@ fbValidateDrawable (DrawablePtr pDrawable)
     if (pDrawable->type != DRAWABLE_PIXMAP)
 	pDrawable = (DrawablePtr) fbGetWindowPixmap(pDrawable);
     fbGetStipDrawable(pDrawable, bits, stride, bpp, xoff, yoff);
-#ifdef __APPLE__
-    if (bits >= 0xb0000000) return; // don't validate CG memory
-#endif
     first = bits - stride;
     last = bits + stride * pDrawable->height;
     if (!fbValidateBits (first, stride, FB_HEAD_BITS) ||
 	!fbValidateBits (last, stride, FB_TAIL_BITS))
 	fbInitializeDrawable(pDrawable);
+    fbFinishAccess (pDrawable);
 }
 
 void
@@ -395,5 +382,6 @@ fbInitializeDrawable (DrawablePtr pDrawable)
     last = bits + stride * pDrawable->height;
     fbSetBits (first, stride, FB_HEAD_BITS);
     fbSetBits (last, stride, FB_TAIL_BITS);
+    fbFinishAccess (pDrawable);
 }
 #endif /* FB_DEBUG */
diff --git a/fb/fbpoint.c b/fb/fbpoint.c
index 7154b53..c0ea8ba 100644
--- a/fb/fbpoint.c
+++ b/fb/fbpoint.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbpoint.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -90,20 +88,20 @@ fbDots (FbBits	    *dstOrig,
 		FbMaskStip (x, 24, leftMask, n, rightMask);
 		if (leftMask)
 		{
-		    *d = FbDoMaskRRop (*d, andT, xorT, leftMask);
+		    WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, leftMask));
 		    andT = FbNext24Stip(andT);
 		    xorT = FbNext24Stip(xorT);
 		    d++;
 		}
 		if (rightMask)
-		    *d = FbDoMaskRRop(*d, andT, xorT, rightMask);
+		    WRITE(d, FbDoMaskRRop(READ(d), andT, xorT, rightMask));
 	    }
 	    else
 #endif
 	    {
 		FbStip	mask;
 		mask = FbStipMask(x, dstBpp);
-		*d = FbDoMaskRRop (*d, and, xor, mask);
+		WRITE(d, FbDoMaskRRop (READ(d), and, xor, mask));
 	    }
 	}
     }
@@ -160,4 +158,5 @@ fbPolyPoint (DrawablePtr    pDrawable,
 	 nBox--; pBox++)
 	(*dots) (dst, dstStride, dstBpp, pBox, pptInit, nptInit, 
 		 pDrawable->x, pDrawable->y, dstXoff, dstYoff, and, xor);
+    fbFinishAccess (pDrawable);
 }
diff --git a/fb/fbpseudocolor.c b/fb/fbpseudocolor.c
index 2233f95..271e981 100644
--- a/fb/fbpseudocolor.c
+++ b/fb/fbpseudocolor.c
@@ -875,6 +875,8 @@ xxCopyPseudocolorRegion(ScreenPtr pScreen, RegionPtr pReg,
     register CARD16     *d;
     int w;
 
+    fbPrepareAccess((DrawablePtr)pScreen->devPrivate);
+
     dst_base = (CARD16*) ((PixmapPtr)pScreen->devPrivate)->devPrivate.ptr;
     dst_stride = (int)((PixmapPtr)pScreen->devPrivate)->devKind
 	/ sizeof (CARD16);
@@ -899,6 +901,8 @@ xxCopyPseudocolorRegion(ScreenPtr pScreen, RegionPtr pReg,
 	}
 	pbox++;
     }
+
+    fbFinishAccess(&((PixmapPtr)pScreen->devPrivate)->drawable);
 }
 
 static void
@@ -1200,7 +1204,7 @@ GCFuncs xxGCFuncs = {
     xxChangeClip, xxDestroyClip, xxCopyClip
 };
 
-GCOps xxGCOps = {
+static GCOps xxGCOps = {
     xxFillSpans, xxSetSpans, 
     xxPutImage, xxCopyArea, 
     xxCopyPlane, xxPolyPoint, 
diff --git a/fb/fbpush.c b/fb/fbpush.c
index 0632766..891572f 100644
--- a/fb/fbpush.c
+++ b/fb/fbpush.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbpush.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -58,7 +56,7 @@ fbPushPattern (DrawablePtr  pDrawable,
 	w = width;
 	s = src;
 	src += srcStride;
-	bits = *s++;
+	bits = READ(s++);
 	xspan = x;
 	while (w)
 	{
@@ -73,7 +71,7 @@ fbPushPattern (DrawablePtr  pDrawable,
 		    bitsMask = FbStipRight (bitsMask, 1);
 		    if (!bitsMask)
 		    {
-			bits = *s++;
+			bits = READ(s++);
 			bitsMask = FbBitsMask(0,1);
 		    }
 		} while (bits & bitsMask);
@@ -92,7 +90,7 @@ fbPushPattern (DrawablePtr  pDrawable,
 		    bitsMask = FbStipRight (bitsMask, 1);
 		    if (!bitsMask)
 		    {
-			bits = *s++;
+			bits = READ(s++);
 			bitsMask = FbBitsMask(0,1);
 		    }
 		} while (!(bits & bitsMask));
@@ -165,6 +163,7 @@ fbPushFill (DrawablePtr	pDrawable,
 		      fbAnd(GXnoop,(FbBits) 0,FB_ALLONES),
 		      fbXor(GXnoop,(FbBits) 0,FB_ALLONES));
 	}
+	fbFinishAccess (pDrawable);
     }
     else
     {
diff --git a/fb/fbrop.h b/fb/fbrop.h
index f3768a2..1685ee8 100644
--- a/fb/fbrop.h
+++ b/fb/fbrop.h
@@ -1,6 +1,4 @@
 /*
- * Id: fbrop.h,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
diff --git a/fb/fbscreen.c b/fb/fbscreen.c
index b883758..94033f1 100644
--- a/fb/fbscreen.c
+++ b/fb/fbscreen.c
@@ -81,7 +81,6 @@ fbQueryBestSize (int class,
     }
 }
 
-#ifndef FB_OLD_SCREEN
 PixmapPtr
 _fbGetWindowPixmap (WindowPtr pWindow)
 {
@@ -97,7 +96,6 @@ _fbSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap)
     pWindow->devPrivates[fbWinPrivateIndex].ptr = (pointer) pPixmap;
 #endif
 }
-#endif
 
 Bool
 fbSetupScreen(ScreenPtr	pScreen, 
@@ -141,7 +139,6 @@ fbSetupScreen(ScreenPtr	pScreen,
     pScreen->ResolveColor = fbResolveColor;
     pScreen->BitmapToRegion = fbPixmapToRegion;
     
-#ifndef FB_OLD_SCREEN
     pScreen->GetWindowPixmap = _fbGetWindowPixmap;
     pScreen->SetWindowPixmap = _fbSetWindowPixmap;
 
@@ -150,11 +147,23 @@ fbSetupScreen(ScreenPtr	pScreen,
     pScreen->BackingStoreFuncs.SetClipmaskRgn = 0;
     pScreen->BackingStoreFuncs.GetImagePixmap = 0;
     pScreen->BackingStoreFuncs.GetSpansPixmap = 0;
-#endif
     
     return TRUE;
 }
 
+#ifdef FB_ACCESS_WRAPPER
+Bool
+wfbFinishScreenInit(ScreenPtr		pScreen,
+		    pointer		pbits,
+		    int			xsize,
+		    int			ysize,
+		    int			dpix,
+		    int			dpiy,
+		    int			width,
+		    int			bpp,
+		    SetupWrapProcPtr	setupWrap,
+		    FinishWrapProcPtr	finishWrap)
+#else
 Bool
 fbFinishScreenInit(ScreenPtr	pScreen,
 		   pointer	pbits,
@@ -164,6 +173,7 @@ fbFinishScreenInit(ScreenPtr	pScreen,
 		   int		dpiy,
 		   int		width,
 		   int		bpp)
+#endif
 {
     VisualPtr	visuals;
     DepthPtr	depths;
@@ -222,6 +232,10 @@ fbFinishScreenInit(ScreenPtr	pScreen,
 	fbGetScreenPrivate(pScreen)->win32bpp = 32;
 	fbGetScreenPrivate(pScreen)->pix32bpp = 32;
     }
+#ifdef FB_ACCESS_WRAPPER
+    fbGetScreenPrivate(pScreen)->setupWrap = setupWrap;
+    fbGetScreenPrivate(pScreen)->finishWrap = finishWrap;
+#endif
 #endif
     rootdepth = 0;
     if (!fbInitVisuals (&visuals, &depths, &nvisuals, &ndepths, &rootdepth,
@@ -229,11 +243,7 @@ fbFinishScreenInit(ScreenPtr	pScreen,
 	return FALSE;
     if (! miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
 			rootdepth, ndepths, depths,
-			defaultVisual, nvisuals, visuals
-#ifdef FB_OLD_MISCREENINIT
-		       , (miBSFuncPtr) 0
-#endif
-		       ))
+			defaultVisual, nvisuals, visuals))
 	return FALSE;
     /* overwrite miCloseScreen with our own */
     pScreen->CloseScreen = fbCloseScreen;
@@ -256,6 +266,27 @@ fbFinishScreenInit(ScreenPtr	pScreen,
 }
 
 /* dts * (inch/dot) * (25.4 mm / inch) = mm */
+#ifdef FB_ACCESS_WRAPPER
+Bool
+wfbScreenInit(ScreenPtr		pScreen,
+	      pointer		pbits,
+	      int		xsize,
+	      int		ysize,
+	      int		dpix,
+	      int		dpiy,
+	      int		width,
+	      int		bpp,
+	      SetupWrapProcPtr	setupWrap,
+	      FinishWrapProcPtr	finishWrap)
+{
+    if (!fbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp))
+	return FALSE;
+    if (!wfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy,
+			     width, bpp, setupWrap, finishWrap))
+	return FALSE;
+    return TRUE;
+}
+#else
 Bool
 fbScreenInit(ScreenPtr	pScreen,
 	     pointer	pbits,
@@ -273,26 +304,4 @@ fbScreenInit(ScreenPtr	pScreen,
 	return FALSE;
     return TRUE;
 }
-
-
-#ifdef FB_OLD_SCREEN
-const miBSFuncRec fbBSFuncRec = {
-    fbSaveAreas,
-    fbRestoreAreas,
-    (void (*)(GCPtr, RegionPtr)) 0,
-    (PixmapPtr (*)(void)) 0,
-    (PixmapPtr (*)(void)) 0,
-};
-#endif
-
-#if 0
-void
-fbInitializeBackingStore (ScreenPtr pScreen)
-{
-#ifdef FB_OLD_SCREEN
-    miInitializeBackingStore (pScreen, (miBSFuncRec *) &fbBSFuncRec);
-#else
-    miInitializeBackingStore (pScreen);
-#endif
-}
 #endif
diff --git a/fb/fbseg.c b/fb/fbseg.c
index d66e424..80ce740 100644
--- a/fb/fbseg.c
+++ b/fb/fbseg.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbseg.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -79,7 +77,7 @@ fbBresSolid (DrawablePtr    pDrawable,
 	    mask = fbBresShiftMask(mask,signdx,dstBpp);
 	    if (!mask)
 	    {
-		*dst = FbDoMaskRRop (*dst, and, xor, bits);
+		WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, bits));
 		bits = 0;
 		dst += signdx;
 		mask = mask0;
@@ -87,20 +85,20 @@ fbBresSolid (DrawablePtr    pDrawable,
 	    e += e1;
 	    if (e >= 0)
 	    {
-		*dst = FbDoMaskRRop (*dst, and, xor, bits);
+		WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, bits));
 		bits = 0;
 		dst += dstStride;
 		e += e3;
 	    }
 	}
 	if (bits)
-	    *dst = FbDoMaskRRop (*dst, and, xor, bits);
+	    WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, bits));
     }
     else
     {
 	while (len--)
 	{
-	    *dst = FbDoMaskRRop (*dst, and, xor, mask);
+	    WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, mask));
 	    dst += dstStride;
 	    e += e1;
 	    if (e >= 0)
@@ -115,6 +113,8 @@ fbBresSolid (DrawablePtr    pDrawable,
 	    }
 	}
     }
+
+    fbFinishAccess (pDrawable);
 }
 
 void
@@ -164,9 +164,9 @@ fbBresDash (DrawablePtr	pDrawable,
     while (len--)
     {
 	if (even)
-	    *dst = FbDoMaskRRop (*dst, and, xor, mask);
+	    WRITE(dst, FbDoMaskRRop (READ(dst), and, xor, mask));
 	else if (doOdd)
-	    *dst = FbDoMaskRRop (*dst, bgand, bgxor, mask);
+	    WRITE(dst, FbDoMaskRRop (READ(dst), bgand, bgxor, mask));
 	if (axis == X_AXIS)
 	{
 	    mask = fbBresShiftMask(mask,signdx,dstBpp);
@@ -199,6 +199,8 @@ fbBresDash (DrawablePtr	pDrawable,
 	}
 	FbDashStep (dashlen, even);
     }
+
+    fbFinishAccess (pDrawable);
 }
 
 void
@@ -371,13 +373,13 @@ fbBresSolid24RRop (DrawablePtr  pDrawable,
 	FbMaskStip (x, 24, leftMask, nl, rightMask);
 	if (leftMask)
 	{
-	    *d = FbDoMaskRRop (*d, andT, xorT, leftMask);
+	    WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, leftMask));
 	    d++;
 	    andT = FbNext24Stip (andT);
 	    xorT = FbNext24Stip (xorT);
 	}
 	if (rightMask)
-	    *d = FbDoMaskRRop (*d, andT, xorT, rightMask);
+	    WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, rightMask));
 	if (axis == X_AXIS)
 	{
 	    x1 += signdx;
@@ -399,6 +401,8 @@ fbBresSolid24RRop (DrawablePtr  pDrawable,
 	    }
 	}
     }
+
+    fbFinishAccess (pDrawable);
 }
 
 static void
@@ -468,13 +472,13 @@ fbBresDash24RRop (DrawablePtr	pDrawable,
 	    FbMaskStip (x, 24, leftMask, nl, rightMask);
 	    if (leftMask)
 	    {
-		*d = FbDoMaskRRop (*d, andT, xorT, leftMask);
+		WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, leftMask));
 		d++;
 		andT = FbNext24Stip (andT);
 		xorT = FbNext24Stip (xorT);
 	    }
 	    if (rightMask)
-		*d = FbDoMaskRRop (*d, andT, xorT, rightMask);
+		WRITE(d, FbDoMaskRRop (READ(d), andT, xorT, rightMask));
 	}
 	if (axis == X_AXIS)
 	{
@@ -498,6 +502,8 @@ fbBresDash24RRop (DrawablePtr	pDrawable,
 	}
 	FbDashStep (dashlen, even);
     }
+
+    fbFinishAccess (pDrawable);
 }
 #endif
 
diff --git a/fb/fbsetsp.c b/fb/fbsetsp.c
index c59c13c..227ba4c 100644
--- a/fb/fbsetsp.c
+++ b/fb/fbsetsp.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbsetsp.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -99,5 +97,6 @@ fbSetSpans (DrawablePtr	    pDrawable,
 	pwidth++;
     }
     fbValidateDrawable (pDrawable);
+    fbFinishAccess (pDrawable);
 }
 	    
diff --git a/fb/fbsolid.c b/fb/fbsolid.c
index 89effe6..53fcae0 100644
--- a/fb/fbsolid.c
+++ b/fb/fbsolid.c
@@ -1,6 +1,4 @@
 /*
- * $XFree86$
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -70,12 +68,12 @@ fbSolid (FbBits	    *dst,
 	n = nmiddle;
 	if (!and)
 	    while (n--)
-		*dst++ = xor;
+		WRITE(dst++, xor);
 	else
 	    while (n--)
 	    {
-		*dst = FbDoRRop (*dst, and, xor);
-		dst++;
+		WRITE(dst, FbDoRRop (READ(dst), and, xor));
+                dst++;
 	    }
 	if (endmask)
 	    FbDoRightMaskByteRRop(dst,endbyte,endmask,and,xor);
@@ -160,26 +158,26 @@ fbSolid24 (FbBits   *dst,
     {
 	if (startmask)
 	{
-	    *dst = FbDoMaskRRop(*dst, andS, xorS, startmask);
-	    dst++;
+	    WRITE(dst, FbDoMaskRRop(READ(dst), andS, xorS, startmask));
+            dst++;
 	}
 	n = nmiddle;
 	if (!and0)
 	{
 	    while (n >= 3)
 	    {
-		*dst++ = xor0;
-		*dst++ = xor1;
-		*dst++ = xor2;
+		WRITE(dst++, xor0);
+		WRITE(dst++, xor1);
+		WRITE(dst++, xor2);
 		n -= 3;
 	    }
 	    if (n)
 	    {
-		*dst++ = xor0;
+		WRITE(dst++, xor0);
 		n--;
 		if (n)
 		{
-		    *dst++ = xor1;
+		    WRITE(dst++, xor1);
 		}
 	    }
 	}
@@ -187,28 +185,28 @@ fbSolid24 (FbBits   *dst,
 	{
 	    while (n >= 3)
 	    {
-		*dst = FbDoRRop (*dst, and0, xor0);
-		dst++;
-		*dst = FbDoRRop (*dst, and1, xor1);
-		dst++;
-		*dst = FbDoRRop (*dst, and2, xor2);
-		dst++;
+		WRITE(dst, FbDoRRop (READ(dst), and0, xor0));
+                dst++;
+		WRITE(dst, FbDoRRop (READ(dst), and1, xor1));
+                dst++;
+		WRITE(dst, FbDoRRop (READ(dst), and2, xor2));
+                dst++;
 		n -= 3;
 	    }
 	    if (n)
 	    {
-		*dst = FbDoRRop (*dst, and0, xor0);
-		dst++;
+		WRITE(dst, FbDoRRop (READ(dst), and0, xor0));
+                dst++;
 		n--;
 		if (n)
 		{
-		    *dst = FbDoRRop (*dst, and1, xor1);
-		    dst++;
+		    WRITE(dst, FbDoRRop (READ(dst), and1, xor1));
+                    dst++;
 		}
 	    }
 	}
 	if (endmask)
-	    *dst = FbDoMaskRRop (*dst, andE, xorE, endmask);
+	    WRITE(dst, FbDoMaskRRop (READ(dst), andE, xorE, endmask));
 	dst += dstStride;
     }
 }
diff --git a/fb/fbstipple.c b/fb/fbstipple.c
index ce97148..7d13263 100644
--- a/fb/fbstipple.c
+++ b/fb/fbstipple.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbstipple.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -155,7 +153,7 @@ fbEvenStipple (FbBits	*dst,
 	/*
 	 * Extract stipple bits for this scanline;
 	 */
-	bits = *s;
+	bits = READ(s);
 	s += stipStride;
 	if (s == stipEnd)
 	    s = stip;
@@ -199,12 +197,12 @@ fbEvenStipple (FbBits	*dst,
 	    n = nmiddle;
 	    if (!and)
 		while (n--)
-		    *dst++ = xor;
+		    WRITE(dst++, xor);
 	    else
 	    {
 		while (n--)
 		{
-		    *dst = FbDoRRop (*dst, and, xor);
+		    WRITE(dst, FbDoRRop (READ(dst), and, xor));
 		    dst++;
 		}
 	    }
diff --git a/fb/fbtile.c b/fb/fbtile.c
index 0d0cfe1..05a27a1 100644
--- a/fb/fbtile.c
+++ b/fb/fbtile.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbtile.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -42,6 +40,7 @@ fbEvenTile (FbBits	*dst,
 	    int		height,
 
 	    FbBits	*tile,
+	    FbStride	tileStride,
 	    int		tileHeight,
 
 	    int		alu,
@@ -68,9 +67,9 @@ fbEvenTile (FbBits	*dst,
     /*
      * Compute tile start scanline and rotation parameters
      */
-    tileEnd = tile + tileHeight;
+    tileEnd = tile + tileHeight * tileStride;
     modulus (- yRot, tileHeight, tileY);
-    t = tile + tileY;
+    t = tile + tileY * tileStride;
     modulus (- xRot, FB_UNIT, tileX);
     rot = tileX;
     
@@ -80,8 +79,9 @@ fbEvenTile (FbBits	*dst,
 	/*
 	 * Pick up bits for this scanline
 	 */
-	bits = *t++;
-	if (t == tileEnd) t = tile;
+	bits = READ(t);
+	t += tileStride;
+	if (t >= tileEnd) t = tile;
 	bits = FbRotLeft(bits,rot);
 	and = fbAnd(alu,bits,pm);
 	xor = fbXor(alu,bits,pm);
@@ -94,11 +94,11 @@ fbEvenTile (FbBits	*dst,
 	n = nmiddle;
 	if (!and)
 	    while (n--)
-		*dst++ = xor;
+		WRITE(dst++, xor);
 	else
 	    while (n--)
 	    {
-		*dst = FbDoRRop (*dst, and, xor);
+		WRITE(dst, FbDoRRop (READ(dst), and, xor));
 		dst++;
 	    }
 	if (endmask)
@@ -194,7 +194,7 @@ fbTile (FbBits	    *dst,
 {
     if (FbEvenTile (tileWidth))
 	fbEvenTile (dst, dstStride, dstX, width, height, 
-		    tile, tileHeight,
+		    tile, tileStride, tileHeight,
 		    alu, pm, xRot, yRot);
     else
 	fbOddTile (dst, dstStride, dstX, width, height, 
diff --git a/fb/fbtrap.c b/fb/fbtrap.c
index 8639695..830603a 100644
--- a/fb/fbtrap.c
+++ b/fb/fbtrap.c
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * Copyright © 2004 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -42,59 +40,14 @@ fbAddTraps (PicturePtr	pPicture,
 	    int		ntrap,
 	    xTrap	*traps)
 {
-    FbBits	*buf;
-    int		bpp;
-    int		width;
-    int		stride;
-    int		height;
-    int		pxoff, pyoff;
-
-    xFixed	x_off_fixed;
-    xFixed	y_off_fixed;
-    RenderEdge  l, r;
-    xFixed	t, b;
-    
-    fbGetDrawable (pPicture->pDrawable, buf, stride, bpp, pxoff, pyoff);
+    pixman_image_t *image = image_from_pict (pPicture, FALSE);
 
-    width = pPicture->pDrawable->width;
-    height = pPicture->pDrawable->height;
-    x_off += pxoff;
-    y_off += pyoff;
+    if (!image)
+	return;
     
-    x_off_fixed = IntToxFixed(y_off);
-    y_off_fixed = IntToxFixed(y_off);
+    pixman_add_traps (image, x_off, y_off, ntrap, (pixman_trap_t *)traps);
 
-    while (ntrap--)
-    {
-	t = traps->top.y + y_off_fixed;
-	if (t < 0)
-	    t = 0;
-	t = RenderSampleCeilY (t, bpp);
-    
-	b = traps->bot.y + y_off_fixed;
-	if (xFixedToInt (b) >= height)
-	    b = IntToxFixed (height) - 1;
-	b = RenderSampleFloorY (b, bpp);
-	
-	if (b >= t)
-	{
-	    /* initialize edge walkers */
-	    RenderEdgeInit (&l, bpp, t,
-			    traps->top.l + x_off_fixed,
-			    traps->top.y + y_off_fixed,
-			    traps->bot.l + x_off_fixed,
-			    traps->bot.y + y_off_fixed);
-	
-	    RenderEdgeInit (&r, bpp, t,
-			    traps->top.r + x_off_fixed,
-			    traps->top.y + y_off_fixed,
-			    traps->bot.r + x_off_fixed,
-			    traps->bot.y + y_off_fixed);
-	    
-	    fbRasterizeEdges (buf, bpp, width, stride, &l, &r, t, b);
-	}
-	traps++;
-    }
+    free_pixman_pict (pPicture, image);
 }
 
 void
@@ -103,45 +56,14 @@ fbRasterizeTrapezoid (PicturePtr    pPicture,
 		      int	    x_off,
 		      int	    y_off)
 {
-    FbBits	*buf;
-    int		bpp;
-    int		width;
-    int		stride;
-    int		height;
-    int		pxoff, pyoff;
-
-    xFixed	x_off_fixed;
-    xFixed	y_off_fixed;
-    RenderEdge	l, r;
-    xFixed	t, b;
-    
-    fbGetDrawable (pPicture->pDrawable, buf, stride, bpp, pxoff, pyoff);
+    pixman_image_t *image = image_from_pict (pPicture, FALSE);
 
-    width = pPicture->pDrawable->width;
-    height = pPicture->pDrawable->height;
-    x_off += pxoff;
-    y_off += pyoff;
-    
-    x_off_fixed = IntToxFixed(x_off);
-    y_off_fixed = IntToxFixed(y_off);
-    t = trap->top + y_off_fixed;
-    if (t < 0)
-	t = 0;
-    t = RenderSampleCeilY (t, bpp);
-
-    b = trap->bottom + y_off_fixed;
-    if (xFixedToInt (b) >= height)
-	b = IntToxFixed (height) - 1;
-    b = RenderSampleFloorY (b, bpp);
-    
-    if (b >= t)
-    {
-	/* initialize edge walkers */
-	RenderLineFixedEdgeInit (&l, bpp, t, &trap->left, x_off, y_off);
-	RenderLineFixedEdgeInit (&r, bpp, t, &trap->right, x_off, y_off);
-	
-	fbRasterizeEdges (buf, bpp, width, stride, &l, &r, t, b);
-    }
+    if (!image)
+	return;
+
+    pixman_rasterize_trapezoid (image, (pixman_trapezoid_t *)trap, x_off, y_off);
+
+    free_pixman_pict (pPicture, image);
 }
 
 static int
diff --git a/fb/fbutil.c b/fb/fbutil.c
index 4be0f23..5e23297 100644
--- a/fb/fbutil.c
+++ b/fb/fbutil.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbutil.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
diff --git a/fb/fbwindow.c b/fb/fbwindow.c
index 968b5a6..144f083 100644
--- a/fb/fbwindow.c
+++ b/fb/fbwindow.c
@@ -1,6 +1,4 @@
 /*
- * Id: fbwindow.c,v 1.1 1999/11/02 03:54:45 keithp Exp $
- *
  * Copyright © 1998 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -30,10 +28,6 @@
 
 #include "fb.h"
 
-#ifdef USE_MMX
-#include "fbmmx.h"
-#endif
-
 Bool
 fbCreateWindow(WindowPtr pWin)
 {
@@ -118,6 +112,9 @@ fbCopyWindowProc (DrawablePtr	pSrcDrawable,
 	       upsidedown);
 	pbox++;
     }
+
+    fbFinishAccess (pDstDrawable);
+    fbFinishAccess (pSrcDrawable);
 }
 
 void 
@@ -219,36 +216,39 @@ fbFillRegionSolid (DrawablePtr	pDrawable,
     int		n = REGION_NUM_RECTS(pRegion);
     BoxPtr	pbox = REGION_RECTS(pRegion);
 
-#ifdef USE_MMX
-    int has_mmx = 0;
-    if (!and && fbHaveMMX())
-        has_mmx = 1;
+#ifndef FB_ACCESS_WRAPPER
+    int try_mmx = 0;
+    if (!and)
+        try_mmx = 1;
 #endif
 
     fbGetDrawable (pDrawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
     
     while (n--)
     {
-#ifdef USE_MMX
-        if (!has_mmx || !fbSolidFillmmx (pDrawable,
-	                                pbox->x1,
-					pbox->y1,
-					(pbox->x2 - pbox->x1),
-					(pbox->y2 - pbox->y1), xor)) {
+#ifndef FB_ACCESS_WRAPPER
+	if (!try_mmx || !pixman_fill (dst, dstStride, dstBpp,
+				      pbox->x1 + dstXoff, pbox->y1 + dstYoff,
+				      (pbox->x2 - pbox->x1),
+				      (pbox->y2 - pbox->y1),
+				      xor))
+	{
 #endif
-	fbSolid (dst + (pbox->y1 + dstYoff) * dstStride,
-		 dstStride,
-		 (pbox->x1 + dstXoff) * dstBpp,
-		 dstBpp,
-		 (pbox->x2 - pbox->x1) * dstBpp,
-		 pbox->y2 - pbox->y1,
-		 and, xor);
-#ifdef USE_MMX
+	    fbSolid (dst + (pbox->y1 + dstYoff) * dstStride,
+		     dstStride,
+		     (pbox->x1 + dstXoff) * dstBpp,
+		     dstBpp,
+		     (pbox->x2 - pbox->x1) * dstBpp,
+		     pbox->y2 - pbox->y1,
+		     and, xor);
+#ifndef FB_ACCESS_WRAPPER
 	}
 #endif
 	fbValidateDrawable (pDrawable);
 	pbox++;
     }
+    
+    fbFinishAccess (pDrawable);
 }
 
 #ifdef PANORAMIX
@@ -311,6 +311,9 @@ fbFillRegionTiled (DrawablePtr	pDrawable,
 		yRot - (pbox->y1 + dstYoff));
 	pbox++;
     }
+
+    fbFinishAccess (&pTile->drawable);
+    fbFinishAccess (pDrawable);
 }
 
 void


More information about the xorg-commit mailing list