aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/Xserver/iplan2p4/iplblt.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/programs/Xserver/iplan2p4/iplblt.c')
-rw-r--r--nx-X11/programs/Xserver/iplan2p4/iplblt.c431
1 files changed, 0 insertions, 431 deletions
diff --git a/nx-X11/programs/Xserver/iplan2p4/iplblt.c b/nx-X11/programs/Xserver/iplan2p4/iplblt.c
deleted file mode 100644
index 85bcece13..000000000
--- a/nx-X11/programs/Xserver/iplan2p4/iplblt.c
+++ /dev/null
@@ -1,431 +0,0 @@
-/* $XFree86$ */
-/*
- * ipl copy area
- */
-
-/*
-
-Copyright (c) 1989 X Consortium
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-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
-X CONSORTIUM 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 X Consortium 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 X Consortium.
-
-Author: Keith Packard
-
-*/
-/* $XConsortium: iplblt.c,v 1.13 94/04/17 20:28:44 dpw Exp $ */
-
-/* Modified nov 94 by Martin Schaller (Martin_Schaller@maus.r.de) for use with
-interleaved planes */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include <X11/Xproto.h>
-#include "gcstruct.h"
-#include "windowstr.h"
-#include "scrnintstr.h"
-#include "pixmapstr.h"
-#include "regionstr.h"
-#include "ipl.h"
-#include "fastblt.h"
-#include "iplmergerop.h"
-#include "iplmskbits.h"
-
-void
-INTER_MROP_NAME(iplDoBitblt)(pSrc, pDst, alu, prgnDst, pptSrc, planemask)
- DrawablePtr pSrc, pDst;
- int alu;
- RegionPtr prgnDst;
- DDXPointPtr pptSrc;
- unsigned long planemask;
-{
- INTER_DECLAREG(*psrcBase);
- INTER_DECLAREG(*pdstBase); /* start of src and dst bitmaps */
- int widthSrc, widthDst; /* add to get to same position in next line */
-
- BoxPtr pbox;
- int nbox;
-
- BoxPtr pboxTmp, pboxNext, pboxBase, pboxNew1, pboxNew2;
- /* temporaries for shuffling rectangles */
- DDXPointPtr pptTmp, pptNew1, pptNew2;
- /* shuffling boxes entails shuffling the
- source points too */
- int w, h;
- int xdir; /* 1 = left right, -1 = right left/ */
- int ydir; /* 1 = top down, -1 = bottom up */
-
- INTER_DECLAREG(*psrcLine);
- INTER_DECLAREG(*pdstLine); /* pointers to line with current src and dst */
- INTER_DECLAREG(*psrc); /* pointer to current src group */
- INTER_DECLAREG(*pdst); /* pointer to current dst group */
-
- INTER_MROP_DECLARE_REG()
-
- /* following used for looping through a line */
- INTER_DECLAREG(startmask);
- INTER_DECLAREG(endmask); /* masks for writing ends of dst */
- int ngMiddle; /* whole groups in dst */
- int xoffSrc, xoffDst;
- register int leftShift, rightShift;
- INTER_DECLAREGP(bits);
- INTER_DECLAREGP(bits1);
- INTER_DECLAREGP(bits2);
- register int ng; /* temp copy of ngMiddle */
-
- /* place to store full source word */
- int nstart; /* number of ragged bits at start of dst */
- int nend; /* number of ragged bits at end of dst */
- int srcStartOver; /* pulling nstart bits from src
- overflows into the next word? */
- int careful;
- int tmpSrc;
-
- INTER_MROP_INITIALIZE(alu,planemask);
-
- iplGetGroupWidthAndPointer (pSrc, widthSrc, psrcBase)
-
- iplGetGroupWidthAndPointer (pDst, widthDst, pdstBase)
-
- /* XXX we have to err on the side of safety when both are windows,
- * because we don't know if IncludeInferiors is being used.
- */
- careful = ((pSrc == pDst) ||
- ((pSrc->type == DRAWABLE_WINDOW) &&
- (pDst->type == DRAWABLE_WINDOW)));
-
- pbox = REGION_RECTS(prgnDst);
- nbox = REGION_NUM_RECTS(prgnDst);
-
- pboxNew1 = NULL;
- pptNew1 = NULL;
- pboxNew2 = NULL;
- pptNew2 = NULL;
- if (careful && (pptSrc->y < pbox->y1))
- {
- /* walk source botttom to top */
- ydir = -1;
- widthSrc = -widthSrc;
- widthDst = -widthDst;
-
- if (nbox > 1)
- {
- /* keep ordering in each band, reverse order of bands */
- pboxNew1 = (BoxPtr)ALLOCATE_LOCAL(sizeof(BoxRec) * nbox);
- if(!pboxNew1)
- return;
- pptNew1 = (DDXPointPtr)ALLOCATE_LOCAL(sizeof(DDXPointRec) * nbox);
- if(!pptNew1)
- {
- DEALLOCATE_LOCAL(pboxNew1);
- return;
- }
- pboxBase = pboxNext = pbox+nbox-1;
- while (pboxBase >= pbox)
- {
- while ((pboxNext >= pbox) &&
- (pboxBase->y1 == pboxNext->y1))
- pboxNext--;
- pboxTmp = pboxNext+1;
- pptTmp = pptSrc + (pboxTmp - pbox);
- while (pboxTmp <= pboxBase)
- {
- *pboxNew1++ = *pboxTmp++;
- *pptNew1++ = *pptTmp++;
- }
- pboxBase = pboxNext;
- }
- pboxNew1 -= nbox;
- pbox = pboxNew1;
- pptNew1 -= nbox;
- pptSrc = pptNew1;
- }
- }
- else
- {
- /* walk source top to bottom */
- ydir = 1;
- }
-
- if (careful && (pptSrc->x < pbox->x1))
- {
- /* walk source right to left */
- xdir = -1;
-
- if (nbox > 1)
- {
- /* reverse order of rects in each band */
- pboxNew2 = (BoxPtr)ALLOCATE_LOCAL(sizeof(BoxRec) * nbox);
- pptNew2 = (DDXPointPtr)ALLOCATE_LOCAL(sizeof(DDXPointRec) * nbox);
- if(!pboxNew2 || !pptNew2)
- {
- if (pptNew2) DEALLOCATE_LOCAL(pptNew2);
- if (pboxNew2) DEALLOCATE_LOCAL(pboxNew2);
- if (pboxNew1)
- {
- DEALLOCATE_LOCAL(pptNew1);
- DEALLOCATE_LOCAL(pboxNew1);
- }
- return;
- }
- pboxBase = pboxNext = pbox;
- while (pboxBase < pbox+nbox)
- {
- while ((pboxNext < pbox+nbox) &&
- (pboxNext->y1 == pboxBase->y1))
- pboxNext++;
- pboxTmp = pboxNext;
- pptTmp = pptSrc + (pboxTmp - pbox);
- while (pboxTmp != pboxBase)
- {
- *pboxNew2++ = *--pboxTmp;
- *pptNew2++ = *--pptTmp;
- }
- pboxBase = pboxNext;
- }
- pboxNew2 -= nbox;
- pbox = pboxNew2;
- pptNew2 -= nbox;
- pptSrc = pptNew2;
- }
- }
- else
- {
- /* walk source left to right */
- xdir = 1;
- }
-
- while(nbox--)
- {
- w = pbox->x2 - pbox->x1;
- h = pbox->y2 - pbox->y1;
-
- if (ydir == -1) /* start at last scanline of rectangle */
- {
- psrcLine = psrcBase + ((pptSrc->y+h-1) * -widthSrc);
- pdstLine = pdstBase + ((pbox->y2-1) * -widthDst);
- }
- else /* start at first scanline */
- {
- psrcLine = psrcBase + (pptSrc->y * widthSrc);
- pdstLine = pdstBase + (pbox->y1 * widthDst);
- }
- if ((pbox->x1 & INTER_PIM) + w <= INTER_PPG)
- {
- INTER_maskpartialbits (pbox->x1, w, endmask);
- startmask = 0;
- ngMiddle = 0;
- }
- else
- {
- INTER_maskbits(pbox->x1, w, startmask, endmask, ngMiddle);
- }
-
- if (xdir == 1)
- {
- xoffSrc = pptSrc->x & INTER_PIM;
- xoffDst = pbox->x1 & INTER_PIM;
- pdstLine += (pbox->x1 >> INTER_PGSH) * INTER_PLANES;
- psrcLine += (pptSrc->x >> INTER_PGSH) * INTER_PLANES;
- ng = xoffSrc - xoffDst;
- if (xoffSrc == xoffDst)
- {
- while (h--)
- {
- psrc = psrcLine;
- pdst = pdstLine;
- pdstLine += widthDst;
- psrcLine += widthSrc;
- if (startmask)
- {
- INTER_MROP_MASK(psrc, pdst, startmask, pdst);
- INTER_NEXT_GROUP(psrc);
- INTER_NEXT_GROUP(pdst);
- }
- ng = ngMiddle;
-
- DuffL(ng, label1,
- INTER_MROP_SOLID(psrc, pdst, pdst);
- INTER_NEXT_GROUP(psrc);
- INTER_NEXT_GROUP(pdst);
- )
- if (endmask)
- INTER_MROP_MASK(psrc, pdst, endmask, pdst);
- }
- }
- else
- {
- if (xoffSrc > xoffDst)
- {
- leftShift = xoffSrc - xoffDst;
- rightShift = (INTER_PIM+1) - leftShift;
- }
- else
- {
- rightShift = xoffDst - xoffSrc;
- leftShift = (INTER_PIM+1) - rightShift;
- }
- while (h--)
- {
- psrc = psrcLine;
- pdst = pdstLine;
- pdstLine += widthDst;
- psrcLine += widthSrc;
- INTER_CLR(bits);
- if (xoffSrc > xoffDst) {
- INTER_COPY(psrc, bits);
- INTER_NEXT_GROUP(psrc);
- }
- if (startmask)
- {
- INTER_GETLRC(leftShift, rightShift, psrc, bits, bits1);
- INTER_MROP_MASK(bits1, pdst, startmask, pdst);
- INTER_NEXT_GROUP(psrc);
- INTER_NEXT_GROUP(pdst);
- }
- ng = ngMiddle;
- DuffL (ng,label2,
- INTER_GETLRC(leftShift, rightShift, psrc, bits, bits1);
- INTER_MROP_SOLID(bits1, pdst, pdst);
- INTER_NEXT_GROUP(psrc);
- INTER_NEXT_GROUP(pdst);
- )
- if (endmask)
- {
- if ((endmask << rightShift) & 0xffff) {
- INTER_GETLRC(leftShift, rightShift, psrc, bits,
- bits1);
- }
- else {
- INTER_SCRLEFT(leftShift, bits, bits1);
- }
- INTER_MROP_MASK(bits1, pdst, endmask, pdst);
- }
- }
- }
- }
- else /* xdir == -1 */
- {
- xoffSrc = (pptSrc->x + w - 1) & INTER_PIM;
- xoffDst = (pbox->x2 - 1) & INTER_PIM;
- pdstLine += (((pbox->x2-1) >> INTER_PGSH) + 1) * INTER_PLANES;
- psrcLine += (((pptSrc->x+w - 1) >> INTER_PGSH) + 1) * INTER_PLANES;
- if (xoffSrc == xoffDst)
- {
- while (h--)
- {
- psrc = psrcLine;
- pdst = pdstLine;
- pdstLine += widthDst;
- psrcLine += widthSrc;
- if (endmask)
- {
- INTER_PREV_GROUP(psrc);
- INTER_PREV_GROUP(pdst);
- INTER_MROP_MASK(psrc, pdst, endmask, pdst);
- }
- ng = ngMiddle;
-
- DuffL(ng,label3,
- INTER_PREV_GROUP(psrc);
- INTER_PREV_GROUP(pdst);
- INTER_MROP_SOLID(psrc, pdst, pdst);
- )
-
- if (startmask)
- {
- INTER_PREV_GROUP(psrc);
- INTER_PREV_GROUP(pdst);
- INTER_MROP_MASK(psrc, pdst, startmask, pdst);
- }
- }
- }
- else
- {
- if (xoffDst > xoffSrc)
- {
- rightShift = xoffDst - xoffSrc;
- leftShift = (INTER_PIM + 1) - rightShift;
- }
- else
- {
- leftShift = xoffSrc - xoffDst;
- rightShift = (INTER_PIM + 1) - leftShift;
- }
- while (h--)
- {
- psrc = psrcLine;
- pdst = pdstLine;
- pdstLine += widthDst;
- psrcLine += widthSrc;
- INTER_CLR(bits);
- if (xoffDst > xoffSrc) {
- INTER_PREV_GROUP(psrc);
- INTER_COPY(psrc, bits);
- }
- if (endmask)
- {
- INTER_PREV_GROUP(psrc);
- INTER_PREV_GROUP(pdst);
- INTER_GETRLC(rightShift, leftShift, psrc, bits, bits1);
- INTER_MROP_MASK(bits1, pdst, endmask, pdst);
- }
- ng = ngMiddle;
- DuffL (ng, label4,
- INTER_PREV_GROUP(psrc);
- INTER_PREV_GROUP(pdst);
- INTER_GETRLC(rightShift, leftShift, psrc, bits, bits1);
- INTER_MROP_SOLID(bits1, pdst, pdst);
- )
- if (startmask)
- {
- INTER_PREV_GROUP(psrc);
- INTER_PREV_GROUP(pdst);
- if ((startmask >> leftShift) & 0xffff) {
- INTER_GETRLC(rightShift, leftShift, psrc, bits,
- bits1);
- }
- else {
- INTER_SCRRIGHT(rightShift, bits, bits1);
- }
- INTER_MROP_MASK(bits1, pdst, startmask, pdst);
- }
- }
- }
- }
- pbox++;
- pptSrc++;
- }
- if (pboxNew2)
- {
- DEALLOCATE_LOCAL(pptNew2);
- DEALLOCATE_LOCAL(pboxNew2);
- }
- if (pboxNew1)
- {
- DEALLOCATE_LOCAL(pptNew1);
- DEALLOCATE_LOCAL(pboxNew1);
- }
-}