コード例 #1
0
/*ARGSUSED*/
void
MFBSOLIDFILLAREA(DrawablePtr pDraw, int nbox, BoxPtr pbox, int alu,
		 PixmapPtr nop)
{
    int nlwidth;	/* width in longwords of the drawable */
    int w;		/* width of current box */
    int h;	/* height of current box */
    PixelType *p;	/* pointer to bits we're writing */
    int nlw;	/* loop version of nlwMiddle */
    PixelType startmask;
    PixelType endmask;/* masks for reggedy bits at either end of line */
    int nlwExtra;	
		        /* to get from right of box to left of next span */
    int nlwMiddle;	/* number of longwords between sides of boxes */
    PixelType *pbits;	/* pointer to start of drawable */

    mfbGetPixelWidthAndPointer(pDraw, nlwidth, pbits);

    while (nbox--)
    {
	w = pbox->x2 - pbox->x1;
	h = pbox->y2 - pbox->y1;
	p = mfbScanline(pbits, pbox->x1, pbox->y1, nlwidth);

	if ( ((pbox->x1 & PIM) + w) < PPW)
	{
	    maskpartialbits(pbox->x1, w, startmask);
	    nlwExtra = nlwidth;
	    Duff(h, *p OPEQ startmask; mfbScanlineInc(p, nlwExtra));
	}
	else
	{
コード例 #2
0
ファイル: mfbfillarc.c プロジェクト: narenas/nx-libs
static void
mfbFillEllipseSolid(
    DrawablePtr pDraw,
    xArc *arc,
    register int rop)
{
    int x, y, e;
    int yk, xk, ym, xm, dx, dy, xorg, yorg;
    register int slw;
    miFillArcRec info;
    PixelType *addrlt, *addrlb;
    register PixelType *addrl;
    register int n;
    int nlwidth;
    register int xpos;
    PixelType startmask, endmask;
    int nlmiddle;

    mfbGetPixelWidthAndPointer(pDraw, nlwidth, addrlt);
    miFillArcSetup(arc, &info);
    MIFILLARCSETUP();
    xorg += pDraw->x;
    yorg += pDraw->y;
    addrlb = addrlt;
    addrlt += nlwidth * (yorg - y);
    addrlb += nlwidth * (yorg + y + dy);
    while (y)
    {
	addrlt += nlwidth;
	addrlb -= nlwidth;
	MIFILLARCSTEP(slw);
	if (!slw)
	    continue;
	xpos = xorg - x;
	addrl = mfbScanlineOffset(addrlt, (xpos >> PWSH));
	if (((xpos & PIM) + slw) < PPW)
	{
	    maskpartialbits(xpos, slw, startmask);
	    if (rop == RROP_BLACK)
		*addrl &= ~startmask;
	    else if (rop == RROP_WHITE)
		*addrl |= startmask;
	    else
		*addrl ^= startmask;
	    if (miFillArcLower(slw))
	    {
		addrl = mfbScanlineOffset(addrlb, (xpos >> PWSH));
		if (rop == RROP_BLACK)
		    *addrl &= ~startmask;
		else if (rop == RROP_WHITE)
		    *addrl |= startmask;
		else
		    *addrl ^= startmask;
	    }
	    continue;
	}
	maskbits(xpos, slw, startmask, endmask, nlmiddle);
	if (startmask)
	{
	    if (rop == RROP_BLACK)
		*addrl++ &= ~startmask;
	    else if (rop == RROP_WHITE)
		*addrl++ |= startmask;
	    else
		*addrl++ ^= startmask;
	}
	n = nlmiddle;
	if (rop == RROP_BLACK)
	    while (n--)
		*addrl++ = 0;
	else if (rop == RROP_WHITE)
	    while (n--)
		*addrl++ = ~0;
	else
	    while (n--)
		*addrl++ ^= ~0;
	if (endmask)
	{
	    if (rop == RROP_BLACK)
		*addrl &= ~endmask;
	    else if (rop == RROP_WHITE)
		*addrl |= endmask;
	    else
		*addrl ^= endmask;
	}
	if (!miFillArcLower(slw))
	    continue;
	addrl = mfbScanlineOffset(addrlb, (xpos >> PWSH));
	if (startmask)
	{
	    if (rop == RROP_BLACK)
		*addrl++ &= ~startmask;
	    else if (rop == RROP_WHITE)
		*addrl++ |= startmask;
	    else
		*addrl++ ^= startmask;
	}
	n = nlmiddle;
	if (rop == RROP_BLACK)
	    while (n--)
		*addrl++ = 0;
	else if (rop == RROP_WHITE)
	    while (n--)
		*addrl++ = ~0;
	else
	    while (n--)
		*addrl++ ^= ~0;
	if (endmask)
	{
	    if (rop == RROP_BLACK)
		*addrl &= ~endmask;
	    else if (rop == RROP_WHITE)
		*addrl |= endmask;
	    else
		*addrl ^= endmask;
	}
    }