summaryrefslogtreecommitdiff
path: root/src/ffb_gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ffb_gc.c')
-rw-r--r--src/ffb_gc.c758
1 files changed, 0 insertions, 758 deletions
diff --git a/src/ffb_gc.c b/src/ffb_gc.c
deleted file mode 100644
index 7fa34a4..0000000
--- a/src/ffb_gc.c
+++ /dev/null
@@ -1,758 +0,0 @@
-/*
- * Acceleration for the Creator and Creator3D framebuffer - GC implementation.
- *
- * Copyright (C) 1998,1999,2000 Jakub Jelinek (jakub@redhat.com)
- * Copyright (C) 1998 Michal Rehacek (majkl@iname.com)
- * Copyright (C) 1999 David S. Miller (davem@redhat.com)
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * JAKUB JELINEK, MICHAL REHACEK, OR DAVID MILLER 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.
- *
- */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_gc.c,v 1.2 2000/05/23 04:47:44 dawes Exp $ */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "ffb.h"
-#include "ffb_regs.h"
-#include "ffb_rcache.h"
-#include "ffb_fifo.h"
-#include "ffb_loops.h"
-#include "ffb_gc.h"
-
-#include "scrnintstr.h"
-#include "pixmapstr.h"
-#include <X11/fonts/fontstruct.h>
-#include "dixfontstr.h"
-
-#define PSZ 8
-#include "cfb.h"
-#undef PSZ
-#include "cfb32.h"
-
-#include "migc.h"
-#include "mi.h"
-#include "mispans.h"
-
-GCOps CreatorTEOps1Rect8 = {
- CreatorFillSpans,
- CreatorSetSpans,
- cfbPutImage,
- CreatorCopyArea,
- CreatorCopyPlane,
- CreatorPolyPoint,
- CreatorPolylines,
- CreatorPolySegment,
- miPolyRectangle,
- CreatorZeroPolyArc,
- CreatorFillPolygon,
- CreatorPolyFillRect,
- CreatorPolyFillArcSolid,
- miPolyText8,
- miPolyText16,
- miImageText8,
- miImageText16,
- CreatorTEGlyphBlt,
- CreatorPolyTEGlyphBlt,
- miPushPixels
-#ifdef NEED_LINEHELPER
- ,NULL
-#endif
-};
-
-GCOps CreatorTEOps1Rect32 = {
- CreatorFillSpans,
- CreatorSetSpans,
- cfb32PutImage,
- CreatorCopyArea,
- CreatorCopyPlane,
- CreatorPolyPoint,
- CreatorPolylines,
- CreatorPolySegment,
- miPolyRectangle,
- CreatorZeroPolyArc,
- CreatorFillPolygon,
- CreatorPolyFillRect,
- CreatorPolyFillArcSolid,
- miPolyText8,
- miPolyText16,
- miImageText8,
- miImageText16,
- CreatorTEGlyphBlt,
- CreatorPolyTEGlyphBlt,
- miPushPixels
-#ifdef NEED_LINEHELPER
- ,NULL
-#endif
-};
-
-GCOps CreatorTEOps8 = {
- CreatorFillSpans,
- CreatorSetSpans,
- cfbPutImage,
- CreatorCopyArea,
- CreatorCopyPlane,
- CreatorPolyPoint,
- CreatorLineSSStub,
- CreatorSegmentSSStub,
- miPolyRectangle,
- CreatorZeroPolyArc,
- CreatorFillPolygon,
- CreatorPolyFillRect,
- CreatorPolyFillArcSolid,
- miPolyText8,
- miPolyText16,
- miImageText8,
- miImageText16,
- CreatorTEGlyphBlt,
- CreatorPolyTEGlyphBlt,
- miPushPixels
-#ifdef NEED_LINEHELPER
- ,NULL
-#endif
-};
-
-GCOps CreatorTEOps32 = {
- CreatorFillSpans,
- CreatorSetSpans,
- cfb32PutImage,
- CreatorCopyArea,
- CreatorCopyPlane,
- CreatorPolyPoint,
- CreatorLineSSStub,
- CreatorSegmentSSStub,
- miPolyRectangle,
- CreatorZeroPolyArc,
- CreatorFillPolygon,
- CreatorPolyFillRect,
- CreatorPolyFillArcSolid,
- miPolyText8,
- miPolyText16,
- miImageText8,
- miImageText16,
- CreatorTEGlyphBlt,
- CreatorPolyTEGlyphBlt,
- miPushPixels
-#ifdef NEED_LINEHELPER
- ,NULL
-#endif
-};
-
-GCOps CreatorNonTEOps1Rect8 = {
- CreatorFillSpans,
- CreatorSetSpans,
- cfbPutImage,
- CreatorCopyArea,
- CreatorCopyPlane,
- CreatorPolyPoint,
- CreatorPolylines,
- CreatorPolySegment,
- miPolyRectangle,
- CreatorZeroPolyArc,
- CreatorFillPolygon,
- CreatorPolyFillRect,
- CreatorPolyFillArcSolid,
- miPolyText8,
- miPolyText16,
- miImageText8,
- miImageText16,
- miImageGlyphBlt,
- CreatorPolyGlyphBlt,
- miPushPixels
-#ifdef NEED_LINEHELPER
- ,NULL
-#endif
-};
-
-GCOps CreatorNonTEOps1Rect32 = {
- CreatorFillSpans,
- CreatorSetSpans,
- cfb32PutImage,
- CreatorCopyArea,
- CreatorCopyPlane,
- CreatorPolyPoint,
- CreatorPolylines,
- CreatorPolySegment,
- miPolyRectangle,
- CreatorZeroPolyArc,
- CreatorFillPolygon,
- CreatorPolyFillRect,
- CreatorPolyFillArcSolid,
- miPolyText8,
- miPolyText16,
- miImageText8,
- miImageText16,
- miImageGlyphBlt,
- CreatorPolyGlyphBlt,
- miPushPixels
-#ifdef NEED_LINEHELPER
- ,NULL
-#endif
-};
-
-GCOps CreatorNonTEOps8 = {
- CreatorFillSpans,
- CreatorSetSpans,
- cfbPutImage,
- CreatorCopyArea,
- CreatorCopyPlane,
- CreatorPolyPoint,
- CreatorLineSSStub,
- CreatorSegmentSSStub,
- miPolyRectangle,
- CreatorZeroPolyArc,
- CreatorFillPolygon,
- CreatorPolyFillRect,
- CreatorPolyFillArcSolid,
- miPolyText8,
- miPolyText16,
- miImageText8,
- miImageText16,
- miImageGlyphBlt,
- CreatorPolyGlyphBlt,
- miPushPixels
-#ifdef NEED_LINEHELPER
- ,NULL
-#endif
-};
-
-GCOps CreatorNonTEOps32 = {
- CreatorFillSpans,
- CreatorSetSpans,
- cfb32PutImage,
- CreatorCopyArea,
- CreatorCopyPlane,
- CreatorPolyPoint,
- CreatorLineSSStub,
- CreatorSegmentSSStub,
- miPolyRectangle,
- CreatorZeroPolyArc,
- CreatorFillPolygon,
- CreatorPolyFillRect,
- CreatorPolyFillArcSolid,
- miPolyText8,
- miPolyText16,
- miImageText8,
- miImageText16,
- miImageGlyphBlt,
- CreatorPolyGlyphBlt,
- miPushPixels
-#ifdef NEED_LINEHELPER
- ,NULL
-#endif
-};
-
-#define FONTWIDTH(font) (FONTMAXBOUNDS(font,rightSideBearing) - \
- FONTMINBOUNDS(font,leftSideBearing))
-#define FONTHEIGHT(font) (FONTMAXBOUNDS(font,ascent) + \
- FONTMINBOUNDS(font,descent))
-
-static GCOps *
-CreatorMatchCommon (GCPtr pGC, cfbPrivGCPtr devPriv)
-{
- int depth = pGC->depth;
-
- 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 &&
- FONTWIDTH (pGC->font) <= 32 &&
- FONTHEIGHT (pGC->font) <= 100 &&
- FONTMINBOUNDS(pGC->font,characterWidth) >= 0) {
- if (TERMINALFONT(pGC->font)) {
- if (devPriv->oneRect) {
- return (depth == 8 ?
- &CreatorTEOps1Rect8 :
- &CreatorTEOps1Rect32);
- } else {
- return (depth == 8 ?
- &CreatorTEOps8 :
- &CreatorTEOps32);
- }
- } else {
- if (devPriv->oneRect) {
- return (depth == 8 ?
- &CreatorNonTEOps1Rect8 :
- &CreatorNonTEOps1Rect32);
- } else {
- return (depth == 8 ?
- &CreatorNonTEOps8 :
- &CreatorNonTEOps32);
- }
- }
- }
- return 0;
-}
-
-static void
-CreatorDestroyGC (GCPtr pGC)
-{
- CreatorPrivGCPtr gcPriv = CreatorGetGCPrivate (pGC);
-
- if (gcPriv->stipple)
- xfree (gcPriv->stipple);
- miDestroyGC (pGC);
-}
-
-static __inline__ void
-CreatorNewLine(GCPtr pGC, cfbPrivGCPtr devPriv, CreatorPrivGCPtr gcPriv, int accel)
-{
- pGC->ops->FillPolygon = miFillPolygon;
- pGC->ops->PolyRectangle = miPolyRectangle;
- if (pGC->lineWidth == 0)
- pGC->ops->PolyArc = miZeroPolyArc;
- else
- pGC->ops->PolyArc = miPolyArc;
- if (accel) {
- pGC->ops->FillPolygon = CreatorFillPolygon;
- if (pGC->lineWidth == 0 && pGC->capStyle != CapNotLast)
- pGC->ops->PolyArc = CreatorZeroPolyArc;
- }
- pGC->ops->PolySegment = miPolySegment;
- gcPriv->linepat = 0;
-
- /* Segment and Line ops are only accelerated if there is
- * one clipping region.
- */
- if (accel && !devPriv->oneRect)
- accel = 0;
-
- if (pGC->lineStyle == LineSolid) {
- if(pGC->lineWidth == 0) {
- if (pGC->fillStyle == FillSolid) {
- pGC->ops->Polylines = CreatorLineSSStub;
- pGC->ops->PolySegment = CreatorSegmentSSStub;
- } else
- pGC->ops->Polylines = miZeroLine;
- if (accel) {
- gcPriv->PolySegment = pGC->ops->PolySegment;
- gcPriv->Polylines = pGC->ops->Polylines;
- pGC->ops->PolySegment = CreatorPolySegment;
- pGC->ops->Polylines = CreatorPolylines;
- }
- } else {
- pGC->ops->Polylines = miWideLine;
- }
- } else if(pGC->lineStyle == LineOnOffDash) {
- if (pGC->lineWidth == 0 && pGC->fillStyle == FillSolid) {
- pGC->ops->Polylines = CreatorLineSDStub;
- pGC->ops->PolySegment = CreatorSegmentSDStub;
- if(accel &&
- CreatorCheckLinePattern(pGC, gcPriv)) {
- gcPriv->PolySegment = pGC->ops->PolySegment;
- gcPriv->Polylines = pGC->ops->Polylines;
- pGC->ops->PolySegment = CreatorPolySegment;
- pGC->ops->Polylines = CreatorPolylines;
- }
- } else {
- pGC->ops->Polylines = miWideDash;
- }
- } else if(pGC->lineStyle == LineDoubleDash) {
- if (pGC->lineWidth == 0 && pGC->fillStyle == FillSolid) {
- pGC->ops->Polylines = CreatorLineSDStub;
- pGC->ops->PolySegment = CreatorSegmentSDStub;
- } else {
- pGC->ops->Polylines = miWideDash;
- }
- }
-}
-
-static __inline__ void
-CreatorNewGlyph(GCPtr pGC, CreatorPrivGCPtr gcPriv)
-{
- if (FONTWIDTH(pGC->font) > 32 ||
- FONTHEIGHT(pGC->font) > 100 ||
- 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 = CreatorPolyTEGlyphBlt;
- } else {
- pGC->ops->PolyGlyphBlt = CreatorPolyGlyphBlt;
- }
- } else {
- pGC->ops->PolyGlyphBlt = miPolyGlyphBlt;
- }
-
- /* special case ImageGlyphBlt for terminal emulator fonts */
- if (TERMINALFONT(pGC->font))
- pGC->ops->ImageGlyphBlt = CreatorTEGlyphBlt;
- else
- pGC->ops->ImageGlyphBlt = miImageGlyphBlt;
- }
-}
-
-static __inline__ void
-CreatorNewFillSpans(GCPtr pGC, cfbPrivGCPtr devPriv, CreatorPrivGCPtr gcPriv, int accel)
-{
- if (pGC->fillStyle == FillSolid) {
- pGC->ops->FillSpans = CreatorSolidSpansGeneralStub;
- } else if(pGC->fillStyle == FillTiled) {
- if (pGC->pRotatedPixmap) {
- int pmsk = (pGC->depth == 8 ? 0xff : 0xffffff);
- if (pGC->alu == GXcopy && (pGC->planemask & pmsk) == pmsk)
- pGC->ops->FillSpans = CreatorTile32FSCopyStub;
- else
- pGC->ops->FillSpans = CreatorTile32FSGeneralStub;
- } else
- pGC->ops->FillSpans = CreatorUnnaturalTileFSStub;
- } else if(pGC->fillStyle == FillStippled) {
- if (pGC->pRotatedPixmap)
- pGC->ops->FillSpans = Creator8Stipple32FSStub;
- else
- pGC->ops->FillSpans = CreatorUnnaturalStippleFSStub;
- } else if(pGC->fillStyle == FillOpaqueStippled) {
- if (pGC->pRotatedPixmap)
- pGC->ops->FillSpans = Creator8OpaqueStipple32FSStub;
- else
- pGC->ops->FillSpans = CreatorUnnaturalStippleFSStub;
- } else
- FatalError("CreatorValidateGC: illegal fillStyle\n");
- if (accel)
- pGC->ops->FillSpans = CreatorFillSpans;
-}
-
-static __inline__ void
-CreatorNewFillArea(GCPtr pGC, cfbPrivGCPtr devPriv, CreatorPrivGCPtr gcPriv, int accel)
-{
- if (accel) {
- pGC->ops->PolyFillRect = CreatorPolyFillRect;
- pGC->ops->PolyFillArc = CreatorPolyFillArcSolid;
- } else {
- pGC->ops->PolyFillRect = miPolyFillRect;
- if(pGC->fillStyle == FillSolid || pGC->fillStyle == FillTiled)
- pGC->ops->PolyFillRect = CreatorPolyFillRectStub;
- pGC->ops->PolyFillArc = miPolyFillArc;
- }
- pGC->ops->PushPixels = mfbPushPixels;
-}
-
-void
-CreatorValidateGC (GCPtr pGC, unsigned long changes, DrawablePtr pDrawable)
-{
- int mask; /* stateChanges */
- 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;
- CreatorPrivGCPtr gcPriv;
- int oneRect, type;
- int accel, drawableChanged;
- FFBPtr pFfb = GET_FFB_FROM_SCREEN(pDrawable->pScreen);
-
- gcPriv = CreatorGetGCPrivate (pGC);
- type = pFfb->vtSema ? -1 : pDrawable->type;
- if (type != DRAWABLE_WINDOW) {
- if (gcPriv->type == DRAWABLE_WINDOW) {
- extern GCOps cfbNonTEOps;
- extern GCOps cfb32NonTEOps;
-
- miDestroyGCOps (pGC->ops);
-
- if (pGC->depth == 8)
- pGC->ops = &cfbNonTEOps;
- else
- pGC->ops = &cfb32NonTEOps;
-
- changes = (1 << (GCLastBit+1)) - 1;
- pGC->stateChanges = changes;
- gcPriv->type = type;
- }
- if (pGC->depth == 8)
- cfbValidateGC (pGC, changes, pDrawable);
- else
- cfb32ValidateGC (pGC, changes, pDrawable);
-
- /* Our high speed VIS copyarea can
- * be used on pixmaps too.
- * But don't clobber someones ops prototype!!
- */
- if (!pGC->ops->devPrivate.val) {
- pGC->ops = miCreateGCOps(pGC->ops);
- pGC->ops->devPrivate.val = 1;
- }
- pGC->ops->CopyArea = CreatorCopyArea;
- return;
- }
-
- if (gcPriv->type != DRAWABLE_WINDOW) {
- changes = (1 << (GCLastBit+1)) - 1;
- gcPriv->type = DRAWABLE_WINDOW;
- }
-
- new_rotate = pGC->lastWinOrg.x != pDrawable->x ||
- pGC->lastWinOrg.y != pDrawable->y;
- if(new_rotate != 0) {
- 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;
-
- drawableChanged = (pDrawable->serialNumber !=
- (pGC->serialNumber & (DRAWABLE_SERIAL_BITS)));
-#define CLIP_BITS (GCClipXOrigin|GCClipYOrigin|GCClipMask|GCSubwindowMode)
- /* 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 & CLIP_BITS) != 0 || drawableChanged) {
- miComputeCompositeClip(pGC, pDrawable);
- oneRect = REGION_NUM_RECTS(cfbGetCompositeClip(pGC)) == 1;
- if (oneRect != devPriv->oneRect) {
- new_line = TRUE;
- devPriv->oneRect = oneRect;
- }
- }
-
- /* A while loop with a switch statement inside? No thanks. -DaveM */
- mask = changes;
- if((mask & (GCFunction | GCForeground | GCBackground | GCPlaneMask)) != 0)
- new_rrop = TRUE;
- if((mask & (GCPlaneMask | GCFillStyle | GCFont)) != 0)
- new_text = TRUE;
- if((mask & (GCLineStyle | GCLineWidth | GCFillStyle | GCCapStyle)) != 0)
- new_line = TRUE;
- if((mask & (GCFillStyle | GCTile | GCStipple)) != 0)
- new_fillspans = new_fillarea = TRUE;
- if(new_rotate == FALSE &&
- (mask & (GCTileStipXOrigin | GCTileStipYOrigin)) != 0)
- new_rotate = TRUE;
- if((mask & GCStipple) != 0) {
- if(pGC->stipple) {
- int width = pGC->stipple->drawable.width;
- PixmapPtr nstipple;
-
- if ((width <= 32) && !(width & (width - 1))) {
- int depth = pGC->depth;
- nstipple = (depth == 8 ?
- cfbCopyPixmap(pGC->stipple) :
- cfb32CopyPixmap(pGC->stipple));
- if (nstipple) {
- if (depth == 8)
- cfbPadPixmap(nstipple);
- else
- cfb32PadPixmap(nstipple);
- (*pGC->pScreen->DestroyPixmap)(pGC->stipple);
- pGC->stipple = nstipple;
- }
- }
- }
- }
-
- /* If the drawable has changed, check its depth and ensure suitable
- * entries are in the proc vector.
- */
- if (drawableChanged)
- 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 (!CreatorCheckFill (pGC, pDrawable)) {
- switch (pGC->fillStyle) {
- case FillTiled:
- if (!pGC->tileIsPixel)
- {
- int width = pGC->tile.pixmap->drawable.width;
-
- if (pGC->depth == 8)
- width *= 8;
- else
- width *= 32;
-
- if ((width <= 32) && !(width & (width - 1))) {
- if (pGC->depth == 8)
- cfbCopyRotatePixmap(pGC->tile.pixmap,
- &pGC->pRotatedPixmap,
- xrot, yrot);
- else
- cfb32CopyRotatePixmap(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) {
- (*pGC->pScreen->DestroyPixmap)(pGC->pRotatedPixmap);
- pGC->pRotatedPixmap = (PixmapPtr) NULL;
- }
- }
-
- if (new_rrop) {
- int old_rrop;
-
- if (gcPriv->stipple) {
- if (pGC->fillStyle == FillStippled)
- gcPriv->stipple->alu = pGC->alu | FFB_ROP_EDIT_BIT;
- else
- gcPriv->stipple->alu = pGC->alu;
- if (pGC->fillStyle != FillTiled) {
- gcPriv->stipple->fg = pGC->fgPixel;
- gcPriv->stipple->bg = pGC->bgPixel;
- }
- }
-
- old_rrop = devPriv->rop;
- if (pGC->depth == 8)
- devPriv->rop = cfbReduceRasterOp (pGC->alu, pGC->fgPixel,
- pGC->planemask,
- &devPriv->and, &devPriv->xor);
- else
- devPriv->rop = cfb32ReduceRasterOp (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;
- int using_creator_ops = 0;
-
- if ((newops = CreatorMatchCommon (pGC, devPriv))) {
- if (pGC->ops->devPrivate.val)
- miDestroyGCOps (pGC->ops);
- pGC->ops = newops;
- new_rrop = new_line = new_fillspans = new_text = new_fillarea = 0;
- using_creator_ops = 1;
- } else {
- if (!pGC->ops->devPrivate.val) {
- pGC->ops = miCreateGCOps (pGC->ops);
- pGC->ops->devPrivate.val = 1;
- }
-
- /* We have to make sure the copyarea op always
- * points to our special routine as it maintains the
- * synchronization between the raster processor and direct
- * access to the frame buffer.
- */
- pGC->ops->CopyArea = CreatorCopyArea;
- }
- if (pGC->depth == 8)
- newops = cfbMatchCommon(pGC, devPriv);
- else
- newops = cfb32MatchCommon(pGC, devPriv);
-
- if (newops) {
- gcPriv->PolySegment = newops->PolySegment;
- gcPriv->Polylines = newops->Polylines;
-
- if (using_creator_ops) {
- /* Fixup line/segment backup ops. */
- if (pGC->ops->PolySegment == CreatorPolySegment)
- gcPriv->PolySegment = CreatorSegmentSSStub;
- if (pGC->ops->Polylines == CreatorPolylines)
- gcPriv->Polylines = CreatorLineSSStub;
- }
- }
- }
-
- accel = pGC->fillStyle == FillSolid || gcPriv->stipple;
-
- /* deal with the changes we've collected */
- if (new_line)
- CreatorNewLine(pGC, devPriv, gcPriv, accel);
-
- if (new_text && pGC->font)
- CreatorNewGlyph(pGC, gcPriv);
-
- if (new_fillspans)
- CreatorNewFillSpans(pGC, devPriv, gcPriv, accel);
-
- if (new_fillarea)
- CreatorNewFillArea(pGC, devPriv, gcPriv, accel);
-}
-
-GCFuncs CreatorGCFuncs = {
- CreatorValidateGC,
- miChangeGC,
- miCopyGC,
- CreatorDestroyGC,
- miChangeClip,
- miDestroyClip,
- miCopyClip
-};
-
-Bool
-CreatorCreateGC (GCPtr pGC)
-{
- CreatorPrivGCPtr gcPriv;
-
- if (pGC->depth == 1)
- return mfbCreateGC(pGC);
-
- if (pGC->depth == 8) {
- if (!cfbCreateGC(pGC))
- return FALSE;
- } else {
- if (!cfb32CreateGC(pGC))
- return FALSE;
- }
-
- if (pGC->depth == 8)
- pGC->ops = &CreatorNonTEOps8;
- else
- pGC->ops = &CreatorNonTEOps32;
-
- pGC->funcs = &CreatorGCFuncs;
- gcPriv = CreatorGetGCPrivate(pGC);
- gcPriv->type = DRAWABLE_WINDOW;
- gcPriv->linepat = 0;
- gcPriv->stipple = 0;
- gcPriv->PolySegment = CreatorSegmentSSStub;
- gcPriv->Polylines = CreatorLineSSStub;
-
- return TRUE;
-}