Blame src/gddemo.c

Packit ed3af9
Packit ed3af9
#ifdef HAVE_CONFIG_H
Packit ed3af9
#include "config.h"
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
#include <stdio.h>
Packit ed3af9
#include <math.h>
Packit ed3af9
#include <stdlib.h>
Packit ed3af9
#include "gd.h"
Packit ed3af9
#include "gdfontt.h"
Packit ed3af9
#include "gdfonts.h"
Packit ed3af9
#include "gdfontmb.h"
Packit ed3af9
#include "gdfontl.h"
Packit ed3af9
#include "gdfontg.h"
Packit ed3af9
Packit ed3af9
int
Packit ed3af9
main (void)
Packit ed3af9
{
Packit ed3af9
#ifdef HAVE_LIBPNG
Packit ed3af9
	/* Input and output files */
Packit ed3af9
	FILE *in;
Packit ed3af9
	FILE *out;
Packit ed3af9
Packit ed3af9
	/* Input and output images */
Packit ed3af9
	gdImagePtr im_in = 0, im_out = 0;
Packit ed3af9
Packit ed3af9
	/* Brush image */
Packit ed3af9
	gdImagePtr brush;
Packit ed3af9
Packit ed3af9
	/* Color indexes */
Packit ed3af9
	int white;
Packit ed3af9
	int blue;
Packit ed3af9
	int red;
Packit ed3af9
	int green;
Packit ed3af9
Packit ed3af9
	/* Points for polygon */
Packit ed3af9
	gdPoint points[3];
Packit ed3af9
	int i;
Packit ed3af9
Packit ed3af9
	/* gd fonts for font test */
Packit ed3af9
	gdFontPtr fonts[5];
Packit ed3af9
	int y;
Packit ed3af9
Packit ed3af9
	/* Create output image, in true color. */
Packit ed3af9
	im_out = gdImageCreateTrueColor (256 + 384, 384);
Packit ed3af9
	/* 2.0.2: first color allocated would automatically be background in a
Packit ed3af9
	   palette based image. Since this is a truecolor image, with an
Packit ed3af9
	   automatic background of black, we must fill it explicitly. */
Packit ed3af9
	white = gdImageColorAllocate (im_out, 255, 255, 255);
Packit ed3af9
	gdImageFilledRectangle (im_out, 0, 0, gdImageSX (im_out),
Packit ed3af9
	                        gdImageSY (im_out), white);
Packit ed3af9
Packit ed3af9
	/* Set transparent color. */
Packit ed3af9
	gdImageColorTransparent (im_out, white);
Packit ed3af9
Packit ed3af9
	/* Try to load demoin.png and paste part of it into the
Packit ed3af9
	   output image. */
Packit ed3af9
	in = fopen ("demoin.png", "rb");
Packit ed3af9
	if (!in) {
Packit ed3af9
		fprintf(stderr, "Can't load source image; this demo\n");
Packit ed3af9
		fprintf(stderr, "is much more impressive if demoin.png\n");
Packit ed3af9
		fprintf(stderr, "is available.\n");
Packit ed3af9
		im_in = 0;
Packit ed3af9
	} else {
Packit ed3af9
		int a;
Packit ed3af9
		im_in = gdImageCreateFromPng (in);
Packit ed3af9
		fclose (in);
Packit ed3af9
		/* Now copy, and magnify as we do so */
Packit ed3af9
		gdImageCopyResampled (im_out, im_in, 32, 32, 0, 0, 192, 192, 255, 255);
Packit ed3af9
		/* Now display variously rotated space shuttles in a circle of our own */
Packit ed3af9
		for (a = 0; (a < 360); a += 45) {
Packit ed3af9
			int cx = cos (a * .0174532925) * 128;
Packit ed3af9
			int cy = -sin (a * .0174532925) * 128;
Packit ed3af9
			gdImageCopyRotated (im_out, im_in,
Packit ed3af9
			                    256 + 192 + cx, 192 + cy,
Packit ed3af9
			                    0, 0, gdImageSX (im_in), gdImageSY (im_in), a);
Packit ed3af9
		}
Packit ed3af9
	}
Packit ed3af9
	red = gdImageColorAllocate (im_out, 255, 0, 0);
Packit ed3af9
	green = gdImageColorAllocate (im_out, 0, 255, 0);
Packit ed3af9
	blue = gdImageColorAllocate (im_out, 0, 0, 255);
Packit ed3af9
	/* Fat Rectangle */
Packit ed3af9
	gdImageSetThickness (im_out, 4);
Packit ed3af9
	gdImageLine (im_out, 16, 16, 240, 16, green);
Packit ed3af9
	gdImageLine (im_out, 240, 16, 240, 240, green);
Packit ed3af9
	gdImageLine (im_out, 240, 240, 16, 240, green);
Packit ed3af9
	gdImageLine (im_out, 16, 240, 16, 16, green);
Packit ed3af9
	gdImageSetThickness (im_out, 1);
Packit ed3af9
	/* Circle */
Packit ed3af9
	gdImageArc (im_out, 128, 128, 60, 20, 0, 720, blue);
Packit ed3af9
	/* Arc */
Packit ed3af9
	gdImageArc (im_out, 128, 128, 40, 40, 90, 270, blue);
Packit ed3af9
	/* Flood fill: doesn't do much on a continuously
Packit ed3af9
	   variable tone jpeg original. */
Packit ed3af9
	gdImageFill (im_out, 8, 8, blue);
Packit ed3af9
	/* Polygon */
Packit ed3af9
	points[0].x = 64;
Packit ed3af9
	points[0].y = 0;
Packit ed3af9
	points[1].x = 0;
Packit ed3af9
	points[1].y = 128;
Packit ed3af9
	points[2].x = 128;
Packit ed3af9
	points[2].y = 128;
Packit ed3af9
	gdImageFilledPolygon (im_out, points, 3, green);
Packit ed3af9
	/* 2.0.12: Antialiased Polygon */
Packit ed3af9
	gdImageSetAntiAliased (im_out, green);
Packit ed3af9
	for (i = 0; (i < 3); i++) {
Packit ed3af9
		points[i].x += 128;
Packit ed3af9
	}
Packit ed3af9
	gdImageFilledPolygon (im_out, points, 3, gdAntiAliased);
Packit ed3af9
	/* Brush. A fairly wild example also involving a line style! */
Packit ed3af9
	if (im_in) {
Packit ed3af9
		int style[8];
Packit ed3af9
		brush = gdImageCreateTrueColor (16, 16);
Packit ed3af9
		gdImageCopyResized (brush, im_in,
Packit ed3af9
		                    0, 0, 0, 0,
Packit ed3af9
		                    gdImageSX (brush), gdImageSY (brush),
Packit ed3af9
		                    gdImageSX (im_in), gdImageSY (im_in));
Packit ed3af9
		gdImageSetBrush (im_out, brush);
Packit ed3af9
		/* With a style, so they won't overprint each other.
Packit ed3af9
		   Normally, they would, yielding a fat-brush effect. */
Packit ed3af9
		style[0] = 0;
Packit ed3af9
		style[1] = 0;
Packit ed3af9
		style[2] = 0;
Packit ed3af9
		style[3] = 0;
Packit ed3af9
		style[4] = 0;
Packit ed3af9
		style[5] = 0;
Packit ed3af9
		style[6] = 0;
Packit ed3af9
		style[7] = 1;
Packit ed3af9
		gdImageSetStyle (im_out, style, 8);
Packit ed3af9
		/* Draw the styled, brushed line */
Packit ed3af9
		gdImageLine (im_out, 0, 255, 255, 0, gdStyledBrushed);
Packit ed3af9
	}
Packit ed3af9
	/* Text (non-truetype; see gdtestft for a freetype demo) */
Packit ed3af9
	fonts[0] = gdFontGetTiny ();
Packit ed3af9
	fonts[1] = gdFontGetSmall ();
Packit ed3af9
	fonts[2] = gdFontGetMediumBold ();
Packit ed3af9
	fonts[3] = gdFontGetLarge ();
Packit ed3af9
	fonts[4] = gdFontGetGiant ();
Packit ed3af9
	y = 0;
Packit ed3af9
	for (i = 0; (i <= 4); i++) {
Packit ed3af9
		gdImageString (im_out, fonts[i], 32, 32 + y, (unsigned char *) "hi",
Packit ed3af9
		               red);
Packit ed3af9
		y += fonts[i]->h;
Packit ed3af9
	}
Packit ed3af9
	y = 0;
Packit ed3af9
	for (i = 0; (i <= 4); i++) {
Packit ed3af9
		gdImageStringUp (im_out, fonts[i], 64 + y, 64,
Packit ed3af9
		                 (unsigned char *) "hi", red);
Packit ed3af9
		y += fonts[i]->h;
Packit ed3af9
	}
Packit ed3af9
	/* Random antialiased lines; coordinates all over the image,
Packit ed3af9
	   but the output will respect a small clipping rectangle */
Packit ed3af9
	gdImageSetClip (im_out, 0, gdImageSY (im_out) - 100,
Packit ed3af9
	                100, gdImageSY (im_out));
Packit ed3af9
	/* Fixed seed for reproducibility of results */
Packit ed3af9
	srand (100);
Packit ed3af9
	for (i = 0; (i < 100); i++) {
Packit ed3af9
		int x1 = rand () % gdImageSX (im_out);
Packit ed3af9
		int y1 = rand () % gdImageSY (im_out);
Packit ed3af9
		int x2 = rand () % gdImageSX (im_out);
Packit ed3af9
		int y2 = rand () % gdImageSY (im_out);
Packit ed3af9
		gdImageSetAntiAliased (im_out, white);
Packit ed3af9
		gdImageLine (im_out, x1, y1, x2, y2, gdAntiAliased);
Packit ed3af9
	}
Packit ed3af9
	/* Make output image interlaced (progressive, in the case of JPEG) */
Packit ed3af9
	gdImageInterlace (im_out, 1);
Packit ed3af9
	out = fopen ("demoout.png", "wb");
Packit ed3af9
	/* Write PNG */
Packit ed3af9
	gdImagePng (im_out, out);
Packit ed3af9
	fclose (out);
Packit ed3af9
	out = fopen ("demoout.gif", "wb");
Packit ed3af9
	/* Write GIF (2.0.28) */
Packit ed3af9
	gdImageGif (im_out, out);
Packit ed3af9
	fclose (out);
Packit ed3af9
	/* 2.0.12: also write a paletteized png comparable to the gif */
Packit ed3af9
	out = fopen ("demooutp.png", "wb");
Packit ed3af9
	gdImageTrueColorToPalette (im_out, 0, 256);
Packit ed3af9
	gdImagePng (im_out, out);
Packit ed3af9
	fclose (out);
Packit ed3af9
	gdImageDestroy (im_out);
Packit ed3af9
	if (im_in) {
Packit ed3af9
		gdImageDestroy (im_in);
Packit ed3af9
	}
Packit ed3af9
#else
Packit ed3af9
	fprintf(stderr, "No PNG library support.\n");
Packit ed3af9
#endif /* HAVE_LIBPNG */
Packit ed3af9
	return 0;
Packit ed3af9
}