mfbfillsp.c

来自「早期freebsd实现」· C语言 代码 · 共 1,080 行 · 第 1/3 页

C
1,080
字号
    while (n--)    {        addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);	src = psrc[ppt->y % tileHeight];        /* all bits inside same longword */        if ( ((ppt->x & 0x1f) + *pwidth) < 32)        {	    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 */    int *addrlBase;		/* pointer to start of bitmap */    int nlwidth;		/* width in longwords of bitmap */    register int *addrl;	/* pointer to current longword in bitmap */    register int src;    register int nlmiddle;    register int startmask;    register int endmask;    PixmapPtr pStipple;    int *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);    if (pDrawable->type == DRAWABLE_WINDOW)    {	addrlBase = (int *) getPrivScreenPtr(pDrawable->pScreen)->bits;	nlwidth = (int) getPrivScreenPtr(pDrawable->pScreen)->stride >> 2;    }    else    {	addrlBase = (int *) getPrivPixmapPtr(pDrawable)->bits;	nlwidth = (int) getPrivPixmapPtr(pDrawable)->stride >> 2;    }    pStipple = ((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pRotatedPixmap;    tileHeight = pStipple->drawable.height;    psrc = (int *)(((hpPrivPixmapPtr)(pStipple->devPrivate.ptr))->bits);    while (n--)    {        addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);	src = psrc[ppt->y % tileHeight];        /* all bits inside same longword */        if ( ((ppt->x & 0x1f) + *pwidth) < 32)        {	    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 */    int *addrlBase;		/* pointer to start of bitmap */    int nlwidth;		/* width in longwords of bitmap */    register int *addrl;	/* pointer to current longword in bitmap */    register int src;    register int nlmiddle;    register int startmask;    register int endmask;    PixmapPtr pStipple;    int *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);    if (pDrawable->type == DRAWABLE_WINDOW)    {	addrlBase = (int *) getPrivScreenPtr(pDrawable->pScreen)->bits;	nlwidth = (int) getPrivScreenPtr(pDrawable->pScreen)->stride >> 2;    }    else    {	addrlBase = (int *) getPrivPixmapPtr(pDrawable)->bits;	nlwidth = (int) getPrivPixmapPtr(pDrawable)->stride >> 2;    }    pStipple = ((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pRotatedPixmap;    tileHeight = pStipple->drawable.height;    psrc = (int *)(((hpPrivPixmapPtr)(pStipple->devPrivate.ptr))->bits);    while (n--)    {        addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);	src = psrc[ppt->y % tileHeight];        /* all bits inside same longword */        if ( ((ppt->x & 0x1f) + *pwidth) < 32)        {	    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 == 32 */#define FILLSPAN32(ROP) \    while (n--) \    { \	if (*pwidth) \	{ \            addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5); \	    src = psrc[ppt->y % tileHeight]; \            if ( ((ppt->x & 0x1f) + *pwidth) < 32) \            { \	        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++; \    }void mfbTileFS(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 */    int *addrlBase;		/* pointer to start of bitmap */    int nlwidth;		/* width in longwords of bitmap */    register int *addrl;	/* pointer to current longword in bitmap */    register int src;    register int nlmiddle;    register int startmask;    register int endmask;    PixmapPtr pTile;    int *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);    if (pDrawable->type == DRAWABLE_WINDOW)    {	addrlBase = (int *) getPrivScreenPtr(pDrawable->pScreen)->bits;	nlwidth = (int) getPrivScreenPtr(pDrawable->pScreen)->stride >> 2;    }    else    {	addrlBase = (int *) getPrivPixmapPtr(pDrawable)->bits;	nlwidth = (int) getPrivPixmapPtr(pDrawable)->stride >> 2;    }    pTile = ((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->pRotatedPixmap;    tileHeight = pTile->drawable.height;    psrc = (int *)(((hpPrivPixmapPtr)(pTile->devPrivate.ptr))->bits);    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 = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);	    	    src = psrc[ppt->y % tileHeight] ^ flip;            	    if ( ((ppt->x & 0x1f) + *pwidth) < 32)            	    {	            	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)	    	{            	    addrl = addrlBase + (ppt->y * nlwidth) + (ppt->x >> 5);	    	    src = psrc[ppt->y % tileHeight];

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?