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

📄 miwideline.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 4 页
字号:
		   left, right, &nleft, &nright, &height);    miFillPolyHelper (pDrawable, pGC, pixel, spanData, y, height, left, right, nleft, nright);}static intmiLineArcI (GdkDrawable *pDraw, GdkGC *pGC, int xorg, int yorg, GdkSpan *points){    register GdkSpan* tpts, *bpts;    register int x, y, e, ex, slw;    tpts = points;    slw = GDK_GC_FBDATA(pGC)->values.line_width;    if (slw == 1)    {	tpts->x = xorg;	tpts->y = yorg;	tpts->width = 1;	return 1;    }    bpts = tpts + slw;    y = (slw >> 1) + 1;    if (slw & 1)	e = - ((y << 2) + 3);    else	e = - (y << 3);    ex = -4;    x = 0;    while (y)    {	e += (y << 3) - 4;	while (e >= 0)	{	    x++;	    e += (ex = -((x << 3) + 4));	}	y--;	slw = (x << 1) + 1;	if ((e == ex) && (slw > 1))	    slw--;	tpts->x = xorg - x;	tpts->y = yorg - y;	tpts->width = slw;	tpts++;	if ((y != 0) && ((slw > 1) || (e != ex)))	{	    bpts--;	    bpts->x = xorg - x;	    bpts->y = yorg + y;	    bpts->width = slw;	}    }    return (GDK_GC_FBDATA(pGC)->values.line_width);}#define CLIPSTEPEDGE(edgey,edge,edgeleft) \    if (ybase == edgey) \    { \	if (edgeleft) \	{ \	    if (edge->x > xcl) \		xcl = edge->x; \	} \	else \	{ \	    if (edge->x < xcr) \		xcr = edge->x; \	} \	edgey++; \	edge->x += edge->stepx; \	edge->e += edge->dx; \	if (edge->e > 0) \	{ \	    edge->x += edge->signdx; \	    edge->e -= edge->dy; \	} \    }static intmiLineArcD (GdkDrawable *pDraw, GdkGC *pGC, double xorg, double yorg, GdkSpan *points,	    PolyEdgePtr edge1, int edgey1, gboolean edgeleft1,            PolyEdgePtr edge2, int edgey2, gboolean edgeleft2){    register GdkSpan* pts;    double radius, x0, y0, el, er, yk, xlk, xrk, k;    int xbase, ybase, y, boty, xl, xr, xcl, xcr;    int ymin, ymax;    gboolean edge1IsMin, edge2IsMin;    int ymin1, ymin2;    pts = points;    xbase = floor(xorg);    x0 = xorg - xbase;    ybase = ICEIL (yorg);    y0 = yorg - ybase;    xlk = x0 + x0 + 1.0;    xrk = x0 + x0 - 1.0;    yk = y0 + y0 - 1.0;    radius = ((double)GDK_GC_FBDATA(pGC)->values.line_width) / 2.0;    y = floor(radius - y0 + 1.0);    ybase -= y;    ymin = ybase;    ymax = 65536;    edge1IsMin = FALSE;    ymin1 = edgey1;    if (edge1->dy >= 0)    {    	if (!edge1->dy)    	{	    if (edgeleft1)	    	edge1IsMin = TRUE;	    else	    	ymax = edgey1;	    edgey1 = 65536;    	}    	else    	{	    if ((edge1->signdx < 0) == edgeleft1)	    	edge1IsMin = TRUE;    	}    }    edge2IsMin = FALSE;    ymin2 = edgey2;    if (edge2->dy >= 0)    {    	if (!edge2->dy)    	{	    if (edgeleft2)	    	edge2IsMin = TRUE;	    else	    	ymax = edgey2;	    edgey2 = 65536;    	}    	else    	{	    if ((edge2->signdx < 0) == edgeleft2)	    	edge2IsMin = TRUE;    	}    }    if (edge1IsMin)    {	ymin = ymin1;	if (edge2IsMin && ymin1 > ymin2)	    ymin = ymin2;    } else if (edge2IsMin)	ymin = ymin2;    el = radius * radius - ((y + y0) * (y + y0)) - (x0 * x0);    er = el + xrk;    xl = 1;    xr = 0;    if (x0 < 0.5)    {	xl = 0;	el -= xlk;    }    boty = (y0 < -0.5) ? 1 : 0;    if (ybase + y - boty > ymax)	boty = ymax - ybase - y;    while (y > boty)    {	k = (y << 1) + yk;	er += k;	while (er > 0.0)	{	    xr++;	    er += xrk - (xr << 1);	}	el += k;	while (el >= 0.0)	{	    xl--;	    el += (xl << 1) - xlk;	}	y--;	ybase++;	if (ybase < ymin)	    continue;	xcl = xl + xbase;	xcr = xr + xbase;	CLIPSTEPEDGE(edgey1, edge1, edgeleft1);	CLIPSTEPEDGE(edgey2, edge2, edgeleft2);	if (xcr >= xcl)	{	    pts->x = xcl;	    pts->y = ybase;	    pts->width = xcr - xcl + 1;	    pts++;	}    }    er = xrk - (xr << 1) - er;    el = (xl << 1) - xlk - el;    boty = floor(-y0 - radius + 1.0);    if (ybase + y - boty > ymax)	boty = ymax - ybase - y;    while (y > boty)    {	k = (y << 1) + yk;	er -= k;	while ((er >= 0.0) && (xr >= 0))	{	    xr--;	    er += xrk - (xr << 1);	}	el -= k;	while ((el > 0.0) && (xl <= 0))	{	    xl++;	    el += (xl << 1) - xlk;	}	y--;	ybase++;	if (ybase < ymin)	    continue;	xcl = xl + xbase;	xcr = xr + xbase;	CLIPSTEPEDGE(edgey1, edge1, edgeleft1);	CLIPSTEPEDGE(edgey2, edge2, edgeleft2);	if (xcr >= xcl)	{	    pts->x = xcl;	    pts->y = ybase;	    pts->width = xcr - xcl + 1;	    pts++;	}    }    return (pts - points);}intmiRoundJoinFace (register LineFacePtr face, register PolyEdgePtr edge,                 gboolean *leftEdge){    int	    y;    int	    dx, dy;    double  xa, ya;    gboolean	left;    dx = -face->dy;    dy = face->dx;    xa = face->xa;    ya = face->ya;    left = 1;    if (ya > 0)    {	ya = 0.0;	xa = 0.0;    }    if (dy < 0 || (dy == 0 && dx > 0))    {	dx = -dx;	dy = -dy;	left = !left;    }    if (dx == 0 && dy == 0)	dy = 1;    if (dy == 0)    {	y = ICEIL (face->ya) + face->y;	edge->x = -32767;	edge->stepx = 0;	edge->signdx = 0;	edge->e = -1;	edge->dy = 0;	edge->dx = 0;	edge->height = 0;    }    else    {	y = miPolyBuildEdge (xa, ya, 0.0, dx, dy, face->x, face->y, !left, edge);	edge->height = 32767;    }    *leftEdge = !left;    return y;}voidmiRoundJoinClip (register LineFacePtr pLeft, register LineFacePtr pRight,                 PolyEdgePtr edge1, PolyEdgePtr edge2, int *y1, int *y2,                 gboolean *left1, gboolean *left2){    double	denom;    denom = - pLeft->dx * (double)pRight->dy + pRight->dx * (double)pLeft->dy;    if (denom >= 0)    {	pLeft->xa = -pLeft->xa;	pLeft->ya = -pLeft->ya;    }    else    {	pRight->xa = -pRight->xa;	pRight->ya = -pRight->ya;    }    *y1 = miRoundJoinFace (pLeft, edge1, left1);    *y2 = miRoundJoinFace (pRight, edge2, left2);}intmiRoundCapClip (register LineFacePtr face, gboolean isInt,                register PolyEdgePtr edge, gboolean *leftEdge){    int	    y;    register int dx, dy;    double  xa, ya, k;    gboolean	left;    dx = -face->dy;    dy = face->dx;    xa = face->xa;    ya = face->ya;    k = 0.0;    if (!isInt)	k = face->k;    left = 1;    if (dy < 0 || (dy == 0 && dx > 0))    {	dx = -dx;	dy = -dy;	xa = -xa;	ya = -ya;	left = !left;    }    if (dx == 0 && dy == 0)	dy = 1;    if (dy == 0)    {	y = ICEIL (face->ya) + face->y;	edge->x = -32767;	edge->stepx = 0;	edge->signdx = 0;	edge->e = -1;	edge->dy = 0;	edge->dx = 0;	edge->height = 0;    }    else    {	y = miPolyBuildEdge (xa, ya, k, dx, dy, face->x, face->y, !left, edge);	edge->height = 32767;    }    *leftEdge = !left;    return y;}static voidmiLineArc (GdkDrawable *pDraw, GdkGC *pGC, GdkColor *pixel,           SpanDataPtr spanData, register LineFacePtr leftFace,           register LineFacePtr rightFace, double xorg, double yorg,           gboolean isInt){    GdkSpan* points;    int xorgi = 0, yorgi = 0;    GdkColor		oldPixel;    Spans spanRec;    int n;    PolyEdgeRec	edge1, edge2;    int		edgey1, edgey2;    gboolean	edgeleft1, edgeleft2;    if (isInt)    {	xorgi = leftFace ? leftFace->x : rightFace->x;	yorgi = leftFace ? leftFace->y : rightFace->y;    }    edgey1 = 65536;    edgey2 = 65536;    edge1.x = 0; /* not used, keep memory checkers happy */    edge1.dy = -1;    edge2.x = 0; /* not used, keep memory checkers happy */    edge2.dy = -1;    edgeleft1 = FALSE;    edgeleft2 = FALSE;    if (((GDK_GC_FBDATA(pGC)->values.line_style != GDK_LINE_SOLID || GDK_GC_FBDATA(pGC)->values.line_width > 2) &&	 (GDK_GC_FBDATA(pGC)->values.cap_style == GDK_CAP_ROUND && GDK_GC_FBDATA(pGC)->values.join_style != GDK_JOIN_ROUND)) ||	(GDK_GC_FBDATA(pGC)->values.join_style == GDK_JOIN_ROUND && GDK_GC_FBDATA(pGC)->values.cap_style == GDK_CAP_BUTT))    {	if (isInt)	{	    xorg = (double) xorgi;	    yorg = (double) yorgi;	}	if (leftFace && rightFace)	{	    miRoundJoinClip (leftFace, rightFace, &edge1, &edge2,			     &edgey1, &edgey2, &edgeleft1, &edgeleft2);	}	else if (leftFace)	{	    edgey1 = miRoundCapClip (leftFace, isInt, &edge1, &edgeleft1);	}	else if (rightFace)	{	    edgey2 = miRoundCapClip (rightFace, isInt, &edge2, &edgeleft2);	}	isInt = FALSE;    }    if (!spanData)    {    	points = (GdkSpan*)ALLOCATE_LOCAL(sizeof(GdkSpan) * GDK_GC_FBDATA(pGC)->values.line_width);    	if (!points)	    return;    	oldPixel = GDK_GC_FBDATA(pGC)->values.foreground;    	if (pixel->pixel != oldPixel.pixel)    	{	  gdk_gc_set_foreground(pGC, pixel);    	}    }    else    {	points = (GdkSpan*) g_malloc (GDK_GC_FBDATA(pGC)->values.line_width * sizeof (GdkSpan));	if (!points)	    return;	spanRec.points = points;    }    if (isInt)	n = miLineArcI(pDraw, pGC, xorgi, yorgi, points);    else	n = miLineArcD(pDraw, pGC, xorg, yorg, points,		       &edge1, edgey1, edgeleft1,		       &edge2, edgey2, edgeleft2);    if (!spanData)    {      gdk_fb_fill_spans(pDraw, pGC, points, n, TRUE);      DEALLOCATE_LOCAL(points);      if (pixel->pixel != oldPixel.pixel)    	{	  gdk_gc_set_foreground(pGC, &oldPixel);    	}    }    else    {	spanRec.count = n;	AppendSpanGroup (pGC, pixel, &spanRec, spanData)    }}voidmiLineProjectingCap (GdkDrawable *pDrawable, register GdkGC *pGC, GdkColor *pixel,                     SpanDataPtr spanData, register LineFacePtr face,                     gboolean isLeft, double xorg, double yorg, gboolean isInt){    int	xorgi = 0, yorgi = 0;    int	lw;    PolyEdgeRec	lefts[2], rights[2];    int		lefty, righty, topy, bottomy;    PolyEdgePtr left, right;    PolyEdgePtr	top, bottom;    double	xa,ya;    double	k;    double	xap, yap;    int		dx, dy;    double	projectXoff, projectYoff;    double	maxy;    int		finaly;        if (isInt)    {	xorgi = face->x;	yorgi = face->y;    }    lw = GDK_GC_FBDATA(pGC)->values.line_width;    dx = face->dx;    dy = face->dy;    k = face->k;    if (dy == 0)    {	lefts[0].height = lw;	lefts[0].x = xorgi;	if (isLeft)	    lefts[0].x -= (lw >> 1);	lefts[0].stepx = 0;	lefts[0].signdx = 1;	lefts[0].e = -lw;	lefts[0].dx = 0;	lefts[0].dy = lw;	rights[0].height = lw;	rights[0].x = xorgi;	if (!isLeft)	    rights[0].x += ((lw + 1) >> 1);	rights[0].stepx = 0;	rights[0].signdx = 1;	rights[0].e = -lw;	rights[0].dx = 0;	rights[0].dy = lw;	miFillPolyHelper (pDrawable, pGC, pixel, spanData, yorgi - (lw >> 1), lw,			  lefts, rights, 1, 1);    }    else if (dx == 0)    {	topy = yorgi;	bottomy = yorgi + dy;	if (isLeft)	    topy -= (lw >> 1);	else	    bottomy += (lw >> 1);	lefts[0].height = bottomy - topy;	lefts[0].x = xorgi - (lw >> 1);	lefts[0].stepx = 0;	lefts[0].signdx = 1;	lefts[0].e = -dy;	lefts[0].dx = dx;	lefts[0].dy = dy;	rights[0].height = bottomy - topy;	rights[0].x = lefts[0].x + (lw-1);	rights[0].stepx = 0;	rights[0].signdx = 1;

⌨️ 快捷键说明

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