diff options
Diffstat (limited to 'hw/xfree86/xaa/xaaImage.c')
-rw-r--r-- | hw/xfree86/xaa/xaaImage.c | 873 |
1 files changed, 443 insertions, 430 deletions
diff --git a/hw/xfree86/xaa/xaaImage.c b/hw/xfree86/xaa/xaaImage.c index e88f45c55..4457c9efa 100644 --- a/hw/xfree86/xaa/xaaImage.c +++ b/hw/xfree86/xaa/xaaImage.c @@ -16,506 +16,519 @@ #include "xaa.h" #include "xaalocal.h" -void XAAMoveDWORDS_FixedBase( - register CARD32* dest, - register CARD32* src, - register int dwords ) +void +XAAMoveDWORDS_FixedBase(register CARD32 *dest, + register CARD32 *src, register int dwords) { - while(dwords & ~0x03) { - *dest = *src; - *dest = *(src + 1); - *dest = *(src + 2); - *dest = *(src + 3); - dwords -= 4; - src += 4; - } - - if(!dwords) return; - *dest = *src; - if(dwords == 1) return; - *dest = *(src + 1); - if(dwords == 2) return; - *dest = *(src + 2); + while (dwords & ~0x03) { + *dest = *src; + *dest = *(src + 1); + *dest = *(src + 2); + *dest = *(src + 3); + dwords -= 4; + src += 4; + } + + if (!dwords) + return; + *dest = *src; + if (dwords == 1) + return; + *dest = *(src + 1); + if (dwords == 2) + return; + *dest = *(src + 2); } -void XAAMoveDWORDS( - register CARD32* dest, - register CARD32* src, - register int dwords ) +void +XAAMoveDWORDS(register CARD32 *dest, register CARD32 *src, register int dwords) { - while(dwords & ~0x03) { - *dest = *src; - *(dest + 1) = *(src + 1); - *(dest + 2) = *(src + 2); - *(dest + 3) = *(src + 3); - src += 4; - dest += 4; - dwords -= 4; - } - if(!dwords) return; - *dest = *src; - if(dwords == 1) return; - *(dest + 1) = *(src + 1); - if(dwords == 2) return; - *(dest + 2) = *(src + 2); + while (dwords & ~0x03) { + *dest = *src; + *(dest + 1) = *(src + 1); + *(dest + 2) = *(src + 2); + *(dest + 3) = *(src + 3); + src += 4; + dest += 4; + dwords -= 4; + } + if (!dwords) + return; + *dest = *src; + if (dwords == 1) + return; + *(dest + 1) = *(src + 1); + if (dwords == 2) + return; + *(dest + 2) = *(src + 2); } -void XAAMoveDWORDS_FixedSrc( - register CARD32* dest, - register CARD32* src, - register int dwords ) +void +XAAMoveDWORDS_FixedSrc(register CARD32 *dest, + register CARD32 *src, register int dwords) { - while(dwords & ~0x03) { - *dest = *src; - *(dest + 1) = *src; - *(dest + 2) = *src; - *(dest + 3) = *src; - dest += 4; - dwords -= 4; - } - if(!dwords) return; - *dest = *src; - if(dwords == 1) return; - *(dest + 1) = *src; - if(dwords == 2) return; - *(dest + 2) = *src; + while (dwords & ~0x03) { + *dest = *src; + *(dest + 1) = *src; + *(dest + 2) = *src; + *(dest + 3) = *src; + dest += 4; + dwords -= 4; + } + if (!dwords) + return; + *dest = *src; + if (dwords == 1) + return; + *(dest + 1) = *src; + if (dwords == 2) + return; + *(dest + 2) = *src; } static void -XAAWritePixmap32To24( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned char *srcInit, - int srcwidth, /* bytes */ - int rop, - unsigned int planemask, - int trans -){ +XAAWritePixmap32To24(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned char *srcInit, int srcwidth, /* bytes */ + int rop, unsigned int planemask, int trans) +{ XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); int count, dwords = bytes_to_int32(w * 3); CARD32 *src, *dst; Bool PlusOne = FALSE; - if((infoRec->ImageWriteFlags & CPU_TRANSFER_PAD_QWORD) && - ((dwords * h) & 0x01)) { - PlusOne = TRUE; + if ((infoRec->ImageWriteFlags & CPU_TRANSFER_PAD_QWORD) && + ((dwords * h) & 0x01)) { + PlusOne = TRUE; } - (*infoRec->SetupForImageWrite)(pScrn, rop, planemask, trans, 24, 24); - (*infoRec->SubsequentImageWriteRect)(pScrn, x, y, w, h, 0); - - if(dwords > infoRec->ImageWriteRange) { - dst = (CARD32*)infoRec->ImageWriteBase; - while(h--) { - src = (CARD32*)srcInit; - count = w; - - while(count >= 4) { - *dst = (src[0] & 0x00ffffff) | (src[1] << 24); - *dst = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16); - *dst = ((src[2] >> 16) & 0x000000ff) | (src[3] << 8); - src += 4; - count -= 4; - } - switch(count) { - case 0: break; - case 1: *dst = src[0]; - break; - case 2: *dst = (src[0] & 0x00ffffff) | (src[1] << 24); - *dst = src[1] >> 8; - break; - default: *dst = (src[0] & 0x00ffffff) | (src[1] << 24); - *dst = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16); - *dst = src[2] >> 16; - break; - } - srcInit += srcwidth; - } - } else { - while(h--) { - dst = (CARD32*)infoRec->ImageWriteBase; - src = (CARD32*)srcInit; - count = w; - - while(count >= 4) { - dst[0] = (src[0] & 0x00ffffff) | (src[1] << 24); - dst[1] = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16); - dst[2] = ((src[2] >> 16) & 0x000000ff) | (src[3] << 8); - dst += 3; - src += 4; - count -= 4; - } - switch(count) { - case 0: break; - case 1: dst[0] = src[0]; - break; - case 2: dst[0] = (src[0] & 0x00ffffff) | (src[1] << 24); - dst[1] = src[1] >> 8; - break; - default: dst[0] = (src[0] & 0x00ffffff) | (src[1] << 24); - dst[1] = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16); - dst[2] = src[2] >> 16; - break; - } - srcInit += srcwidth; - } + (*infoRec->SetupForImageWrite) (pScrn, rop, planemask, trans, 24, 24); + (*infoRec->SubsequentImageWriteRect) (pScrn, x, y, w, h, 0); + + if (dwords > infoRec->ImageWriteRange) { + dst = (CARD32 *) infoRec->ImageWriteBase; + while (h--) { + src = (CARD32 *) srcInit; + count = w; + + while (count >= 4) { + *dst = (src[0] & 0x00ffffff) | (src[1] << 24); + *dst = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16); + *dst = ((src[2] >> 16) & 0x000000ff) | (src[3] << 8); + src += 4; + count -= 4; + } + switch (count) { + case 0: + break; + case 1: + *dst = src[0]; + break; + case 2: + *dst = (src[0] & 0x00ffffff) | (src[1] << 24); + *dst = src[1] >> 8; + break; + default: + *dst = (src[0] & 0x00ffffff) | (src[1] << 24); + *dst = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16); + *dst = src[2] >> 16; + break; + } + srcInit += srcwidth; + } + } + else { + while (h--) { + dst = (CARD32 *) infoRec->ImageWriteBase; + src = (CARD32 *) srcInit; + count = w; + + while (count >= 4) { + dst[0] = (src[0] & 0x00ffffff) | (src[1] << 24); + dst[1] = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16); + dst[2] = ((src[2] >> 16) & 0x000000ff) | (src[3] << 8); + dst += 3; + src += 4; + count -= 4; + } + switch (count) { + case 0: + break; + case 1: + dst[0] = src[0]; + break; + case 2: + dst[0] = (src[0] & 0x00ffffff) | (src[1] << 24); + dst[1] = src[1] >> 8; + break; + default: + dst[0] = (src[0] & 0x00ffffff) | (src[1] << 24); + dst[1] = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16); + dst[2] = src[2] >> 16; + break; + } + srcInit += srcwidth; + } } - if(PlusOne) { - CARD32* base = (CARD32*)infoRec->ImageWriteBase; - *base = 0x00000000; + if (PlusOne) { + CARD32 *base = (CARD32 *) infoRec->ImageWriteBase; + + *base = 0x00000000; } - if(infoRec->ImageWriteFlags & SYNC_AFTER_IMAGE_WRITE) - (*infoRec->Sync)(pScrn); - else SET_SYNC_FLAG(infoRec); + if (infoRec->ImageWriteFlags & SYNC_AFTER_IMAGE_WRITE) + (*infoRec->Sync) (pScrn); + else + SET_SYNC_FLAG(infoRec); } void -XAAWritePixmap ( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned char *src, - int srcwidth, /* bytes */ - int rop, - unsigned int planemask, - int trans, - int bpp, int depth -){ +XAAWritePixmap(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned char *src, int srcwidth, /* bytes */ + int rop, unsigned int planemask, int trans, int bpp, int depth) +{ XAAInfoRecPtr infoRec; - int dwords, skipleft, Bpp; + int dwords, skipleft, Bpp; Bool beCareful, PlusOne; - if((bpp == 32) && (pScrn->bitsPerPixel == 24)) { - XAAWritePixmap32To24(pScrn, x, y, w, h, src, srcwidth, - rop, planemask, trans); - return; + if ((bpp == 32) && (pScrn->bitsPerPixel == 24)) { + XAAWritePixmap32To24(pScrn, x, y, w, h, src, srcwidth, + rop, planemask, trans); + return; } infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); beCareful = PlusOne = FALSE; Bpp = bpp >> 3; - if((skipleft = (long)src & 0x03L)) { - if(!(infoRec->ImageWriteFlags & LEFT_EDGE_CLIPPING)) { - skipleft = 0; - beCareful = TRUE; - goto BAD_ALIGNMENT; - } - - if(Bpp == 3) - skipleft = 4 - skipleft; - else - skipleft /= Bpp; - - if((x < skipleft) && !(infoRec->ImageWriteFlags & - LEFT_EDGE_CLIPPING_NEGATIVE_X)) { - skipleft = 0; - beCareful = TRUE; - goto BAD_ALIGNMENT; - } - - x -= skipleft; - w += skipleft; - - if(Bpp == 3) - src -= 3 * skipleft; - else /* is this Alpha friendly ? */ - src = (unsigned char*)((long)src & ~0x03L); + if ((skipleft = (long) src & 0x03L)) { + if (!(infoRec->ImageWriteFlags & LEFT_EDGE_CLIPPING)) { + skipleft = 0; + beCareful = TRUE; + goto BAD_ALIGNMENT; + } + + if (Bpp == 3) + skipleft = 4 - skipleft; + else + skipleft /= Bpp; + + if ((x < skipleft) && !(infoRec->ImageWriteFlags & + LEFT_EDGE_CLIPPING_NEGATIVE_X)) { + skipleft = 0; + beCareful = TRUE; + goto BAD_ALIGNMENT; + } + + x -= skipleft; + w += skipleft; + + if (Bpp == 3) + src -= 3 * skipleft; + else /* is this Alpha friendly ? */ + src = (unsigned char *) ((long) src & ~0x03L); } -BAD_ALIGNMENT: + BAD_ALIGNMENT: dwords = bytes_to_int32(w * Bpp); - if((infoRec->ImageWriteFlags & CPU_TRANSFER_PAD_QWORD) && - ((dwords * h) & 0x01)) { - PlusOne = TRUE; - } - - - (*infoRec->SetupForImageWrite)(pScrn, rop, planemask, trans, bpp, depth); - (*infoRec->SubsequentImageWriteRect)(pScrn, x, y, w, h, skipleft); - - if(beCareful) { - /* in cases with bad alignment we have to be careful not - to read beyond the end of the source */ - if(((x * Bpp) + (dwords << 2)) > srcwidth) h--; - else beCareful = FALSE; + if ((infoRec->ImageWriteFlags & CPU_TRANSFER_PAD_QWORD) && + ((dwords * h) & 0x01)) { + PlusOne = TRUE; } - if(dwords > infoRec->ImageWriteRange) { - while(h--) { - XAAMoveDWORDS_FixedBase((CARD32*)infoRec->ImageWriteBase, - (CARD32*)src, dwords); - src += srcwidth; - } - if(beCareful) { - int shift = ((long)src & 0x03L) << 3; - if(--dwords) - XAAMoveDWORDS_FixedBase((CARD32*)infoRec->ImageWriteBase, - (CARD32*)src, dwords); - src = (unsigned char*)((long)(src + (dwords << 2)) & ~0x03L); - *((CARD32*)infoRec->ImageWriteBase) = *((CARD32*)src) >> shift; - } - } else { - if(srcwidth == (dwords << 2)) { - int decrement = infoRec->ImageWriteRange/dwords; - - while(h > decrement) { - XAAMoveDWORDS((CARD32*)infoRec->ImageWriteBase, - (CARD32*)src, dwords * decrement); - src += (srcwidth * decrement); - h -= decrement; - } - if(h) { - XAAMoveDWORDS((CARD32*)infoRec->ImageWriteBase, - (CARD32*)src, dwords * h); - if(beCareful) src += (srcwidth * h); - } - } else { - while(h--) { - XAAMoveDWORDS((CARD32*)infoRec->ImageWriteBase, - (CARD32*)src, dwords); - src += srcwidth; - } - } - - if(beCareful) { - int shift = ((long)src & 0x03L) << 3; - if(--dwords) - XAAMoveDWORDS((CARD32*)infoRec->ImageWriteBase, - (CARD32*)src, dwords); - src = (unsigned char*)((long)(src + (dwords << 2)) & ~0x03L); - - ((CARD32*)infoRec->ImageWriteBase)[dwords] = - *((CARD32*)src) >> shift; - } + (*infoRec->SetupForImageWrite) (pScrn, rop, planemask, trans, bpp, depth); + (*infoRec->SubsequentImageWriteRect) (pScrn, x, y, w, h, skipleft); + + if (beCareful) { + /* in cases with bad alignment we have to be careful not + to read beyond the end of the source */ + if (((x * Bpp) + (dwords << 2)) > srcwidth) + h--; + else + beCareful = FALSE; } - if(PlusOne) { - CARD32* base = (CARD32*)infoRec->ImageWriteBase; - *base = 0x00000000; + if (dwords > infoRec->ImageWriteRange) { + while (h--) { + XAAMoveDWORDS_FixedBase((CARD32 *) infoRec->ImageWriteBase, + (CARD32 *) src, dwords); + src += srcwidth; + } + if (beCareful) { + int shift = ((long) src & 0x03L) << 3; + + if (--dwords) + XAAMoveDWORDS_FixedBase((CARD32 *) infoRec->ImageWriteBase, + (CARD32 *) src, dwords); + src = (unsigned char *) ((long) (src + (dwords << 2)) & ~0x03L); + *((CARD32 *) infoRec->ImageWriteBase) = *((CARD32 *) src) >> shift; + } + } + else { + if (srcwidth == (dwords << 2)) { + int decrement = infoRec->ImageWriteRange / dwords; + + while (h > decrement) { + XAAMoveDWORDS((CARD32 *) infoRec->ImageWriteBase, + (CARD32 *) src, dwords * decrement); + src += (srcwidth * decrement); + h -= decrement; + } + if (h) { + XAAMoveDWORDS((CARD32 *) infoRec->ImageWriteBase, + (CARD32 *) src, dwords * h); + if (beCareful) + src += (srcwidth * h); + } + } + else { + while (h--) { + XAAMoveDWORDS((CARD32 *) infoRec->ImageWriteBase, + (CARD32 *) src, dwords); + src += srcwidth; + } + } + + if (beCareful) { + int shift = ((long) src & 0x03L) << 3; + + if (--dwords) + XAAMoveDWORDS((CARD32 *) infoRec->ImageWriteBase, + (CARD32 *) src, dwords); + src = (unsigned char *) ((long) (src + (dwords << 2)) & ~0x03L); + + ((CARD32 *) infoRec->ImageWriteBase)[dwords] = + *((CARD32 *) src) >> shift; + } } - if(infoRec->ImageWriteFlags & SYNC_AFTER_IMAGE_WRITE) - (*infoRec->Sync)(pScrn); - else SET_SYNC_FLAG(infoRec); -} + if (PlusOne) { + CARD32 *base = (CARD32 *) infoRec->ImageWriteBase; + + *base = 0x00000000; + } + if (infoRec->ImageWriteFlags & SYNC_AFTER_IMAGE_WRITE) + (*infoRec->Sync) (pScrn); + else + SET_SYNC_FLAG(infoRec); +} void -XAAWritePixmapScanline ( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned char *src, - int srcwidth, /* bytes */ - int rop, - unsigned int planemask, - int trans, - int bpp, int depth -){ +XAAWritePixmapScanline(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned char *src, int srcwidth, /* bytes */ + int rop, + unsigned int planemask, int trans, int bpp, int depth) +{ XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); - int dwords, skipleft, bufferNo = 0, Bpp = bpp >> 3; + int dwords, skipleft, bufferNo = 0, Bpp = bpp >> 3; Bool beCareful = FALSE; - CARD32* base; - - if((skipleft = (long)src & 0x03L)) { - if(!(infoRec->ScanlineImageWriteFlags & LEFT_EDGE_CLIPPING)) { - skipleft = 0; - beCareful = TRUE; - goto BAD_ALIGNMENT; - } - - if(Bpp == 3) - skipleft = 4 - skipleft; - else - skipleft /= Bpp; - - if((x < skipleft) && !(infoRec->ScanlineImageWriteFlags & - LEFT_EDGE_CLIPPING_NEGATIVE_X)) { - skipleft = 0; - beCareful = TRUE; - goto BAD_ALIGNMENT; - } - - x -= skipleft; - w += skipleft; - - if(Bpp == 3) - src -= 3 * skipleft; - else - src = (unsigned char*)((long)src & ~0x03L); + CARD32 *base; + + if ((skipleft = (long) src & 0x03L)) { + if (!(infoRec->ScanlineImageWriteFlags & LEFT_EDGE_CLIPPING)) { + skipleft = 0; + beCareful = TRUE; + goto BAD_ALIGNMENT; + } + + if (Bpp == 3) + skipleft = 4 - skipleft; + else + skipleft /= Bpp; + + if ((x < skipleft) && !(infoRec->ScanlineImageWriteFlags & + LEFT_EDGE_CLIPPING_NEGATIVE_X)) { + skipleft = 0; + beCareful = TRUE; + goto BAD_ALIGNMENT; + } + + x -= skipleft; + w += skipleft; + + if (Bpp == 3) + src -= 3 * skipleft; + else + src = (unsigned char *) ((long) src & ~0x03L); } -BAD_ALIGNMENT: + BAD_ALIGNMENT: dwords = bytes_to_int32(w * Bpp); - (*infoRec->SetupForScanlineImageWrite)( - pScrn, rop, planemask, trans, bpp, depth); - (*infoRec->SubsequentScanlineImageWriteRect)(pScrn, x, y, w, h, skipleft); - - if(beCareful) { - /* in cases with bad alignment we have to be careful not - to read beyond the end of the source */ - if(((x * Bpp) + (dwords << 2)) > srcwidth) h--; - else beCareful = FALSE; + (*infoRec->SetupForScanlineImageWrite) (pScrn, rop, planemask, trans, bpp, + depth); + (*infoRec->SubsequentScanlineImageWriteRect) (pScrn, x, y, w, h, skipleft); + + if (beCareful) { + /* in cases with bad alignment we have to be careful not + to read beyond the end of the source */ + if (((x * Bpp) + (dwords << 2)) > srcwidth) + h--; + else + beCareful = FALSE; } - while(h--) { - base = (CARD32*)infoRec->ScanlineImageWriteBuffers[bufferNo]; - XAAMoveDWORDS(base, (CARD32*)src, dwords); - (*infoRec->SubsequentImageWriteScanline)(pScrn, bufferNo++); - src += srcwidth; - if(bufferNo >= infoRec->NumScanlineImageWriteBuffers) - bufferNo = 0; + while (h--) { + base = (CARD32 *) infoRec->ScanlineImageWriteBuffers[bufferNo]; + XAAMoveDWORDS(base, (CARD32 *) src, dwords); + (*infoRec->SubsequentImageWriteScanline) (pScrn, bufferNo++); + src += srcwidth; + if (bufferNo >= infoRec->NumScanlineImageWriteBuffers) + bufferNo = 0; } - if(beCareful) { - int shift = ((long)src & 0x03L) << 3; - base = (CARD32*)infoRec->ScanlineImageWriteBuffers[bufferNo]; - if(--dwords) - XAAMoveDWORDS(base,(CARD32*)src, dwords); - src = (unsigned char*)((long)(src + (dwords << 2)) & ~0x03L); - - base[dwords] = *((CARD32*)src) >> shift; - (*infoRec->SubsequentImageWriteScanline)(pScrn, bufferNo); + if (beCareful) { + int shift = ((long) src & 0x03L) << 3; + + base = (CARD32 *) infoRec->ScanlineImageWriteBuffers[bufferNo]; + if (--dwords) + XAAMoveDWORDS(base, (CARD32 *) src, dwords); + src = (unsigned char *) ((long) (src + (dwords << 2)) & ~0x03L); + + base[dwords] = *((CARD32 *) src) >> shift; + (*infoRec->SubsequentImageWriteScanline) (pScrn, bufferNo); } SET_SYNC_FLAG(infoRec); } - void -XAAPutImage( - DrawablePtr pDraw, - GCPtr pGC, - int depth, - int x, - int y, - int w, - int h, - int leftPad, - int format, - char *pImage -){ +XAAPutImage(DrawablePtr pDraw, + GCPtr pGC, + int depth, + int x, int y, int w, int h, int leftPad, int format, char *pImage) +{ XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC); int bpp = BitsPerPixel(depth); Bool depthBug = FALSE; - if(!w || !h) return; - if(!RegionNumRects(pGC->pCompositeClip)) - return; + if (!w || !h) + return; + + if (!RegionNumRects(pGC->pCompositeClip)) + return; depthBug = XAA_DEPTH_BUG(pGC); - if(((format == ZPixmap) && infoRec->WritePixmap && - ((pDraw->bitsPerPixel == bpp) || - ((pDraw->bitsPerPixel == 24) && (bpp == 32) && - (infoRec->WritePixmapFlags & CONVERT_32BPP_TO_24BPP))) && - CHECK_ROP(pGC,infoRec->WritePixmapFlags) && - CHECK_ROPSRC(pGC,infoRec->WritePixmapFlags) && - CHECK_PLANEMASK(pGC,infoRec->WritePixmapFlags) && - CHECK_NO_GXCOPY(pGC,infoRec->WritePixmapFlags)) || - ((format == XYBitmap) && !depthBug && infoRec->WriteBitmap && - CHECK_ROP(pGC,infoRec->WriteBitmapFlags) && - CHECK_ROPSRC(pGC,infoRec->WriteBitmapFlags) && - CHECK_PLANEMASK(pGC,infoRec->WriteBitmapFlags) && - CHECK_COLORS(pGC,infoRec->WriteBitmapFlags) && - !(infoRec->WriteBitmapFlags & TRANSPARENCY_ONLY)) || - ((format == XYPixmap) && !depthBug && infoRec->WriteBitmap && - CHECK_ROP(pGC,infoRec->WriteBitmapFlags) && - CHECK_ROPSRC(pGC,infoRec->WriteBitmapFlags) && - !(infoRec->WriteBitmapFlags & NO_PLANEMASK) && - !(infoRec->WriteBitmapFlags & TRANSPARENCY_ONLY))){ - - int MaxBoxes = RegionNumRects(pGC->pCompositeClip); - BoxPtr pbox, pClipBoxes; - int nboxes, srcx, srcy, srcwidth; - xRectangle TheRect; - - TheRect.x = pDraw->x + x; - TheRect.y = pDraw->y + y; - TheRect.width = w; - TheRect.height = h; - - if(MaxBoxes > (infoRec->PreAllocSize/sizeof(BoxRec))) { - pClipBoxes = malloc(MaxBoxes * sizeof(BoxRec)); - if(!pClipBoxes) return; - } else pClipBoxes = (BoxPtr)infoRec->PreAllocMem; - - nboxes = XAAGetRectClipBoxes(pGC, pClipBoxes, 1, &TheRect); - pbox = pClipBoxes; - - if(format == XYBitmap) { - srcwidth = BitmapBytePad(leftPad + w); - while(nboxes--) { - srcx = pbox->x1 - TheRect.x + leftPad; - srcy = pbox->y1 - TheRect.y; - (*infoRec->WriteBitmap)(infoRec->pScrn, pbox->x1, pbox->y1, - pbox->x2 - pbox->x1, pbox->y2 - pbox->y1, - (unsigned char*)pImage + - (srcwidth * srcy) + ((srcx >> 5) << 2), - srcwidth, srcx & 31, pGC->fgPixel, pGC->bgPixel, - pGC->alu, pGC->planemask); - pbox++; - } - } else if(format == ZPixmap) { - int Bpp = bpp >> 3; - srcwidth = PixmapBytePad(leftPad + w, depth); - while(nboxes--) { - srcx = pbox->x1 - TheRect.x + leftPad; - srcy = pbox->y1 - TheRect.y; - (*infoRec->WritePixmap)(infoRec->pScrn, pbox->x1, pbox->y1, - pbox->x2 - pbox->x1, pbox->y2 - pbox->y1, - (unsigned char*)pImage + - (srcwidth * srcy) + (srcx * Bpp), - srcwidth, pGC->alu, pGC->planemask, -1, - Bpp << 3, depth); - pbox++; - } - } else { /* XYPixmap */ - int depth = pGC->depth; - int numBox, increment; - unsigned long i, mask; - BoxPtr pntBox; - - srcwidth = BitmapBytePad(w + leftPad); - increment = h * srcwidth; - i = 1 << (depth - 1); - mask = ~0; - - if((infoRec->pScrn->overlayFlags & OVERLAY_8_32_PLANAR) && - (pGC->depth == 8)){ - i = 0x80000000; mask = 0xff000000; - } - - for(; i & mask; i >>= 1, pImage += increment) { - if(i & pGC->planemask) { - pntBox = pbox; - numBox = nboxes; - while(numBox--) { - srcx = pntBox->x1 - TheRect.x + leftPad; - srcy = pntBox->y1 - TheRect.y; - (*infoRec->WriteBitmap)(infoRec->pScrn, - pntBox->x1, pntBox->y1, - pntBox->x2 - pntBox->x1, - pntBox->y2 - pntBox->y1, - (unsigned char*)pImage + - (srcwidth * srcy) + ((srcx >> 5) << 2), - srcwidth, srcx & 31, ~0, 0, pGC->alu, i); - pntBox++; - } - } - } - - } - - if(pClipBoxes != (BoxPtr)infoRec->PreAllocMem) - free(pClipBoxes); - } else - XAAFallbackOps.PutImage(pDraw, pGC, depth, x, y, w, h, leftPad, - format, pImage); + if (((format == ZPixmap) && infoRec->WritePixmap && + ((pDraw->bitsPerPixel == bpp) || + ((pDraw->bitsPerPixel == 24) && (bpp == 32) && + (infoRec->WritePixmapFlags & CONVERT_32BPP_TO_24BPP))) && + CHECK_ROP(pGC, infoRec->WritePixmapFlags) && + CHECK_ROPSRC(pGC, infoRec->WritePixmapFlags) && + CHECK_PLANEMASK(pGC, infoRec->WritePixmapFlags) && + CHECK_NO_GXCOPY(pGC, infoRec->WritePixmapFlags)) || + ((format == XYBitmap) && !depthBug && infoRec->WriteBitmap && + CHECK_ROP(pGC, infoRec->WriteBitmapFlags) && + CHECK_ROPSRC(pGC, infoRec->WriteBitmapFlags) && + CHECK_PLANEMASK(pGC, infoRec->WriteBitmapFlags) && + CHECK_COLORS(pGC, infoRec->WriteBitmapFlags) && + !(infoRec->WriteBitmapFlags & TRANSPARENCY_ONLY)) || + ((format == XYPixmap) && !depthBug && infoRec->WriteBitmap && + CHECK_ROP(pGC, infoRec->WriteBitmapFlags) && + CHECK_ROPSRC(pGC, infoRec->WriteBitmapFlags) && + !(infoRec->WriteBitmapFlags & NO_PLANEMASK) && + !(infoRec->WriteBitmapFlags & TRANSPARENCY_ONLY))) { + + int MaxBoxes = RegionNumRects(pGC->pCompositeClip); + BoxPtr pbox, pClipBoxes; + int nboxes, srcx, srcy, srcwidth; + xRectangle TheRect; + + TheRect.x = pDraw->x + x; + TheRect.y = pDraw->y + y; + TheRect.width = w; + TheRect.height = h; + + if (MaxBoxes > (infoRec->PreAllocSize / sizeof(BoxRec))) { + pClipBoxes = malloc(MaxBoxes * sizeof(BoxRec)); + if (!pClipBoxes) + return; + } + else + pClipBoxes = (BoxPtr) infoRec->PreAllocMem; + + nboxes = XAAGetRectClipBoxes(pGC, pClipBoxes, 1, &TheRect); + pbox = pClipBoxes; + + if (format == XYBitmap) { + srcwidth = BitmapBytePad(leftPad + w); + while (nboxes--) { + srcx = pbox->x1 - TheRect.x + leftPad; + srcy = pbox->y1 - TheRect.y; + (*infoRec->WriteBitmap) (infoRec->pScrn, pbox->x1, pbox->y1, + pbox->x2 - pbox->x1, + pbox->y2 - pbox->y1, + (unsigned char *) pImage + + (srcwidth * srcy) + ((srcx >> 5) << 2), + srcwidth, srcx & 31, pGC->fgPixel, + pGC->bgPixel, pGC->alu, + pGC->planemask); + pbox++; + } + } + else if (format == ZPixmap) { + int Bpp = bpp >> 3; + + srcwidth = PixmapBytePad(leftPad + w, depth); + while (nboxes--) { + srcx = pbox->x1 - TheRect.x + leftPad; + srcy = pbox->y1 - TheRect.y; + (*infoRec->WritePixmap) (infoRec->pScrn, pbox->x1, pbox->y1, + pbox->x2 - pbox->x1, + pbox->y2 - pbox->y1, + (unsigned char *) pImage + + (srcwidth * srcy) + (srcx * Bpp), + srcwidth, pGC->alu, pGC->planemask, -1, + Bpp << 3, depth); + pbox++; + } + } + else { /* XYPixmap */ + int depth = pGC->depth; + int numBox, increment; + unsigned long i, mask; + BoxPtr pntBox; + + srcwidth = BitmapBytePad(w + leftPad); + increment = h * srcwidth; + i = 1 << (depth - 1); + mask = ~0; + + if ((infoRec->pScrn->overlayFlags & OVERLAY_8_32_PLANAR) && + (pGC->depth == 8)) { + i = 0x80000000; + mask = 0xff000000; + } + + for (; i & mask; i >>= 1, pImage += increment) { + if (i & pGC->planemask) { + pntBox = pbox; + numBox = nboxes; + while (numBox--) { + srcx = pntBox->x1 - TheRect.x + leftPad; + srcy = pntBox->y1 - TheRect.y; + (*infoRec->WriteBitmap) (infoRec->pScrn, + pntBox->x1, pntBox->y1, + pntBox->x2 - pntBox->x1, + pntBox->y2 - pntBox->y1, + (unsigned char *) pImage + + (srcwidth * srcy) + + ((srcx >> 5) << 2), srcwidth, + srcx & 31, ~0, 0, pGC->alu, i); + pntBox++; + } + } + } + + } + + if (pClipBoxes != (BoxPtr) infoRec->PreAllocMem) + free(pClipBoxes); + } + else + XAAFallbackOps.PutImage(pDraw, pGC, depth, x, y, w, h, leftPad, + format, pImage); } |