648 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			648 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
| /* $XFree86: xc/programs/Xserver/hw/xfree86/xf8_32bpp/cfbgc.c,v 1.3 2000/02/11 06:33:46 mvojkovi Exp $ */
 | |
| /***********************************************************
 | |
| 
 | |
| Copyright 1987, 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.
 | |
| 
 | |
| 
 | |
| Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
 | |
| 
 | |
|                         All Rights Reserved
 | |
| 
 | |
| Permission to use, copy, modify, and distribute this software and its 
 | |
| documentation for any purpose and without fee is hereby granted, 
 | |
| provided that the above copyright notice appear in all copies and that
 | |
| both that copyright notice and this permission notice appear in 
 | |
| supporting documentation, and that the name of Digital not be
 | |
| used in advertising or publicity pertaining to distribution of the
 | |
| software without specific, written prior permission.  
 | |
| 
 | |
| DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
 | |
| ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
 | |
| DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
 | |
| ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 | |
| WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 | |
| ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 | |
| SOFTWARE.
 | |
| 
 | |
| ******************************************************************/
 | |
| 
 | |
| 
 | |
| /*
 | |
| 
 | |
| PSZ		8	16	24	32
 | |
| PIXEL_ADDR	True	True	True	True
 | |
| NO_ONE_RECT	False	False	False	False
 | |
| WriteBitGroup	True	True	True	True
 | |
| FOUR_BIT_CODE	True	False	False	False
 | |
| LOWMEMFTPT	False	False	False	False
 | |
| 
 | |
| */
 | |
| 
 | |
| 
 | |
| /* This gets built twice.  Once for 8bpp and another for 32bpp */
 | |
| 
 | |
| #ifdef HAVE_XORG_CONFIG_H
 | |
| #include <xorg-config.h>
 | |
| #endif
 | |
| 
 | |
| #include <X11/X.h>
 | |
| #include <X11/Xmd.h>
 | |
| #include <X11/Xproto.h>
 | |
| #include "cfb.h"
 | |
| #include <X11/fonts/fontstruct.h>
 | |
| #include "dixfontstr.h"
 | |
| #include "gcstruct.h"
 | |
| #include "windowstr.h"
 | |
| #include "pixmapstr.h"
 | |
| #include "scrnintstr.h"
 | |
| #include "region.h"
 | |
| 
 | |
| #include "mistruct.h"
 | |
| #include "mibstore.h"
 | |
| #include "migc.h"
 | |
| #include "mioverlay.h"
 | |
| 
 | |
| #include "cfb8_32.h"
 | |
| #include "cfbmskbits.h"
 | |
| #include "cfb8bit.h"
 | |
| 
 | |
| 
 | |
| #if PSZ == 8
 | |
| # define useTEGlyphBlt  cfbTEGlyphBlt8
 | |
| #else
 | |
| # ifdef WriteBitGroup
 | |
| #  define useTEGlyphBlt cfbImageGlyphBlt8
 | |
| # else
 | |
| #  define useTEGlyphBlt cfbTEGlyphBlt
 | |
| # endif
 | |
| #endif
 | |
| 
 | |
| #ifdef WriteBitGroup
 | |
| # define useImageGlyphBlt       cfbImageGlyphBlt8
 | |
| # define usePolyGlyphBlt        cfbPolyGlyphBlt8
 | |
| #else
 | |
| # define useImageGlyphBlt       miImageGlyphBlt
 | |
| # define usePolyGlyphBlt        miPolyGlyphBlt
 | |
| #endif
 | |
| 
 | |
| #ifdef FOUR_BIT_CODE
 | |
| # define usePushPixels  cfbPushPixels8
 | |
| #else
 | |
| # define usePushPixels  mfbPushPixels
 | |
| #endif
 | |
| 
 | |
| #ifdef PIXEL_ADDR
 | |
| # define ZeroPolyArc    cfbZeroPolyArcSS8Copy
 | |
| #else
 | |
| # define ZeroPolyArc    miZeroPolyArc
 | |
| #endif
 | |
| 
 | |
| 
 | |
| static GCOps cfb8_32TEOps1Rect = {
 | |
|     cfbSolidSpansCopy,
 | |
|     cfbSetSpans,
 | |
|     cfb8_32PutImage,
 | |
|     cfb8_32CopyArea,
 | |
|     cfb8_32CopyPlane,
 | |
|     cfbPolyPoint,
 | |
| #ifdef PIXEL_ADDR
 | |
|     cfb8LineSS1Rect,
 | |
|     cfb8SegmentSS1Rect,
 | |
| #else
 | |
|     cfbLineSS,
 | |
|     cfbSegmentSS,
 | |
| #endif
 | |
|     miPolyRectangle,
 | |
|     ZeroPolyArc,
 | |
|     cfbFillPoly1RectCopy,
 | |
|     cfbPolyFillRect,
 | |
|     cfbPolyFillArcSolidCopy,
 | |
|     miPolyText8,
 | |
|     miPolyText16,
 | |
|     miImageText8,
 | |
|     miImageText16,
 | |
|     useTEGlyphBlt,
 | |
|     usePolyGlyphBlt,
 | |
|     usePushPixels
 | |
| };
 | |
| 
 | |
| static GCOps cfb8_32NonTEOps1Rect = {
 | |
|     cfbSolidSpansCopy,
 | |
|     cfbSetSpans,
 | |
|     cfb8_32PutImage,
 | |
|     cfb8_32CopyArea,
 | |
|     cfb8_32CopyPlane,
 | |
|     cfbPolyPoint,
 | |
| #ifdef PIXEL_ADDR
 | |
|     cfb8LineSS1Rect,
 | |
|     cfb8SegmentSS1Rect,
 | |
| #else
 | |
|     cfbLineSS,
 | |
|     cfbSegmentSS,
 | |
| #endif
 | |
|     miPolyRectangle,
 | |
|     ZeroPolyArc,
 | |
|     cfbFillPoly1RectCopy,
 | |
|     cfbPolyFillRect,
 | |
|     cfbPolyFillArcSolidCopy,
 | |
|     miPolyText8,
 | |
|     miPolyText16,
 | |
|     miImageText8,
 | |
|     miImageText16,
 | |
|     useImageGlyphBlt,
 | |
|     usePolyGlyphBlt,
 | |
|     usePushPixels
 | |
| };
 | |
| 
 | |
| static GCOps cfb8_32TEOps = {
 | |
|     cfbSolidSpansCopy,
 | |
|     cfbSetSpans,
 | |
|     cfb8_32PutImage,
 | |
|     cfb8_32CopyArea,
 | |
|     cfb8_32CopyPlane,
 | |
|     cfbPolyPoint,
 | |
|     cfbLineSS,
 | |
|     cfbSegmentSS,
 | |
|     miPolyRectangle,
 | |
|     ZeroPolyArc,
 | |
|     miFillPolygon,
 | |
|     cfbPolyFillRect,
 | |
|     cfbPolyFillArcSolidCopy,
 | |
|     miPolyText8,
 | |
|     miPolyText16,
 | |
|     miImageText8,
 | |
|     miImageText16,
 | |
|     useTEGlyphBlt,
 | |
|     usePolyGlyphBlt,
 | |
|     usePushPixels
 | |
| };
 | |
| 
 | |
| static GCOps cfb8_32NonTEOps = {
 | |
|     cfbSolidSpansCopy,
 | |
|     cfbSetSpans,
 | |
|     cfb8_32PutImage,
 | |
|     cfb8_32CopyArea,
 | |
|     cfb8_32CopyPlane,
 | |
|     cfbPolyPoint,
 | |
|     cfbLineSS,
 | |
|     cfbSegmentSS,
 | |
|     miPolyRectangle,
 | |
| #ifdef PIXEL_ADDR
 | |
|     cfbZeroPolyArcSS8Copy,
 | |
| #else
 | |
|     miZeroPolyArc,
 | |
| #endif
 | |
|     miFillPolygon,
 | |
|     cfbPolyFillRect,
 | |
|     cfbPolyFillArcSolidCopy,
 | |
|     miPolyText8,
 | |
|     miPolyText16,
 | |
|     miImageText8,
 | |
|     miImageText16,
 | |
|     useImageGlyphBlt,
 | |
|     usePolyGlyphBlt,
 | |
|     usePushPixels
 | |
| };
 | |
| 
 | |
| static GCOps *
 | |
| cfb8_32MatchCommon (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 (pGC->font &&
 | |
| 	FONTMAXBOUNDS(pGC->font,rightSideBearing) -
 | |
|         FONTMINBOUNDS(pGC->font,leftSideBearing) <= 32 &&
 | |
| 	FONTMINBOUNDS(pGC->font,characterWidth) >= 0)
 | |
|     {
 | |
| 	if (TERMINALFONT(pGC->font)
 | |
| #ifdef FOUR_BIT_CODE
 | |
| 	    && FONTMAXBOUNDS(pGC->font,characterWidth) >= PGSZB
 | |
| #endif
 | |
| 	)
 | |
| #ifdef NO_ONE_RECT
 | |
|             return &cfb8_32TEOps1Rect;
 | |
| #else
 | |
| 	    if (devPriv->oneRect)
 | |
| 		return &cfb8_32TEOps1Rect;
 | |
| 	    else
 | |
| 		return &cfb8_32TEOps;
 | |
| #endif
 | |
| 	else
 | |
| #ifdef NO_ONE_RECT
 | |
| 	    return &cfb8_32NonTEOps1Rect;
 | |
| #else
 | |
| 	    if (devPriv->oneRect)
 | |
| 		return &cfb8_32NonTEOps1Rect;
 | |
| 	    else
 | |
| 		return &cfb8_32NonTEOps;
 | |
| #endif
 | |
|     }
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| /* Clipping conventions
 | |
| 	if the drawable is a window
 | |
| 	    CT_REGION ==> pCompositeClip really is the composite
 | |
| 	    CT_other ==> pCompositeClip is the window clip region
 | |
| 	if the drawable is a pixmap
 | |
| 	    CT_REGION ==> pCompositeClip is the translated client region
 | |
| 		clipped to the pixmap boundary
 | |
| 	    CT_other ==> pCompositeClip is the pixmap bounding box
 | |
| */
 | |
| 
 | |
| void
 | |
| #if PSZ == 8
 | |
| cfb8_32ValidateGC8(
 | |
| #else
 | |
| cfb8_32ValidateGC32(
 | |
| #endif
 | |
|     GCPtr  		pGC,
 | |
|     unsigned long 	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;
 | |
|     /* flags for changing the proc vector */
 | |
|     cfbPrivGCPtr devPriv;
 | |
|     int		oneRect;
 | |
| 
 | |
|     pGC->lastWinOrg.x = pDrawable->x;
 | |
|     pGC->lastWinOrg.y = pDrawable->y;
 | |
|     devPriv = cfbGetGCPrivate(pGC);
 | |
| 
 | |
|     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);
 | |
| #ifdef NO_ONE_RECT
 | |
| 	devPriv->oneRect = FALSE;
 | |
| #else
 | |
| 	oneRect = REGION_NUM_RECTS(pGC->pCompositeClip) == 1;
 | |
| 	if (oneRect != devPriv->oneRect)
 | |
| 	    new_line = TRUE;
 | |
| 	devPriv->oneRect = oneRect;
 | |
| #endif
 | |
|     }
 | |
| 
 | |
|     mask = changes;
 | |
|     while (mask) {
 | |
| 	index = lowbit (mask);
 | |
| 	mask &= ~index;
 | |
| 
 | |
| 	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 GCJoinStyle:
 | |
| 	case GCCapStyle:
 | |
| 	    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:
 | |
| 	case GCTileStipYOrigin:
 | |
| 	    break;
 | |
| 	case GCFont:
 | |
| 	    new_text = TRUE;
 | |
| 	    break;
 | |
| 	case GCSubwindowMode:
 | |
| 	case GCGraphicsExposures:
 | |
| 	case GCClipXOrigin:
 | |
| 	case GCClipYOrigin:
 | |
| 	case GCClipMask:
 | |
| 	case GCDashOffset:
 | |
| 	case GCDashList:
 | |
| 	case GCArcMode:
 | |
| 	default:
 | |
| 	    break;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     /*
 | |
|      * If the drawable has changed,  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_rrop)
 | |
|     {
 | |
| 	int old_rrop;
 | |
| 
 | |
| 	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
 | |
| 	{
 | |
| #ifdef PIXEL_ADDR
 | |
| 	    new_line = TRUE;
 | |
| #endif
 | |
| #ifdef WriteBitGroup
 | |
| 	    new_text = TRUE;
 | |
| #endif
 | |
| 	    new_fillspans = TRUE;
 | |
| 	    new_fillarea = TRUE;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if(!pGC->ops)
 | |
| 	pGC->ops = & cfb8_32NonTEOps;
 | |
| 
 | |
|     if (new_rrop || new_fillspans || new_text || new_fillarea || new_line)
 | |
|     {
 | |
| 	GCOps	*newops;
 | |
| 
 | |
| 	if ((newops = cfb8_32MatchCommon (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;
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     /* deal with the changes we've collected */
 | |
|     if (new_line)
 | |
|     {
 | |
| 	pGC->ops->FillPolygon = miFillPolygon;
 | |
| #ifdef NO_ONE_RECT
 | |
| 	if (pGC->fillStyle == FillSolid)
 | |
| 	{
 | |
| 	    switch (devPriv->rop) {
 | |
| 	    case GXcopy:
 | |
| 		pGC->ops->FillPolygon = cfbFillPoly1RectCopy;
 | |
| 		break;
 | |
| 	    default:
 | |
| 		pGC->ops->FillPolygon = cfbFillPoly1RectGeneral;
 | |
| 		break;
 | |
| 	    }
 | |
| 	}
 | |
| #else
 | |
| 	if (devPriv->oneRect && pGC->fillStyle == FillSolid)
 | |
| 	{
 | |
| 	    switch (devPriv->rop) {
 | |
| 	    case GXcopy:
 | |
| 		pGC->ops->FillPolygon = cfbFillPoly1RectCopy;
 | |
| 		break;
 | |
| 	    default:
 | |
| 		pGC->ops->FillPolygon = cfbFillPoly1RectGeneral;
 | |
| 		break;
 | |
| 	    }
 | |
| 	}
 | |
| #endif
 | |
| 	if (pGC->lineWidth == 0)
 | |
| 	{
 | |
| #ifdef PIXEL_ADDR
 | |
| 	    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
 | |
| #endif
 | |
| 		pGC->ops->PolyArc = miZeroPolyArc;
 | |
| 	}
 | |
| 	else
 | |
| 	    pGC->ops->PolyArc = miPolyArc;
 | |
| 	pGC->ops->PolySegment = miPolySegment;
 | |
| 	switch (pGC->lineStyle)
 | |
| 	{
 | |
| 	case LineSolid:
 | |
| 	    if(pGC->lineWidth == 0)
 | |
| 	    {
 | |
| 		if (pGC->fillStyle == FillSolid)
 | |
| 		{
 | |
| #if defined(PIXEL_ADDR) && !defined(NO_ONE_RECT)
 | |
| 		    if (devPriv->oneRect &&
 | |
| 			((pDrawable->x >= pGC->pScreen->width - 32768) &&
 | |
| 			 (pDrawable->y >= pGC->pScreen->height - 32768)))
 | |
| 		    {
 | |
| 			pGC->ops->Polylines = cfb8LineSS1Rect;
 | |
| 			pGC->ops->PolySegment = cfb8SegmentSS1Rect;
 | |
| 		    } else
 | |
| #endif
 | |
| #ifdef NO_ONE_RECT
 | |
| 		    {
 | |
| 			pGC->ops->Polylines = cfb8LineSS1Rect;
 | |
| 			pGC->ops->PolySegment = cfb8SegmentSS1Rect;
 | |
| 		    }
 | |
| #else
 | |
| 		    {
 | |
| 		    	pGC->ops->Polylines = cfbLineSS;
 | |
| 		    	pGC->ops->PolySegment = cfbSegmentSS;
 | |
| 		    }
 | |
| #endif
 | |
| 		}
 | |
|  		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 (FONTMAXBOUNDS(pGC->font,rightSideBearing) -
 | |
|             FONTMINBOUNDS(pGC->font,leftSideBearing) > 32 ||
 | |
| 	    FONTMINBOUNDS(pGC->font,characterWidth) < 0)
 | |
|         {
 | |
|             pGC->ops->PolyGlyphBlt = miPolyGlyphBlt;
 | |
|             pGC->ops->ImageGlyphBlt = miImageGlyphBlt;
 | |
|         }
 | |
|         else
 | |
|         {
 | |
| #ifdef WriteBitGroup
 | |
| 	    if (pGC->fillStyle == FillSolid)
 | |
| 	    {
 | |
| 		if (devPriv->rop == GXcopy)
 | |
| 		    pGC->ops->PolyGlyphBlt = cfbPolyGlyphBlt8;
 | |
| 		else
 | |
| #ifdef FOUR_BIT_CODE
 | |
| 		    pGC->ops->PolyGlyphBlt = cfbPolyGlyphRop8;
 | |
| #else
 | |
| 		    pGC->ops->PolyGlyphBlt = miPolyGlyphBlt;
 | |
| #endif
 | |
| 	    }
 | |
| 	    else
 | |
| #endif
 | |
| 		pGC->ops->PolyGlyphBlt = miPolyGlyphBlt;
 | |
|             /* special case ImageGlyphBlt for terminal emulator fonts */
 | |
| #if !defined(WriteBitGroup) || PSZ == 8
 | |
| 	    if (TERMINALFONT(pGC->font) &&
 | |
| 		(pGC->planemask & PMSK) == PMSK
 | |
| #ifdef FOUR_BIT_CODE
 | |
| 		&& FONTMAXBOUNDS(pGC->font,characterWidth) >= PGSZB
 | |
| #endif
 | |
| 		)
 | |
| 	    {
 | |
| 		pGC->ops->ImageGlyphBlt = useTEGlyphBlt;
 | |
| 	    }
 | |
|             else
 | |
| #endif
 | |
| 	    {
 | |
| #ifdef WriteBitGroup
 | |
| 		if (devPriv->rop == GXcopy &&
 | |
| 		    pGC->fillStyle == FillSolid &&
 | |
| 		    (pGC->planemask & PMSK) == PMSK)
 | |
| 		    pGC->ops->ImageGlyphBlt = cfbImageGlyphBlt8;
 | |
| 		else
 | |
| #endif
 | |
| 		    pGC->ops->ImageGlyphBlt = miImageGlyphBlt;
 | |
| 	    }
 | |
|         }
 | |
|     }    
 | |
| 
 | |
| 
 | |
|     if (new_fillspans) {
 | |
| 	switch (pGC->fillStyle) {
 | |
| 	case FillSolid:
 | |
| 	    switch (devPriv->rop) {
 | |
| 	    case GXcopy:
 | |
| 		pGC->ops->FillSpans = cfbSolidSpansCopy;
 | |
| 		break;
 | |
| 	    case GXxor:
 | |
| 		pGC->ops->FillSpans = cfbSolidSpansXor;
 | |
| 		break;
 | |
| 	    default:
 | |
| 		pGC->ops->FillSpans = cfbSolidSpansGeneral;
 | |
| 		break;
 | |
| 	    }
 | |
| 	    break;
 | |
| 	case FillTiled:
 | |
| 	    pGC->ops->FillSpans = cfbUnnaturalTileFS;
 | |
| 	    break;
 | |
| 	case FillStippled:
 | |
| 	case FillOpaqueStippled:
 | |
| 	    pGC->ops->FillSpans = cfbUnnaturalStippleFS;
 | |
| 	    break;
 | |
| 	default:
 | |
| 	    FatalError("cfbValidateGC: illegal fillStyle\n");
 | |
| 	}
 | |
|     } /* end of new_fillspans */
 | |
| 
 | |
|     if (new_fillarea) {
 | |
| #ifndef FOUR_BIT_CODE
 | |
| 	pGC->ops->PolyFillRect = miPolyFillRect;
 | |
| 	if (pGC->fillStyle == FillSolid || pGC->fillStyle == FillTiled)
 | |
| 	{
 | |
| 	    pGC->ops->PolyFillRect = cfbPolyFillRect;
 | |
| 	}
 | |
| #endif
 | |
| #ifdef FOUR_BIT_CODE
 | |
| 	pGC->ops->PushPixels = mfbPushPixels;
 | |
| 	if (pGC->fillStyle == FillSolid && devPriv->rop == GXcopy)
 | |
| 	    pGC->ops->PushPixels = cfbPushPixels8;
 | |
| #endif
 | |
| 	pGC->ops->PolyFillArc = miPolyFillArc;
 | |
| 	if (pGC->fillStyle == FillSolid)
 | |
| 	{
 | |
| 	    switch (devPriv->rop)
 | |
| 	    {
 | |
| 	    case GXcopy:
 | |
| 		pGC->ops->PolyFillArc = cfbPolyFillArcSolidCopy;
 | |
| 		break;
 | |
| 	    default:
 | |
| 		pGC->ops->PolyFillArc = cfbPolyFillArcSolidGeneral;
 | |
| 		break;
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| }
 |