⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mizerline.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 2 页
字号:
		utmp = xmin - x1_orig;		if (utmp <= 32767)		/* clip based on near endpt */		{		    if (xmajor)			eqn = (swapped) ? EQN2 : EQN1;		    else			eqn = (swapped) ? EQN4 : EQN3;		    anchorval = y1_orig;		}		else				/* clip based on far endpt */		{		    utmp = x2_orig - xmin;		    if (xmajor)			eqn = (swapped) ? EQN1B : EQN2B;		    else			eqn = (swapped) ? EQN3B : EQN4B;		    anchorval = y2_orig;		    negslope = !negslope;		}		x1 = xmin;	    }	    else if (oc1 & OUT_ABOVE)	    {		negslope = IsXDecreasingOctant(octant);		utmp = ymin - y1_orig;		if (utmp <= 32767)		/* clip based on near endpt */		{		    if (xmajor)			eqn = (swapped) ? EQN6 : EQN5;		    else			eqn = (swapped) ? EQN8 : EQN7;		    anchorval = x1_orig;		}		else				/* clip based on far endpt */		{		    utmp = y2_orig - ymin;		    if (xmajor)			eqn = (swapped) ? EQN5B : EQN6B;		    else			eqn = (swapped) ? EQN7B : EQN8B;		    anchorval = x2_orig;		    negslope = !negslope;		}		y1 = ymin;	    }	    else if (oc1 & OUT_RIGHT)	    {		negslope = IsYDecreasingOctant(octant);		utmp = x1_orig - xmax;		if (utmp <= 32767)		/* clip based on near endpt */		{		    if (xmajor)			eqn = (swapped) ? EQN2 : EQN1;		    else			eqn = (swapped) ? EQN4 : EQN3;		    anchorval = y1_orig;		}		else				/* clip based on far endpt */		{		    /*		     * Technically since the equations can handle		     * utmp == 32768, this overflow code isn't		     * needed since X11 protocol can't generate		     * a line which goes more than 32768 pixels		     * to the right of a clip rectangle.		     */		    utmp = xmax - x2_orig;		    if (xmajor)			eqn = (swapped) ? EQN1B : EQN2B;		    else			eqn = (swapped) ? EQN3B : EQN4B;		    anchorval = y2_orig;		    negslope = !negslope;		}		x1 = xmax;	    }	    else if (oc1 & OUT_BELOW)	    {		negslope = IsXDecreasingOctant(octant);		utmp = y1_orig - ymax;		if (utmp <= 32767)		/* clip based on near endpt */		{		    if (xmajor)			eqn = (swapped) ? EQN6 : EQN5;		    else			eqn = (swapped) ? EQN8 : EQN7;		    anchorval = x1_orig;		}		else				/* clip based on far endpt */		{		    /*		     * Technically since the equations can handle		     * utmp == 32768, this overflow code isn't		     * needed since X11 protocol can't generate		     * a line which goes more than 32768 pixels		     * below the bottom of a clip rectangle.		     */		    utmp = ymax - y2_orig;		    if (xmajor)			eqn = (swapped) ? EQN5B : EQN6B;		    else			eqn = (swapped) ? EQN7B : EQN8B;		    anchorval = x2_orig;		    negslope = !negslope;		}		y1 = ymax;	    }	    if (swapped)		negslope = !negslope;	    utmp <<= 1;			/* utmp = 2N or 2M */	    if (eqn & T_2NDX)		utmp = (utmp * adx);	    else /* (eqn & T_2MDY) */		utmp = (utmp * ady);	    if (eqn & T_DXNOTY)		if (eqn & T_SUBDXORY)		    utmp -= adx;		else		    utmp += adx;	    else /* (eqn & T_DYNOTX) */		if (eqn & T_SUBDXORY)		    utmp -= ady;		else		    utmp += ady;	    if (eqn & T_BIASSUBONE)		utmp += bias - 1;	    else /* (eqn & T_SUBBIAS) */		utmp -= bias;	    if (eqn & T_DIV2DX)		utmp /= (adx << 1);	    else /* (eqn & T_DIV2DY) */		utmp /= (ady << 1);	    if (eqn & T_ADDONE)		utmp++;	    if (negslope)		utmp = -utmp;	    if (eqn & T_2NDX)	/* We are calculating X steps */		x1 = anchorval + utmp;	    else		/* else, Y steps */		y1 = anchorval + utmp;	    oc1 = 0;	    MIOUTCODES(oc1, x1, y1, xmin, ymin, xmax, ymax);        }    }    *new_x1 = x1;    *new_y1 = y1;    *new_x2 = x2;    *new_y2 = y2;        *pt1_clipped = clip1;    *pt2_clipped = clip2;    return clipDone;}/* Draw lineSolid, fillStyle-independent zero width lines. * * Must keep X and Y coordinates in "ints" at least until after they're * translated and clipped to accomodate CoordModePrevious lines with very * large coordinates. * * Draws the same pixels regardless of sign(dx) or sign(dy). * * Ken Whaley * *//* largest positive value that can fit into a component of a point. * Assumes that the point structure is {type x, y;} where type is * a signed type. */#define MAX_COORDINATE ((1 << (((sizeof(DDXPointRec) >> 1) << 3) - 1)) - 1)#define MI_OUTPUT_POINT(xx, yy)\{\    if ( !new_span && yy == current_y)\    {\        if (xx < spans->x)\	    spans->x = xx;\	++*widths;\    }\    else\    {\        ++Nspans;\	++spans;\	++widths;\	spans->x = xx;\	spans->y = yy;\	*widths = 1;\	current_y = yy;\        new_span = FALSE;\    }\}voidmiZeroLine(pDraw, pGC, mode, npt, pptInit)    DrawablePtr pDraw;    GCPtr	pGC;    int		mode;		/* Origin or Previous */    int		npt;		/* number of points */    DDXPointPtr pptInit;{    int Nspans, current_y;    DDXPointPtr ppt;     DDXPointPtr pspanInit, spans;    int *pwidthInit, *widths, list_len;    int xleft, ytop, xright, ybottom;    int new_x1, new_y1, new_x2, new_y2;    int x, y, x1, y1, x2, y2, xstart, ystart;    int oc1, oc2;    int result;    int pt1_clipped, pt2_clipped = 0;    Bool new_span;    int signdx, signdy;    int clipdx, clipdy;    int width, height;    int adx, ady;    int octant;    unsigned int bias = miGetZeroLineBias(pDraw->pScreen);    int e, e1, e2, e3;	/* Bresenham error terms */    int length;		/* length of lines == # of pixels on major axis */    xleft   = pDraw->x;    ytop    = pDraw->y;    xright  = pDraw->x + pDraw->width - 1;    ybottom = pDraw->y + pDraw->height - 1;    if (!pGC->miTranslate)    {	/* do everything in drawable-relative coordinates */	xleft    = 0;	ytop     = 0;	xright  -= pDraw->x;	ybottom -= pDraw->y;    }    /* it doesn't matter whether we're in drawable or screen coordinates,     * FillSpans simply cannot take starting coordinates outside of the     * range of a DDXPointRec component.     */    if (xright > MAX_COORDINATE)	xright = MAX_COORDINATE;    if (ybottom > MAX_COORDINATE)	ybottom = MAX_COORDINATE;    /* since we're clipping to the drawable's boundaries & coordinate     * space boundaries, we're guaranteed that the larger of width/height     * is the longest span we'll need to output     */    width = xright - xleft + 1;    height = ybottom - ytop + 1;    list_len = (height >= width) ? height : width;    pspanInit = (DDXPointPtr)ALLOCATE_LOCAL(list_len * sizeof(DDXPointRec));    pwidthInit = (int *)ALLOCATE_LOCAL(list_len * sizeof(int));    if (!pspanInit || !pwidthInit)	return;    Nspans = 0;    new_span = TRUE;    spans  = pspanInit - 1;    widths = pwidthInit - 1;    ppt = pptInit;    xstart = ppt->x;    ystart = ppt->y;    if (pGC->miTranslate)    {	xstart += pDraw->x;	ystart += pDraw->y;    }        /* x2, y2, oc2 copied to x1, y1, oc1 at top of loop to simplify     * iteration logic     */    x2 = xstart;    y2 = ystart;    oc2 = 0;    MIOUTCODES(oc2, x2, y2, xleft, ytop, xright, ybottom);    while (--npt > 0)    {	if (Nspans > 0)	    (*pGC->ops->FillSpans)(pDraw, pGC, Nspans, pspanInit,				   pwidthInit, FALSE);	Nspans = 0;	new_span = TRUE;	spans  = pspanInit - 1;	widths = pwidthInit - 1;	x1  = x2;	y1  = y2;	oc1 = oc2;	++ppt;	x2 = ppt->x;	y2 = ppt->y;	if (pGC->miTranslate && (mode != CoordModePrevious))	{	    x2 += pDraw->x;	    y2 += pDraw->y;	}	else if (mode == CoordModePrevious)	{	    x2 += x1;	    y2 += y1;	}	oc2 = 0;	MIOUTCODES(oc2, x2, y2, xleft, ytop, xright, ybottom);	CalcLineDeltas(x1, y1, x2, y2, adx, ady, signdx, signdy, 1, 1, octant);	if (adx > ady)	{	    e1 = ady << 1;	    e2 = e1 - (adx << 1);	    e  = e1 - adx;	    length  = adx;	/* don't draw endpoint in main loop */	    FIXUP_ERROR(e, octant, bias);	    new_x1 = x1;	    new_y1 = y1;	    new_x2 = x2;	    new_y2 = y2;	    pt1_clipped = 0;	    pt2_clipped = 0;	    if ((oc1 | oc2) != 0)	    {		result = miZeroClipLine(xleft, ytop, xright, ybottom,					&new_x1, &new_y1, &new_x2, &new_y2,					adx, ady,					&pt1_clipped, &pt2_clipped,					octant, bias, oc1, oc2);		if (result == -1)		    continue;		length = abs(new_x2 - new_x1);		/* if we've clipped the endpoint, always draw the full length		 * of the segment, because then the capstyle doesn't matter 		 */		if (pt2_clipped)		    length++;		if (pt1_clipped)		{		    /* must calculate new error terms */		    clipdx = abs(new_x1 - x1);		    clipdy = abs(new_y1 - y1);		    e += (clipdy * e2) + ((clipdx - clipdy) * e1);		}	    }	    /* draw the segment */	    x = new_x1;	    y = new_y1;	    	    e3 = e2 - e1;	    e  = e - e1;	    while (length--)	    {		MI_OUTPUT_POINT(x, y);		e += e1;		if (e >= 0)		{		    y += signdy;		    e += e3;		}		x += signdx;	    }	}	else    /* Y major line */	{	    e1 = adx << 1;	    e2 = e1 - (ady << 1);	    e  = e1 - ady;	    length  = ady;	/* don't draw endpoint in main loop */	    SetYMajorOctant(octant);	    FIXUP_ERROR(e, octant, bias);	    new_x1 = x1;	    new_y1 = y1;	    new_x2 = x2;	    new_y2 = y2;	    pt1_clipped = 0;	    pt2_clipped = 0;	    if ((oc1 | oc2) != 0)	    {		result = miZeroClipLine(xleft, ytop, xright, ybottom,					&new_x1, &new_y1, &new_x2, &new_y2,					adx, ady,					&pt1_clipped, &pt2_clipped,					octant, bias, oc1, oc2);		if (result == -1)		    continue;		length = abs(new_y2 - new_y1);		/* if we've clipped the endpoint, always draw the full length		 * of the segment, because then the capstyle doesn't matter 		 */		if (pt2_clipped)		    length++;		if (pt1_clipped)		{		    /* must calculate new error terms */		    clipdx = abs(new_x1 - x1);		    clipdy = abs(new_y1 - y1);		    e += (clipdx * e2) + ((clipdy - clipdx) * e1);		}	    }	    /* draw the segment */	    x = new_x1;	    y = new_y1;	    e3 = e2 - e1;	    e  = e - e1;	    while (length--)	    {		MI_OUTPUT_POINT(x, y);		e += e1;		if (e >= 0)		{		    x += signdx;		    e += e3;		}		y += signdy;	    }	}    }    /* only do the capnotlast check on the last segment     * and only if the endpoint wasn't clipped.  And then, if the last     * point is the same as the first point, do not draw it, unless the     * line is degenerate     */    if ( (! pt2_clipped) && (pGC->capStyle != CapNotLast) &&		(((xstart != x2) || (ystart != y2)) || (ppt == pptInit + 1)))    {	MI_OUTPUT_POINT(x, y);    }        if (Nspans > 0)	(*pGC->ops->FillSpans)(pDraw, pGC, Nspans, pspanInit,			       pwidthInit, FALSE);    DEALLOCATE_LOCAL(pwidthInit);    DEALLOCATE_LOCAL(pspanInit);}voidmiZeroDashLine(dst, pgc, mode, nptInit, pptInit)DrawablePtr dst;GCPtr pgc;int mode;int nptInit;		/* number of points in polyline */DDXPointRec *pptInit;	/* points in the polyline */{    /* XXX kludge until real zero-width dash code is written */    pgc->lineWidth = 1;    miWideDash (dst, pgc, mode, nptInit, pptInit);    pgc->lineWidth = 0;}

⌨️ 快捷键说明

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