1
/* $XFree86: xc/programs/Xserver/hw/xfree86/xaa/xaaCpyPlane.c,v 1.13tsi Exp $ */
4
A CopyPlane function that handles bitmap->screen copies and
5
sends anything else to the Fallback.
7
Also, a PushPixels for solid fill styles.
9
Written by Mark Vojkovich (markv@valinux.com)
13
#ifdef HAVE_XORG_CONFIG_H
14
#include <xorg-config.h>
19
#include "xf86_ansic.h"
20
#include "xf86_OSproc.h"
24
#include "scrnintstr.h"
26
#include "pixmapstr.h"
32
static void XAACopyPlane1toNColorExpand(DrawablePtr pSrc, DrawablePtr pDst,
33
GCPtr pGC, RegionPtr rgnDst,
35
static void XAACopyPlaneNtoNColorExpand(DrawablePtr pSrc, DrawablePtr pDst,
36
GCPtr pGC, RegionPtr rgnDst,
40
static unsigned long TmpBitPlane;
43
XAACopyPlaneColorExpansion(
48
int width, int height,
50
unsigned long bitPlane
52
if((pSrc->type == DRAWABLE_PIXMAP) && !XAA_DEPTH_BUG(pGC)) {
53
if(pSrc->bitsPerPixel == 1) {
54
return(XAABitBlt(pSrc, pDst, pGC, srcx, srcy,
55
width, height, dstx, dsty,
56
XAACopyPlane1toNColorExpand, bitPlane));
57
} else if(bitPlane < (1 << pDst->depth)){
58
TmpBitPlane = bitPlane;
59
return(XAABitBlt(pSrc, pDst, pGC, srcx, srcy,
60
width, height, dstx, dsty,
61
XAACopyPlaneNtoNColorExpand, bitPlane));
65
return (XAAFallbackOps.CopyPlane(pSrc, pDst, pGC, srcx, srcy,
66
width, height, dstx, dsty, bitPlane));
71
XAACopyPlane1toNColorExpand(
78
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
79
BoxPtr pbox = REGION_RECTS(rgnDst);
80
int numrects = REGION_NUM_RECTS(rgnDst);
81
unsigned char *src = ((PixmapPtr)pSrc)->devPrivate.ptr;
82
int srcwidth = ((PixmapPtr)pSrc)->devKind;
85
(*infoRec->WriteBitmap)(infoRec->pScrn, pbox->x1, pbox->y1,
86
pbox->x2 - pbox->x1, pbox->y2 - pbox->y1,
87
src + (srcwidth * pptSrc->y) + ((pptSrc->x >> 5) << 2),
88
srcwidth, pptSrc->x & 31,
89
pGC->fgPixel, pGC->bgPixel, pGC->alu, pGC->planemask);
96
XAACopyPlaneNtoNColorExpand(
103
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
104
BoxPtr pbox = REGION_RECTS(rgnDst);
105
int numrects = REGION_NUM_RECTS(rgnDst);
106
unsigned char *src = ((PixmapPtr)pSrc)->devPrivate.ptr;
107
unsigned char *data, *srcPtr, *dataPtr;
108
int srcwidth = ((PixmapPtr)pSrc)->devKind;
109
int pitch, width, height, h, i, index, offset;
110
int Bpp = pSrc->bitsPerPixel >> 3;
111
unsigned long mask = TmpBitPlane;
113
if(TmpBitPlane < 8) {
115
} else if(TmpBitPlane < 16) {
118
} else if(TmpBitPlane < 24) {
126
if(IS_OFFSCREEN_PIXMAP(pSrc))
130
width = pbox->x2 - pbox->x1;
131
h = height = pbox->y2 - pbox->y1;
132
pitch = BitmapBytePad(width);
134
if(!(data = xalloc(height * pitch)))
137
bzero(data, height * pitch);
140
srcPtr = ((pptSrc->y) * srcwidth) + src +
141
((pptSrc->x) * Bpp) + offset;
144
for(i = index = 0; i < width; i++, index += Bpp) {
145
if(mask & srcPtr[index])
146
dataPtr[i >> 3] |= (1 << (i & 7));
152
(*infoRec->WriteBitmap)(infoRec->pScrn,
153
pbox->x1, pbox->y1, width, height, data, pitch, 0,
154
pGC->fgPixel, pGC->bgPixel, pGC->alu, pGC->planemask);
165
XAAPushPixelsSolidColorExpansion(
172
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
173
int MaxBoxes = REGION_NUM_RECTS(pGC->pCompositeClip);
174
BoxPtr pbox, pClipBoxes;
175
int nboxes, srcx, srcy;
177
unsigned char *src = pBitMap->devPrivate.ptr;
178
int srcwidth = pBitMap->devKind;
180
if(!REGION_NUM_RECTS(pGC->pCompositeClip))
188
if(MaxBoxes > (infoRec->PreAllocSize/sizeof(BoxRec))) {
189
pClipBoxes = xalloc(MaxBoxes * sizeof(BoxRec));
190
if(!pClipBoxes) return;
191
} else pClipBoxes = (BoxPtr)infoRec->PreAllocMem;
193
nboxes = XAAGetRectClipBoxes(pGC, pClipBoxes, 1, &TheRect);
197
srcx = pbox->x1 - xOrg;
198
srcy = pbox->y1 - yOrg;
199
(*infoRec->WriteBitmap)(infoRec->pScrn, pbox->x1, pbox->y1,
200
pbox->x2 - pbox->x1, pbox->y2 - pbox->y1,
201
src + (srcwidth * srcy) + ((srcx >> 5) << 2),
203
pGC->fgPixel, -1, pGC->alu, pGC->planemask);
207
if(pClipBoxes != (BoxPtr)infoRec->PreAllocMem)