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 (®ion,
- 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 (®ion);
- pbox = REGION_RECTS (®ion);
- 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, ®ion);
-
- 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 (®ion, pSrc, pMask, pDst, xSrc, ySrc,
- xMask, yMask, xDst, yDst, width, height))
- return;
-
- n = REGION_NUM_RECTS (®ion);
- pbox = REGION_RECTS (®ion);
- 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, ®ion);
-}
-
-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 (®ion,
- pSrc,
- pMask,
- pDst,
- xSrc,
- ySrc,
- xMask,
- yMask,
- xDst,
- yDst,
- width,
- height))
+ if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, xSrc, ySrc,
+ xMask, yMask, xDst, yDst, width, height))
return;
-
+
n = REGION_NUM_RECTS (®ion);
pbox = REGION_RECTS (®ion);
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, ®ion);
}
-#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 (
+ ¢er, 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