diff options
Diffstat (limited to 'nx-X11/programs/Xserver/hw/sun/sunGX.c')
-rw-r--r-- | nx-X11/programs/Xserver/hw/sun/sunGX.c | 2906 |
1 files changed, 0 insertions, 2906 deletions
diff --git a/nx-X11/programs/Xserver/hw/sun/sunGX.c b/nx-X11/programs/Xserver/hw/sun/sunGX.c deleted file mode 100644 index b6ecaac57..000000000 --- a/nx-X11/programs/Xserver/hw/sun/sunGX.c +++ /dev/null @@ -1,2906 +0,0 @@ -/* -static char *rid="$Xorg: sunGX.c,v 1.5 2001/02/09 02:04:44 xorgcvs Exp $"; - */ -/* -Copyright 1991, 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. - * - * Author: Keith Packard, MIT X Consortium - */ - -/* $XFree86: xc/programs/Xserver/hw/sun/sunGX.c,v 1.8 2003/07/19 13:22:28 tsi Exp $ */ - -#include "sun.h" - -#include <X11/Xmd.h> -#include "gcstruct.h" -#include "scrnintstr.h" -#include "pixmapstr.h" -#include "regionstr.h" -#include "mistruct.h" -#include <X11/fonts/fontstruct.h> -#include "dixfontstr.h" -#include "cfb/cfb.h" -#include "cfb/cfbmskbits.h" -#include "cfb/cfb8bit.h" -#include "fastblt.h" -#include "mergerop.h" -#include "sunGX.h" -#include "migc.h" -#include "mispans.h" - -#define sunGXFillSpan(gx,y,x1,x2,r) {\ - (gx)->apointy = (y); \ - (gx)->apointx = (x1); \ - (gx)->arectx = (x2); \ - GXDrawDone(gx,r); \ -} - -#define GXSetClip(gx,pbox) {\ - (gx)->clipminx = (pbox)->x1; \ - (gx)->clipminy = (pbox)->y1; \ - (gx)->clipmaxx = (pbox)->x2 - 1; \ - (gx)->clipmaxy = (pbox)->y2 - 1; \ -} - -#define GXSetOff(gx,x,y) {\ - (gx)->offx = (x); \ - (gx)->offy = (y); \ -} - -#define GXResetClip(gx,pScreen) { \ - (gx)->clipminx = 0; \ - (gx)->clipminy = 0; \ - (gx)->clipmaxx = (pScreen)->width - 1; \ - (gx)->clipmaxy = (pScreen)->height - 1; \ -} - -#define GXResetOff(gx) {\ - (gx)->offx = 0; \ - (gx)->offy = 0; \ -} - -#define sunGXGetAddrRange(pDrawable,extents,base,lo,hi) {\ - int __x__; \ - cfbGetWindowByteWidthAndPointer((WindowPtr)pDrawable,__x__,base); \ - lo = (base) + WIDTH_MUL((extents)->y1) + (extents)->x1; \ - hi = (base) + WIDTH_MUL((extents)->y2 - 1) + (extents)->x2 - 1; \ - (base) = (base) + WIDTH_MUL(pDrawable->y) + pDrawable->x; \ -} - -/* - rop_tables - ========== - lookup tables for GX raster ops, with the plane_mask,pixel_mask,pattern_mask - ,attrib_sel, polygon_draw,raster_mode encoded into the top half. - There is a lookup table for each commonly used combination. -*/ - -/* rops for bit blit / copy area - with: - Plane Mask - use plane mask reg. - Pixel Mask - use all ones. - Patt Mask - use all ones. -*/ - -#define POLY_O GX_POLYG_OVERLAP -#define POLY_N GX_POLYG_NONOVERLAP - -#define ROP_STANDARD (GX_PLANE_MASK |\ - GX_PIXEL_ONES |\ - GX_ATTR_SUPP |\ - GX_RAST_BOOL |\ - GX_PLOT_PLOT) - -/* fg = don't care bg = don't care */ - -#define ROP_BLIT(O,I) (ROP_STANDARD | \ - GX_PATTERN_ONES |\ - GX_ROP_11_1(I) |\ - GX_ROP_11_0(O) |\ - GX_ROP_10_1(I) |\ - GX_ROP_10_0(O) |\ - GX_ROP_01_1(I) |\ - GX_ROP_01_0(O) |\ - GX_ROP_00_1(I) |\ - GX_ROP_00_0(O)) - -/* fg = fgPixel bg = don't care */ - -#define ROP_FILL(O,I) (ROP_STANDARD | \ - GX_PATTERN_ONES |\ - GX_ROP_11_1(I) |\ - GX_ROP_11_0(I) |\ - GX_ROP_10_1(I) |\ - GX_ROP_10_0(I) | \ - GX_ROP_01_1(O) |\ - GX_ROP_01_0(O) |\ - GX_ROP_00_1(O) |\ - GX_ROP_00_0(O)) - -/* fg = fgPixel bg = don't care */ - -#define ROP_STIP(O,I) (ROP_STANDARD |\ - GX_ROP_11_1(I) |\ - GX_ROP_11_0(GX_ROP_NOOP) |\ - GX_ROP_10_1(I) |\ - GX_ROP_10_0(GX_ROP_NOOP) | \ - GX_ROP_01_1(O) |\ - GX_ROP_01_0(GX_ROP_NOOP) |\ - GX_ROP_00_1(O) |\ - GX_ROP_00_0(GX_ROP_NOOP)) - -/* fg = fgPixel bg = bgPixel */ - -#define ROP_OSTP(O,I) (ROP_STANDARD |\ - GX_ROP_11_1(I) |\ - GX_ROP_11_0(I) |\ - GX_ROP_10_1(I) |\ - GX_ROP_10_0(O) |\ - GX_ROP_01_1(O) |\ - GX_ROP_01_0(I) |\ - GX_ROP_00_1(O) |\ - GX_ROP_00_0(O)) - -#define ROP_ITXT(O,I) (ROP_STANDARD |\ - GX_PATTERN_ONES |\ - GX_ROP_11_1(I) |\ - GX_ROP_11_0(I) |\ - GX_ROP_10_1(I) |\ - GX_ROP_10_0(O) |\ - GX_ROP_01_1(O) |\ - GX_ROP_01_0(I) |\ - GX_ROP_00_1(O) |\ - GX_ROP_00_0(O)) - -#define ROP_PTXT(O,I) (ROP_STANDARD |\ - GX_PATTERN_ONES |\ - GX_ROP_11_1(I) |\ - GX_ROP_11_0(GX_ROP_NOOP) |\ - GX_ROP_10_1(I) |\ - GX_ROP_10_0(GX_ROP_NOOP) | \ - GX_ROP_01_1(O) |\ - GX_ROP_01_0(GX_ROP_NOOP) |\ - GX_ROP_00_1(O) |\ - GX_ROP_00_0(GX_ROP_NOOP)) - -static Uint gx_blit_rop_table[16]={ - ROP_BLIT(GX_ROP_CLEAR, GX_ROP_CLEAR), /* GXclear */ - ROP_BLIT(GX_ROP_CLEAR, GX_ROP_NOOP), /* GXand */ - ROP_BLIT(GX_ROP_CLEAR, GX_ROP_INVERT), /* GXandReverse */ - ROP_BLIT(GX_ROP_CLEAR, GX_ROP_SET), /* GXcopy */ - ROP_BLIT(GX_ROP_NOOP, GX_ROP_CLEAR), /* GXandInverted */ - ROP_BLIT(GX_ROP_NOOP, GX_ROP_NOOP), /* GXnoop */ - ROP_BLIT(GX_ROP_NOOP, GX_ROP_INVERT), /* GXxor */ - ROP_BLIT(GX_ROP_NOOP, GX_ROP_SET), /* GXor */ - ROP_BLIT(GX_ROP_INVERT, GX_ROP_CLEAR), /* GXnor */ - ROP_BLIT(GX_ROP_INVERT, GX_ROP_NOOP), /* GXequiv */ - ROP_BLIT(GX_ROP_INVERT, GX_ROP_INVERT), /* GXinvert */ - ROP_BLIT(GX_ROP_INVERT, GX_ROP_SET), /* GXorReverse */ - ROP_BLIT(GX_ROP_SET, GX_ROP_CLEAR), /* GXcopyInverted */ - ROP_BLIT(GX_ROP_SET, GX_ROP_NOOP), /* GXorInverted */ - ROP_BLIT(GX_ROP_SET, GX_ROP_INVERT), /* GXnand */ - ROP_BLIT(GX_ROP_SET, GX_ROP_SET), /* GXset */ -}; - -/* rops for solid drawing - with: - Plane Mask - use plane mask reg. - Pixel Mask - use all ones. - Patt Mask - use all ones. -*/ - -static Uint gx_solid_rop_table[16]={ - ROP_FILL(GX_ROP_CLEAR, GX_ROP_CLEAR), /* GXclear */ - ROP_FILL(GX_ROP_CLEAR, GX_ROP_NOOP), /* GXand */ - ROP_FILL(GX_ROP_CLEAR, GX_ROP_INVERT), /* GXandReverse */ - ROP_FILL(GX_ROP_CLEAR, GX_ROP_SET), /* GXcopy */ - ROP_FILL(GX_ROP_NOOP, GX_ROP_CLEAR), /* GXandInverted */ - ROP_FILL(GX_ROP_NOOP, GX_ROP_NOOP), /* GXnoop */ - ROP_FILL(GX_ROP_NOOP, GX_ROP_INVERT), /* GXxor */ - ROP_FILL(GX_ROP_NOOP, GX_ROP_SET), /* GXor */ - ROP_FILL(GX_ROP_INVERT, GX_ROP_CLEAR), /* GXnor */ - ROP_FILL(GX_ROP_INVERT, GX_ROP_NOOP), /* GXequiv */ - ROP_FILL(GX_ROP_INVERT, GX_ROP_INVERT), /* GXinvert */ - ROP_FILL(GX_ROP_INVERT, GX_ROP_SET), /* GXorReverse */ - ROP_FILL(GX_ROP_SET, GX_ROP_CLEAR), /* GXcopyInverted */ - ROP_FILL(GX_ROP_SET, GX_ROP_NOOP), /* GXorInverted */ - ROP_FILL(GX_ROP_SET, GX_ROP_INVERT), /* GXnand */ - ROP_FILL(GX_ROP_SET, GX_ROP_SET), /* GXset */ -}; - -static Uint gx_stipple_rop_table[16]={ - ROP_STIP(GX_ROP_CLEAR, GX_ROP_CLEAR), /* GXclear */ - ROP_STIP(GX_ROP_CLEAR, GX_ROP_NOOP), /* GXand */ - ROP_STIP(GX_ROP_CLEAR, GX_ROP_INVERT), /* GXandReverse */ - ROP_STIP(GX_ROP_CLEAR, GX_ROP_SET), /* GXcopy */ - ROP_STIP(GX_ROP_NOOP, GX_ROP_CLEAR), /* GXandInverted */ - ROP_STIP(GX_ROP_NOOP, GX_ROP_NOOP), /* GXnoop */ - ROP_STIP(GX_ROP_NOOP, GX_ROP_INVERT), /* GXxor */ - ROP_STIP(GX_ROP_NOOP, GX_ROP_SET), /* GXor */ - ROP_STIP(GX_ROP_INVERT, GX_ROP_CLEAR), /* GXnor */ - ROP_STIP(GX_ROP_INVERT, GX_ROP_NOOP), /* GXequiv */ - ROP_STIP(GX_ROP_INVERT, GX_ROP_INVERT), /* GXinvert */ - ROP_STIP(GX_ROP_INVERT, GX_ROP_SET), /* GXorReverse */ - ROP_STIP(GX_ROP_SET, GX_ROP_CLEAR), /* GXcopyInverted */ - ROP_STIP(GX_ROP_SET, GX_ROP_NOOP), /* GXorInverted */ - ROP_STIP(GX_ROP_SET, GX_ROP_INVERT), /* GXnand */ - ROP_STIP(GX_ROP_SET, GX_ROP_SET), /* GXset */ -}; - -static Uint gx_opaque_stipple_rop_table[16]={ - ROP_OSTP(GX_ROP_CLEAR, GX_ROP_CLEAR), /* GXclear */ - ROP_OSTP(GX_ROP_CLEAR, GX_ROP_NOOP), /* GXand */ - ROP_OSTP(GX_ROP_CLEAR, GX_ROP_INVERT), /* GXandReverse */ - ROP_OSTP(GX_ROP_CLEAR, GX_ROP_SET), /* GXcopy */ - ROP_OSTP(GX_ROP_NOOP, GX_ROP_CLEAR), /* GXandInverted */ - ROP_OSTP(GX_ROP_NOOP, GX_ROP_NOOP), /* GXnoop */ - ROP_OSTP(GX_ROP_NOOP, GX_ROP_INVERT), /* GXxor */ - ROP_OSTP(GX_ROP_NOOP, GX_ROP_SET), /* GXor */ - ROP_OSTP(GX_ROP_INVERT, GX_ROP_CLEAR), /* GXnor */ - ROP_OSTP(GX_ROP_INVERT, GX_ROP_NOOP), /* GXequiv */ - ROP_OSTP(GX_ROP_INVERT, GX_ROP_INVERT), /* GXinvert */ - ROP_OSTP(GX_ROP_INVERT, GX_ROP_SET), /* GXorReverse */ - ROP_OSTP(GX_ROP_SET, GX_ROP_CLEAR), /* GXcopyInverted */ - ROP_OSTP(GX_ROP_SET, GX_ROP_NOOP), /* GXorInverted */ - ROP_OSTP(GX_ROP_SET, GX_ROP_INVERT), /* GXnand */ - ROP_OSTP(GX_ROP_SET, GX_ROP_SET), /* GXset */ -}; - -int sunGXScreenPrivateIndex; -int sunGXGCPrivateIndex; -int sunGXWindowPrivateIndex; -int sunGXGeneration; - -/* - sunGXDoBitBlt - ============= - Bit Blit for all window to window blits. -*/ -static void -sunGXDoBitblt(pSrc, pDst, alu, prgnDst, pptSrc, planemask) - DrawablePtr pSrc, pDst; - int alu; - RegionPtr prgnDst; - DDXPointPtr pptSrc; - unsigned long planemask; -{ - register sunGXPtr gx = sunGXGetScreenPrivate (pSrc->pScreen); - register long r; - register BoxPtr pboxTmp; - register DDXPointPtr pptTmp; - register int nbox; - BoxPtr pboxNext,pboxBase,pbox; - - /* setup GX ( need fg of 0xff for blits ) */ - GXBlitInit(gx,gx_blit_rop_table[alu]|POLY_O,planemask); - - pbox = REGION_RECTS(prgnDst); - nbox = REGION_NUM_RECTS(prgnDst); - - /* need to blit rectangles in different orders, depending on the direction of copy - so that an area isnt overwritten before it is blitted */ - if( (pptSrc->y < pbox->y1) && (nbox > 1) ){ - - if( (pptSrc->x < pbox->x1) && (nbox > 1) ){ - - /* reverse order of bands and rects in each band */ - pboxTmp=pbox+nbox; - pptTmp=pptSrc+nbox; - - while (nbox--){ - pboxTmp--; - pptTmp--; - gx->x0=pptTmp->x; - gx->y0=pptTmp->y; - gx->x1=pptTmp->x+(pboxTmp->x2-pboxTmp->x1)-1; - gx->y1=pptTmp->y+(pboxTmp->y2-pboxTmp->y1)-1; - gx->x2=pboxTmp->x1; - gx->y2=pboxTmp->y1; - gx->x3=pboxTmp->x2-1; - gx->y3=pboxTmp->y2-1; - GXBlitDone(gx,r); - } - } - else{ - - /* keep ordering in each band, reverse order of bands */ - pboxBase = pboxNext = pbox+nbox-1; - - while (pboxBase >= pbox){ /* for each band */ - - /* find first box in band */ - while ((pboxNext >= pbox) && - (pboxBase->y1 == pboxNext->y1)) - pboxNext--; - - pboxTmp = pboxNext+1; /* first box in band */ - pptTmp = pptSrc + (pboxTmp - pbox); /* first point in band */ - - while (pboxTmp <= pboxBase){ /* for each box in band */ - gx->x0=pptTmp->x; - gx->y0=pptTmp->y; - gx->x1=pptTmp->x+(pboxTmp->x2-pboxTmp->x1)-1; - gx->y1=pptTmp->y+(pboxTmp->y2-pboxTmp->y1)-1; - gx->x2=pboxTmp->x1; - gx->y2=pboxTmp->y1; - gx->x3=pboxTmp->x2-1; - gx->y3=pboxTmp->y2-1; - ++pboxTmp; - ++pptTmp; - GXBlitDone(gx,r); - } - pboxBase = pboxNext; - } - } - } - else{ - - if( (pptSrc->x < pbox->x1) && (nbox > 1) ){ - - /* reverse order of rects in each band */ - pboxBase = pboxNext = pbox; - - while (pboxBase < pbox+nbox){ /* for each band */ - - /* find last box in band */ - while ((pboxNext < pbox+nbox) && - (pboxNext->y1 == pboxBase->y1)) - pboxNext++; - - pboxTmp = pboxNext; /* last box in band */ - pptTmp = pptSrc + (pboxTmp - pbox); /* last point in band */ - - while (pboxTmp != pboxBase){ /* for each box in band */ - --pboxTmp; - --pptTmp; - gx->x0=pptTmp->x; - gx->y0=pptTmp->y; - gx->x1=pptTmp->x+(pboxTmp->x2-pboxTmp->x1)-1; - gx->y1=pptTmp->y+(pboxTmp->y2-pboxTmp->y1)-1; - gx->x2=pboxTmp->x1; - gx->y2=pboxTmp->y1; - gx->x3=pboxTmp->x2-1; - gx->y3=pboxTmp->y2-1; - GXBlitDone(gx,r); - } - pboxBase = pboxNext; - } - } - else{ - - /* dont need to change order of anything */ - pptTmp=pptSrc; - pboxTmp=pbox; - - while(nbox--){ - gx->x0=pptTmp->x; - gx->y0=pptTmp->y; - gx->x1=pptTmp->x+(pboxTmp->x2-pboxTmp->x1)-1; - gx->y1=pptTmp->y+(pboxTmp->y2-pboxTmp->y1)-1; - gx->x2=pboxTmp->x1; - gx->y2=pboxTmp->y1; - gx->x3=pboxTmp->x2-1; - gx->y3=pboxTmp->y2-1; - pboxTmp++; - pptTmp++; - GXBlitDone(gx,r); - } - } - } - GXWait(gx,r); -} - -RegionPtr -sunGXCopyArea(pSrcDrawable, pDstDrawable, - pGC, srcx, srcy, width, height, dstx, dsty) - register DrawablePtr pSrcDrawable; - register DrawablePtr pDstDrawable; - GC *pGC; - int srcx, srcy; - int width, height; - int dstx, dsty; -{ - if (pSrcDrawable->type != DRAWABLE_WINDOW) - return cfbCopyArea (pSrcDrawable, pDstDrawable, - pGC, srcx, srcy, width, height, dstx, dsty); - return cfbBitBlt (pSrcDrawable, pDstDrawable, - pGC, srcx, srcy, width, height, dstx, dsty, sunGXDoBitblt, 0); -} - -static unsigned long copyPlaneFG, copyPlaneBG; - -static void -sunGXCopyPlane1to8 (pSrcDrawable, pDstDrawable, rop, prgnDst, pptSrc, planemask, bitPlane) - DrawablePtr pSrcDrawable; - DrawablePtr pDstDrawable; - int rop; - RegionPtr prgnDst; - DDXPointPtr pptSrc; - unsigned long planemask; - unsigned long bitPlane; -{ - register sunGXPtr gx = sunGXGetScreenPrivate (pDstDrawable->pScreen); - int srcx, srcy, dstx, dsty, width, height; - int dstLastx, dstRightx; - int xoffSrc, widthSrc, widthRest; - int widthLast; - unsigned long *psrcBase, *psrc; - unsigned long bits, tmp; - register int leftShift, rightShift; - register int nl, nlMiddle; - int nbox; - BoxPtr pbox; - register int r; - - GXDrawInit (gx, copyPlaneFG, - gx_opaque_stipple_rop_table[rop]|GX_PATTERN_ONES, - planemask); - gx->bg = copyPlaneBG; - gx->mode = GX_BLIT_NOSRC | GX_MODE_COLOR1; - - cfbGetLongWidthAndPointer (pSrcDrawable, widthSrc, psrcBase) - - nbox = REGION_NUM_RECTS(prgnDst); - pbox = REGION_RECTS(prgnDst); - gx->incx = 32; - gx->incy = 0; - while (nbox--) - { - dstx = pbox->x1; - dsty = pbox->y1; - srcx = pptSrc->x; - srcy = pptSrc->y; - dstLastx = pbox->x2; - width = dstLastx - dstx; - height = pbox->y2 - dsty; - pbox++; - pptSrc++; - if (!width) - continue; - psrc = psrcBase + srcy * widthSrc + (srcx >> 5); - dstLastx--; - dstRightx = dstx + 31; - nlMiddle = (width + 31) >> 5; - widthLast = width & 31; - xoffSrc = srcx & 0x1f; - leftShift = xoffSrc; - rightShift = 32 - leftShift; - widthRest = widthSrc - nlMiddle; - if (widthLast) - nlMiddle--; - if (leftShift == 0) - { - while (height--) - { - gx->x0 = dstx; - gx->x1 = dstRightx; - gx->y0 = dsty++; - nl = nlMiddle; - while (nl--) - gx->font = *psrc++; - if (widthLast) - { - gx->x1 = dstLastx; - gx->font = *psrc++; - } - psrc += widthRest; - } - } - else - { - widthRest--; - while (height--) - { - gx->x0 = dstx; - gx->x1 = dstRightx; - gx->y0 = dsty++; - bits = *psrc++; - nl = nlMiddle; - while (nl--) - { - tmp = BitLeft(bits, leftShift); - bits = *psrc++; - tmp |= BitRight(bits, rightShift); - gx->font = tmp; - } - if (widthLast) - { - tmp = BitLeft(bits, leftShift); - bits = *psrc++; - tmp |= BitRight(bits, rightShift); - gx->x1 = dstLastx; - gx->font = tmp; - } - psrc += widthRest; - } - } - } - GXWait (gx, r); - gx->incx = 0; - gx->incy = 0; - gx->mode = GX_BLIT_SRC | GX_MODE_COLOR8; -} - -RegionPtr sunGXCopyPlane(pSrcDrawable, pDstDrawable, - pGC, srcx, srcy, width, height, dstx, dsty, bitPlane) - DrawablePtr pSrcDrawable; - DrawablePtr pDstDrawable; - GCPtr pGC; - int srcx, srcy; - int width, height; - int dstx, dsty; - unsigned long bitPlane; -{ - RegionPtr ret; - - if (pSrcDrawable->bitsPerPixel == 1 && pDstDrawable->bitsPerPixel == 8) - { - if (bitPlane == 1) - { - copyPlaneFG = pGC->fgPixel; - copyPlaneBG = pGC->bgPixel; - ret = cfbBitBlt (pSrcDrawable, pDstDrawable, - pGC, srcx, srcy, width, height, dstx, dsty, sunGXCopyPlane1to8, bitPlane); - } - else - ret = miHandleExposures (pSrcDrawable, pDstDrawable, - pGC, srcx, srcy, width, height, dstx, dsty, bitPlane); - } - else if (pSrcDrawable->bitsPerPixel == 8 && pDstDrawable->bitsPerPixel == 1) - { - extern int InverseAlu[16]; - int oldalu; - - oldalu = pGC->alu; - if ((pGC->fgPixel & 1) == 0 && (pGC->bgPixel&1) == 1) - pGC->alu = InverseAlu[pGC->alu]; - else if ((pGC->fgPixel & 1) == (pGC->bgPixel & 1)) - pGC->alu = mfbReduceRop(pGC->alu, pGC->fgPixel); - ret = cfbCopyPlaneReduce (pSrcDrawable, pDstDrawable, - pGC, srcx, srcy, width, height, dstx, dsty, cfbCopyPlane8to1, bitPlane); - pGC->alu = oldalu; - } - else - { - PixmapPtr pBitmap; - ScreenPtr pScreen = pSrcDrawable->pScreen; - GCPtr pGC1; - - pBitmap = (*pScreen->CreatePixmap) (pScreen, width, height, 1); - if (!pBitmap) - return NULL; - pGC1 = GetScratchGC (1, pScreen); - if (!pGC1) - { - (*pScreen->DestroyPixmap) (pBitmap); - return NULL; - } - /* - * don't need to set pGC->fgPixel,bgPixel as copyPlane8to1 - * ignores pixel values, expecting the rop to "do the - * right thing", which GXcopy will. - */ - ValidateGC ((DrawablePtr) pBitmap, pGC1); - /* no exposures here, scratch GC's don't get graphics expose */ - (void) cfbCopyPlaneReduce (pSrcDrawable, (DrawablePtr) pBitmap, - pGC1, srcx, srcy, width, height, 0, 0, cfbCopyPlane8to1, bitPlane); - copyPlaneFG = pGC->fgPixel; - copyPlaneBG = pGC->bgPixel; - (void) cfbBitBlt ((DrawablePtr) pBitmap, pDstDrawable, pGC, - 0, 0, width, height, dstx, dsty, sunGXCopyPlane1to8, 1); - FreeScratchGC (pGC1); - (*pScreen->DestroyPixmap) (pBitmap); - /* compute resultant exposures */ - ret = miHandleExposures (pSrcDrawable, pDstDrawable, pGC, - srcx, srcy, width, height, - dstx, dsty, bitPlane); - } - return ret; -} - -void -sunGXFillRectAll (pDrawable, pGC, nBox, pBox) - DrawablePtr pDrawable; - GCPtr pGC; - int nBox; - BoxPtr pBox; -{ - register sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - register sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC); - register int r; - - GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_N,pGC->planemask); - if (gxPriv->stipple) - GXStippleInit(gx,gxPriv->stipple); - while (nBox--) { - gx->arecty = pBox->y1; - gx->arectx = pBox->x1; - gx->arecty = pBox->y2; - gx->arectx = pBox->x2; - pBox++; - GXDrawDone(gx,r); - } - GXWait(gx,r); -} - -#define NUM_STACK_RECTS 1024 - -void -sunGXPolyFillRect(pDrawable, pGC, nrectFill, prectInit) - DrawablePtr pDrawable; - register GCPtr pGC; - int nrectFill; /* number of rectangles to fill */ - xRectangle *prectInit; /* Pointer to first rectangle to fill */ -{ - xRectangle *prect; - RegionPtr prgnClip; - register BoxPtr pbox; - register BoxPtr pboxClipped; - BoxPtr pboxClippedBase; - BoxPtr pextent; - BoxRec stackRects[NUM_STACK_RECTS]; - int numRects; - int n; - int xorg, yorg; - - prgnClip = pGC->pCompositeClip; - prect = prectInit; - xorg = pDrawable->x; - yorg = pDrawable->y; - if (xorg || yorg) - { - prect = prectInit; - n = nrectFill; - while(n--) - { - prect->x += xorg; - prect->y += yorg; - prect++; - } - } - - prect = prectInit; - - numRects = REGION_NUM_RECTS(prgnClip) * nrectFill; - if (numRects > NUM_STACK_RECTS) - { - pboxClippedBase = (BoxPtr)ALLOCATE_LOCAL(numRects * sizeof(BoxRec)); - if (!pboxClippedBase) - return; - } - else - pboxClippedBase = stackRects; - - pboxClipped = pboxClippedBase; - - if (REGION_NUM_RECTS(prgnClip) == 1) - { - int x1, y1, x2, y2, bx2, by2; - - pextent = REGION_RECTS(prgnClip); - x1 = pextent->x1; - y1 = pextent->y1; - x2 = pextent->x2; - y2 = pextent->y2; - while (nrectFill--) - { - if ((pboxClipped->x1 = prect->x) < x1) - pboxClipped->x1 = x1; - - if ((pboxClipped->y1 = prect->y) < y1) - pboxClipped->y1 = y1; - - bx2 = (int) prect->x + (int) prect->width; - if (bx2 > x2) - bx2 = x2; - pboxClipped->x2 = bx2; - - by2 = (int) prect->y + (int) prect->height; - if (by2 > y2) - by2 = y2; - pboxClipped->y2 = by2; - - prect++; - if ((pboxClipped->x1 < pboxClipped->x2) && - (pboxClipped->y1 < pboxClipped->y2)) - { - pboxClipped++; - } - } - } - else - { - int x1, y1, x2, y2, bx2, by2; - - pextent = REGION_EXTENTS(pGC->pScreen, prgnClip); - x1 = pextent->x1; - y1 = pextent->y1; - x2 = pextent->x2; - y2 = pextent->y2; - while (nrectFill--) - { - BoxRec box; - - if ((box.x1 = prect->x) < x1) - box.x1 = x1; - - if ((box.y1 = prect->y) < y1) - box.y1 = y1; - - bx2 = (int) prect->x + (int) prect->width; - if (bx2 > x2) - bx2 = x2; - box.x2 = bx2; - - by2 = (int) prect->y + (int) prect->height; - if (by2 > y2) - by2 = y2; - box.y2 = by2; - - prect++; - - if ((box.x1 >= box.x2) || (box.y1 >= box.y2)) - continue; - - n = REGION_NUM_RECTS (prgnClip); - pbox = REGION_RECTS(prgnClip); - - /* clip the rectangle to each box in the clip region - this is logically equivalent to calling Intersect() - */ - while(n--) - { - pboxClipped->x1 = max(box.x1, pbox->x1); - pboxClipped->y1 = max(box.y1, pbox->y1); - pboxClipped->x2 = min(box.x2, pbox->x2); - pboxClipped->y2 = min(box.y2, pbox->y2); - pbox++; - - /* see if clipping left anything */ - if(pboxClipped->x1 < pboxClipped->x2 && - pboxClipped->y1 < pboxClipped->y2) - { - pboxClipped++; - } - } - } - } - if (pboxClipped != pboxClippedBase) - sunGXFillRectAll(pDrawable, pGC, - pboxClipped-pboxClippedBase, pboxClippedBase); - if (pboxClippedBase != stackRects) - DEALLOCATE_LOCAL(pboxClippedBase); -} - -void -sunGXFillSpans (pDrawable, pGC, n, ppt, pwidth, fSorted) - DrawablePtr pDrawable; - GCPtr pGC; - int n; /* number of spans to fill */ - DDXPointPtr ppt; /* pointer to list of start points */ - int *pwidth; /* pointer to list of n widths */ - int fSorted; -{ - int x, y; - int width; - /* next three parameters are post-clip */ - int nTmp; - int *pwidthFree;/* copies of the pointers to free */ - DDXPointPtr pptFree; - register sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - cfbPrivGCPtr devPriv = cfbGetGCPrivate(pGC); - register sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC); - register int r; - BoxPtr extents; - - GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_O,pGC->planemask) - if (gxPriv->stipple) - GXStippleInit(gx,gxPriv->stipple); - if (devPriv->oneRect) - { - extents = &pGC->pCompositeClip->extents; - GXSetClip (gx, extents); - } - else - { - nTmp = n * miFindMaxBand(pGC->pCompositeClip); - pwidthFree = (int *)ALLOCATE_LOCAL(nTmp * sizeof(int)); - pptFree = (DDXPointRec *)ALLOCATE_LOCAL(nTmp * sizeof(DDXPointRec)); - if(!pptFree || !pwidthFree) - { - if (pptFree) DEALLOCATE_LOCAL(pptFree); - if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree); - return; - } - n = miClipSpans(pGC->pCompositeClip, ppt, pwidth, n, - pptFree, pwidthFree, fSorted); - pwidth = pwidthFree; - ppt = pptFree; - } - while (n--) - { - x = ppt->x; - y = ppt->y; - ppt++; - width = *pwidth++; - if (width) - { - sunGXFillSpan(gx,y,x,x + width - 1,r); - } - } - GXWait(gx,r); - if (devPriv->oneRect) - { - GXResetClip (gx, pDrawable->pScreen); - } - else - { - DEALLOCATE_LOCAL(pptFree); - DEALLOCATE_LOCAL(pwidthFree); - } -} - -#ifdef NOTDEF -/* cfb is faster for dots */ -void -sunGXPolyPoint(pDrawable, pGC, mode, npt, pptInit) - DrawablePtr pDrawable; - GCPtr pGC; - int mode; - int npt; - xPoint *pptInit; -{ - register sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - RegionPtr cclip; - int nbox; - register int i; - register BoxPtr pbox; - cfbPrivGCPtr devPriv; - xPoint *ppt; - int x, y; - int r; - int off; - - devPriv = (cfbPrivGC *)(pGC->devPrivates[cfbGCPrivateIndex].ptr); - if (devPriv->rop == GXnoop) - return; - cclip = pGC->pCompositeClip; - GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu],pGC->planemask); - gx->offx = pDrawable->x; - gx->offy = pDrawable->y; - for (nbox = REGION_NUM_RECTS(cclip), pbox = REGION_RECTS(cclip); - --nbox >= 0; - pbox++) - { - sunGXSetClip(gx,pbox); - if (mode != CoordModeOrigin) - { - x = 0; - y = 0; - for (ppt = pptInit, i = npt; --i >= 0;) - { - gx->apointy = y += ppt->y; - gx->apointx = x += ppt->x; - ++ppt; - GXDrawDone(gx,r); - } - } - else - { - for (ppt = pptInit, i = npt; --i >= 0;) - { - gx->apointy = ppt->y; - gx->apointx = ppt->x; - ++ppt; - GXDrawDone(gx,r); - } - } - } - GXWait(gx,r); - GXResetOff (gx); - GXResetClip(gx,pDrawable->pScreen); -} -#endif - -#include "mifillarc.h" - -#define FILLSPAN(gx,y,x1,x2,r) {\ - if (x2 >= x1) {\ - sunGXFillSpan(gx,y,x1,x2,r) \ - } \ -} - -#define FILLSLICESPANS(flip,y) \ - if (!flip) \ - { \ - FILLSPAN(gx,y,xl,xr,r) \ - } \ - else \ - { \ - xc = xorg - x; \ - FILLSPAN(gx, y, xc, xr, r) \ - xc += slw - 1; \ - FILLSPAN(gx, y, xl, xc, r) \ - } - -static void -sunGXFillEllipse (pDraw, gx, arc) - DrawablePtr pDraw; - sunGXPtr gx; - xArc *arc; -{ - int x, y, e; - int yk, xk, ym, xm, dx, dy, xorg, yorg; - int y_top, y_bot; - miFillArcRec info; - register int xpos; - int r; - int slw; - - miFillArcSetup(arc, &info); - MIFILLARCSETUP(); - y_top = yorg - y; - y_bot = yorg + y + dy; - while (y) - { - y_top++; - y_bot--; - MIFILLARCSTEP(slw); - if (!slw) - continue; - xpos = xorg - x; - sunGXFillSpan (gx,y_top,xpos,xpos+slw - 1,r); - if (miFillArcLower(slw)) - sunGXFillSpan (gx,y_bot,xpos,xpos+slw - 1,r); - } -} - - -static void -sunGXFillArcSlice (pDraw, pGC, gx, arc) - DrawablePtr pDraw; - GCPtr pGC; - sunGXPtr gx; - xArc *arc; -{ - int yk, xk, ym, xm, dx, dy, xorg, yorg, slw; - register int x, y, e; - miFillArcRec info; - miArcSliceRec slice; - int xl, xr, xc; - int y_top, y_bot; - int r; - - miFillArcSetup(arc, &info); - miFillArcSliceSetup(arc, &slice, pGC); - MIFILLARCSETUP(); - y_top = yorg - y; - y_bot = yorg + y + dy; - while (y > 0) - { - y_top++; - y_bot--; - MIFILLARCSTEP(slw); - MIARCSLICESTEP(slice.edge1); - MIARCSLICESTEP(slice.edge2); - if (miFillSliceUpper(slice)) - { - MIARCSLICEUPPER(xl, xr, slice, slw); - FILLSLICESPANS(slice.flip_top, y_top); - } - if (miFillSliceLower(slice)) - { - MIARCSLICELOWER(xl, xr, slice, slw); - FILLSLICESPANS(slice.flip_bot, y_bot); - } - } -} - -#define FAST_CIRCLES -#ifdef FAST_CIRCLES -#if (BITMAP_BIT_ORDER == MSBFirst) -#define Bits32(v) (v) -#define Bits16(v) (v) -#define Bits8(v) (v) -#else -#define FlipBits2(a) ((((a) & 0x1) << 1) | (((a) & 0x2) >> 1)) -#define FlipBits4(a) ((FlipBits2(a) << 2) | FlipBits2(a >> 2)) -#define FlipBits8(a) ((FlipBits4(a) << 4) | FlipBits4(a >> 4)) -#define FlipBits16(a) ((FlipBits8(a) << 8) | FlipBits8(a >> 8)) -#define FlipBits32(a) ((FlipBits16(a) << 16) | FlipBits16(a >> 16)) -#define Bits32(v) FlipBits32(v) -#define Bits16(v) FlipBits16(v) -#define Bits8(v) FlipBits8(v) -#endif - -#define B(x) Bits16(x) -#define DO_FILLED_ARCS -#include "circleset.h" -#undef B -#undef Bits8 -#undef Bits16 -#undef Bits32 -#define UNSET_CIRCLE if (old_width) \ - { \ - gx->alu = gx_solid_rop_table[pGC->alu]; \ - old_width = -old_width; \ - } - -#else -#define UNSET_CIRCLE -#endif - -void -sunGXPolyFillArc (pDraw, pGC, narcs, parcs) - DrawablePtr pDraw; - GCPtr pGC; - int narcs; - xArc *parcs; -{ - register xArc *arc; - register int i; - int x, y; - BoxRec box; - BoxPtr extents = NULL; - RegionPtr cclip; - register sunGXPtr gx = sunGXGetScreenPrivate (pDraw->pScreen); - sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC); - cfbPrivGCPtr devPriv; - register int r; -#ifdef FAST_CIRCLES - int old_width = 0; -#endif - - GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_O,pGC->planemask); - if (gxPriv->stipple) - GXStippleInit(gx,gxPriv->stipple); - devPriv = (cfbPrivGC *)(pGC->devPrivates[cfbGCPrivateIndex].ptr); - cclip = pGC->pCompositeClip; - GXSetOff(gx,pDraw->x,pDraw->y) - if (devPriv->oneRect) { - extents = &cclip->extents; - GXSetClip(gx,extents); - } - for (arc = parcs, i = narcs; --i >= 0; arc++) - { - if (miFillArcEmpty(arc)) - continue; - if (miCanFillArc(arc)) - { - x = arc->x; - y = arc->y; - if (!devPriv->oneRect) - { - box.x1 = x + pDraw->x; - box.y1 = y + pDraw->y; - box.x2 = box.x1 + (int)arc->width + 1; - box.y2 = box.y1 + (int)arc->height + 1; - } - if (devPriv->oneRect || - RECT_IN_REGION(pDraw->pScreen, cclip, &box) == rgnIN) - { - if ((arc->angle2 >= FULLCIRCLE) || - (arc->angle2 <= -FULLCIRCLE)) - { -#ifdef FAST_CIRCLES -/* who really needs fast filled circles? */ - if (arc->width == arc->height && arc->width <= 16 && - !gxPriv->stipple) - { - int offx, offy; - if (arc->width != old_width) - { - int i; - Uint *sp; - VUint *dp; - - if (old_width != -arc->width) - { - sp = (Uint *) filled_arcs[arc->width-1]; - dp = gx->pattern; - i = 8; - while (i--) - dp[i] = sp[i]; - } - gx->alu = gx_stipple_rop_table[pGC->alu]|GX_PATTERN_MASK; - old_width = arc->width; - } - offx = 16 - ((x + pDraw->x) & 0x0f); - offy = 16 - ((y + pDraw->y) & 0x0f); - gx->patalign = (offx << 16) | offy; - gx->arecty = y; - gx->arectx = x; - gx->arecty = y + old_width-1; - gx->arectx = x + old_width-1; - GXDrawDone (gx, r); - } - else -#endif - { - UNSET_CIRCLE - sunGXFillEllipse (pDraw, gx, arc); - } - } - else - { - UNSET_CIRCLE - sunGXFillArcSlice (pDraw, pGC, gx, arc); - } - continue; - } - } - UNSET_CIRCLE - GXWait (gx,r); - GXResetOff (gx); - if (devPriv->oneRect) - GXResetClip (gx, pDraw->pScreen); - miPolyFillArc(pDraw, pGC, 1, arc); - GXSetOff (gx, pDraw->x, pDraw->y); - if (devPriv->oneRect) - GXSetClip (gx, extents); - } - GXWait (gx, r); - GXResetOff (gx); - if (devPriv->oneRect) - GXResetClip (gx, pDraw->pScreen); -} - -void -sunGXFillPoly1Rect (pDrawable, pGC, shape, mode, count, ptsIn) - DrawablePtr pDrawable; - GCPtr pGC; - int count; - DDXPointPtr ptsIn; -{ - BoxPtr extents; - int x1, x2, x3, x4; - int y1, y2, y3, y4; - sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC); - int r; - typedef struct { - Uint x; - Uint y; - Uint z; - } GXPointRec, *GXPointPtr; - GXPointPtr tri, qua; - - if (count < 3) - return; - if (shape != Convex && count > 4) - { - miFillPolygon (pDrawable, pGC, shape, mode, count, ptsIn); - return; - } - GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_N,pGC->planemask); - if (gxPriv->stipple) - GXStippleInit(gx,gxPriv->stipple); - extents = &pGC->pCompositeClip->extents; - GXSetOff(gx,pDrawable->x, pDrawable->y); - GXSetClip(gx,extents); - if (mode == CoordModeOrigin) - { - tri = (GXPointPtr) &gx->atrix; - qua = (GXPointPtr) &gx->aquadx; - } - else - { - tri = (GXPointPtr) &gx->rtrix; - qua = (GXPointPtr) &gx->rquadx; - } - if (count == 3) { - gx->apointy = ptsIn[0].y; - gx->apointx = ptsIn[0].x; - tri->y = ptsIn[1].y; - tri->x = ptsIn[1].x; - tri->y = ptsIn[2].y; - tri->x = ptsIn[2].x; - GXDrawDone (gx, r); - } - else if (count == 4) - { - gx->apointy = ptsIn[0].y; - gx->apointx = ptsIn[0].x; - qua->y = ptsIn[1].y; - qua->x = ptsIn[1].x; - qua->y = ptsIn[2].y; - qua->x = ptsIn[2].x; - qua->y = ptsIn[3].y; - qua->x = ptsIn[3].x; - GXDrawDone (gx, r); - if (r < 0 && shape != Convex) - { - GXWait(gx,r); - GXResetOff(gx); - GXResetClip(gx,pDrawable->pScreen); - miFillPolygon (pDrawable, pGC, shape, mode, count, ptsIn); - return; - } - } - else - { - y1 = ptsIn[0].y; - x1 = ptsIn[0].x; - y2 = ptsIn[1].y; - x2 = ptsIn[1].x; - count -= 2; - ptsIn += 2; - while (count) { - x3 = ptsIn->x; - y3 = ptsIn->y; - ptsIn++; - count--; - gx->apointy = y1; - gx->apointx = x1; - if (count == 0) { - tri->y = y2; - tri->x = x2; - tri->y = y3; - tri->x = x3; - } - else - { - y4 = ptsIn->y; - x4 = ptsIn->x; - ptsIn++; - count--; - qua->y = y2; - qua->x = x2; - qua->y = y3; - qua->x = x3; - qua->y = y4; - qua->x = x4; - if (mode == CoordModeOrigin) - { - x2 = x4; - y2 = y4; - } - else - { - x2 = x2 + x3 + x4; - y2 = y2 + y3 + y4; - } - } - GXDrawDone (gx, r); - } - } - GXWait(gx,r); - GXResetOff(gx); - GXResetClip(gx,pDrawable->pScreen); -} - -/* - * Note that the GX does not allow CapNotLast, so the code fakes it. This is - * expensive to do as the GX is asynchronous and must be synced with GXWait - * before fetching and storing the final line point. If only the hardware was - * designed for X. - */ - -/* hard code the screen width; otherwise we'd have to check or mul */ - -#define WIDTH_MUL(y) (((y) << 10) + ((y) << 7)) -#define GX_WIDTH 1152 -#define WID_OK(s) ((s)->width == GX_WIDTH) - -void -sunGXPolySeg1Rect (pDrawable, pGC, nseg, pSeg) - DrawablePtr pDrawable; - GCPtr pGC; - int nseg; - xSegment *pSeg; -{ - sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC); - BoxPtr extents; - int x, y; - int r; - unsigned char *baseAddr, *loAddr, *hiAddr, *saveAddr = 0, save = 0; - - GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_O,pGC->planemask); - if (gxPriv->stipple) - GXStippleInit(gx,gxPriv->stipple); - GXSetOff (gx, pDrawable->x, pDrawable->y); - - extents = &pGC->pCompositeClip->extents; - GXSetClip (gx, extents); - if (pGC->capStyle == CapNotLast) - { - sunGXGetAddrRange(pDrawable,extents,baseAddr,loAddr,hiAddr); - while (nseg--) - { - gx->aliney = pSeg->y1; - gx->alinex = pSeg->x1; - y = pSeg->y2; - x = pSeg->x2; - saveAddr = baseAddr + WIDTH_MUL(y) + x; - if (saveAddr < loAddr || hiAddr < saveAddr) - saveAddr = 0; - else - save = *saveAddr; - gx->aliney = y; - gx->alinex = x; - GXDrawDone (gx, r); - if (saveAddr) - { - GXWait(gx,r); - *saveAddr = save; - } - pSeg++; - } - } - else - { - while (nseg--) - { - gx->aliney = pSeg->y1; - gx->alinex = pSeg->x1; - gx->aliney = pSeg->y2; - gx->alinex = pSeg->x2; - pSeg++; - GXDrawDone (gx, r); - } - } - GXWait (gx, r); - GXResetOff (gx); - GXResetClip (gx, pDrawable->pScreen); -} - -void -sunGXPolylines1Rect (pDrawable, pGC, mode, npt, ppt) - DrawablePtr pDrawable; - GCPtr pGC; - int mode; - int npt; - DDXPointPtr ppt; -{ - sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC); - BoxPtr extents; - unsigned char *baseAddr, *loAddr, *hiAddr, *saveAddr, save = 0; - int r; - Bool careful; - Bool capNotLast; - - if (!--npt) - return; - GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_O,pGC->planemask); - if (gxPriv->stipple) - GXStippleInit(gx,gxPriv->stipple); - careful = ((pGC->alu & 0xc) == 0x8 || (pGC->alu & 0x3) == 0x2); - capNotLast = pGC->capStyle == CapNotLast; - - extents = &pGC->pCompositeClip->extents; - GXSetOff (gx, pDrawable->x, pDrawable->y); - GXSetClip (gx, extents); - if (careful) - { - int x, y; - sunGXGetAddrRange (pDrawable, extents, baseAddr, loAddr, hiAddr); - gx->apointy = y = ppt->y; - gx->apointx = x = ppt->x; - ppt++; - while (npt--) - { - if (mode == CoordModeOrigin) - { - y = ppt->y; - x = ppt->x; - } - else - { - y += ppt->y; - x += ppt->x; - } - ppt++; - saveAddr = baseAddr + WIDTH_MUL(y) + x; - if (saveAddr < loAddr || hiAddr < saveAddr) - saveAddr = 0; - else - save = *saveAddr; - gx->aliney = y; - gx->alinex = x; - GXDrawDone (gx, r); - if (saveAddr) - { - GXWait(gx,r); - *saveAddr = save; - } - } - GXWait(gx,r); - } - else - { - int x, y; - if (capNotLast) - npt--; - if (mode == CoordModeOrigin) - { - x = y = 0; - gx->apointy = ppt->y; - gx->apointx = ppt->x; - ppt++; - while (npt--) - { - gx->aliney = ppt->y; - gx->alinex = ppt->x; - ++ppt; - GXDrawDone(gx,r); - } - } - else - { - y = gx->apointy = ppt->y; - x = gx->apointx = ppt->x; - ppt++; - while (npt--) - { - y += gx->rliney = ppt->y; - x += gx->rlinex = ppt->x; - ++ppt; - GXDrawDone(gx,r); - } - } - if (capNotLast) - { - sunGXGetAddrRange (pDrawable, extents, baseAddr, loAddr, hiAddr); - x += ppt->x; - y += ppt->y; - saveAddr = baseAddr + WIDTH_MUL(y) + x; - if (saveAddr < loAddr || hiAddr < saveAddr) - saveAddr = 0; - else - save = *saveAddr; - gx->aliney = y; - gx->alinex = x; - GXDrawDone(gx,r); - GXWait(gx,r); - if (saveAddr) - *saveAddr = save; - } - else - { - GXWait(gx,r); - } - } - GXResetOff (gx); - GXResetClip (gx, pDrawable->pScreen); -} - -void -sunGXPolyFillRect1Rect (pDrawable, pGC, nrect, prect) - DrawablePtr pDrawable; - GCPtr pGC; - int nrect; - xRectangle *prect; -{ - sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC); - BoxPtr extents = &pGC->pCompositeClip->extents; - int r; - int x, y; - - GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_N,pGC->planemask); - if (gxPriv->stipple) - GXStippleInit(gx,gxPriv->stipple); - GXSetOff (gx, pDrawable->x, pDrawable->y); - GXSetClip (gx, extents); - while (nrect--) - { - gx->arecty = y = prect->y; - gx->arectx = x = prect->x; - gx->arecty = y + (int) prect->height; - gx->arectx = x + (int) prect->width; - prect++; - GXDrawDone (gx, r); - } - GXWait (gx, r); - GXResetOff (gx); - GXResetClip (gx, pDrawable->pScreen); -} - -static void -sunGXPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase) - DrawablePtr pDrawable; - GCPtr pGC; - int x, y; - unsigned int nglyph; - CharInfoPtr *ppci; /* array of character info */ - pointer pglyphBase; -{ - sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - int h; - int w; - CharInfoPtr pci; - unsigned long *bits; - register int r; - RegionPtr clip; - BoxPtr extents; - BoxRec box; - - clip = pGC->pCompositeClip; - extents = &clip->extents; - - if (REGION_NUM_RECTS(clip) == 1) - { - GXSetClip (gx, extents); - } - else - { - /* compute an approximate (but covering) bounding box */ - box.x1 = 0; - if ((ppci[0]->metrics.leftSideBearing < 0)) - box.x1 = ppci[0]->metrics.leftSideBearing; - h = nglyph - 1; - w = ppci[h]->metrics.rightSideBearing; - while (--h >= 0) - w += ppci[h]->metrics.characterWidth; - box.x2 = w; - box.y1 = -FONTMAXBOUNDS(pGC->font,ascent); - box.y2 = FONTMAXBOUNDS(pGC->font,descent); - - box.x1 += pDrawable->x + x; - box.x2 += pDrawable->x + x; - box.y1 += pDrawable->y + y; - box.y2 += pDrawable->y + y; - - switch (RECT_IN_REGION(pGC->pScreen, clip, &box)) - { - case rgnPART: - cfbPolyGlyphBlt8 (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); - case rgnOUT: - return; - } - } - - GXDrawInit (gx, pGC->fgPixel, - gx_stipple_rop_table[pGC->alu]|GX_PATTERN_ONES|POLY_N, - pGC->planemask); - gx->mode = GX_BLIT_NOSRC | GX_MODE_COLOR1; - x += pDrawable->x; - y += pDrawable->y; - - while (nglyph--) - { - pci = *ppci++; - gx->incx = 0; - gx->incy = 1; - gx->x0 = x + pci->metrics.leftSideBearing; - gx->x1 = (x + pci->metrics.rightSideBearing) - 1; - gx->y0 = y - pci->metrics.ascent; - h = pci->metrics.ascent + pci->metrics.descent; - bits = (unsigned long *) pci->bits; - while (h--) { - gx->font = *bits++; - } - x += pci->metrics.characterWidth; - } - GXWait (gx, r); - gx->mode = GX_BLIT_SRC | GX_MODE_COLOR8; - GXResetClip (gx, pDrawable->pScreen); -} - -static void -sunGXTEGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase) - DrawablePtr pDrawable; - GCPtr pGC; - int x, y; - unsigned int nglyph; - CharInfoPtr *ppci; /* array of character info */ - pointer pglyphBase; /* start of array of glyphs */ -{ - sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - int h, hTmp; - FontPtr pfont = pGC->font; - register int r; - unsigned long *char1, *char2, *char3, *char4; - int widthGlyphs, widthGlyph; - BoxRec bbox; - BoxPtr extents; - RegionPtr clip; - unsigned long rop; - - widthGlyph = FONTMAXBOUNDS(pfont,characterWidth); - h = FONTASCENT(pfont) + FONTDESCENT(pfont); - clip = pGC->pCompositeClip; - extents = &clip->extents; - - if (REGION_NUM_RECTS(clip) == 1) - { - GXSetClip (gx, extents); - } - else - { - bbox.x1 = x + pDrawable->x; - bbox.x2 = bbox.x1 + (widthGlyph * nglyph); - bbox.y1 = y + pDrawable->y - FONTASCENT(pfont); - bbox.y2 = bbox.y1 + h; - - switch (RECT_IN_REGION(pGC->pScreen, clip, &bbox)) - { - case rgnPART: - if (pglyphBase) - cfbPolyGlyphBlt8(pDrawable, pGC, x, y, nglyph, ppci, NULL); - else - miImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); - case rgnOUT: - return; - } - } - - rop = gx_opaque_stipple_rop_table[GXcopy] | GX_PATTERN_ONES; - if (pglyphBase) - rop = gx_stipple_rop_table[pGC->alu] | GX_PATTERN_ONES; - GXDrawInit (gx, pGC->fgPixel, rop, pGC->planemask); - gx->bg = pGC->bgPixel; - gx->mode = GX_BLIT_NOSRC | GX_MODE_COLOR1; - - y = y + pDrawable->y - FONTASCENT(pfont); - x += pDrawable->x; - -#define LoopIt(count, w, loadup, fetch) \ - while (nglyph >= count) \ - { \ - nglyph -= count; \ - gx->incx = 0; \ - gx->incy = 1; \ - gx->x0 = x; \ - gx->x1 = (x += w) - 1; \ - gx->y0 = y; \ - loadup \ - hTmp = h; \ - while (hTmp--) \ - gx->font = fetch; \ - } - - if (widthGlyph <= 8) - { - widthGlyphs = widthGlyph << 2; - LoopIt(4, widthGlyphs, - char1 = (unsigned long *) (*ppci++)->bits; - char2 = (unsigned long *) (*ppci++)->bits; - char3 = (unsigned long *) (*ppci++)->bits; - char4 = (unsigned long *) (*ppci++)->bits;, - (*char1++ | ((*char2++ | ((*char3++ | (*char4++ - >> widthGlyph)) - >> widthGlyph)) - >> widthGlyph))) - } - else if (widthGlyph <= 10) - { - widthGlyphs = (widthGlyph << 1) + widthGlyph; - LoopIt(3, widthGlyphs, - char1 = (unsigned long *) (*ppci++)->bits; - char2 = (unsigned long *) (*ppci++)->bits; - char3 = (unsigned long *) (*ppci++)->bits;, - (*char1++ | ((*char2++ | (*char3++ >> widthGlyph)) >> widthGlyph))) - } - else if (widthGlyph <= 16) - { - widthGlyphs = widthGlyph << 1; - LoopIt(2, widthGlyphs, - char1 = (unsigned long *) (*ppci++)->bits; - char2 = (unsigned long *) (*ppci++)->bits;, - (*char1++ | (*char2++ >> widthGlyph))) - } - while (nglyph--) { - gx->incx = 0; - gx->incy = 1; - gx->x0 = x; - gx->x1 = (x += widthGlyph) - 1; - gx->y0 = y; - char1 = (unsigned long *) (*ppci++)->bits; - hTmp = h; - while (hTmp--) - gx->font = *char1++; - } - gx->incx = 0; - gx->incy = 0; - GXWait (gx, r); - gx->mode = GX_BLIT_SRC | GX_MODE_COLOR8; - GXResetClip (gx, pDrawable->pScreen); -} - -static void -sunGXPolyTEGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase) - DrawablePtr pDrawable; - GCPtr pGC; - int x, y; - unsigned int nglyph; - CharInfoPtr *ppci; /* array of character info */ - pointer pglyphBase; /* start of array of glyphs */ -{ - sunGXTEGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, (char *) 1); -} - -static void -sunGXFillBoxSolid (pDrawable, nBox, pBox, pixel) - DrawablePtr pDrawable; - int nBox; - BoxPtr pBox; - unsigned long pixel; -{ - register sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - register int r; - - GXDrawInit(gx,pixel,gx_solid_rop_table[GXcopy]|POLY_N,~0); - while (nBox--) { - gx->arecty = pBox->y1; - gx->arectx = pBox->x1; - gx->arecty = pBox->y2; - gx->arectx = pBox->x2; - pBox++; - GXDrawDone(gx,r); - } - GXWait(gx,r); -} - -void -sunGXFillBoxStipple (pDrawable, nBox, pBox, stipple) - DrawablePtr pDrawable; - int nBox; - BoxPtr pBox; - sunGXStipplePtr stipple; -{ - register sunGXPtr gx = sunGXGetScreenPrivate (pDrawable->pScreen); - register int r; - int patx, paty; - - patx = 16 - (pDrawable->x & 0xf); - paty = 16 - (pDrawable->y & 0xf); - stipple->patalign = (patx << 16) | paty; - GXDrawInit(gx,0,gx_solid_rop_table[GXcopy]|POLY_N,~0); - GXStippleInit(gx, stipple); - while (nBox--) { - gx->arecty = pBox->y1; - gx->arectx = pBox->x1; - gx->arecty = pBox->y2; - gx->arectx = pBox->x2; - pBox++; - GXDrawDone(gx,r); - } - GXWait(gx,r); -} - -Bool -sunGXCheckTile (pPixmap, stipple) - PixmapPtr pPixmap; - sunGXStipplePtr stipple; -{ - unsigned short *sbits; - unsigned int fg = (unsigned int)~0, bg = (unsigned int)~0; - unsigned char *tilebitsLine, *tilebits, tilebit; - unsigned short sbit, mask; - int nbwidth; - int h, w; - int x, y; - int s_y, s_x; - - h = pPixmap->drawable.height; - if (h > 16 || (h & (h - 1))) - return FALSE; - w = pPixmap->drawable.width; - if (w > 16 || (w & (w - 1))) - return FALSE; - sbits = (unsigned short *) stipple->bits; - tilebitsLine = (unsigned char *) pPixmap->devPrivate.ptr; - nbwidth = pPixmap->devKind; - for (y = 0; y < h; y++) { - tilebits = tilebitsLine; - tilebitsLine += nbwidth; - sbit = 0; - mask = 1 << 15; - for (x = 0; x < w; x++) - { - tilebit = *tilebits++; - if (tilebit == fg) - sbit |= mask; - else if (tilebit != bg) - { - if (fg == ~0) - { - fg = tilebit; - sbit |= mask; - } - else if (bg == ~0) - { - bg = tilebit; - } - else - { - return FALSE; - } - } - mask >>= 1; - } - for (s_x = w; s_x < 16; s_x <<= 1) - sbit = sbit | (sbit >> s_x); - for (s_y = y; s_y < 16; s_y += h) - sbits[s_y] = sbit; - } - stipple->fore = fg; - stipple->back = bg; - return TRUE; -} - -Bool -sunGXCheckStipple (pPixmap, stipple) - PixmapPtr pPixmap; - sunGXStipplePtr stipple; -{ - unsigned short *sbits; - unsigned long *stippleBits; - unsigned long sbit, mask; - int h, w; - int y; - int s_y, s_x; - - h = pPixmap->drawable.height; - if (h > 16 || (h & (h - 1))) - return FALSE; - w = pPixmap->drawable.width; - if (w > 16 || (w & (w - 1))) - return FALSE; - sbits = (unsigned short *) stipple->bits; - stippleBits = (unsigned long *) pPixmap->devPrivate.ptr; - mask = ((1 << w) - 1) << (16 - w); - for (y = 0; y < h; y++) { - sbit = (*stippleBits++ >> 16) & mask; - for (s_x = w; s_x < 16; s_x <<= 1) - sbit = sbit | (sbit >> s_x); - for (s_y = y; s_y < 16; s_y += h) - sbits[s_y] = sbit; - } - return TRUE; -} - -/* cache one stipple; figuring out if we can use the stipple is as hard as - * computing it, so we just use this one and leave it here if it - * can't be used this time - */ - -static sunGXStipplePtr tmpStipple; - -Bool -sunGXCheckFill (pGC, pDrawable) - GCPtr pGC; - DrawablePtr pDrawable; -{ - sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC); - sunGXStipplePtr stipple; - Uint alu; - int xrot, yrot; - - if (pGC->fillStyle == FillSolid) - { - if (gxPriv->stipple) - { - xfree (gxPriv->stipple); - gxPriv->stipple = 0; - } - return TRUE; - } - if (!(stipple = gxPriv->stipple)) - { - if (!tmpStipple) - { - tmpStipple = (sunGXStipplePtr) xalloc (sizeof *tmpStipple); - if (!tmpStipple) - return FALSE; - } - stipple = tmpStipple; - } - alu = gx_opaque_stipple_rop_table[pGC->alu]|GX_PATTERN_MASK; - switch (pGC->fillStyle) { - case FillTiled: - if (!sunGXCheckTile (pGC->tile.pixmap, stipple)) - { - if (gxPriv->stipple) - { - xfree (gxPriv->stipple); - gxPriv->stipple = 0; - } - return FALSE; - } - break; - case FillStippled: - alu = gx_stipple_rop_table[pGC->alu]|GX_PATTERN_MASK; - case FillOpaqueStippled: - if (!sunGXCheckStipple (pGC->stipple, stipple)) - { - if (gxPriv->stipple) - { - xfree (gxPriv->stipple); - gxPriv->stipple = 0; - } - return FALSE; - } - stipple->fore = pGC->fgPixel; - stipple->back = pGC->bgPixel; - break; - } - xrot = (pGC->patOrg.x + pDrawable->x) & 0xf; - yrot = (pGC->patOrg.y + pDrawable->y) & 0xf; -/* - stipple->patalign = ((16 - (xrot & 0xf)) << 16) | (16 - (yrot & 0xf)); -*/ - xrot = 16 - xrot; - yrot = 16 - yrot; - stipple->patalign = (xrot << 16) | yrot; - stipple->alu = alu; - gxPriv->stipple = stipple; - if (stipple == tmpStipple) - tmpStipple = 0; - return TRUE; -} - -void sunGXValidateGC (); -void sunGXDestroyGC (); - -GCFuncs sunGXGCFuncs = { - sunGXValidateGC, - miChangeGC, - miCopyGC, - sunGXDestroyGC, - miChangeClip, - miDestroyClip, - miCopyClip -}; - -GCOps sunGXTEOps1Rect = { - sunGXFillSpans, - cfbSetSpans, - cfbPutImage, - sunGXCopyArea, - sunGXCopyPlane, - cfbPolyPoint, - sunGXPolylines1Rect, - sunGXPolySeg1Rect, - miPolyRectangle, - cfbZeroPolyArcSS8Copy, - sunGXFillPoly1Rect, - sunGXPolyFillRect1Rect, - sunGXPolyFillArc, - miPolyText8, - miPolyText16, - miImageText8, - miImageText16, - sunGXTEGlyphBlt, - sunGXPolyTEGlyphBlt, - cfbPushPixels8 -#ifdef NEED_LINEHELPER - ,NULL -#endif -}; - -GCOps sunGXTEOps = { - sunGXFillSpans, - cfbSetSpans, - cfbPutImage, - sunGXCopyArea, - sunGXCopyPlane, - cfbPolyPoint, - cfbLineSS, - cfbSegmentSS, - miPolyRectangle, - cfbZeroPolyArcSS8Copy, - miFillPolygon, - sunGXPolyFillRect, - sunGXPolyFillArc, - miPolyText8, - miPolyText16, - miImageText8, - miImageText16, - sunGXTEGlyphBlt, - sunGXPolyTEGlyphBlt, - cfbPushPixels8 -#ifdef NEED_LINEHELPER - ,NULL -#endif -}; - -GCOps sunGXNonTEOps1Rect = { - sunGXFillSpans, - cfbSetSpans, - cfbPutImage, - sunGXCopyArea, - sunGXCopyPlane, - cfbPolyPoint, - sunGXPolylines1Rect, - sunGXPolySeg1Rect, - miPolyRectangle, - cfbZeroPolyArcSS8Copy, - sunGXFillPoly1Rect, - sunGXPolyFillRect1Rect, - sunGXPolyFillArc, - miPolyText8, - miPolyText16, - miImageText8, - miImageText16, - miImageGlyphBlt, - sunGXPolyGlyphBlt, - cfbPushPixels8 -#ifdef NEED_LINEHELPER - ,NULL -#endif -}; - -GCOps sunGXNonTEOps = { - sunGXFillSpans, - cfbSetSpans, - cfbPutImage, - sunGXCopyArea, - sunGXCopyPlane, - cfbPolyPoint, - cfbLineSS, - cfbSegmentSS, - miPolyRectangle, - cfbZeroPolyArcSS8Copy, - miFillPolygon, - sunGXPolyFillRect, - sunGXPolyFillArc, - miPolyText8, - miPolyText16, - miImageText8, - miImageText16, - miImageGlyphBlt, - sunGXPolyGlyphBlt, - cfbPushPixels8 -#ifdef NEED_LINEHELPER - ,NULL -#endif -}; - -#define FONTWIDTH(font) (FONTMAXBOUNDS(font,rightSideBearing) - \ - FONTMINBOUNDS(font,leftSideBearing)) - -GCOps * -sunGXMatchCommon (pGC, devPriv) - GCPtr pGC; - cfbPrivGCPtr devPriv; -{ - if (pGC->lineWidth != 0) - return 0; - if (pGC->lineStyle != LineSolid) - return 0; - if (pGC->fillStyle != FillSolid) - return 0; - if (devPriv->rop != GXcopy) - return 0; - if (!WID_OK(pGC->pScreen)) - return 0; - if (pGC->font && - FONTWIDTH (pGC->font) <= 32 && - FONTMINBOUNDS(pGC->font,characterWidth) >= 0) - { - if (TERMINALFONT(pGC->font)) - if (devPriv->oneRect) - return &sunGXTEOps1Rect; - else - return &sunGXTEOps; - else - if (devPriv->oneRect) - return &sunGXNonTEOps1Rect; - else - return &sunGXNonTEOps; - } - return 0; -} - -void -sunGXValidateGC (pGC, changes, pDrawable) - GCPtr pGC; - Mask changes; - DrawablePtr pDrawable; -{ - int mask; /* stateChanges */ - int index; /* used for stepping through bitfields */ - int new_rrop; - int new_line, new_text, new_fillspans, new_fillarea; - int new_rotate; - int xrot, yrot; - /* flags for changing the proc vector */ - cfbPrivGCPtr devPriv; - sunGXPrivGCPtr gxPriv; - int oneRect; - int canGX; - int widOK; - - gxPriv = sunGXGetGCPrivate (pGC); - widOK = WID_OK(pGC->pScreen); - if (pDrawable->type != DRAWABLE_WINDOW) - { - if (gxPriv->type == DRAWABLE_WINDOW) - { - extern GCOps cfbNonTEOps; - - miDestroyGCOps (pGC->ops); - pGC->ops = &cfbNonTEOps; - changes = (1 << (GCLastBit + 1)) - 1; - pGC->stateChanges = changes; - gxPriv->type = pDrawable->type; - } - cfbValidateGC (pGC, changes, pDrawable); - return; - } - if (gxPriv->type != DRAWABLE_WINDOW) - { - changes = (1 << (GCLastBit + 1)) - 1; - gxPriv->type = DRAWABLE_WINDOW; - } - - new_rotate = pGC->lastWinOrg.x != pDrawable->x || - pGC->lastWinOrg.y != pDrawable->y; - - pGC->lastWinOrg.x = pDrawable->x; - pGC->lastWinOrg.y = pDrawable->y; - - devPriv = ((cfbPrivGCPtr) (pGC->devPrivates[cfbGCPrivateIndex].ptr)); - - new_rrop = FALSE; - new_line = FALSE; - new_text = FALSE; - new_fillspans = FALSE; - new_fillarea = FALSE; - - /* - * if the client clip is different or moved OR the subwindowMode has - * changed OR the window's clip has changed since the last validation - * we need to recompute the composite clip - */ - - if ((changes & (GCClipXOrigin|GCClipYOrigin|GCClipMask|GCSubwindowMode)) || - (pDrawable->serialNumber != (pGC->serialNumber & DRAWABLE_SERIAL_BITS)) - ) - { - miComputeCompositeClip(pGC, pDrawable); - oneRect = REGION_NUM_RECTS(pGC->pCompositeClip) == 1; - if (oneRect != devPriv->oneRect) - { - new_line = TRUE; - new_fillarea = TRUE; - devPriv->oneRect = oneRect; - } - } - - mask = changes; - while (mask) { - index = lowbit (mask); - mask &= ~index; - - /* - * this switch acculmulates a list of which procedures might have - * to change due to changes in the GC. in some cases (e.g. - * changing one 16 bit tile for another) we might not really need - * a change, but the code is being paranoid. this sort of batching - * wins if, for example, the alu and the font have been changed, - * or any other pair of items that both change the same thing. - */ - switch (index) { - case GCFunction: - case GCForeground: - new_rrop = TRUE; - break; - case GCPlaneMask: - new_rrop = TRUE; - new_text = TRUE; - break; - case GCBackground: - break; - case GCLineStyle: - case GCLineWidth: - new_line = TRUE; - break; - case GCCapStyle: - break; - case GCJoinStyle: - break; - case GCFillStyle: - new_text = TRUE; - new_fillspans = TRUE; - new_line = TRUE; - new_fillarea = TRUE; - break; - case GCFillRule: - break; - case GCTile: - new_fillspans = TRUE; - new_fillarea = TRUE; - break; - - case GCStipple: - new_fillspans = TRUE; - new_fillarea = TRUE; - break; - - case GCTileStipXOrigin: - new_rotate = TRUE; - break; - - case GCTileStipYOrigin: - new_rotate = TRUE; - break; - - case GCFont: - new_text = TRUE; - break; - case GCSubwindowMode: - break; - case GCGraphicsExposures: - break; - case GCClipXOrigin: - break; - case GCClipYOrigin: - break; - case GCClipMask: - break; - case GCDashOffset: - break; - case GCDashList: - break; - case GCArcMode: - break; - default: - break; - } - } - - /* - * If the drawable has changed, check its depth & ensure suitable - * entries are in the proc vector. - */ - if (pDrawable->serialNumber != (pGC->serialNumber & (DRAWABLE_SERIAL_BITS))) { - new_fillspans = TRUE; /* deal with FillSpans later */ - } - - if ((new_rotate || new_fillspans)) - { - Bool new_pix = FALSE; - xrot = pGC->patOrg.x + pDrawable->x; - yrot = pGC->patOrg.y + pDrawable->y; - - if (!sunGXCheckFill (pGC, pDrawable)) - { - switch (pGC->fillStyle) - { - case FillTiled: - if (!pGC->tileIsPixel) - { - int width = pGC->tile.pixmap->drawable.width * PSZ; - - if ((width <= 32) && !(width & (width - 1))) - { - cfbCopyRotatePixmap(pGC->tile.pixmap, - &pGC->pRotatedPixmap, - xrot, yrot); - new_pix = TRUE; - } - } - break; - case FillStippled: - case FillOpaqueStippled: - { - int width = pGC->stipple->drawable.width; - - if ((width <= 32) && !(width & (width - 1))) - { - mfbCopyRotatePixmap(pGC->stipple, - &pGC->pRotatedPixmap, xrot, yrot); - new_pix = TRUE; - } - } - break; - } - } - if (!new_pix && pGC->pRotatedPixmap) - { - cfbDestroyPixmap(pGC->pRotatedPixmap); - pGC->pRotatedPixmap = (PixmapPtr) NULL; - } - } - - if (new_rrop) - { - int old_rrop; - - if (gxPriv->stipple) - { - if (pGC->fillStyle == FillStippled) - gxPriv->stipple->alu = gx_stipple_rop_table[pGC->alu]|GX_PATTERN_MASK; - else - gxPriv->stipple->alu = gx_opaque_stipple_rop_table[pGC->alu]|GX_PATTERN_MASK; - if (pGC->fillStyle != FillTiled) - { - gxPriv->stipple->fore = pGC->fgPixel; - gxPriv->stipple->back = pGC->bgPixel; - } - } - old_rrop = devPriv->rop; - devPriv->rop = cfbReduceRasterOp (pGC->alu, pGC->fgPixel, - pGC->planemask, - &devPriv->and, &devPriv->xor); - if (old_rrop == devPriv->rop) - new_rrop = FALSE; - else - { - new_line = TRUE; - new_text = TRUE; - new_fillspans = TRUE; - new_fillarea = TRUE; - } - } - - if (new_rrop || new_fillspans || new_text || new_fillarea || new_line) - { - GCOps *newops; - - if ((newops = sunGXMatchCommon (pGC, devPriv))) - { - if (pGC->ops->devPrivate.val) - miDestroyGCOps (pGC->ops); - pGC->ops = newops; - new_rrop = new_line = new_fillspans = new_text = new_fillarea = 0; - } - else - { - if (!pGC->ops->devPrivate.val) - { - pGC->ops = miCreateGCOps (pGC->ops); - pGC->ops->devPrivate.val = 1; - } - } - } - - canGX = pGC->fillStyle == FillSolid || gxPriv->stipple; - - /* deal with the changes we've collected */ - if (new_line) - { - pGC->ops->FillPolygon = miFillPolygon; - if (devPriv->oneRect && canGX) - pGC->ops->FillPolygon = sunGXFillPoly1Rect; - if (pGC->lineWidth == 0) - { - if ((pGC->lineStyle == LineSolid) && (pGC->fillStyle == FillSolid)) - { - switch (devPriv->rop) - { - case GXxor: - pGC->ops->PolyArc = cfbZeroPolyArcSS8Xor; - break; - case GXcopy: - pGC->ops->PolyArc = cfbZeroPolyArcSS8Copy; - break; - default: - pGC->ops->PolyArc = cfbZeroPolyArcSS8General; - break; - } - } - else - pGC->ops->PolyArc = miZeroPolyArc; - } - else - pGC->ops->PolyArc = miPolyArc; - pGC->ops->PolySegment = miPolySegment; - switch (pGC->lineStyle) - { - case LineSolid: - if(pGC->lineWidth == 0) - { - if (devPriv->oneRect && canGX && widOK) - { - pGC->ops->PolySegment = sunGXPolySeg1Rect; - pGC->ops->Polylines = sunGXPolylines1Rect; - } - else if (pGC->fillStyle == FillSolid) - { - if (devPriv->oneRect) - { - pGC->ops->Polylines = cfb8LineSS1Rect; - pGC->ops->PolySegment = cfb8SegmentSS1Rect; - } - else - { - pGC->ops->Polylines = cfbLineSS; - pGC->ops->PolySegment = cfbSegmentSS; - } - } - else - pGC->ops->Polylines = miZeroLine; - } - else - pGC->ops->Polylines = miWideLine; - break; - case LineOnOffDash: - case LineDoubleDash: - if (pGC->lineWidth == 0 && pGC->fillStyle == FillSolid) - { - pGC->ops->Polylines = cfbLineSD; - pGC->ops->PolySegment = cfbSegmentSD; - } else - pGC->ops->Polylines = miWideDash; - break; - } - } - - if (new_text && (pGC->font)) - { - if (FONTWIDTH(pGC->font) > 32 || - FONTMINBOUNDS(pGC->font,characterWidth) < 0) - { - pGC->ops->PolyGlyphBlt = miPolyGlyphBlt; - pGC->ops->ImageGlyphBlt = miImageGlyphBlt; - } - else - { - if (pGC->fillStyle == FillSolid) - { - if (TERMINALFONT (pGC->font)) - pGC->ops->PolyGlyphBlt = sunGXPolyTEGlyphBlt; - else - pGC->ops->PolyGlyphBlt = sunGXPolyGlyphBlt; - } - else - pGC->ops->PolyGlyphBlt = miPolyGlyphBlt; - /* special case ImageGlyphBlt for terminal emulator fonts */ - if (TERMINALFONT(pGC->font)) - pGC->ops->ImageGlyphBlt = sunGXTEGlyphBlt; - else - pGC->ops->ImageGlyphBlt = miImageGlyphBlt; - } - } - - - if (new_fillspans) { - if (canGX) - pGC->ops->FillSpans = sunGXFillSpans; - else switch (pGC->fillStyle) { - case FillTiled: - if (pGC->pRotatedPixmap) - { - if (pGC->alu == GXcopy && (pGC->planemask & PMSK) == PMSK) - pGC->ops->FillSpans = cfbTile32FSCopy; - else - pGC->ops->FillSpans = cfbTile32FSGeneral; - } - else - pGC->ops->FillSpans = cfbUnnaturalTileFS; - break; - case FillStippled: - if (pGC->pRotatedPixmap) - pGC->ops->FillSpans = cfb8Stipple32FS; - else - pGC->ops->FillSpans = cfbUnnaturalStippleFS; - break; - case FillOpaqueStippled: - if (pGC->pRotatedPixmap) - pGC->ops->FillSpans = cfb8OpaqueStipple32FS; - else - pGC->ops->FillSpans = cfbUnnaturalStippleFS; - break; - default: - FatalError("cfbValidateGC: illegal fillStyle\n"); - } - } /* end of new_fillspans */ - - if (new_fillarea) { - pGC->ops->PolyFillRect = cfbPolyFillRect; - pGC->ops->PolyFillArc = miPolyFillArc; - if (canGX) - { - pGC->ops->PolyFillArc = sunGXPolyFillArc; - pGC->ops->PolyFillRect = sunGXPolyFillRect; - if (devPriv->oneRect) - pGC->ops->PolyFillRect = sunGXPolyFillRect1Rect; - } - pGC->ops->PushPixels = mfbPushPixels; - if (pGC->fillStyle == FillSolid && devPriv->rop == GXcopy) - pGC->ops->PushPixels = cfbPushPixels8; - } -} - -void -sunGXDestroyGC (pGC) - GCPtr pGC; -{ - sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC); - - if (gxPriv->stipple) - xfree (gxPriv->stipple); - miDestroyGC (pGC); -} - -Bool -sunGXCreateGC (pGC) - GCPtr pGC; -{ - sunGXPrivGCPtr gxPriv; - if (pGC->depth == 1) - return mfbCreateGC (pGC); - if (!cfbCreateGC (pGC)) - return FALSE; - pGC->ops = &sunGXNonTEOps; - pGC->funcs = &sunGXGCFuncs; - gxPriv = sunGXGetGCPrivate(pGC); - gxPriv->type = DRAWABLE_WINDOW; - gxPriv->stipple = 0; - return TRUE; -} - -Bool -sunGXCreateWindow (pWin) - WindowPtr pWin; -{ - if (!cfbCreateWindow (pWin)) - return FALSE; - pWin->devPrivates[sunGXWindowPrivateIndex].ptr = 0; - return TRUE; -} - -Bool -sunGXDestroyWindow (pWin) - WindowPtr pWin; -{ - sunGXStipplePtr stipple = sunGXGetWindowPrivate(pWin); - xfree (stipple); - return cfbDestroyWindow (pWin); -} - -Bool -sunGXChangeWindowAttributes (pWin, mask) - WindowPtr pWin; - Mask mask; -{ - sunGXStipplePtr stipple; - Mask index; - WindowPtr pBgWin; - register cfbPrivWin *pPrivWin; - int width; - - pPrivWin = (cfbPrivWin *)(pWin->devPrivates[cfbWindowPrivateIndex].ptr); - /* - * When background state changes from ParentRelative and - * we had previously rotated the fast border pixmap to match - * the parent relative origin, rerotate to match window - */ - if (mask & (CWBackPixmap | CWBackPixel) && - pWin->backgroundState != ParentRelative && - pPrivWin->fastBorder && - (pPrivWin->oldRotate.x != pWin->drawable.x || - pPrivWin->oldRotate.y != pWin->drawable.y)) - { - cfbXRotatePixmap(pPrivWin->pRotatedBorder, - pWin->drawable.x - pPrivWin->oldRotate.x); - cfbYRotatePixmap(pPrivWin->pRotatedBorder, - pWin->drawable.y - pPrivWin->oldRotate.y); - pPrivWin->oldRotate.x = pWin->drawable.x; - pPrivWin->oldRotate.y = pWin->drawable.y; - } - while (mask) - { - index = lowbit(mask); - mask &= ~index; - switch (index) - { - case CWBackPixmap: - stipple = sunGXGetWindowPrivate(pWin); - if (pWin->backgroundState == None || - pWin->backgroundState == ParentRelative) - { - pPrivWin->fastBackground = FALSE; - if (stipple) - { - xfree (stipple); - sunGXSetWindowPrivate(pWin,0); - } - /* Rotate border to match parent origin */ - if (pWin->backgroundState == ParentRelative && - pPrivWin->pRotatedBorder) - { - for (pBgWin = pWin->parent; - pBgWin->backgroundState == ParentRelative; - pBgWin = pBgWin->parent); - cfbXRotatePixmap(pPrivWin->pRotatedBorder, - pBgWin->drawable.x - pPrivWin->oldRotate.x); - cfbYRotatePixmap(pPrivWin->pRotatedBorder, - pBgWin->drawable.y - pPrivWin->oldRotate.y); - } - - break; - } - if (!stipple) - { - if (!tmpStipple) - tmpStipple = (sunGXStipplePtr) xalloc (sizeof *tmpStipple); - stipple = tmpStipple; - } - if (stipple && sunGXCheckTile (pWin->background.pixmap, stipple)) - { - stipple->alu = gx_opaque_stipple_rop_table[GXcopy]|GX_PATTERN_MASK; - pPrivWin->fastBackground = FALSE; - if (stipple == tmpStipple) - { - sunGXSetWindowPrivate(pWin, stipple); - tmpStipple = 0; - } - break; - } - if ((stipple = sunGXGetWindowPrivate(pWin))) - { - xfree (stipple); - sunGXSetWindowPrivate(pWin,0); - } - if (((width = (pWin->background.pixmap->drawable.width * PSZ)) <= 32) && - !(width & (width - 1))) - { - cfbCopyRotatePixmap(pWin->background.pixmap, - &pPrivWin->pRotatedBackground, - pWin->drawable.x, - pWin->drawable.y); - if (pPrivWin->pRotatedBackground) - { - pPrivWin->fastBackground = TRUE; - pPrivWin->oldRotate.x = pWin->drawable.x; - pPrivWin->oldRotate.y = pWin->drawable.y; - } - else - { - pPrivWin->fastBackground = FALSE; - } - break; - } - pPrivWin->fastBackground = FALSE; - break; - - case CWBackPixel: - pPrivWin->fastBackground = FALSE; - break; - - case CWBorderPixmap: - /* don't bother with accelerator for border tiles (just lazy) */ - if (((width = (pWin->border.pixmap->drawable.width * PSZ)) <= 32) && - !(width & (width - 1))) - { - for (pBgWin = pWin; - pBgWin->backgroundState == ParentRelative; - pBgWin = pBgWin->parent); - cfbCopyRotatePixmap(pWin->border.pixmap, - &pPrivWin->pRotatedBorder, - pBgWin->drawable.x, - pBgWin->drawable.y); - if (pPrivWin->pRotatedBorder) - { - pPrivWin->fastBorder = TRUE; - pPrivWin->oldRotate.x = pBgWin->drawable.x; - pPrivWin->oldRotate.y = pBgWin->drawable.y; - } - else - { - pPrivWin->fastBorder = TRUE; - } - } - else - { - pPrivWin->fastBorder = FALSE; - } - break; - case CWBorderPixel: - pPrivWin->fastBorder = FALSE; - break; - } - } - return (TRUE); -} - -void -sunGXPaintWindow(pWin, pRegion, what) - WindowPtr pWin; - RegionPtr pRegion; - int what; -{ - register cfbPrivWin *pPrivWin; - sunGXStipplePtr stipple; - WindowPtr pBgWin; - pPrivWin = (cfbPrivWin *)(pWin->devPrivates[cfbWindowPrivateIndex].ptr); - - switch (what) { - case PW_BACKGROUND: - stipple = sunGXGetWindowPrivate(pWin); - switch (pWin->backgroundState) { - case None: - return; - case ParentRelative: - do { - pWin = pWin->parent; - } while (pWin->backgroundState == ParentRelative); - (*pWin->drawable.pScreen->PaintWindowBackground)(pWin, pRegion, - what); - return; - case BackgroundPixmap: - if (stipple) - { - sunGXFillBoxStipple ((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - stipple); - } - else if (pPrivWin->fastBackground) - { - cfbFillBoxTile32 ((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - pPrivWin->pRotatedBackground); - } - else - { - cfbFillBoxTileOdd ((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - pWin->background.pixmap, - (int) pWin->drawable.x, (int) pWin->drawable.y); - } - return; - case BackgroundPixel: - sunGXFillBoxSolid((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - pWin->background.pixel); - return; - } - break; - case PW_BORDER: - if (pWin->borderIsPixel) - { - sunGXFillBoxSolid((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - pWin->border.pixel); - return; - } - else if (pPrivWin->fastBorder) - { - cfbFillBoxTile32 ((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - pPrivWin->pRotatedBorder); - return; - } - else - { - for (pBgWin = pWin; - pBgWin->backgroundState == ParentRelative; - pBgWin = pBgWin->parent); - - cfbFillBoxTileOdd ((DrawablePtr)pWin, - (int)REGION_NUM_RECTS(pRegion), - REGION_RECTS(pRegion), - pWin->border.pixmap, - (int) pBgWin->drawable.x, - (int) pBgWin->drawable.y); - return; - } - break; - } -} - -void -sunGXCopyWindow(pWin, ptOldOrg, prgnSrc) - WindowPtr pWin; - DDXPointRec ptOldOrg; - RegionPtr prgnSrc; -{ - DDXPointPtr pptSrc; - register DDXPointPtr ppt; - RegionPtr prgnDst; - register BoxPtr pbox; - register int dx, dy; - register int i, nbox; - WindowPtr pwinRoot; - extern WindowPtr *WindowTable; - - pwinRoot = WindowTable[pWin->drawable.pScreen->myNum]; - - prgnDst = REGION_CREATE(pWin->drawable.pScreen, NULL, 1); - - dx = ptOldOrg.x - pWin->drawable.x; - dy = ptOldOrg.y - pWin->drawable.y; - REGION_TRANSLATE(pWin->drawable.pScreen, prgnSrc, -dx, -dy); - REGION_INTERSECT(pWin->drawable.pScreen, prgnDst, &pWin->borderClip, prgnSrc); - - pbox = REGION_RECTS(prgnDst); - nbox = REGION_NUM_RECTS(prgnDst); - if(!(pptSrc = (DDXPointPtr )ALLOCATE_LOCAL(nbox * sizeof(DDXPointRec)))) - return; - ppt = pptSrc; - - for (i = nbox; --i >= 0; ppt++, pbox++) - { - ppt->x = pbox->x1 + dx; - ppt->y = pbox->y1 + dy; - } - - sunGXDoBitblt ((DrawablePtr)pwinRoot, (DrawablePtr)pwinRoot, - GXcopy, prgnDst, pptSrc, ~0L); - DEALLOCATE_LOCAL(pptSrc); - REGION_DESTROY(pWin->drawable.pScreen, prgnDst); -} - -Bool -sunGXInit ( - ScreenPtr pScreen, - fbFd *fb) -{ - sunGXPtr gx; - Uint mode; - register long r; - - if (serverGeneration != sunGXGeneration) - { - sunGXScreenPrivateIndex = AllocateScreenPrivateIndex(); - if (sunGXScreenPrivateIndex == -1) - return FALSE; - sunGXGCPrivateIndex = AllocateGCPrivateIndex (); - sunGXWindowPrivateIndex = AllocateWindowPrivateIndex (); - sunGXGeneration = serverGeneration; - } - if (!AllocateGCPrivate(pScreen, sunGXGCPrivateIndex, sizeof (sunGXPrivGCRec))) - return FALSE; - if (!AllocateWindowPrivate(pScreen, sunGXWindowPrivateIndex, 0)) - return FALSE; - gx = (sunGXPtr) fb->fb; - mode = gx->mode; - GXWait(gx,r); - mode &= ~( GX_BLIT_ALL | - GX_MODE_ALL | - GX_DRAW_ALL | - GX_BWRITE0_ALL | - GX_BWRITE1_ALL | - GX_BREAD_ALL | - GX_BDISP_ALL); - mode |= GX_BLIT_SRC | - GX_MODE_COLOR8 | - GX_DRAW_RENDER | - GX_BWRITE0_ENABLE | - GX_BWRITE1_DISABLE | - GX_BREAD_0 | - GX_BDISP_0; - gx->mode = mode; - gx->clip = 0; - gx->offx = 0; - gx->offy = 0; - gx->clipminx = 0; - gx->clipminy = 0; - gx->clipmaxx = fb->info.fb_width - 1; - gx->clipmaxy = fb->info.fb_height - 1; - pScreen->devPrivates[sunGXScreenPrivateIndex].ptr = (pointer) gx; - /* - * Replace various screen functions - */ - pScreen->CreateGC = sunGXCreateGC; - pScreen->CreateWindow = sunGXCreateWindow; - pScreen->ChangeWindowAttributes = sunGXChangeWindowAttributes; - pScreen->DestroyWindow = sunGXDestroyWindow; - pScreen->PaintWindowBackground = sunGXPaintWindow; - pScreen->PaintWindowBorder = sunGXPaintWindow; - pScreen->CopyWindow = sunGXCopyWindow; - return TRUE; -} |