📄 mfbfillsp.c
字号:
ppt = pptFree; n = miClipSpans(((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pCompositeClip, pptInit, pwidthInit, nInit, ppt, pwidth, fSorted); mfbGetPixelWidthAndPointer(pDrawable, nlwidth, addrlBase); pStipple = ((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pRotatedPixmap; tileHeight = pStipple->drawable.height; psrc = (PixelType *)(pStipple->devPrivate.ptr); while (n--) { addrl = mfbScanline(addrlBase, ppt->x, ppt->y, nlwidth); src = psrc[ppt->y % tileHeight]; /* all bits inside same longword */ if ( ((ppt->x & PIM) + *pwidth) < PPW) { maskpartialbits(ppt->x, *pwidth, startmask); *addrl |= (src & startmask); } else { maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); if (startmask) *addrl++ |= (src & startmask); Duff (nlmiddle, *addrl++ |= src); if (endmask) *addrl |= (src & endmask); } pwidth++; ppt++; } DEALLOCATE_LOCAL(pptFree); DEALLOCATE_LOCAL(pwidthFree);}void mfbBlackStippleFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted) DrawablePtr pDrawable; GC *pGC; int nInit; /* number of spans to fill */ DDXPointPtr pptInit; /* pointer to list of start points */ int *pwidthInit; /* pointer to list of n widths */ int fSorted;{ /* next three parameters are post-clip */ int n; /* number of spans to fill */ register DDXPointPtr ppt; /* pointer to list of start points */ register int *pwidth; /* pointer to list of n widths */ PixelType *addrlBase; /* pointer to start of bitmap */ int nlwidth; /* width in longwords of bitmap */ register PixelType *addrl; /* pointer to current longword in bitmap */ register PixelType src; register int nlmiddle; register PixelType startmask; register PixelType endmask; PixmapPtr pStipple; PixelType *psrc; int tileHeight; int *pwidthFree; /* copies of the pointers to free */ DDXPointPtr pptFree; if (!(pGC->planemask & 1)) return; n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pCompositeClip); pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int)); pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec)); if(!pptFree || !pwidthFree) { if (pptFree) DEALLOCATE_LOCAL(pptFree); if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree); return; } pwidth = pwidthFree; ppt = pptFree; n = miClipSpans(((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pCompositeClip, pptInit, pwidthInit, nInit, ppt, pwidth, fSorted); mfbGetPixelWidthAndPointer(pDrawable, nlwidth, addrlBase); pStipple = ((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pRotatedPixmap; tileHeight = pStipple->drawable.height; psrc = (PixelType *)(pStipple->devPrivate.ptr); while (n--) { addrl = mfbScanline(addrlBase, ppt->x, ppt->y, nlwidth); src = psrc[ppt->y % tileHeight]; /* all bits inside same longword */ if ( ((ppt->x & PIM) + *pwidth) < PPW) { maskpartialbits(ppt->x, *pwidth, startmask); *addrl &= ~(src & startmask); } else { maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); if (startmask) *addrl++ &= ~(src & startmask); Duff (nlmiddle, *addrl++ &= ~src); if (endmask) *addrl &= ~(src & endmask); } pwidth++; ppt++; } DEALLOCATE_LOCAL(pptFree); DEALLOCATE_LOCAL(pwidthFree);}void mfbInvertStippleFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted) DrawablePtr pDrawable; GC *pGC; int nInit; /* number of spans to fill */ DDXPointPtr pptInit; /* pointer to list of start points */ int *pwidthInit; /* pointer to list of n widths */ int fSorted;{ /* next three parameters are post-clip */ int n; /* number of spans to fill */ register DDXPointPtr ppt; /* pointer to list of start points */ register int *pwidth; /* pointer to list of n widths */ PixelType *addrlBase; /* pointer to start of bitmap */ int nlwidth; /* width in longwords of bitmap */ register PixelType *addrl; /* pointer to current longword in bitmap */ register PixelType src; register int nlmiddle; register PixelType startmask; register PixelType endmask; PixmapPtr pStipple; PixelType *psrc; int tileHeight; int *pwidthFree; /* copies of the pointers to free */ DDXPointPtr pptFree; if (!(pGC->planemask & 1)) return; n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pCompositeClip); pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int)); pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec)); if(!pptFree || !pwidthFree) { if (pptFree) DEALLOCATE_LOCAL(pptFree); if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree); return; } pwidth = pwidthFree; ppt = pptFree; n = miClipSpans(((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pCompositeClip, pptInit, pwidthInit, nInit, ppt, pwidth, fSorted); mfbGetPixelWidthAndPointer(pDrawable, nlwidth, addrlBase); pStipple = ((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pRotatedPixmap; tileHeight = pStipple->drawable.height; psrc = (PixelType *)(pStipple->devPrivate.ptr); while (n--) { addrl = mfbScanline(addrlBase, ppt->x, ppt->y, nlwidth); src = psrc[ppt->y % tileHeight]; /* all bits inside same longword */ if ( ((ppt->x & PIM) + *pwidth) < PPW) { maskpartialbits(ppt->x, *pwidth, startmask); *addrl ^= (src & startmask); } else { maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); if (startmask) *addrl++ ^= (src & startmask); Duff(nlmiddle, *addrl++ ^= src); if (endmask) *addrl ^= (src & endmask); } pwidth++; ppt++; } DEALLOCATE_LOCAL(pptFree); DEALLOCATE_LOCAL(pwidthFree);}/* this works with tiles of width == PPW */#define FILLSPANPPW(ROP) \ while (n--) \ { \ if (*pwidth) \ { \ addrl = mfbScanline(addrlBase, ppt->x, ppt->y, nlwidth); \ src = psrc[ppt->y % tileHeight]; \ if ( ((ppt->x & PIM) + *pwidth) < PPW) \ { \ maskpartialbits(ppt->x, *pwidth, startmask); \ *addrl = (*addrl & ~startmask) | \ (ROP(src, *addrl) & startmask); \ } \ else \ { \ maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); \ if (startmask) \ { \ *addrl = (*addrl & ~startmask) | \ (ROP(src, *addrl) & startmask); \ addrl++; \ } \ while (nlmiddle--) \ { \ *addrl = ROP(src, *addrl); \ addrl++; \ } \ if (endmask) \ *addrl = (*addrl & ~endmask) | \ (ROP(src, *addrl) & endmask); \ } \ } \ pwidth++; \ ppt++; \ }voidmfbTileFS(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted) DrawablePtr pDrawable; GC *pGC; int nInit; /* number of spans to fill */ DDXPointPtr pptInit; /* pointer to list of start points */ int *pwidthInit; /* pointer to list of n widths */ int fSorted;{ /* next three parameters are post-clip */ int n; /* number of spans to fill */ register DDXPointPtr ppt; /* pointer to list of start points */ register int *pwidth; /* pointer to list of n widths */ PixelType *addrlBase; /* pointer to start of bitmap */ int nlwidth; /* width in longwords of bitmap */ register PixelType *addrl; /* pointer to current longword in bitmap */ register PixelType src; register int nlmiddle; register PixelType startmask; register PixelType endmask; PixmapPtr pTile; PixelType *psrc; int tileHeight; int rop; int *pwidthFree; /* copies of the pointers to free */ DDXPointPtr pptFree; unsigned long flip; if (!(pGC->planemask & 1)) return; n = nInit * miFindMaxBand(((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pCompositeClip); pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int)); pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec)); if(!pptFree || !pwidthFree) { if (pptFree) DEALLOCATE_LOCAL(pptFree); if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree); return; } pwidth = pwidthFree; ppt = pptFree; n = miClipSpans(((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pCompositeClip, pptInit, pwidthInit, nInit, ppt, pwidth, fSorted); mfbGetPixelWidthAndPointer(pDrawable, nlwidth, addrlBase); pTile = ((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pRotatedPixmap; tileHeight = pTile->drawable.height; psrc = (PixelType *)(pTile->devPrivate.ptr); if (pGC->fillStyle == FillTiled) rop = pGC->alu; else rop = ((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->ropOpStip; flip = 0; switch(rop) { case GXcopyInverted: /* for opaque stipples */ flip = ~0; case GXcopy: {#define DoMaskCopyRop(src,dst,mask) ((dst) & ~(mask) | (src) & (mask)) while (n--) { if (*pwidth) { addrl = mfbScanline(addrlBase, ppt->x, ppt->y, nlwidth); src = psrc[ppt->y % tileHeight] ^ flip; if ( ((ppt->x & PIM) + *pwidth) < PPW) { maskpartialbits(ppt->x, *pwidth, startmask); *addrl = DoMaskCopyRop (src, *addrl, startmask); } else { maskbits(ppt->x, *pwidth, startmask, endmask, nlmiddle); if (startmask) { *addrl = DoMaskCopyRop (src, *addrl, startmask); addrl++; } while (nlmiddle--) { *addrl = src; addrl++; } if (endmask) *addrl = DoMaskCopyRop (src, *addrl, endmask); } } pwidth++; ppt++; } } break; default: { register DeclareMergeRop (); InitializeMergeRop(rop,~0); while (n--) { if (*pwidth)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -