Blame src/annotate.c

Packit ed3af9
#ifdef HAVE_CONFIG_H
Packit ed3af9
#	include "config.h"
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
#include <stdio.h>
Packit ed3af9
#include <stdlib.h>
Packit ed3af9
#include <string.h>
Packit ed3af9
#include "gd.h"
Packit ed3af9
Packit ed3af9
/* A neat little utility which adds freetype text to
Packit ed3af9
 * existing JPEG images. Type annotate -h for instructions.
Packit ed3af9
 * Thanks to Joel Dubiner for supporting this work. -TBB
Packit ed3af9
 */
Packit ed3af9
Packit ed3af9
enum { left, center, right };
Packit ed3af9
Packit ed3af9
int main(int argc, char *argv[])
Packit ed3af9
{
Packit ed3af9
#ifndef HAVE_LIBFREETYPE
Packit ed3af9
	(void)argc;
Packit ed3af9
	(void)argv;
Packit ed3af9
Packit ed3af9
	/* 2.0.12 */
Packit ed3af9
	fprintf(stderr, "annotate is not useful without freetype.\n"
Packit ed3af9
	         "Install freetype, then './configure; make clean; make install'\n"
Packit ed3af9
	         "the gd library again.\n"
Packit ed3af9
	        );
Packit ed3af9
	return 1;
Packit ed3af9
#else
Packit ed3af9
	gdImagePtr im;
Packit ed3af9
	char *iin, *iout;
Packit ed3af9
	FILE *in, *out;
Packit ed3af9
	char s[1024];
Packit ed3af9
	int bounds[8];
Packit ed3af9
	int lines = 1;
Packit ed3af9
	int color = gdTrueColor(0, 0, 0);
Packit ed3af9
	char font[1024];
Packit ed3af9
	int size = 12;
Packit ed3af9
	int align = left;
Packit ed3af9
	int x = 0, y = 0;
Packit ed3af9
	char *fontError;
Packit ed3af9
Packit ed3af9
	strcpy(font, "times");
Packit ed3af9
Packit ed3af9
	if(argc != 3) {
Packit ed3af9
		fprintf(stderr, "Usage: annotate imagein.jpg imageout.jpg\n\n");
Packit ed3af9
		fprintf(stderr, "Standard input should consist of\n");
Packit ed3af9
		fprintf(stderr, "lines in the following formats:\n");
Packit ed3af9
		fprintf(stderr, "color r g b (0-255 each) [a (0-127, 0 is opaque)]\n");
Packit ed3af9
		fprintf(stderr, "font fontname (max name length 1024)\n");
Packit ed3af9
		fprintf(stderr, "size pointsize\n");
Packit ed3af9
		fprintf(stderr, "align (left|right|center)\n");
Packit ed3af9
		fprintf(stderr, "move x y\n");
Packit ed3af9
		fprintf(stderr, "text actual-output-text\n\n");
Packit ed3af9
		fprintf(stderr,
Packit ed3af9
		        "If the file 'paris.ttf' exists in /usr/share/fonts/truetype or in a\n");
Packit ed3af9
		fprintf(stderr,
Packit ed3af9
		        "location specified in the GDFONTPATH environment variable, 'font paris' is\n");
Packit ed3af9
		fprintf(stderr,
Packit ed3af9
		        "sufficient. You may also specify the full, rooted path of a font file.\n");
Packit ed3af9
		exit(1);
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	iin = argv[1];
Packit ed3af9
	iout = argv[2];
Packit ed3af9
Packit ed3af9
	in = fopen(iin, "rb");
Packit ed3af9
	if(!in) {
Packit ed3af9
		fprintf(stderr, "Couldn't open %s\n", iin);
Packit ed3af9
		exit(2);
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
#ifdef HAVE_LIBJPEG
Packit ed3af9
	im = gdImageCreateFromJpeg(in);
Packit ed3af9
#else
Packit ed3af9
	fprintf(stderr, "No JPEG library support available.\n");
Packit ed3af9
	exit(1);
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
	fclose(in);
Packit ed3af9
Packit ed3af9
	if(!im) {
Packit ed3af9
		fprintf(stderr, "%s did not load properly\n", iin);
Packit ed3af9
		exit(3);
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	while(fgets(s, sizeof(s), stdin)) {
Packit ed3af9
		char *st;
Packit ed3af9
		char *text;
Packit ed3af9
Packit ed3af9
		st = strtok(s, " \t\r\n");
Packit ed3af9
		if(!st) {
Packit ed3af9
			/* Be nice about blank lines */
Packit ed3af9
			continue;
Packit ed3af9
		}
Packit ed3af9
Packit ed3af9
		if(!strcmp(st, "font")) {
Packit ed3af9
			char *st = strtok(0, " \t\r\n");
Packit ed3af9
			if(!st) {
Packit ed3af9
				goto badLine;
Packit ed3af9
			} else {
Packit ed3af9
				const unsigned int font_len = strlen(st);
Packit ed3af9
				if (font_len >= 1024) {
Packit ed3af9
					fprintf(stderr, "Font maximum length is 1024, %d given\n", font_len);
Packit ed3af9
					goto badLine;
Packit ed3af9
				}
Packit ed3af9
				strncpy(font, st, font_len);
Packit ed3af9
			}
Packit ed3af9
		} else if(!strcmp(st, "align")) {
Packit ed3af9
			char *st = strtok(0, " \t\r\n");
Packit ed3af9
Packit ed3af9
			if(!st) {
Packit ed3af9
				goto badLine;
Packit ed3af9
			}
Packit ed3af9
Packit ed3af9
			if(!strcmp(st, "left")) {
Packit ed3af9
				align = 0;
Packit ed3af9
			} else if(!strcmp(st, "center")) {
Packit ed3af9
				align = 1;
Packit ed3af9
			} else if(!strcmp(st, "right")) {
Packit ed3af9
				align = 2;
Packit ed3af9
			}
Packit ed3af9
		} else if(!strcmp(st, "size")) {
Packit ed3af9
			char *st = strtok(0, " \t\r\n");
Packit ed3af9
Packit ed3af9
			if(!st) {
Packit ed3af9
				goto badLine;
Packit ed3af9
			}
Packit ed3af9
Packit ed3af9
			size = atoi(st);
Packit ed3af9
		} else if(!strcmp(st, "color")) {
Packit ed3af9
			char *st = strtok(0, "\r\n");
Packit ed3af9
			int r, g, b, a = 0;
Packit ed3af9
Packit ed3af9
			if(!st) {
Packit ed3af9
				goto badLine;
Packit ed3af9
			}
Packit ed3af9
Packit ed3af9
			if(sscanf(st, "%d %d %d %d", &r, &g, &b, &a) < 3) {
Packit ed3af9
				fprintf(stderr, "Bad color at line %d\n", lines);
Packit ed3af9
				exit(2);
Packit ed3af9
			}
Packit ed3af9
Packit ed3af9
			color = gdTrueColorAlpha(r, g, b, a);
Packit ed3af9
		} else if(!strcmp(st, "move")) {
Packit ed3af9
			char *st = strtok(0, "\r\n");
Packit ed3af9
Packit ed3af9
			if(!st) {
Packit ed3af9
				goto badLine;
Packit ed3af9
			}
Packit ed3af9
Packit ed3af9
			if(sscanf(st, "%d %d", &x, &y) != 2) {
Packit ed3af9
				fprintf(stderr, "Missing coordinates at line %d\n", lines);
Packit ed3af9
				exit(3);
Packit ed3af9
			}
Packit ed3af9
		} else if(!strcmp(st, "text")) {
Packit ed3af9
			int rx = x;
Packit ed3af9
Packit ed3af9
			text = strtok(0, "\r\n");
Packit ed3af9
			if(!text) {
Packit ed3af9
				text = "";
Packit ed3af9
			}
Packit ed3af9
Packit ed3af9
			gdImageStringFT(0, bounds, color, font, size, 0, x, y, text);
Packit ed3af9
Packit ed3af9
			switch(align) {
Packit ed3af9
			case left:
Packit ed3af9
				break;
Packit ed3af9
Packit ed3af9
			case center:
Packit ed3af9
				rx -= (bounds[2] - bounds[0]) / 2;
Packit ed3af9
				break;
Packit ed3af9
Packit ed3af9
			case right:
Packit ed3af9
				rx -= (bounds[2] - bounds[0]);
Packit ed3af9
				break;
Packit ed3af9
			}
Packit ed3af9
Packit ed3af9
			fontError = gdImageStringFT(im, 0, color, font, size, 0, rx, y, text);
Packit ed3af9
			if(fontError) {
Packit ed3af9
				fprintf(stderr, "font error at line %d: %s\n", lines, fontError);
Packit ed3af9
				exit(7);
Packit ed3af9
			}
Packit ed3af9
Packit ed3af9
			y -= (bounds[7] - bounds[1]);
Packit ed3af9
		} else {
Packit ed3af9
			goto badLine;
Packit ed3af9
		}
Packit ed3af9
Packit ed3af9
		lines++;
Packit ed3af9
		continue;
Packit ed3af9
Packit ed3af9
badLine:
Packit ed3af9
		fprintf(stderr, "Bad syntax, line %d\n", lines);
Packit ed3af9
		exit(4);
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	out = fopen(iout, "wb");
Packit ed3af9
	if(!out) {
Packit ed3af9
		fprintf(stderr, "Cannot create %s\n", iout);
Packit ed3af9
		exit(5);
Packit ed3af9
	}
Packit ed3af9
#ifdef HAVE_LIBJPEG
Packit ed3af9
	gdImageJpeg(im, out, 95);
Packit ed3af9
#else
Packit ed3af9
	fprintf(stderr, "No JPEG library support available.\n");
Packit ed3af9
#endif
Packit ed3af9
	gdImageDestroy(im);
Packit ed3af9
	fclose(out);
Packit ed3af9
	return 0;
Packit ed3af9
#endif /* HAVE_LIBFREETYPE */
Packit ed3af9
}