Exemple #1
0
int	GetStringHeight(char *szString, char* font, int size)
{
	int brect[8];
	char* err;
	gdFontPtr	pFont;

	if(font && strlen(font) != 0 && size > 0)
	{
		err = gdImageStringFT(NULL, brect, 0, font,size,0.,0,0,szString);
		if (err) 
		{
			/* if error occur, use native font */				
			return GetStringHeight(szString, "", size);	
		}
		return brect[3]-brect[5];		
	}
	else
	{		
		/* negative size */
		switch(size) {
			case UF_TINY:
				pFont = gdFontGetTiny();
				break;
			case UF_SMALL:
				pFont = gdFontGetSmall();
				break;
			case UF_MEDIUM:
				pFont = gdFontGetMediumBold();
				break;
			case UF_LARGE:
				pFont = gdFontGetLarge();
				break;
			case UF_GIANT:
				pFont = gdFontGetGiant();
				break;		
			default:
				pFont = gdFontGetMediumBold();
				break;
		}
		/* positive size */
		if(size > 0)
		{
			if(size > 9)
			{
				pFont = gdFontGetGiant();
			}
			else
			{
				pFont = gdFontGetSmall();
			}
		}
		return pFont->h;
	}	
	
}
Exemple #2
0
void Gd::drawString(int x, int y, const char* str, int color, FontStyle style)
{
  gdFontPtr font = style == FontTiny    ? gdFontGetTiny()
                 : style == FontSmall   ? gdFontGetSmall()
                 : style == FontMedium  ? gdFontGetMediumBold()
                 : style == FontLarge   ? gdFontGetLarge()
                 : style == FontGiant   ? gdFontGetGiant()
                 : gdFontGetMediumBold();

  gdImageString(_imagePtr, font, x, y, const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(str)), color);
}
Exemple #3
0
void Gd::drawChar(int x, int y, char ch, int color, FontStyle style)
{
  gdFontPtr font = style == FontTiny    ? gdFontGetTiny()
                 : style == FontSmall   ? gdFontGetSmall()
                 : style == FontMedium  ? gdFontGetMediumBold()
                 : style == FontLarge   ? gdFontGetLarge()
                 : style == FontGiant   ? gdFontGetGiant()
                 : gdFontGetMediumBold();

  gdImageChar(_imagePtr, font, x, y, ch, color);
}
Exemple #4
0
static void print_string(gdImagePtr im, int x, int y, const char *str)
{
    gdFontPtr font = gdFontGetGiant();

    x -= (10 + strlen(str)*font->w);
    gdImageFilledRectangle(im, x-1, y, 
                           x+strlen(str)*font->w, 
                           y+font->h, 0x0);
    gdImageString(im, font, x, y, (unsigned char *)str, 0x00FFFFFF);

}
/*本函数将code指定的字符写入图片中,将图片大小存储在pic_size中,返回该图片所在的内存地址
写入成功时,返回的内存指针非空
写入失败时,返回的内存指针为空
*/
void * sslvpn_write_string_to_pic(s8 *code, s32 *pic_size)
{
	/* Declare color indexes */  
    s32 black = 0;  
    s32 white = 0;   
    s32 randcolor = 0;
    s32 i = 0;
	
    /* img pointer */
    gdImagePtr im;  

    /* Font ptr */
    gdFontPtr ftptr=gdFontGetGiant();

    /*Picture buffer pointer*/
    void *pic_buf_ptr;

    /* Allocate the image: SSLVPN_VALID_PIC_WIDTH pixels across by SSLVPN_VALID_PIC_HEIGHTS pixels tall */  
    im = gdImageCreate(SSLVPN_VALID_PIC_WIDTH, SSLVPN_VALID_PIC_HEIGHT);   
    
    /* Allocate the color white (red, green and blue all maximum). */  
    /* Since this is the first color in a new image, it will    
     * be the background color. */  
    white = gdImageColorAllocate(im, 255, 255, 255);     
    
    /* Allocate the color black (red, green and blue all minimum). */ 
    black = gdImageColorAllocate(im, 0, 0, 0);

    /* Draw a centered string. */    
    gdImageString(im, ftptr, 
        (im->sx) / 2 - (strlen(code) * (ftptr->w) / 2),      
        (im->sy) / 2 - ftptr->h / 2, (u8*)code, black);
    
    /* Some disturbing points */
    for(i = 0; i < SSLVPN_VALID_DISTURB_POINTS; i++)
    {
        randcolor = gdImageColorAllocate(im, sslvpn_getRandom(255), sslvpn_getRandom(255), sslvpn_getRandom(255));
        gdImageSetPixel(im, sslvpn_getRandom(SSLVPN_VALID_PIC_WIDTH), sslvpn_getRandom(SSLVPN_VALID_PIC_HEIGHT), randcolor);
    }

    /* Output the image to buf and asign the length of buf to pic_size. */  
    pic_buf_ptr = gdImagePngPtr(im, pic_size);

    /* Destroy the image in memory. */  
    gdImageDestroy(im);

    return pic_buf_ptr;
    
}
Exemple #6
0
    void string(const std::string& text, const Point& point, const Color& color, Size size, int align)
    {
        // copy text into gd-friendly (unsigned char) buffer

        vector<unsigned char> buffer;
        copy(text.begin(), text.end(), back_inserter(buffer));
        buffer.push_back('\0');

        // choose font

        gdFontPtr font;
        switch (size)
        {
        case Tiny:
            font = gdFontGetTiny();
            break;
        case Small:
            font = gdFontGetSmall();
            break;
        case MediumBold:
            font = gdFontGetMediumBold();
            break;
        case Large:
            font = gdFontGetLarge();
            break;
        case Giant:
            font = gdFontGetGiant();
            break;
        default:
            throw runtime_error("[ImageImpl::string()] This isn't happening.");
        }

        // calculate position

        Point position = point;
        int length = (int)text.size() * font->w;
        int height = font->h;

        if (align & CenterX) position.x -= length/2;
        else if (align & Right) position.x -= length;

        if (align & CenterY) position.y -= height/2;
        else if (align & Bottom) position.y -= height;

        // draw the string

        gdImageString(im_, font, position.x, position.y, &buffer[0], color2gd(color));
    }
Exemple #7
0
gdFontPtr msGetBitmapFont(int size)
{
  switch(size) { /* set the font to use */
  case MS_TINY:
#ifdef GD_HAS_GETBITMAPFONT
    return gdFontGetTiny();
#else
    return(gdFontTiny);
#endif
    break;
  case MS_SMALL:
#ifdef GD_HAS_GETBITMAPFONT
    return gdFontGetSmall();
#else
    return(gdFontSmall);
#endif
    break;
  case MS_MEDIUM:
#ifdef GD_HAS_GETBITMAPFONT
    return gdFontGetMediumBold();
#else
    return(gdFontMediumBold);
#endif
    break;
  case MS_LARGE:
#ifdef GD_HAS_GETBITMAPFONT
    return gdFontGetLarge();
#else
    return(gdFontLarge);
#endif
    break;
  case MS_GIANT:
#ifdef GD_HAS_GETBITMAPFONT
    return gdFontGetGiant();
#else
    return(gdFontGiant);
#endif
    break;
  default:
    msSetError(MS_GDERR,"Invalid bitmap font. Must be one of tiny, small, medium, large or giant." , "msGetBitmapFont()");
    return(NULL);
  }
}
gdFontPtr msGetBitmapFont(int size)
{
    switch(size) { /* set the font to use */
    case MS_TINY:
        return gdFontGetTiny();
        break;
    case MS_SMALL:
        return gdFontGetSmall();
        break;
    case MS_MEDIUM:
        return gdFontGetMediumBold();
        break;
    case MS_LARGE:
        return gdFontGetLarge();
        break;
    case MS_GIANT:
        return gdFontGetGiant();
        break;
    default:
        msSetError(MS_GDERR,"Invalid bitmap font. Must be one of tiny, small, medium, large or giant." , "msGetBitmapFont()");
        return(NULL);
    }
}
Exemple #9
0
void gdDrawImage(HDC hdc, RECT *rc)
{
    HDC  mem_dc;
	BITMAPINFO bmp_info;
	void* bits;
	HBITMAP bmp, temp;
	gdImagePtr im;
	int width, height, stride;
	int white, black, blue, red;
	char *s = "Hello world!";
	gdFontPtr lfont, gfont;

	width = rc->right - rc->left;
	height = rc->bottom - rc->top;

	bmp_info = gdCreateBmp(width, height);

	// Create memory device context
	mem_dc = CreateCompatibleDC(hdc);
	if (!mem_dc) {
		MessageBox(NULL, "Can't create a compatible DC!", "Error!", MB_ICONEXCLAMATION | MB_OK);
		return;
	}

	// bits points to a shared buffer of pixels
	bits = NULL;
	bmp = CreateDIBSection(mem_dc, &bmp_info, DIB_RGB_COLORS, (void**)&bits, 0, 0);

	// Selecting the object before doing anything allows you to use libgd
	// together with native Windows GDI.
	temp = (HBITMAP)SelectObject(mem_dc, bmp);

	/*stride = ((width * 1 + 3) >> 2) << 2;*/
	// always uses 32bit in BMPINFO
	stride = width;
	im = NULL;

	// Attach shared buffer of pixels to GD image
	// Negative stride places 0,0 in upper-left corner
	im = gdImageTrueColorAttachBuffer((int*)bits, width, height, -stride);
	if (!im) {
		MessageBox(NULL, "GD image creation failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
		return;
	}

	// Start of GD drawing
	white = gdImageColorAllocate(im, 255, 255, 255);
	black = gdImageColorAllocate(im, 0, 0, 0);
	blue = gdImageColorAllocate(im, 0, 0, 255);

	// Allocate the color red, 50% transparent.
	red = gdImageColorAllocateAlpha(im, 255, 0, 0, 64);

	// Erase background with white color
	gdImageFilledRectangle(im, 0, 0, width, height, 0xFF0000);

	lfont = gdFontGetLarge();
	gfont = gdFontGetGiant();

	// Draw a dashed line from the upper left corner to the lower right corner.
	gdImageFilledRectangle(im, 25, 25, 100, 100, blue);

	gdImageChar(im, gfont, 35, 35, 'Q', white);
	gdImageFilledRectangle(im, 50, 50, 75, 175, red);
	gdImageLine(im, 0, 0, 150, 150, black);

	gdImageString(im, gdFontGetLarge(),
	im->sx / 2 - (strlen(s) * lfont->w / 2),
	im->sy / 2 - lfont->h / 2,
	(unsigned char*)s, black);

	// Copy drawing from memory context (shared bitmap buffer) to screen DC.
	BitBlt(hdc, rc->left, rc->top, width, height, mem_dc, 0, 0, SRCCOPY);

	// Free
	gdImageDetachBuffer(im);
	SelectObject(mem_dc, temp);
	DeleteObject(bmp);
	DeleteObject(mem_dc);
}
Exemple #10
0
int
main (void)
{
#ifdef HAVE_LIBPNG
  /* Input and output files */
  FILE *in;
  FILE *out;

  /* Input and output images */
  gdImagePtr im_in = 0, im_out = 0;

  /* Brush image */
  gdImagePtr brush;

  /* Color indexes */
  int white;
  int blue;
  int red;
  int green;

  /* Points for polygon */
  gdPoint points[3];
  int i;

  /* gd fonts for font test */
  gdFontPtr fonts[5];
  int y;

  /* Create output image, in true color. */
  im_out = gdImageCreateTrueColor (256 + 384, 384);
  /* 2.0.2: first color allocated would automatically be background in a 
     palette based image. Since this is a truecolor image, with an 
     automatic background of black, we must fill it explicitly. */
  white = gdImageColorAllocate (im_out, 255, 255, 255);
  gdImageFilledRectangle (im_out, 0, 0, gdImageSX (im_out),
			  gdImageSY (im_out), white);

  /* Set transparent color. */
  gdImageColorTransparent (im_out, white);

  /* Try to load demoin.png and paste part of it into the
     output image. */
  in = fopen ("demoin.png", "rb");
  if (!in)
    {
      fprintf (stderr, "Can't load source image; this demo\n");
      fprintf (stderr, "is much more impressive if demoin.png\n");
      fprintf (stderr, "is available.\n");
      im_in = 0;
    }
  else
    {
      int a;
      im_in = gdImageCreateFromPng (in);
      fclose (in);
      /* Now copy, and magnify as we do so */
      gdImageCopyResampled (im_out, im_in, 32, 32, 0, 0, 192, 192, 255, 255);
      /* Now display variously rotated space shuttles in a circle of our own */
      for (a = 0; (a < 360); a += 45)
	{
	  int cx = cos (a * .0174532925) * 128;
	  int cy = -sin (a * .0174532925) * 128;
	  gdImageCopyRotated (im_out, im_in,
			      256 + 192 + cx, 192 + cy,
			      0, 0, gdImageSX (im_in), gdImageSY (im_in), a);
	}
    }
  red = gdImageColorAllocate (im_out, 255, 0, 0);
  green = gdImageColorAllocate (im_out, 0, 255, 0);
  blue = gdImageColorAllocate (im_out, 0, 0, 255);
  /* Fat Rectangle */
  gdImageSetThickness (im_out, 4);
  gdImageLine (im_out, 16, 16, 240, 16, green);
  gdImageLine (im_out, 240, 16, 240, 240, green);
  gdImageLine (im_out, 240, 240, 16, 240, green);
  gdImageLine (im_out, 16, 240, 16, 16, green);
  gdImageSetThickness (im_out, 1);
  /* Circle */
  gdImageArc (im_out, 128, 128, 60, 20, 0, 720, blue);
  /* Arc */
  gdImageArc (im_out, 128, 128, 40, 40, 90, 270, blue);
  /* Flood fill: doesn't do much on a continuously
     variable tone jpeg original. */
  gdImageFill (im_out, 8, 8, blue);
  /* Polygon */
  points[0].x = 64;
  points[0].y = 0;
  points[1].x = 0;
  points[1].y = 128;
  points[2].x = 128;
  points[2].y = 128;
  gdImageFilledPolygon (im_out, points, 3, green);
  /* 2.0.12: Antialiased Polygon */
  gdImageSetAntiAliased (im_out, green);
  for (i = 0; (i < 3); i++)
    {
      points[i].x += 128;
    }
  gdImageFilledPolygon (im_out, points, 3, gdAntiAliased);
  /* Brush. A fairly wild example also involving a line style! */
  if (im_in)
    {
      int style[8];
      brush = gdImageCreateTrueColor (16, 16);
      gdImageCopyResized (brush, im_in,
			  0, 0, 0, 0,
			  gdImageSX (brush), gdImageSY (brush),
			  gdImageSX (im_in), gdImageSY (im_in));
      gdImageSetBrush (im_out, brush);
      /* With a style, so they won't overprint each other.
         Normally, they would, yielding a fat-brush effect. */
      style[0] = 0;
      style[1] = 0;
      style[2] = 0;
      style[3] = 0;
      style[4] = 0;
      style[5] = 0;
      style[6] = 0;
      style[7] = 1;
      gdImageSetStyle (im_out, style, 8);
      /* Draw the styled, brushed line */
      gdImageLine (im_out, 0, 255, 255, 0, gdStyledBrushed);
    }
  /* Text (non-truetype; see gdtestft for a freetype demo) */
  fonts[0] = gdFontGetTiny ();
  fonts[1] = gdFontGetSmall ();
  fonts[2] = gdFontGetMediumBold ();
  fonts[3] = gdFontGetLarge ();
  fonts[4] = gdFontGetGiant ();
  y = 0;
  for (i = 0; (i <= 4); i++)
    {
      gdImageString (im_out, fonts[i], 32, 32 + y, (unsigned char *) "hi",
		     red);
      y += fonts[i]->h;
    }
  y = 0;
  for (i = 0; (i <= 4); i++)
    {
      gdImageStringUp (im_out, fonts[i], 64 + y, 64,
		       (unsigned char *) "hi", red);
      y += fonts[i]->h;
    }
  /* Random antialiased lines; coordinates all over the image, 
     but the output will respect a small clipping rectangle */
  gdImageSetClip (im_out, 0, gdImageSY (im_out) - 100,
		  100, gdImageSY (im_out));
  /* Fixed seed for reproducibility of results */
  srand (100);
  for (i = 0; (i < 100); i++)
    {
      int x1 = rand () % gdImageSX (im_out);
      int y1 = rand () % gdImageSY (im_out);
      int x2 = rand () % gdImageSX (im_out);
      int y2 = rand () % gdImageSY (im_out);
      gdImageSetAntiAliased (im_out, white); 
      gdImageLine (im_out, x1, y1, x2, y2, gdAntiAliased); 
    }
  /* Make output image interlaced (progressive, in the case of JPEG) */
  gdImageInterlace (im_out, 1);
  out = fopen ("demoout.png", "wb");
  /* Write PNG */
  gdImagePng (im_out, out);
  fclose (out);
  out = fopen ("demoout.gif", "wb");
  /* Write GIF (2.0.28) */
  gdImageGif (im_out, out);
  fclose (out);
  /* 2.0.12: also write a paletteized png comparable to the gif */
  out = fopen ("demooutp.png", "wb");
  gdImageTrueColorToPalette (im_out, 0, 256);
  gdImagePng (im_out, out);
  fclose (out);
  gdImageDestroy (im_out);
  if (im_in)
    {
      gdImageDestroy (im_in);
    }
#else
  fprintf (stderr, "No PNG library support.\n");
#endif /* HAVE_LIBPNG */
  return 0;
}
Exemple #11
0
int	DrawString(gdImagePtr image, char *szString, int x, int y, char* font, int size, int color, TEXT_ALIGN align)
{
	int brect[8];
	gdFontPtr	pFont;
	char* err;
	int offsetX = 0, offsetY = 0;

	if(image)
	{
		/* use TTF */
		if(font && strlen(font) != 0 && size > 0)
		{
			err = gdImageStringFT(NULL, brect, 0, font,size,0.,0,0,szString);
			if (err) 
			{
				/* if error occur, use native font */				
				return DrawString(image, szString, x, y, "", size, color, align);				
			}
			switch(align) {
				case TA_CENTERED:
					offsetX = -(brect[2]-brect[0])/2;
					offsetY = +(brect[3]-brect[5])/2;
					break;
				case TA_TOPLEFT:
					offsetX = 0;
					offsetY = (brect[3]-brect[5]);
					break;
				case TA_RIGHTBOTTOM:
					offsetX = -(brect[2]-brect[0]);
					offsetY = 0;
					break;
			}

			err = gdImageStringFT(	image,brect,
									color,font, size, 0.,
									x+offsetX,
									y+offsetY,
									szString);

			if (err) 
			{
				/* if error occur, use native font */				
				return DrawString(image, szString, x, y, "", size, color, align);				
			}
		}
		/* use native GD fonts */
		else
		{
			/* negative size */
			switch(size) {
				case UF_TINY:
					pFont = gdFontGetTiny();
					break;
				case UF_SMALL:
					pFont = gdFontGetSmall();
					break;
				case UF_MEDIUM:
					pFont = gdFontGetMediumBold();
					break;
				case UF_LARGE:
					pFont = gdFontGetLarge();
					break;
				case UF_GIANT:
					pFont = gdFontGetGiant();
					break;			
				default:
					pFont = gdFontGetMediumBold();
					break;
			}
			/* positive size */
			if(size > 0)
			{
				if(size > 9)
				{
					pFont = gdFontGetGiant();
				}
				else
				{
					pFont = gdFontGetSmall();
				}
			}
			switch(align) {
				case TA_CENTERED:
					offsetX = -(int)(strlen(szString) * pFont->w)/2;
					offsetY = (int)-pFont->h/2;
					break;
				case TA_TOPLEFT:
					offsetX = offsetY = 0;
					break;
				case TA_RIGHTBOTTOM:
					offsetX = -(int)(strlen(szString) * pFont->w);
					offsetY = -pFont->h;
					break;
			}
			gdImageString(	image, pFont, 
							x+offsetX, 
							y+offsetY, 
							(unsigned char*)szString, color);
		}

		return OK;
	}
	return FAILURE;
}