?? gd.c
字號:
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 + -