Beispiel #1
0
static void
RROP_NAME(cfbZeroArcSS8)(
    DrawablePtr pDraw,
    GCPtr pGC,
    xArc *arc)
{
    miZeroArcRec info;
    Bool do360;
    register int x;
    PixelType *addrp;
    register PixelType *yorgp, *yorgop;
#if PSZ == 24
    int xorg, xorg3, xorgo, xorgo3;
    register int xtmp;
#endif
    RROP_DECLARE
    register int yoffset;
    int npwidth, dyoffset;
    register int y, a, b, d, mask;
    register int k1, k3, dx, dy;

    cfbGetPixelWidthAndPointer(pDraw,npwidth, addrp)

    RROP_FETCH_GC (pGC);
    do360 = miZeroArcSetup(arc, &info, TRUE);
    yorgp = addrp + ((info.yorg + pDraw->y) * npwidth);
    yorgop = addrp + ((info.yorgo + pDraw->y) * npwidth);
    info.xorg += pDraw->x;
    info.xorgo += pDraw->x;
#if PSZ == 24
    xorg = info.xorg;
    xorg3 = xorg * 3;
    info.xorg = (info.xorg * 3) >> 2;
    xorgo = info.xorgo;
    xorgo3 = xorgo * 3; 
    info.xorgo = (info.xorgo * 3) >> 2;
#endif
    MIARCSETUP();
    yoffset = y ? npwidth : 0;
    dyoffset = 0;
    mask = info.initialMask;
    if (!(arc->width & 1))
    {
#if PSZ == 24
	if (mask & 2)
	    RROP_SOLID24((yorgp + info.xorgo), xorgo);
	if (mask & 8)
	    RROP_SOLID24((yorgop + info.xorgo), xorgo);
#else
	if (mask & 2)
	    RROP_SOLID((yorgp + info.xorgo));
	if (mask & 8)
	    RROP_SOLID((yorgop + info.xorgo));
#endif /* PSZ == 24 */
    }
    if (!info.end.x || !info.end.y)
    {
	mask = info.end.mask;
	info.end = info.altend;
    }
    if (do360 && (arc->width == arc->height) && !(arc->width & 1))
    {
	register int xoffset = npwidth;
#if PSZ == 24
	PixelType *yorghb = yorgp + (info.h * npwidth);
	register int tmp1, tmp2, tmp1_3, tmp2_3;

	tmp1 = xorg + info.h;
	tmp1_3 = tmp1 * 3;
	tmp2 = xorg - info.h;
	tmp2_3 = tmp2 * 3;
	while (1)
	{
	    xtmp = (xorg3 + x * 3) >> 2;
	    RROP_SOLID24(yorgp + yoffset + xtmp, xorg + x);
	    RROP_SOLID24(yorgop - yoffset + xtmp, xorg + x);
	    xtmp = (xorg3 - x * 3) >> 2;
	    RROP_SOLID24(yorgp + yoffset + xtmp, xorg - x);
	    RROP_SOLID24(yorgop - yoffset + xtmp, xorg - x);
	    if (a < 0)
		break;
	    xtmp = (tmp1_3 - y * 3) >> 2;
	    RROP_SOLID24(yorghb - xoffset + xtmp, tmp1 - y);
	    RROP_SOLID24(yorghb + xoffset + xtmp, tmp1 - y);
	    xtmp = (tmp2_3 + y * 3) >> 2;
	    RROP_SOLID24(yorghb - xoffset + xtmp, tmp2 + y);
	    RROP_SOLID24(yorghb + xoffset + xtmp, tmp2 + y);
	    xoffset += npwidth;
	    MIARCCIRCLESTEP(yoffset += npwidth;);
	}
#else
	PixelType *yorghb = yorgp + (info.h * npwidth) + info.xorg;
	PixelType *yorgohb = yorghb - info.h;

	yorgp += info.xorg;
	yorgop += info.xorg;
	yorghb += info.h;
	while (1)
	{
	    RROP_SOLID(yorgp + yoffset + x);
	    RROP_SOLID(yorgp + yoffset - x);
	    RROP_SOLID(yorgop - yoffset - x);
	    RROP_SOLID(yorgop - yoffset + x);
	    if (a < 0)
		break;
	    RROP_SOLID(yorghb - xoffset - y);
	    RROP_SOLID(yorgohb - xoffset + y);
	    RROP_SOLID(yorgohb + xoffset + y);
	    RROP_SOLID(yorghb + xoffset - y);
	    xoffset += npwidth;
	    MIARCCIRCLESTEP(yoffset += npwidth;);
	}
Beispiel #2
0
static void
mfbZeroArcSS(
    DrawablePtr pDraw,
    GCPtr pGC,
    xArc *arc)
{
    miZeroArcRec info;
    Bool do360;
    register int x, y, a, b, d, mask;
    register int k1, k3, dx, dy;
    PixelType *addrl;
    PixelType *yorgl, *yorgol;
    PixelType pixel;
    int nlwidth, yoffset, dyoffset;
    PixelType pmask;
    register PixelType *paddr;

    if (((mfbPrivGC *)(pGC->devPrivates[mfbGCPrivateIndex].ptr))->rop ==
	RROP_BLACK)
	pixel = 0;
    else
	pixel = ~0;

    mfbGetPixelWidthAndPointer(pDraw, nlwidth, addrl);
    do360 = miZeroArcSetup(arc, &info, TRUE);
    yorgl = addrl + ((info.yorg + pDraw->y) * nlwidth);
    yorgol = addrl + ((info.yorgo + pDraw->y) * nlwidth);
    info.xorg += pDraw->x;
    info.xorgo += pDraw->x;
    MIARCSETUP();
    yoffset = y ? nlwidth : 0;
    dyoffset = 0;
    mask = info.initialMask;
    if (!(arc->width & 1))
    {
	DoPix(2, yorgl, 0, info.xorgo);
	DoPix(8, yorgol, 0, info.xorgo);
    }
    if (!info.end.x || !info.end.y)
    {
	mask = info.end.mask;
	info.end = info.altend;
    }
    if (do360 && (arc->width == arc->height) && !(arc->width & 1))
    {
	int xoffset = nlwidth;
	PixelType *yorghl = mfbScanlineDeltaNoBankSwitch(yorgl, info.h, nlwidth);
	int xorghp = info.xorg + info.h;
	int xorghn = info.xorg - info.h;

	if (pixel)
	{
	    while (1)
	    {
		PixelateWhite(yorgl, yoffset, info.xorg + x);
		PixelateWhite(yorgl, yoffset, info.xorg - x);
		PixelateWhite(yorgol, -yoffset, info.xorg - x);
		PixelateWhite(yorgol, -yoffset, info.xorg + x);
		if (a < 0)
		    break;
		PixelateWhite(yorghl, -xoffset, xorghp - y);
		PixelateWhite(yorghl, -xoffset, xorghn + y);
		PixelateWhite(yorghl, xoffset, xorghn + y);
		PixelateWhite(yorghl, xoffset, xorghp - y);
		xoffset += nlwidth;
		MIARCCIRCLESTEP(yoffset += nlwidth;);
	    }
	}