📄 cfbgc.c
字号:
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: if (pGC->stipple) { int width = pGC->stipple->drawable.width; PixmapPtr nstipple; if ((width <= PGSZ) && !(width & (width - 1)) && (nstipple = cfbCopyPixmap(pGC->stipple))) { cfbPadPixmap(nstipple); (*pGC->pScreen->DestroyPixmap)(pGC->stipple); pGC->stipple = nstipple; } } 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, 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; switch (pGC->fillStyle) { case FillTiled: if (!pGC->tileIsPixel) { int width = pGC->tile.pixmap->drawable.width * PSZ; if ((width <= PGSZ) && !(width & (width - 1))) { cfbCopyRotatePixmap(pGC->tile.pixmap, &devPriv->pRotatedPixmap, xrot, yrot); new_pix = TRUE; } } break;#ifdef FOUR_BIT_CODE case FillStippled: case FillOpaqueStippled: { int width = pGC->stipple->drawable.width; if ((width <= PGSZ) && !(width & (width - 1))) { mfbCopyRotatePixmap(pGC->stipple, &devPriv->pRotatedPixmap, xrot, yrot); new_pix = TRUE; } } break;#endif } if (!new_pix && devPriv->pRotatedPixmap) { (*pGC->pScreen->DestroyPixmap)(devPriv->pRotatedPixmap); devPriv->pRotatedPixmap = (PixmapPtr) NULL; } } 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 (new_rrop || new_fillspans || new_text || new_fillarea || new_line) { GCOps *newops; if (newops = cfbMatchCommon (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: if (devPriv->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:#ifdef FOUR_BIT_CODE if (devPriv->pRotatedPixmap) pGC->ops->FillSpans = cfb8Stipple32FS; else#endif pGC->ops->FillSpans = cfbUnnaturalStippleFS; break; case FillOpaqueStippled:#ifdef FOUR_BIT_CODE if (devPriv->pRotatedPixmap) pGC->ops->FillSpans = cfb8OpaqueStipple32FS; else#endif 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; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -