|
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 |
}
|