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

📄 gd.c

📁 下载来的一个看图软件的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
	  /* Refuse to draw if no style is set. */	  return;	}      p = im->style[im->stylePos++];      if ((p != gdTransparent) && (p != 0))	{	  gdImageSetPixel (im, x, y, gdBrushed);	}      im->stylePos = im->stylePos % im->styleLength;      break;    case gdBrushed:      gdImageBrushApply (im, x, y);      break;    case gdTiled:      gdImageTileApply (im, x, y);      break;    default:      if (gdImageBoundsSafe (im, x, y))	{	  if (im->trueColor)	    {	      if (im->alphaBlendingFlag)		{		  im->tpixels[y][x] =		    gdAlphaBlend (im->tpixels[y][x],				  color);		}	      else		{		  im->tpixels[y][x] = color;		}	    }	  else	    {	      im->pixels[y][x] = color;	    }	}      break;    }}static voidgdImageBrushApply (gdImagePtr im, int x, int y){  int lx, ly;  int hy;  int hx;  int x1, y1, x2, y2;  int srcx, srcy;  if (!im->brush)    {      return;    }  hy = gdImageSY (im->brush) / 2;  y1 = y - hy;  y2 = y1 + gdImageSY (im->brush);  hx = gdImageSX (im->brush) / 2;  x1 = x - hx;  x2 = x1 + gdImageSX (im->brush);  srcy = 0;  if (im->trueColor)    {      for (ly = y1; (ly < y2); ly++)	{	  srcx = 0;	  for (lx = x1; (lx < x2); lx++)	    {	      int p;	      p = gdImageGetTrueColorPixel (					     im->brush, srcx, srcy);	      gdImageSetPixel (im, lx, ly,			       p);	      srcx++;	    }	  srcy++;	}    }  else    {      for (ly = y1; (ly < y2); ly++)	{	  srcx = 0;	  for (lx = x1; (lx < x2); lx++)	    {	      int p;	      p = gdImageGetPixel (im->brush, srcx, srcy);	      /* Allow for non-square brushes! */	      if (p != gdImageGetTransparent (im->brush))		{		  /* Truecolor brush. Very slow		     on a palette destination. */		  if (im->brush->trueColor)		    {		      gdImageSetPixel (im, lx, ly,				       gdImageColorResolveAlpha (								  im,						      gdTrueColorGetRed (p),						    gdTrueColorGetGreen (p),						     gdTrueColorGetBlue (p),						  gdTrueColorGetAlpha (p)));		    }		  else		    {		      gdImageSetPixel (im, lx, ly,				       im->brushColorMap[p]);		    }		}	      srcx++;	    }	  srcy++;	}    }}static voidgdImageTileApply (gdImagePtr im, int x, int y){  int srcx, srcy;  int p;  if (!im->tile)    {      return;    }  srcx = x % gdImageSX (im->tile);  srcy = y % gdImageSY (im->tile);  if (im->trueColor)    {      p = gdImageGetTrueColorPixel (im->tile, srcx, srcy);      gdImageSetPixel (im, x, y, p);    }  else    {      /* Allow for transparency */      if (p != gdImageGetTransparent (im->tile))	{	  if (im->tile->trueColor)	    {	      /* Truecolor tile. Very slow	         on a palette destination. */	      gdImageSetPixel (im, x, y,			       gdImageColorResolveAlpha (							  im,						      gdTrueColorGetRed (p),						    gdTrueColorGetGreen (p),						     gdTrueColorGetBlue (p),						  gdTrueColorGetAlpha (p)));	    }	  else	    {	      gdImageSetPixel (im, x, y,			       im->tileColorMap[p]);	    }	}    }}intgdImageGetPixel (gdImagePtr im, int x, int y){  if (gdImageBoundsSafe (im, x, y))    {      if (im->trueColor)	{	  return im->tpixels[y][x];	}      else	{	  return im->pixels[y][x];	}    }  else    {      return 0;    }}intgdImageGetTrueColorPixel (gdImagePtr im, int x, int y){  int p = gdImageGetPixel (im, x, y);  if (!im->trueColor)    {      return gdTrueColorAlpha (im->red[p], im->green[p], im->blue[p],			       (im->transparent == p) ? gdAlphaTransparent :			       gdAlphaOpaque);    }  else    {      return p;    }}/* Bresenham as presented in Foley & Van Dam */voidgdImageLine (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 wid;  int w, wstart;  int thick = im->thick;  dx = abs (x2 - x1);  dy = abs (y2 - y1);  if (dy <= dx)    {      /* More-or-less horizontal. use wid for vertical stroke */      wid = thick * cos (atan2 (dy, dx));      if (wid == 0)	wid = 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;	}      /* Set up line thickness */      wstart = y - wid / 2;      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 */      wid = thick * sin (atan2 (dy, dx));      if (wid == 0)	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);	    }	}    }}static void dashedSet (gdImagePtr im, int x, int y, int color,		       int *onP, int *dashStepP, int wid, int vert);voidgdImageDashedLine (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 w, wstart, 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 */      wid = 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    {      /* More-or-less vertical. use wid for horizontal stroke */      wid = thick * sin (atan2 (dy, dx));      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 voiddashedSet (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;}#ifdef ORIGINAL_BOUNDS_SAFEintgdImageBoundsSafe (gdImagePtr im, int x, int y){  return (!(((y < 0) || (y >= im->sy)) ||	    ((x < 0) || (x >= im->sx))));}#endif /* ORIGINAL_BOUNDS_SAFE */voidgdImageChar (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++;    }}voidgdImageCharUp (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++;    }}voidgdImageString (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;    }}voidgdImageStringUp (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);voidgdImageString16 (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;    }}voidgdImageStringUp16 (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;    }}

⌨️ 快捷键说明

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