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

📄 gd.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		for (w = wstart; w < wstart + wid; w++) {			gdImageSetPixel(im, x, w, color);		}		if (((y2 - y1) * ydirflag) > 0) {			while (x < xend) {				x++;				if (d < 0) {					d += incr1;				} else {					y++;					d += incr2;				}				wstart = y - wid / 2;				for (w = wstart; w < wstart + wid; w++) {					gdImageSetPixel (im, x, w, color);				}			}		} else {			while (x < xend) {				x++;				if (d < 0) {					d += incr1;				} else {					y--;					d += incr2;				}				wstart = y - wid / 2;				for (w = wstart; w < wstart + wid; w++) {					gdImageSetPixel (im, x, w, color);				}			}		}	} else {		/* More-or-less vertical. use wid for horizontal stroke */		/* 2.0.12: Michael Schwartz: divide rather than multiply; 		   TBB: but watch out for /0! */		double as = sin(atan2(dy, dx));		if (as != 0) {			if (!(wid = thick / as)) {				wid = 1;			}		} else {			wid = 1;		}		d = 2 * dx - dy;		incr1 = 2 * dx;		incr2 = 2 * (dx - dy);		if (y1 > y2) {			y = y2;			x = x2;			yend = y1;			xdirflag = (-1);		} else {			y = y1;			x = x1;			yend = y2;			xdirflag = 1;		}		/* Set up line thickness */		wstart = x - wid / 2;		for (w = wstart; w < wstart + wid; w++) {			gdImageSetPixel (im, w, y, color);		}		if (((x2 - x1) * xdirflag) > 0) {			while (y < yend) {				y++;				if (d < 0) {					d += incr1;				} else {					x++;					d += incr2;				}				wstart = x - wid / 2;				for (w = wstart; w < wstart + wid; w++) {					gdImageSetPixel (im, w, y, color);				}			}		} else {			while (y < yend) {				y++;				if (d < 0) {					d += incr1;				} else {					x--;					d += incr2;				}				wstart = x - wid / 2;				for (w = wstart; w < wstart + wid; w++) {					gdImageSetPixel (im, w, y, color);				}			}		}	}	/* If this is the only line we are drawing, go ahead and blend. */	if (color == gdAntiAliased && !im->AA_polygon) {		gdImageAABlend(im);	}}/* * Added on 2003/12 by Pierre-Alain Joye (pajoye@pearfr.org) * */#define BLEND_COLOR(a, nc, c, cc) \nc = (cc) + (((((c) - (cc)) * (a)) + ((((c) - (cc)) * (a)) >> 8) + 0x80) >> 8);inline static void gdImageSetAAPixelColor(gdImagePtr im, int x, int y, int color, int t){	int dr,dg,db,p,r,g,b;	dr = gdTrueColorGetRed(color);	dg = gdTrueColorGetGreen(color);	db = gdTrueColorGetBlue(color);	p = gdImageGetPixel(im,x,y);	r = gdTrueColorGetRed(p);	g = gdTrueColorGetGreen(p);	b = gdTrueColorGetBlue(p);	BLEND_COLOR(t, dr, r, dr);	BLEND_COLOR(t, dg, g, dg);	BLEND_COLOR(t, db, b, db);	im->tpixels[y][x]=gdTrueColorAlpha(dr, dg, db,  gdAlphaOpaque);}  /* * Added on 2003/12 by Pierre-Alain Joye (pajoye@pearfr.org) **/void gdImageAALine (gdImagePtr im, int x1, int y1, int x2, int y2, int col){	/* keep them as 32bits */	long x, y, inc;	long dx, dy,tmp;	if (y1 < 0 && y2 < 0) {		return;	}	if (y1 < 0) {		x1 += (y1 * (x1 - x2)) / (y2 - y1);		y1 = 0;	}	if (y2 < 0) {		x2 += (y2 * (x1 - x2)) / (y2 - y1);		y2 = 0;	}	/* bottom edge */	if (y1 >= im->sy && y2 >= im->sy) {		return;	}	if (y1 >= im->sy) {		x1 -= ((im->sy - y1) * (x1 - x2)) / (y2 - y1);		y1 = im->sy - 1;	}	if (y2 >= im->sy) {		x2 -= ((im->sy - y2) * (x1 - x2)) / (y2 - y1);		y2 = im->sy - 1;	}	/* left edge */	if (x1 < 0 && x2 < 0) {		return;	}	if (x1 < 0) {		y1 += (x1 * (y1 - y2)) / (x2 - x1);		x1 = 0;	}	if (x2 < 0) {		y2 += (x2 * (y1 - y2)) / (x2 - x1);		x2 = 0;	}	/* right edge */	if (x1 >= im->sx && x2 >= im->sx) {		return;	}	if (x1 >= im->sx) {		y1 -= ((im->sx - x1) * (y1 - y2)) / (x2 - x1);		x1 = im->sx - 1;	}	if (x2 >= im->sx) {		y2 -= ((im->sx - x2) * (y1 - y2)) / (x2 - x1);		x2 = im->sx - 1;	}	dx = x2 - x1;	dy = y2 - y1;	if (dx == 0 && dy == 0) {		return;	}	if (abs(dx) > abs(dy)) {		if (dx < 0) {			tmp = x1;			x1 = x2;			x2 = tmp;			tmp = y1;			y1 = y2;			y2 = tmp;			dx = x2 - x1;			dy = y2 - y1;		}		x = x1 << 16;		y = y1 << 16;		inc = (dy * 65536) / dx;		while ((x >> 16) < x2) {			gdImageSetAAPixelColor(im, x >> 16, y >> 16, col, (y >> 8) & 0xFF);			if ((y >> 16) + 1 < im->sy) {				gdImageSetAAPixelColor(im, x >> 16, (y >> 16) + 1,col, (~y >> 8) & 0xFF);			}			x += (1 << 16);			y += inc;		}	} else {		if (dy < 0) {			tmp = x1;			x1 = x2;			x2 = tmp;			tmp = y1;			y1 = y2;			y2 = tmp;			dx = x2 - x1;			dy = y2 - y1;		}		x = x1 << 16;		y = y1 << 16;		inc = (dx * 65536) / dy;		while ((y>>16) < y2) {			gdImageSetAAPixelColor(im, x >> 16, y >> 16, col, (x >> 8) & 0xFF);			if ((x >> 16) + 1 < im->sx) {				gdImageSetAAPixelColor(im, (x >> 16) + 1, (y >> 16),col, (~x >> 8) & 0xFF);			}			x += inc;			y += (1<<16);		}	}}static void dashedSet (gdImagePtr im, int x, int y, int color, int *onP, int *dashStepP, int wid, int vert);void gdImageDashedLine (gdImagePtr im, int x1, int y1, int x2, int y2, int color){	int dx, dy, incr1, incr2, d, x, y, xend, yend, xdirflag, ydirflag;	int dashStep = 0;	int on = 1;	int wid;	int vert;	int thick = im->thick;	dx = abs(x2 - x1);	dy = abs(y2 - y1);	if (dy <= dx) {		/* More-or-less horizontal. use wid for vertical stroke */		/* 2.0.12: Michael Schwartz: divide rather than multiply;		TBB: but watch out for /0! */		double as = sin(atan2(dy, dx));		if (as != 0) {			wid = thick / as;		} else {			wid = 1;		}		wid = (int)(thick * sin(atan2(dy, dx)));		vert = 1;		d = 2 * dy - dx;		incr1 = 2 * dy;		incr2 = 2 * (dy - dx);		if (x1 > x2) {			x = x2;			y = y2;			ydirflag = (-1);			xend = x1;		} else {			x = x1;			y = y1;			ydirflag = 1;			xend = x2;		}		dashedSet(im, x, y, color, &on, &dashStep, wid, vert);		if (((y2 - y1) * ydirflag) > 0) {			while (x < xend) {				x++;				if (d < 0) {					d += incr1;				} else {					y++;					d += incr2;				}				dashedSet(im, x, y, color, &on, &dashStep, wid, vert);			}		} else {			while (x < xend) {				x++;				if (d < 0) {					d += incr1;				} else {					y--;					d += incr2;				}				dashedSet(im, x, y, color, &on, &dashStep, wid, vert);			}		}	} else {		/* 2.0.12: Michael Schwartz: divide rather than multiply;		TBB: but watch out for /0! */		double as = sin (atan2 (dy, dx));		if (as != 0) {			wid = thick / as;		} else {			wid = 1;		}		vert = 0;		d = 2 * dx - dy;		incr1 = 2 * dx;		incr2 = 2 * (dx - dy);		if (y1 > y2) {			y = y2;			x = x2;			yend = y1;			xdirflag = (-1);		} else {			y = y1;			x = x1;			yend = y2;			xdirflag = 1;		}		dashedSet(im, x, y, color, &on, &dashStep, wid, vert);		if (((x2 - x1) * xdirflag) > 0) {			while (y < yend) {				y++;				if (d < 0) {					d += incr1;				} else {					x++;					d += incr2;				}				dashedSet(im, x, y, color, &on, &dashStep, wid, vert);			}		} else {			while (y < yend) {				y++;				if (d < 0) {					d += incr1;				} else {					x--;					d += incr2;				}				dashedSet(im, x, y, color, &on, &dashStep, wid, vert);			}		}	}}static void dashedSet (gdImagePtr im, int x, int y, int color, int *onP, int *dashStepP, int wid, int vert){	int dashStep = *dashStepP;	int on = *onP;	int w, wstart;	dashStep++;	if (dashStep == gdDashSize) {		dashStep = 0;		on = !on;	}	if (on) {		if (vert) {			wstart = y - wid / 2;			for (w = wstart; w < wstart + wid; w++) {				gdImageSetPixel(im, x, w, color);			}		} else {			wstart = x - wid / 2;			for (w = wstart; w < wstart + wid; w++) {				gdImageSetPixel(im, w, y, color);			}		}	}	*dashStepP = dashStep;	*onP = on;}void gdImageChar (gdImagePtr im, gdFontPtr f, int x, int y, int c, int color){	int cx, cy;	int px, py;	int fline;	cx = 0;	cy = 0;#ifdef CHARSET_EBCDIC	c = ASC (c);#endif /*CHARSET_EBCDIC */	if ((c < f->offset) || (c >= (f->offset + f->nchars))) {		return;	}	fline = (c - f->offset) * f->h * f->w;	for (py = y; (py < (y + f->h)); py++) {		for (px = x; (px < (x + f->w)); px++) {			if (f->data[fline + cy * f->w + cx]) {				gdImageSetPixel(im, px, py, color);			}			cx++;		}		cx = 0;		cy++;	}}void gdImageCharUp (gdImagePtr im, gdFontPtr f, int x, int y, int c, int color){	int cx, cy;	int px, py;	int fline;	cx = 0;	cy = 0;#ifdef CHARSET_EBCDIC	c = ASC (c);#endif /*CHARSET_EBCDIC */	if ((c < f->offset) || (c >= (f->offset + f->nchars))) {		return;	}	fline = (c - f->offset) * f->h * f->w;	for (py = y; py > (y - f->w); py--) {		for (px = x; px < (x + f->h); px++) {			if (f->data[fline + cy * f->w + cx]) {				gdImageSetPixel(im, px, py, color);			}			cy++;		}		cy = 0;		cx++;	}}void gdImageString (gdImagePtr im, gdFontPtr f, int x, int y, unsigned char *s, int color){	int i;	int l;	l = strlen ((char *) s);	for (i = 0; (i < l); i++) {		gdImageChar(im, f, x, y, s[i], color);		x += f->w;	}}void gdImageStringUp (gdImagePtr im, gdFontPtr f, int x, int y, unsigned char *s, int color){	int i;	int l;	l = strlen ((char *) s);	for (i = 0; (i < l); i++) {		gdImageCharUp(im, f, x, y, s[i], color);		y -= f->w;	}}static int strlen16 (unsigned short *s);void gdImageString16 (gdImagePtr im, gdFontPtr f, int x, int y, unsigned short *s, int color){	int i;	int l;	l = strlen16(s);	for (i = 0; (i < l); i++) {		gdImageChar(im, f, x, y, s[i], color);		x += f->w;	}}void gdImageStringUp16 (gdImagePtr im, gdFontPtr f, int x, int y, unsigned short *s, int color){	int i;	int l;	l = strlen16(s);	for (i = 0; i < l; i++) {		gdImageCharUp(im, f, x, y, s[i], color);		y -= f->w;	}}static int strlen16 (unsigned short *s){	int len = 0;	while (*s) {		s++;		len++;	}	return len;}#ifndef HAVE_LSQRT/* If you don't have a nice square root function for longs, you can use   ** this hack */long lsqrt (long n){ 	long result = (long) sqrt ((double) n);	return result;}#endif/* s and e are integers modulo 360 (degrees), with 0 degrees   being the rightmost extreme and degrees changing clockwise.   cx and cy are the center in pixels; w and h are the horizontal    and vertical diameter in pixels. Nice interface, but slow.   See gd_arc_f_buggy.c for a better version that doesn't    seem to be bug-free yet. */void gdImageArc (gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int color){	if ((s % 360) == (e % 360)) {		gdImageEllipse(im, cx, cy, w, h, color);	} else {		gdImageFilledArc(im, cx, cy, w, h, s, e, color, gdNoFill);	}}void gdImageFilledArc (gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int color, int style){	gdPoint pts[3];	int i;	int lx = 0, ly = 0;	int fx = 0, fy = 0;	if (s > 360) {		s = s % 360;	}	if (e > 360) {		e = e % 360;	}	while (s<0) {		s += 360;	}	while (e < s) {		e += 360;

⌨️ 快捷键说明

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