1246 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			1246 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Fill odd tiled rectangles and spans.
 | 
						|
 * no depth dependencies.
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 | 
						|
Copyright 1989, 1998  The Open Group
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
The above copyright notice and this permission notice shall be included in
 | 
						|
all copies or substantial portions of the Software.
 | 
						|
 | 
						|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
						|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
						|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 | 
						|
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
						|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
						|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
						|
 | 
						|
Except as contained in this notice, the name of The Open Group shall not be
 | 
						|
used in advertising or otherwise to promote the sale, use or other dealings
 | 
						|
in this Software without prior written authorization from The Open Group.
 | 
						|
*/
 | 
						|
 | 
						|
 | 
						|
#ifdef HAVE_DIX_CONFIG_H
 | 
						|
#include <dix-config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include <X11/X.h>
 | 
						|
#include <X11/Xmd.h>
 | 
						|
#include "servermd.h"
 | 
						|
#include "gcstruct.h"
 | 
						|
#include "window.h"
 | 
						|
#include "pixmapstr.h"
 | 
						|
#include "scrnintstr.h"
 | 
						|
#include "windowstr.h"
 | 
						|
 | 
						|
#include "cfb.h"
 | 
						|
#include "cfbmskbits.h"
 | 
						|
#include "cfb8bit.h"
 | 
						|
 | 
						|
#include "mergerop.h"
 | 
						|
 | 
						|
#if PSZ == 24
 | 
						|
#define LEFTSHIFT_AMT (3)
 | 
						|
#else /* PSZ != 24 */
 | 
						|
#define LEFTSHIFT_AMT (5 - PWSH)
 | 
						|
#endif /* PSZ == 24*/
 | 
						|
 | 
						|
#define LastTileBits {\
 | 
						|
    tmp = bits; \
 | 
						|
    if (tileEndPart) \
 | 
						|
	bits = (*pSrc & tileEndMask) | BitRight (*pSrcLine, tileEndLeftShift); \
 | 
						|
    else \
 | 
						|
	bits = *pSrc; \
 | 
						|
}
 | 
						|
 | 
						|
#if PSZ == 24
 | 
						|
#define ResetTileBits {\
 | 
						|
    pSrc = pSrcLine; \
 | 
						|
    nlwSrc = widthSrc;\
 | 
						|
    if (tileEndPart) { \
 | 
						|
	if (4 - xoff + tileEndPart <= 4) {\
 | 
						|
	    bits = *pSrc++; \
 | 
						|
	    nlwSrc--; \
 | 
						|
	} else \
 | 
						|
	    bits = BitLeft(tmp, tileEndLeftShift) | \
 | 
						|
		   BitRight(bits, tileEndRightShift); \
 | 
						|
	xoff = (xoff + xoffStep) & 3; \
 | 
						|
	leftShift = xoff << LEFTSHIFT_AMT; \
 | 
						|
	rightShift = PGSZ - leftShift; \
 | 
						|
    }\
 | 
						|
}
 | 
						|
#else
 | 
						|
#define ResetTileBits {\
 | 
						|
    pSrc = pSrcLine; \
 | 
						|
    nlwSrc = widthSrc;\
 | 
						|
    if (tileEndPart) { \
 | 
						|
	if (PPW - xoff + tileEndPart <= PPW) {\
 | 
						|
	    bits = *pSrc++; \
 | 
						|
	    nlwSrc--; \
 | 
						|
	} else \
 | 
						|
	    bits = BitLeft(tmp, tileEndLeftShift) | \
 | 
						|
		   BitRight(bits, tileEndRightShift); \
 | 
						|
	xoff = (xoff + xoffStep) & PIM; \
 | 
						|
	leftShift = xoff << LEFTSHIFT_AMT; \
 | 
						|
	rightShift = PGSZ - leftShift; \
 | 
						|
    }\
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#define NextTileBits {\
 | 
						|
    if (nlwSrc == 1) {\
 | 
						|
	LastTileBits\
 | 
						|
    } else { \
 | 
						|
    	if (nlwSrc == 0) {\
 | 
						|
	    ResetTileBits\
 | 
						|
    	} \
 | 
						|
	if (nlwSrc == 1) {\
 | 
						|
	    LastTileBits\
 | 
						|
	} else {\
 | 
						|
	    tmp = bits; \
 | 
						|
	    bits = *pSrc++; \
 | 
						|
	}\
 | 
						|
    }\
 | 
						|
    nlwSrc--; \
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
MROP_NAME(cfbFillBoxTileOdd) (pDrawable, nBox, pBox, tile, xrot, yrot, alu, planemask)
 | 
						|
    DrawablePtr	    pDrawable;
 | 
						|
    int		    nBox;	/* number of boxes to fill */
 | 
						|
    register BoxPtr pBox;	/* pointer to list of boxes to fill */
 | 
						|
    PixmapPtr	    tile;	/* tile */
 | 
						|
    int		    xrot, yrot;
 | 
						|
    int		    alu;
 | 
						|
    unsigned long   planemask;
 | 
						|
{
 | 
						|
    int tileWidth;	/* width of tile in pixels */
 | 
						|
    int tileHeight;	/* height of the tile */
 | 
						|
    int widthSrc;
 | 
						|
 | 
						|
    int widthDst;	/* width in longwords of the dest pixmap */
 | 
						|
    int w;		/* width of current box */
 | 
						|
    int h;		/* height of current box */
 | 
						|
    CfbBits startmask;
 | 
						|
    CfbBits endmask;/* masks for reggedy bits at either end of line */
 | 
						|
    int nlwMiddle;	/* number of longwords between sides of boxes */
 | 
						|
    int nlwSrc;		/* number of whole longwords in source */
 | 
						|
    
 | 
						|
    register int nlw;	/* loop version of nlwMiddle */
 | 
						|
    int srcy;		/* current tile y position */
 | 
						|
    int srcx;		/* current tile x position */
 | 
						|
    int xoffDst, xoffSrc;
 | 
						|
    int leftShift, rightShift;
 | 
						|
 | 
						|
#if MROP == 0 && PSZ == 24
 | 
						|
    DeclareMergeRop24()
 | 
						|
#else
 | 
						|
    MROP_DECLARE_REG()
 | 
						|
#endif
 | 
						|
 | 
						|
    CfbBits *pdstBase;	/* pointer to start of dest */
 | 
						|
    CfbBits *pDstLine;	/* poitner to start of dest box */
 | 
						|
    CfbBits *pSrcBase;	/* pointer to start of source */
 | 
						|
    CfbBits *pSrcLine;	/* pointer to start of source line */
 | 
						|
    register CfbBits *pDst;
 | 
						|
    register CfbBits *pSrc;
 | 
						|
    register CfbBits bits, tmp = 0;
 | 
						|
    int xoffStart, xoff;
 | 
						|
    int leftShiftStart, rightShiftStart, nlwSrcStart;
 | 
						|
    CfbBits tileEndMask;
 | 
						|
    int tileEndLeftShift, tileEndRightShift;
 | 
						|
    int	xoffStep;
 | 
						|
    int tileEndPart;
 | 
						|
    int needFirst;
 | 
						|
    CfbBits   narrow[2];
 | 
						|
    CfbBits   narrowMask = 0;
 | 
						|
    int	    narrowShift = 0;
 | 
						|
    Bool    narrowTile;
 | 
						|
 | 
						|
#if MROP == 0 && PSZ == 24
 | 
						|
    InitializeMergeRop24 (alu, planemask)
 | 
						|
#else
 | 
						|
    MROP_INITIALIZE (alu, planemask)
 | 
						|
#endif
 | 
						|
 | 
						|
    tileHeight = tile->drawable.height;
 | 
						|
    tileWidth = tile->drawable.width;
 | 
						|
    widthSrc = tile->devKind / PGSZB;
 | 
						|
    narrowTile = FALSE;
 | 
						|
    if (widthSrc == 1)
 | 
						|
    {
 | 
						|
	narrowShift = tileWidth;
 | 
						|
	narrowMask = cfbendpartial [tileWidth];
 | 
						|
	tileWidth *= 2;
 | 
						|
	widthSrc = 2;
 | 
						|
	narrowTile = TRUE;
 | 
						|
    }
 | 
						|
    pSrcBase = (CfbBits *)tile->devPrivate.ptr;
 | 
						|
 | 
						|
    cfbGetLongWidthAndPointer (pDrawable, widthDst, pdstBase)
 | 
						|
 | 
						|
#if PSZ == 24
 | 
						|
    tileEndPart = (4 - tileWidth) & 3;
 | 
						|
    tileEndMask = cfbendpartial[tileWidth & 3];
 | 
						|
#else
 | 
						|
    tileEndPart = tileWidth & PIM;
 | 
						|
    tileEndMask = cfbendpartial[tileEndPart];
 | 
						|
#endif /* PSZ == 24 */
 | 
						|
    tileEndLeftShift = (tileEndPart) << LEFTSHIFT_AMT;
 | 
						|
    tileEndRightShift = PGSZ - tileEndLeftShift;
 | 
						|
#if PSZ == 24
 | 
						|
    xoffStep = 4 - tileEndPart;
 | 
						|
#else
 | 
						|
    xoffStep = PPW - tileEndPart;
 | 
						|
#endif /* PSZ == 24 */
 | 
						|
    /*
 | 
						|
     * current assumptions: tile > 32 bits wide.
 | 
						|
     */
 | 
						|
    while (nBox--)
 | 
						|
    {
 | 
						|
	w = pBox->x2 - pBox->x1;
 | 
						|
	h = pBox->y2 - pBox->y1;
 | 
						|
	modulus (pBox->x1 - xrot, tileWidth, srcx);
 | 
						|
	modulus (pBox->y1 - yrot, tileHeight, srcy);
 | 
						|
#if PSZ == 24
 | 
						|
	xoffDst = (4 - pBox->x1) & 3;
 | 
						|
	if (w == 1  &&  (xoffDst == 0  ||  xoffDst == 1))
 | 
						|
#else
 | 
						|
	xoffDst = pBox->x1 & PIM;
 | 
						|
	if (xoffDst + w < PPW)
 | 
						|
#endif
 | 
						|
	{
 | 
						|
	    maskpartialbits(pBox->x1, w, startmask);
 | 
						|
	    endmask = 0;
 | 
						|
	    nlwMiddle = 0;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
	    maskbits (pBox->x1, w, startmask, endmask, nlwMiddle)
 | 
						|
	}
 | 
						|
#if PSZ == 24
 | 
						|
	pDstLine = pdstBase + (pBox->y1 * widthDst) + ((pBox->x1*3) >> 2);
 | 
						|
#else
 | 
						|
	pDstLine = pdstBase + (pBox->y1 * widthDst) + (pBox->x1 >> PWSH);
 | 
						|
#endif
 | 
						|
	pSrcLine = pSrcBase + (srcy * widthSrc);
 | 
						|
#if PSZ == 24
 | 
						|
	xoffSrc = (4 - srcx) & 3;
 | 
						|
#else
 | 
						|
	xoffSrc = srcx & PIM;
 | 
						|
#endif
 | 
						|
	if (xoffSrc >= xoffDst)
 | 
						|
	{
 | 
						|
	    xoffStart = xoffSrc - xoffDst;
 | 
						|
	    needFirst = 1;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
#if PSZ == 24
 | 
						|
	    xoffStart = 4 - (xoffDst - xoffSrc);
 | 
						|
#else
 | 
						|
	    xoffStart = PPW - (xoffDst - xoffSrc);
 | 
						|
#endif
 | 
						|
	    needFirst = 0;
 | 
						|
	}
 | 
						|
	leftShiftStart = (xoffStart) << LEFTSHIFT_AMT;
 | 
						|
	rightShiftStart = PGSZ - leftShiftStart;
 | 
						|
#if PSZ == 24
 | 
						|
	nlwSrcStart = widthSrc - ((srcx*3) >> 2);
 | 
						|
#else
 | 
						|
	nlwSrcStart = widthSrc - (srcx >> PWSH);
 | 
						|
#endif
 | 
						|
	while (h--)
 | 
						|
	{
 | 
						|
	    /* XXX only works when narrowShift >= PPW/2 */
 | 
						|
	    if (narrowTile)
 | 
						|
	    {
 | 
						|
		tmp = pSrcBase[srcy] & narrowMask; /* source width == 1 */
 | 
						|
		narrow[0] = tmp | SCRRIGHT (tmp, narrowShift);
 | 
						|
#if PSZ == 24
 | 
						|
		narrow[1] = BitLeft (tmp, 8) |
 | 
						|
			    BitRight(tmp, 16);
 | 
						|
#else
 | 
						|
		narrow[1] = SCRLEFT (tmp, PPW - narrowShift) |
 | 
						|
			    SCRRIGHT(tmp, 2 * narrowShift - PPW);
 | 
						|
#endif
 | 
						|
		pSrcLine = narrow;
 | 
						|
	    }
 | 
						|
	    xoff = xoffStart;
 | 
						|
	    leftShift = leftShiftStart;
 | 
						|
	    rightShift = rightShiftStart;
 | 
						|
	    nlwSrc = nlwSrcStart;
 | 
						|
#if PSZ == 24
 | 
						|
	    pSrc = pSrcLine + ((srcx * 3) >> 2);
 | 
						|
#else
 | 
						|
	    pSrc = pSrcLine + (srcx >> PWSH);
 | 
						|
#endif
 | 
						|
	    pDst = pDstLine;
 | 
						|
	    bits = 0;
 | 
						|
	    if (needFirst)
 | 
						|
	    {
 | 
						|
		NextTileBits
 | 
						|
	    }
 | 
						|
	    if (startmask)
 | 
						|
	    {
 | 
						|
		NextTileBits
 | 
						|
		tmp = BitLeft(tmp, leftShift);
 | 
						|
 		if (rightShift != PGSZ)
 | 
						|
		    tmp |= BitRight(bits,rightShift);
 | 
						|
		*pDst = MROP_MASK (tmp, *pDst, startmask);
 | 
						|
		++pDst;
 | 
						|
	    }
 | 
						|
	    nlw = nlwMiddle;
 | 
						|
	    while (nlw)
 | 
						|
	    {
 | 
						|
#if MROP == Mcopy
 | 
						|
		if (nlwSrc > 1)
 | 
						|
		{
 | 
						|
		    int nlwPart = nlw;
 | 
						|
 | 
						|
		    if (nlwPart >= nlwSrc)
 | 
						|
			nlwPart = nlwSrc - 1;
 | 
						|
		    nlw -= nlwPart;
 | 
						|
		    nlwSrc -= nlwPart;
 | 
						|
		    if (rightShift != PGSZ)
 | 
						|
		    {
 | 
						|
			while (nlwPart--)
 | 
						|
			{
 | 
						|
			    tmp = bits;
 | 
						|
			    bits = *pSrc++;
 | 
						|
			    *pDst = MROP_SOLID(BitLeft(tmp, leftShift) |
 | 
						|
					      BitRight (bits, rightShift),
 | 
						|
					      *pDst);
 | 
						|
			    ++pDst;
 | 
						|
			}
 | 
						|
		    }
 | 
						|
		    else
 | 
						|
		    {
 | 
						|
			if (nlwPart)
 | 
						|
			{
 | 
						|
			    *pDst = MROP_SOLID (bits, *pDst);
 | 
						|
			    ++pDst;
 | 
						|
			    nlwPart--;
 | 
						|
			    while (nlwPart--)
 | 
						|
			    {
 | 
						|
				*pDst = MROP_SOLID(*pSrc, *pDst);
 | 
						|
				++pDst; ++pSrc;
 | 
						|
			    }
 | 
						|
			    bits = *pSrc++;
 | 
						|
			}
 | 
						|
		    }
 | 
						|
		}
 | 
						|
		else
 | 
						|
#endif
 | 
						|
		{
 | 
						|
		    NextTileBits
 | 
						|
		    if (rightShift != PGSZ)
 | 
						|
		    {
 | 
						|
			*pDst = MROP_SOLID(BitLeft(tmp, leftShift) |
 | 
						|
					   BitRight(bits, rightShift),
 | 
						|
					   *pDst);
 | 
						|
		    }
 | 
						|
		    else
 | 
						|
		    {
 | 
						|
			*pDst = MROP_SOLID (tmp, *pDst);
 | 
						|
		    }
 | 
						|
		    ++pDst;
 | 
						|
		    nlw--;
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	    if (endmask)
 | 
						|
	    {
 | 
						|
		NextTileBits
 | 
						|
		if (rightShift == PGSZ)
 | 
						|
		    bits = 0;
 | 
						|
		*pDst = MROP_MASK (BitLeft(tmp, leftShift) |
 | 
						|
				   BitRight(bits,rightShift),
 | 
						|
				   *pDst, endmask);
 | 
						|
	    }
 | 
						|
	    pDstLine += widthDst;
 | 
						|
	    pSrcLine += widthSrc;
 | 
						|
	    if (++srcy == tileHeight)
 | 
						|
	    {
 | 
						|
		srcy = 0;
 | 
						|
		pSrcLine = pSrcBase;
 | 
						|
	    }
 | 
						|
	}
 | 
						|
	pBox++;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
MROP_NAME(cfbFillSpanTileOdd) (pDrawable, n, ppt, pwidth, tile, xrot, yrot, alu, planemask)
 | 
						|
    DrawablePtr	pDrawable;
 | 
						|
    int		n;
 | 
						|
    DDXPointPtr	ppt;
 | 
						|
    int		*pwidth;
 | 
						|
    PixmapPtr	tile;
 | 
						|
    int		xrot, yrot;
 | 
						|
    int		alu;
 | 
						|
    unsigned long   planemask;
 | 
						|
{
 | 
						|
    int tileWidth;	/* width of tile in pixels */
 | 
						|
    int tileHeight;	/* height of the tile */
 | 
						|
    int widthSrc;
 | 
						|
 | 
						|
    int widthDst;		/* width in longwords of the dest pixmap */
 | 
						|
    int w;		/* width of current span */
 | 
						|
    CfbBits startmask;
 | 
						|
    CfbBits endmask;	/* masks for reggedy bits at either end of line */
 | 
						|
    int nlwSrc;		/* number of whole longwords in source */
 | 
						|
    
 | 
						|
    register int nlw;	/* loop version of nlwMiddle */
 | 
						|
    int srcy;		/* current tile y position */
 | 
						|
    int srcx;		/* current tile x position */
 | 
						|
    int xoffDst, xoffSrc;
 | 
						|
    int leftShift, rightShift;
 | 
						|
 | 
						|
#if MROP == 0 && PSZ == 24
 | 
						|
    DeclareMergeRop24()
 | 
						|
#else
 | 
						|
    MROP_DECLARE_REG()
 | 
						|
#endif
 | 
						|
 | 
						|
    CfbBits *pdstBase;	/* pointer to start of dest */
 | 
						|
    CfbBits *pDstLine;	/* poitner to start of dest box */
 | 
						|
    CfbBits *pSrcBase;	/* pointer to start of source */
 | 
						|
    CfbBits *pSrcLine;	/* pointer to start of source line */
 | 
						|
    register CfbBits *pDst;
 | 
						|
    register CfbBits *pSrc;
 | 
						|
    register CfbBits bits, tmp = 0;
 | 
						|
    int xoffStart, xoff;
 | 
						|
    int leftShiftStart, rightShiftStart, nlwSrcStart;
 | 
						|
    CfbBits tileEndMask;
 | 
						|
    int tileEndLeftShift, tileEndRightShift;
 | 
						|
    int	xoffStep;
 | 
						|
    int tileEndPart;
 | 
						|
    int needFirst;
 | 
						|
    CfbBits   narrow[2];
 | 
						|
    CfbBits   narrowMask = 0;
 | 
						|
    int	    narrowShift = 0;
 | 
						|
    Bool    narrowTile;
 | 
						|
 | 
						|
#if MROP == 0 && PSZ == 24
 | 
						|
    InitializeMergeRop24 (alu, planemask)
 | 
						|
#else
 | 
						|
    MROP_INITIALIZE (alu, planemask)
 | 
						|
#endif
 | 
						|
 | 
						|
    tileHeight = tile->drawable.height;
 | 
						|
    tileWidth = tile->drawable.width;
 | 
						|
    widthSrc = tile->devKind / PGSZB;
 | 
						|
    narrowTile = FALSE;
 | 
						|
    if (widthSrc == 1)
 | 
						|
    {
 | 
						|
	narrowShift = tileWidth;
 | 
						|
	narrowMask = cfbendpartial [tileWidth];
 | 
						|
	tileWidth *= 2;
 | 
						|
	widthSrc = 2;
 | 
						|
	narrowTile = TRUE;
 | 
						|
    }
 | 
						|
    pSrcBase = (CfbBits *)tile->devPrivate.ptr;
 | 
						|
 | 
						|
    cfbGetLongWidthAndPointer (pDrawable, widthDst, pdstBase)
 | 
						|
 | 
						|
#if PSZ == 24
 | 
						|
    tileEndPart = (4 - tileWidth) & 3;
 | 
						|
    tileEndMask = cfbendpartial[tileWidth & 3];
 | 
						|
#else
 | 
						|
    tileEndPart = tileWidth & PIM;
 | 
						|
    tileEndMask = cfbendpartial[tileEndPart];
 | 
						|
#endif
 | 
						|
    tileEndLeftShift = (tileEndPart) << LEFTSHIFT_AMT;
 | 
						|
    tileEndRightShift = PGSZ - tileEndLeftShift;
 | 
						|
#if PSZ == 24
 | 
						|
    xoffStep = 4 - tileEndPart;
 | 
						|
#else
 | 
						|
    xoffStep = PPW - tileEndPart;
 | 
						|
#endif
 | 
						|
    while (n--)
 | 
						|
    {
 | 
						|
	w = *pwidth++;
 | 
						|
	modulus (ppt->x - xrot, tileWidth, srcx);
 | 
						|
	modulus (ppt->y - yrot, tileHeight, srcy);
 | 
						|
#if PSZ == 24
 | 
						|
	xoffDst = (4 - ppt->x) & 3;
 | 
						|
	if (w == 1  &&  (xoffDst == 0  ||  xoffDst == 1))
 | 
						|
#else
 | 
						|
	xoffDst = ppt->x & PIM;
 | 
						|
	if (xoffDst + w < PPW)
 | 
						|
#endif
 | 
						|
	{
 | 
						|
	    maskpartialbits(ppt->x, w, startmask);
 | 
						|
	    endmask = 0;
 | 
						|
	    nlw = 0;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
	    maskbits (ppt->x, w, startmask, endmask, nlw)
 | 
						|
	}
 | 
						|
#if PSZ == 24
 | 
						|
	pDstLine = pdstBase + (ppt->y * widthDst)  + ((ppt->x *3)>> 2);
 | 
						|
#else
 | 
						|
	pDstLine = pdstBase + (ppt->y * widthDst) + (ppt->x >> PWSH);
 | 
						|
#endif
 | 
						|
	pSrcLine = pSrcBase + (srcy * widthSrc);
 | 
						|
#if PSZ == 24
 | 
						|
	xoffSrc = (4 - srcx) & 3;
 | 
						|
#else
 | 
						|
	xoffSrc = srcx & PIM;
 | 
						|
#endif
 | 
						|
	if (xoffSrc >= xoffDst)
 | 
						|
	{
 | 
						|
	    xoffStart = xoffSrc - xoffDst;
 | 
						|
	    needFirst = 1;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
#if PSZ == 24
 | 
						|
	    xoffStart = 4 - (xoffDst - xoffSrc);
 | 
						|
#else
 | 
						|
	    xoffStart = PPW - (xoffDst - xoffSrc);
 | 
						|
#endif
 | 
						|
	    needFirst = 0;
 | 
						|
	}
 | 
						|
	leftShiftStart = (xoffStart) << LEFTSHIFT_AMT;
 | 
						|
	rightShiftStart = PGSZ - leftShiftStart;
 | 
						|
#if PSZ == 24
 | 
						|
	nlwSrcStart = widthSrc - ((srcx*3) >> 2);
 | 
						|
#else
 | 
						|
	nlwSrcStart = widthSrc - (srcx >> PWSH);
 | 
						|
#endif
 | 
						|
	/* XXX only works when narrowShift >= PPW/2 */
 | 
						|
	if (narrowTile)
 | 
						|
	{
 | 
						|
	    tmp = pSrcBase[srcy] & narrowMask;	/* source width == 1 */
 | 
						|
	    narrow[0] = tmp | SCRRIGHT (tmp, narrowShift);
 | 
						|
#if PSZ == 24
 | 
						|
	    narrow[1] = BitLeft (tmp, 8) |
 | 
						|
			BitRight(tmp, 16);
 | 
						|
#else
 | 
						|
	    narrow[1] = SCRLEFT (tmp, PPW - narrowShift) |
 | 
						|
			SCRRIGHT(tmp, 2 * narrowShift - PPW);
 | 
						|
#endif
 | 
						|
	    pSrcLine = narrow;
 | 
						|
	}
 | 
						|
	xoff = xoffStart;
 | 
						|
	leftShift = leftShiftStart;
 | 
						|
	rightShift = rightShiftStart;
 | 
						|
	nlwSrc = nlwSrcStart;
 | 
						|
#if PSZ == 24
 | 
						|
	pSrc = pSrcLine + ((srcx * 3) >> 2);
 | 
						|
#else
 | 
						|
	pSrc = pSrcLine + (srcx >> PWSH);
 | 
						|
#endif
 | 
						|
	pDst = pDstLine;
 | 
						|
	bits = 0;
 | 
						|
	if (needFirst)
 | 
						|
	{
 | 
						|
	    NextTileBits
 | 
						|
	}
 | 
						|
	if (startmask)
 | 
						|
	{
 | 
						|
	    NextTileBits
 | 
						|
	    tmp = BitLeft(tmp, leftShift);
 | 
						|
	    if (rightShift != PGSZ)
 | 
						|
		tmp |= BitRight(bits,rightShift);
 | 
						|
	    *pDst = MROP_MASK (tmp, *pDst, startmask);
 | 
						|
	    ++pDst;
 | 
						|
	}
 | 
						|
	while (nlw)
 | 
						|
	{
 | 
						|
#if MROP == Mcopy
 | 
						|
	    if (nlwSrc > 1)
 | 
						|
	    {
 | 
						|
		int nlwPart = nlw;
 | 
						|
 | 
						|
		if (nlwPart >= nlwSrc)
 | 
						|
		    nlwPart = nlwSrc - 1;
 | 
						|
		nlw -= nlwPart;
 | 
						|
		nlwSrc -= nlwPart;
 | 
						|
		if (rightShift != PGSZ)
 | 
						|
		{
 | 
						|
		    while (nlwPart--)
 | 
						|
		    {
 | 
						|
			tmp = bits;
 | 
						|
			bits = *pSrc++;
 | 
						|
			*pDst = MROP_SOLID(BitLeft(tmp, leftShift) |
 | 
						|
					  BitRight (bits, rightShift),
 | 
						|
					  *pDst);
 | 
						|
			++pDst;
 | 
						|
		    }
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
		    if (nlwPart)
 | 
						|
		    {
 | 
						|
			*pDst = MROP_SOLID (bits, *pDst);
 | 
						|
			++pDst;
 | 
						|
			nlwPart--;
 | 
						|
			while (nlwPart--)
 | 
						|
			{
 | 
						|
			    *pDst = MROP_SOLID(*pSrc, *pDst);
 | 
						|
			    ++pDst; ++pSrc;
 | 
						|
			}
 | 
						|
			bits = *pSrc++;
 | 
						|
		    }
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	    else
 | 
						|
#endif
 | 
						|
	    {
 | 
						|
		NextTileBits
 | 
						|
		if (rightShift != PGSZ)
 | 
						|
		{
 | 
						|
		    *pDst = MROP_SOLID(BitLeft(tmp, leftShift) |
 | 
						|
				       BitRight(bits, rightShift),
 | 
						|
				       *pDst);
 | 
						|
		    ++pDst;
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
		    *pDst = MROP_SOLID (tmp, *pDst);
 | 
						|
		    ++pDst;
 | 
						|
		}
 | 
						|
		nlw--;
 | 
						|
	    }
 | 
						|
	}
 | 
						|
	if (endmask)
 | 
						|
	{
 | 
						|
	    NextTileBits
 | 
						|
	    if (rightShift == PGSZ)
 | 
						|
		bits = 0;
 | 
						|
	    *pDst = MROP_MASK (BitLeft(tmp, leftShift) |
 | 
						|
			       BitRight(bits,rightShift),
 | 
						|
			       *pDst, endmask);
 | 
						|
	}
 | 
						|
	ppt++;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
# include "fastblt.h"
 | 
						|
 | 
						|
#define IncSrcPtr   psrc++; if (!--srcRemaining) { srcRemaining = widthSrc; psrc = psrcStart; }
 | 
						|
 | 
						|
void
 | 
						|
MROP_NAME(cfbFillBoxTile32s) (pDrawable, nBox, pBox, tile, xrot, yrot, alu, planemask)
 | 
						|
    DrawablePtr	    pDrawable;
 | 
						|
    int		    nBox;	/* number of boxes to fill */
 | 
						|
    register BoxPtr pBox;	/* pointer to list of boxes to fill */
 | 
						|
    PixmapPtr	    tile;	/* tile */
 | 
						|
    int		    xrot, yrot;
 | 
						|
    int		    alu;
 | 
						|
    unsigned long   planemask;
 | 
						|
{
 | 
						|
    int	tileWidth;	/* width of tile */
 | 
						|
    int tileHeight;	/* height of the tile */
 | 
						|
    int	widthSrc;	/* width in longwords of the source tile */
 | 
						|
 | 
						|
    int widthDst;	/* width in longwords of the dest pixmap */
 | 
						|
    int w;		/* width of current box */
 | 
						|
    int h;		/* height of current box */
 | 
						|
    CfbBits startmask;
 | 
						|
    CfbBits endmask;/* masks for reggedy bits at either end of line */
 | 
						|
    int nlMiddle;	/* number of longwords between sides of boxes */
 | 
						|
    
 | 
						|
    register int nl;	/* loop version of nlMiddle */
 | 
						|
    int srcy;		/* current tile y position */
 | 
						|
    int srcx;		/* current tile x position */
 | 
						|
    int	srcRemaining;	/* number of longwords remaining in source */
 | 
						|
    int xoffDst, xoffSrc;
 | 
						|
    int	srcStart;	/* number of longwords source offset at left of box */
 | 
						|
    int	leftShift, rightShift;
 | 
						|
 | 
						|
#if MROP == 0 && PSZ == 24
 | 
						|
    DeclareMergeRop24()
 | 
						|
#else
 | 
						|
    MROP_DECLARE_REG()
 | 
						|
#endif
 | 
						|
 | 
						|
    CfbBits	    *pdstBase;	/* pointer to start of dest */
 | 
						|
    CfbBits	    *pdstLine;	/* poitner to start of dest box */
 | 
						|
    CfbBits	    *psrcBase;	/* pointer to start of source */
 | 
						|
    CfbBits	    *psrcLine;	/* pointer to fetch point of source */
 | 
						|
    CfbBits	    *psrcStart;	/* pointer to start of source line */
 | 
						|
    register CfbBits  *pdst;
 | 
						|
    register CfbBits  *psrc;
 | 
						|
    register CfbBits  bits, bits1;
 | 
						|
    register int	    nlTemp;
 | 
						|
 | 
						|
#if MROP == 0 && PSZ == 24
 | 
						|
    InitializeMergeRop24 (alu, planemask)
 | 
						|
#else
 | 
						|
    MROP_INITIALIZE (alu, planemask)
 | 
						|
#endif
 | 
						|
 | 
						|
    psrcBase = (CfbBits *)tile->devPrivate.ptr;
 | 
						|
    tileHeight = tile->drawable.height;
 | 
						|
    tileWidth = tile->drawable.width;
 | 
						|
#if PSZ == 24
 | 
						|
    widthSrc = tile->devKind / PGSZB;
 | 
						|
#else
 | 
						|
    widthSrc = tileWidth >> PWSH;
 | 
						|
#endif
 | 
						|
 | 
						|
    cfbGetLongWidthAndPointer (pDrawable, widthDst, pdstBase)
 | 
						|
 | 
						|
    while (nBox--)
 | 
						|
    {
 | 
						|
	w = pBox->x2 - pBox->x1;
 | 
						|
	h = pBox->y2 - pBox->y1;
 | 
						|
 | 
						|
	/* set up source */
 | 
						|
	modulus (pBox->x1 - xrot, tileWidth, srcx);
 | 
						|
	modulus (pBox->y1 - yrot, tileHeight, srcy);
 | 
						|
#if PSZ == 24
 | 
						|
	xoffSrc = (4 - srcx) & 3;
 | 
						|
	srcStart = (srcx * 3) >> 2;
 | 
						|
#else
 | 
						|
	xoffSrc = srcx & PIM;
 | 
						|
	srcStart = (srcx >> PWSH);
 | 
						|
#endif
 | 
						|
	psrcStart = psrcBase + (srcy * widthSrc);
 | 
						|
	psrcLine = psrcStart + srcStart;
 | 
						|
 | 
						|
	/* set up dest */
 | 
						|
#if PSZ == 24
 | 
						|
	xoffDst = (4 - pBox->x1) & 3;
 | 
						|
	pdstLine = pdstBase + (pBox->y1 * widthDst) + ((pBox->x1*3) >> 2);
 | 
						|
#else
 | 
						|
	xoffDst = pBox->x1 & PIM;
 | 
						|
	pdstLine = pdstBase + (pBox->y1 * widthDst) + (pBox->x1 >> PWSH);
 | 
						|
#endif
 | 
						|
	/* set up masks */
 | 
						|
#if PSZ == 24
 | 
						|
	if (w == 1  &&  (xoffDst == 0  ||  xoffDst == 1))
 | 
						|
#else
 | 
						|
	if (xoffDst + w < PPW)
 | 
						|
#endif
 | 
						|
	{
 | 
						|
	    maskpartialbits(pBox->x1, w, startmask);
 | 
						|
	    endmask = 0;
 | 
						|
	    nlMiddle = 0;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
	    maskbits (pBox->x1, w, startmask, endmask, nlMiddle)
 | 
						|
	}
 | 
						|
	if (xoffSrc == xoffDst)
 | 
						|
	{
 | 
						|
	    while (h--)
 | 
						|
	    {
 | 
						|
		psrc = psrcLine;
 | 
						|
		pdst = pdstLine;
 | 
						|
		srcRemaining = widthSrc - srcStart;
 | 
						|
		if (startmask)
 | 
						|
		{
 | 
						|
		    *pdst = MROP_MASK (*psrc, *pdst, startmask);
 | 
						|
		    pdst++;
 | 
						|
		    IncSrcPtr
 | 
						|
		}
 | 
						|
		nlTemp = nlMiddle;
 | 
						|
		while (nlTemp)
 | 
						|
		{
 | 
						|
		    nl = nlTemp;
 | 
						|
		    if (nl > srcRemaining)
 | 
						|
			nl = srcRemaining;
 | 
						|
 | 
						|
		    nlTemp -= nl;
 | 
						|
		    srcRemaining -= nl;
 | 
						|
 | 
						|
#if MROP == Mcopy
 | 
						|
#ifdef LARGE_INSTRUCTION_CACHE
 | 
						|
#ifdef FAST_CONSTANT_OFFSET_MODE
 | 
						|
 | 
						|
		    psrc += nl & (UNROLL-1);
 | 
						|
		    pdst += nl & (UNROLL-1);
 | 
						|
 | 
						|
#define BodyOdd(n) pdst[-n] = MROP_SOLID (psrc[-n], pdst[-n]);
 | 
						|
#define BodyEven(n) pdst[-n] = MROP_SOLID (psrc[-n], pdst[-n]);
 | 
						|
 | 
						|
#define LoopReset \
 | 
						|
pdst += UNROLL; \
 | 
						|
psrc += UNROLL;
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
#define BodyOdd(n)  *pdst = MROP_SOLID (*psrc, *pdst); pdst++; psrc++;
 | 
						|
#define BodyEven(n) BodyOdd(n)
 | 
						|
 | 
						|
#define LoopReset   ;
 | 
						|
 | 
						|
#endif
 | 
						|
		    PackedLoop
 | 
						|
 | 
						|
#undef BodyOdd
 | 
						|
#undef BodyEven
 | 
						|
#undef LoopReset
 | 
						|
 | 
						|
#else
 | 
						|
		    DuffL(nl, label1,
 | 
						|
			    *pdst = MROP_SOLID (*psrc, *pdst);
 | 
						|
			    pdst++; psrc++;)
 | 
						|
#endif
 | 
						|
#else
 | 
						|
		    while (nl--) {
 | 
						|
			    *pdst = MROP_SOLID (*psrc, *pdst);
 | 
						|
			    pdst++; psrc++;
 | 
						|
		    }
 | 
						|
#endif
 | 
						|
		    if (!srcRemaining)
 | 
						|
		    {
 | 
						|
			srcRemaining = widthSrc;
 | 
						|
			psrc = psrcStart;
 | 
						|
		    }
 | 
						|
		}
 | 
						|
		if (endmask)
 | 
						|
		{
 | 
						|
		    *pdst = MROP_MASK (*psrc, *pdst, endmask);
 | 
						|
		}
 | 
						|
		pdstLine += widthDst;
 | 
						|
		psrcLine += widthSrc;
 | 
						|
		psrcStart += widthSrc;
 | 
						|
		if (++srcy == tileHeight)
 | 
						|
		{
 | 
						|
		    psrcStart = psrcBase;
 | 
						|
		    psrcLine = psrcStart + srcStart;
 | 
						|
		    srcy = 0;
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
	    if (xoffSrc > xoffDst)
 | 
						|
	    {
 | 
						|
		leftShift = (xoffSrc - xoffDst) << LEFTSHIFT_AMT;
 | 
						|
		rightShift = PGSZ - leftShift;
 | 
						|
	    }
 | 
						|
	    else
 | 
						|
	    {
 | 
						|
		rightShift = (xoffDst - xoffSrc) << LEFTSHIFT_AMT;
 | 
						|
		leftShift = PGSZ - rightShift;
 | 
						|
	    }
 | 
						|
	    while (h--)
 | 
						|
	    {
 | 
						|
		psrc = psrcLine;
 | 
						|
		pdst = pdstLine;
 | 
						|
		bits = 0;
 | 
						|
		srcRemaining = widthSrc - srcStart;
 | 
						|
		if (xoffSrc > xoffDst)
 | 
						|
		{
 | 
						|
		    bits = *psrc;
 | 
						|
		    IncSrcPtr
 | 
						|
		}
 | 
						|
		if (startmask)
 | 
						|
		{
 | 
						|
		    bits1 = BitLeft(bits,leftShift);
 | 
						|
		    bits = *psrc;
 | 
						|
		    IncSrcPtr
 | 
						|
		    bits1 |= BitRight(bits,rightShift);
 | 
						|
		    *pdst = MROP_MASK(bits1, *pdst, startmask);
 | 
						|
		    pdst++;
 | 
						|
		}
 | 
						|
		nlTemp = nlMiddle;
 | 
						|
		while (nlTemp)
 | 
						|
		{
 | 
						|
		    nl = nlTemp;
 | 
						|
		    if (nl > srcRemaining)
 | 
						|
			nl = srcRemaining;
 | 
						|
 | 
						|
		    nlTemp -= nl;
 | 
						|
		    srcRemaining -= nl;
 | 
						|
    
 | 
						|
#if MROP == Mcopy
 | 
						|
#ifdef LARGE_INSTRUCTION_CACHE
 | 
						|
		    bits1 = bits;
 | 
						|
    
 | 
						|
#ifdef FAST_CONSTANT_OFFSET_MODE
 | 
						|
    
 | 
						|
		    psrc += nl & (UNROLL-1);
 | 
						|
		    pdst += nl & (UNROLL-1);
 | 
						|
    
 | 
						|
#define BodyOdd(n) \
 | 
						|
    bits = psrc[-n]; \
 | 
						|
    pdst[-n] = MROP_SOLID(BitLeft(bits1, leftShift) | BitRight(bits, rightShift), pdst[-n]);
 | 
						|
    
 | 
						|
#define BodyEven(n) \
 | 
						|
    bits1 = psrc[-n]; \
 | 
						|
    pdst[-n] = MROP_SOLID(BitLeft(bits, leftShift) | BitRight(bits1, rightShift), pdst[-n]);
 | 
						|
    
 | 
						|
#define LoopReset \
 | 
						|
    pdst += UNROLL; \
 | 
						|
    psrc += UNROLL;
 | 
						|
    
 | 
						|
#else
 | 
						|
    
 | 
						|
#define BodyOdd(n) \
 | 
						|
    bits = *psrc++; \
 | 
						|
    *pdst = MROP_SOLID(BitLeft(bits1, leftShift) | BitRight(bits, rightShift), *pdst); \
 | 
						|
    pdst++;
 | 
						|
	       	   
 | 
						|
#define BodyEven(n) \
 | 
						|
    bits1 = *psrc++; \
 | 
						|
    *pdst = MROP_SOLID(BitLeft(bits, leftShift) | BitRight(bits1, rightShift), *pdst); \
 | 
						|
    pdst++;
 | 
						|
    
 | 
						|
#define LoopReset   ;
 | 
						|
    
 | 
						|
#endif	/* !FAST_CONSTANT_OFFSET_MODE */
 | 
						|
    
 | 
						|
		    PackedLoop
 | 
						|
    
 | 
						|
#undef BodyOdd
 | 
						|
#undef BodyEven
 | 
						|
#undef LoopReset
 | 
						|
    
 | 
						|
#else
 | 
						|
		    DuffL (nl,label2,
 | 
						|
		    	bits1 = BitLeft(bits, leftShift);
 | 
						|
		    	bits = *psrc++;
 | 
						|
		    	*pdst = MROP_SOLID (bits1 | BitRight(bits, rightShift), *pdst);
 | 
						|
		    	pdst++;
 | 
						|
		    )
 | 
						|
#endif
 | 
						|
#else
 | 
						|
		    while (nl--) {
 | 
						|
		    	bits1 = BitLeft(bits, leftShift);
 | 
						|
		    	bits = *psrc++;
 | 
						|
		    	*pdst = MROP_SOLID (bits1 | BitRight(bits, rightShift), *pdst);
 | 
						|
		    	pdst++;
 | 
						|
		    }
 | 
						|
#endif
 | 
						|
		    if (!srcRemaining)
 | 
						|
		    {
 | 
						|
			srcRemaining = widthSrc;
 | 
						|
			psrc = psrcStart;
 | 
						|
		    }
 | 
						|
		}
 | 
						|
 | 
						|
		if (endmask)
 | 
						|
		{
 | 
						|
		    bits1 = BitLeft(bits, leftShift);
 | 
						|
		    if (BitLeft(endmask, rightShift))
 | 
						|
		    {
 | 
						|
			bits = *psrc;
 | 
						|
			bits1 |= BitRight(bits, rightShift);
 | 
						|
		    }
 | 
						|
		    *pdst = MROP_MASK (bits1, *pdst, endmask);
 | 
						|
		}
 | 
						|
		pdstLine += widthDst;
 | 
						|
		psrcLine += widthSrc;
 | 
						|
		psrcStart += widthSrc;
 | 
						|
		if (++srcy == tileHeight)
 | 
						|
		{
 | 
						|
		    psrcStart = psrcBase;
 | 
						|
		    psrcLine = psrcStart + srcStart;
 | 
						|
		    srcy = 0;
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	}
 | 
						|
	pBox++;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
MROP_NAME(cfbFillSpanTile32s) (pDrawable, n, ppt, pwidth, tile, xrot, yrot, alu, planemask)
 | 
						|
    DrawablePtr	pDrawable;
 | 
						|
    int		n;
 | 
						|
    DDXPointPtr	ppt;
 | 
						|
    int		*pwidth;
 | 
						|
    PixmapPtr	tile;
 | 
						|
    int		xrot, yrot;
 | 
						|
    int		alu;
 | 
						|
    unsigned long   planemask;
 | 
						|
{
 | 
						|
    int	tileWidth;	/* width of tile */
 | 
						|
    int tileHeight;	/* height of the tile */
 | 
						|
    int	widthSrc;	/* width in longwords of the source tile */
 | 
						|
 | 
						|
    int widthDst;	/* width in longwords of the dest pixmap */
 | 
						|
    int w;		/* width of current box */
 | 
						|
    CfbBits startmask;
 | 
						|
    CfbBits endmask;/* masks for reggedy bits at either end of line */
 | 
						|
    int nlMiddle;	/* number of longwords between sides of boxes */
 | 
						|
    
 | 
						|
    register int nl;	/* loop version of nlMiddle */
 | 
						|
    int srcy;		/* current tile y position */
 | 
						|
    int srcx;		/* current tile x position */
 | 
						|
    int	srcRemaining;	/* number of longwords remaining in source */
 | 
						|
    int xoffDst, xoffSrc;
 | 
						|
    int	srcStart;	/* number of longwords source offset at left of box */
 | 
						|
    int	leftShift, rightShift;
 | 
						|
 | 
						|
#if MROP == 0 && PSZ == 24
 | 
						|
    DeclareMergeRop24()
 | 
						|
#else
 | 
						|
    MROP_DECLARE_REG()
 | 
						|
#endif
 | 
						|
 | 
						|
    CfbBits	    *pdstBase;	/* pointer to start of dest */
 | 
						|
    CfbBits	    *pdstLine;	/* poitner to start of dest box */
 | 
						|
    CfbBits	    *psrcBase;	/* pointer to start of source */
 | 
						|
    CfbBits	    *psrcLine;	/* pointer to fetch point of source */
 | 
						|
    CfbBits	    *psrcStart;	/* pointer to start of source line */
 | 
						|
    register CfbBits  *pdst;
 | 
						|
    register CfbBits  *psrc;
 | 
						|
    register CfbBits  bits, bits1;
 | 
						|
    register int	    nlTemp;
 | 
						|
 | 
						|
#if MROP == 0 && PSZ == 24
 | 
						|
    InitializeMergeRop24 (alu, planemask)
 | 
						|
#else
 | 
						|
    MROP_INITIALIZE (alu, planemask)
 | 
						|
#endif
 | 
						|
 | 
						|
    psrcBase = (CfbBits *)tile->devPrivate.ptr;
 | 
						|
    tileHeight = tile->drawable.height;
 | 
						|
    tileWidth = tile->drawable.width;
 | 
						|
#if PSZ == 24
 | 
						|
    widthSrc = tile->devKind / PGSZB;
 | 
						|
#else
 | 
						|
    widthSrc = tileWidth >> PWSH;
 | 
						|
#endif
 | 
						|
 | 
						|
    cfbGetLongWidthAndPointer (pDrawable, widthDst, pdstBase)
 | 
						|
 | 
						|
    while (n--)
 | 
						|
    {
 | 
						|
	w = *pwidth++;
 | 
						|
 | 
						|
	/* set up source */
 | 
						|
	modulus (ppt->x - xrot, tileWidth, srcx);
 | 
						|
	modulus (ppt->y - yrot, tileHeight, srcy);
 | 
						|
#if PSZ == 24
 | 
						|
	xoffSrc = (4 - srcx) & 3;
 | 
						|
	srcStart = (srcx * 3) >> 2;
 | 
						|
#else
 | 
						|
	xoffSrc = srcx & PIM;
 | 
						|
	srcStart = (srcx >> PWSH);
 | 
						|
#endif
 | 
						|
	psrcStart = psrcBase + (srcy * widthSrc);
 | 
						|
	psrcLine = psrcStart + srcStart;
 | 
						|
 | 
						|
	/* set up dest */
 | 
						|
#if PSZ == 24
 | 
						|
	xoffDst = (4 - ppt->x) & 3;
 | 
						|
	pdstLine = pdstBase + (ppt->y * widthDst) + ((ppt->x *3) >> 2);
 | 
						|
	/* set up masks */
 | 
						|
	if (w == 1  &&  (xoffDst == 0  ||  xoffDst == 1))
 | 
						|
#else
 | 
						|
	xoffDst = ppt->x & PIM;
 | 
						|
	pdstLine = pdstBase + (ppt->y * widthDst) + (ppt->x >> PWSH);
 | 
						|
	/* set up masks */
 | 
						|
	if (xoffDst + w < PPW)
 | 
						|
#endif
 | 
						|
	{
 | 
						|
	    maskpartialbits(ppt->x, w, startmask);
 | 
						|
	    endmask = 0;
 | 
						|
	    nlMiddle = 0;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
	    maskbits (ppt->x, w, startmask, endmask, nlMiddle)
 | 
						|
	}
 | 
						|
 | 
						|
	if (xoffSrc == xoffDst)
 | 
						|
	{
 | 
						|
	    psrc = psrcLine;
 | 
						|
	    pdst = pdstLine;
 | 
						|
	    srcRemaining = widthSrc - srcStart;
 | 
						|
	    if (startmask)
 | 
						|
	    {
 | 
						|
		*pdst = MROP_MASK (*psrc, *pdst, startmask);
 | 
						|
		pdst++;
 | 
						|
		IncSrcPtr
 | 
						|
	    }
 | 
						|
	    nlTemp = nlMiddle;
 | 
						|
	    while (nlTemp)
 | 
						|
	    {
 | 
						|
		nl = nlTemp;
 | 
						|
		if (nl > srcRemaining)
 | 
						|
		    nl = srcRemaining;
 | 
						|
 | 
						|
		nlTemp -= nl;
 | 
						|
		srcRemaining -= nl;
 | 
						|
 | 
						|
#if MROP == Mcopy
 | 
						|
#ifdef LARGE_INSTRUCTION_CACHE
 | 
						|
#ifdef FAST_CONSTANT_OFFSET_MODE
 | 
						|
 | 
						|
		psrc += nl & (UNROLL-1);
 | 
						|
		pdst += nl & (UNROLL-1);
 | 
						|
 | 
						|
#define BodyOdd(n) pdst[-n] = MROP_SOLID (psrc[-n], pdst[-n]);
 | 
						|
#define BodyEven(n) pdst[-n] = MROP_SOLID (psrc[-n], pdst[-n]);
 | 
						|
 | 
						|
#define LoopReset \
 | 
						|
pdst += UNROLL; \
 | 
						|
psrc += UNROLL;
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
#define BodyOdd(n)  *pdst = MROP_SOLID (*psrc, *pdst); pdst++; psrc++;
 | 
						|
#define BodyEven(n) BodyOdd(n)
 | 
						|
 | 
						|
#define LoopReset   ;
 | 
						|
 | 
						|
#endif
 | 
						|
		PackedLoop
 | 
						|
 | 
						|
#undef BodyOdd
 | 
						|
#undef BodyEven
 | 
						|
#undef LoopReset
 | 
						|
 | 
						|
#else
 | 
						|
		DuffL(nl, label1,
 | 
						|
			*pdst = MROP_SOLID (*psrc, *pdst);
 | 
						|
			pdst++; psrc++;)
 | 
						|
#endif
 | 
						|
#else
 | 
						|
		while (nl--) {
 | 
						|
			*pdst = MROP_SOLID (*psrc, *pdst);
 | 
						|
			pdst++; psrc++;
 | 
						|
		}
 | 
						|
#endif
 | 
						|
		if (!srcRemaining)
 | 
						|
		{
 | 
						|
		    srcRemaining = widthSrc;
 | 
						|
		    psrc = psrcStart;
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	    if (endmask)
 | 
						|
	    {
 | 
						|
		*pdst = MROP_MASK (*psrc, *pdst, endmask);
 | 
						|
	    }
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
	    if (xoffSrc > xoffDst)
 | 
						|
	    {
 | 
						|
		leftShift = (xoffSrc - xoffDst) << LEFTSHIFT_AMT;
 | 
						|
		rightShift = PGSZ - leftShift;
 | 
						|
	    }
 | 
						|
	    else
 | 
						|
	    {
 | 
						|
		rightShift = (xoffDst - xoffSrc) << LEFTSHIFT_AMT;
 | 
						|
		leftShift = PGSZ - rightShift;
 | 
						|
	    }
 | 
						|
	    psrc = psrcLine;
 | 
						|
	    pdst = pdstLine;
 | 
						|
	    bits = 0;
 | 
						|
	    srcRemaining = widthSrc - srcStart;
 | 
						|
	    if (xoffSrc > xoffDst)
 | 
						|
	    {
 | 
						|
		bits = *psrc;
 | 
						|
		IncSrcPtr
 | 
						|
	    }
 | 
						|
	    if (startmask)
 | 
						|
	    {
 | 
						|
		bits1 = BitLeft(bits,leftShift);
 | 
						|
		bits = *psrc;
 | 
						|
		IncSrcPtr
 | 
						|
		bits1 |= BitRight(bits,rightShift);
 | 
						|
		*pdst = MROP_MASK(bits1, *pdst, startmask);
 | 
						|
		pdst++;
 | 
						|
	    }
 | 
						|
	    nlTemp = nlMiddle;
 | 
						|
	    while (nlTemp)
 | 
						|
	    {
 | 
						|
		nl = nlTemp;
 | 
						|
		if (nl > srcRemaining)
 | 
						|
		    nl = srcRemaining;
 | 
						|
 | 
						|
		nlTemp -= nl;
 | 
						|
		srcRemaining -= nl;
 | 
						|
 | 
						|
#if MROP == Mcopy
 | 
						|
#ifdef LARGE_INSTRUCTION_CACHE
 | 
						|
		bits1 = bits;
 | 
						|
 | 
						|
#ifdef FAST_CONSTANT_OFFSET_MODE
 | 
						|
 | 
						|
		psrc += nl & (UNROLL-1);
 | 
						|
		pdst += nl & (UNROLL-1);
 | 
						|
 | 
						|
#define BodyOdd(n) \
 | 
						|
bits = psrc[-n]; \
 | 
						|
pdst[-n] = MROP_SOLID(BitLeft(bits1, leftShift) | BitRight(bits, rightShift), pdst[-n]);
 | 
						|
 | 
						|
#define BodyEven(n) \
 | 
						|
bits1 = psrc[-n]; \
 | 
						|
pdst[-n] = MROP_SOLID(BitLeft(bits, leftShift) | BitRight(bits1, rightShift), pdst[-n]);
 | 
						|
 | 
						|
#define LoopReset \
 | 
						|
pdst += UNROLL; \
 | 
						|
psrc += UNROLL;
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
#define BodyOdd(n) \
 | 
						|
bits = *psrc++; \
 | 
						|
*pdst = MROP_SOLID(BitLeft(bits1, leftShift) | BitRight(bits, rightShift), *pdst); \
 | 
						|
pdst++;
 | 
						|
	       
 | 
						|
#define BodyEven(n) \
 | 
						|
bits1 = *psrc++; \
 | 
						|
*pdst = MROP_SOLID(BitLeft(bits, leftShift) | BitRight(bits1, rightShift), *pdst); \
 | 
						|
pdst++;
 | 
						|
 | 
						|
#define LoopReset   ;
 | 
						|
 | 
						|
#endif	/* !FAST_CONSTANT_OFFSET_MODE */
 | 
						|
 | 
						|
		PackedLoop
 | 
						|
 | 
						|
#undef BodyOdd
 | 
						|
#undef BodyEven
 | 
						|
#undef LoopReset
 | 
						|
 | 
						|
#else
 | 
						|
		DuffL (nl,label2,
 | 
						|
		    bits1 = BitLeft(bits, leftShift);
 | 
						|
		    bits = *psrc++;
 | 
						|
		    *pdst = MROP_SOLID (bits1 | BitRight(bits, rightShift), *pdst);
 | 
						|
		    pdst++;
 | 
						|
		)
 | 
						|
#endif
 | 
						|
#else
 | 
						|
		while (nl--) {
 | 
						|
		    bits1 = BitLeft(bits,leftShift);
 | 
						|
		    bits = *psrc++;
 | 
						|
		    *pdst = MROP_SOLID(bits1|BitRight(bits,rightShift), *pdst);
 | 
						|
		    pdst++;
 | 
						|
		}
 | 
						|
#endif
 | 
						|
		if (!srcRemaining)
 | 
						|
		{
 | 
						|
		    srcRemaining = widthSrc;
 | 
						|
		    psrc = psrcStart;
 | 
						|
		}
 | 
						|
	    }
 | 
						|
 | 
						|
	    if (endmask)
 | 
						|
	    {
 | 
						|
		bits1 = BitLeft(bits, leftShift);
 | 
						|
		if (BitLeft(endmask, rightShift))
 | 
						|
		{
 | 
						|
		    bits = *psrc;
 | 
						|
		    bits1 |= BitRight(bits, rightShift);
 | 
						|
		}
 | 
						|
		*pdst = MROP_MASK (bits1, *pdst, endmask);
 | 
						|
	    }
 | 
						|
	}
 | 
						|
	ppt++;
 | 
						|
    }
 | 
						|
}
 |