1
/* $Id: gvusershape.c,v 1.31 2007/09/07 20:28:24 ellson Exp $ $Revision: 1.31 $ */
1
/* $Id: gvusershape.c,v 1.34 2007/12/27 22:09:22 ellson Exp $ $Revision: 1.34 $ */
2
2
/* vim:set shiftwidth=4 ts=8: */
4
4
/**********************************************************
47
48
#define JPEG_MAGIC "\xFF\xD8\xFF\xE0"
48
49
#define PDF_MAGIC "%PDF-"
49
50
#define EPS_MAGIC "\xC5\xD0\xD3\xC6"
51
#define XML_MAGIC "<?xml"
52
#define SVG_MAGIC "<svg"
51
54
static knowntype_t knowntypes[] = {
52
55
{ PNG_MAGIC, sizeof(PNG_MAGIC)-1, FT_PNG, "png", },
56
59
{ JPEG_MAGIC, sizeof(JPEG_MAGIC)-1, FT_JPEG, "jpeg", },
57
60
{ PDF_MAGIC, sizeof(PDF_MAGIC)-1, FT_PDF, "pdf", },
58
61
{ EPS_MAGIC, sizeof(EPS_MAGIC)-1, FT_EPS, "eps", },
62
/* { SVG_MAGIC, sizeof(SVG_MAGIC)-1, FT_SVG, "svg", }, - viewers expect xml preamble */
63
{ XML_MAGIC, sizeof(XML_MAGIC)-1, FT_XML, "xml", },
61
66
static int imagetype (usershape_t *us)
63
68
char header[HDRLEN];
66
72
if (us->f && fread(header, 1, HDRLEN, us->f) == HDRLEN) {
67
73
for (i = 0; i < sizeof(knowntypes) / sizeof(knowntype_t); i++) {
68
74
if (!memcmp (header, knowntypes[i].template, knowntypes[i].size)) {
69
75
us->stringtype = knowntypes[i].stringtype;
70
return (us->type = knowntypes[i].type);
76
us->type = knowntypes[i].type;
77
if (us->type != FT_XML)
79
/* check for SVG in case of XML */
80
while (fgets(line, sizeof(line), us->f) != NULL) {
81
if (!memcmp(line, SVG_MAGIC, sizeof(SVG_MAGIC)-1)) {
82
us->stringtype = "svg";
83
return (us->type = FT_SVG);
74
90
us->stringtype = "(lib)";
75
91
us->type = FT_NULL;
125
static unsigned int svg_units_convert(double n, char *u)
127
if (strcmp(u, "in") == 0)
128
return ROUND(n * POINTS_PER_INCH);
129
if (strcmp(u, "px") == 0)
130
return ROUND(n * POINTS_PER_INCH / 96);
131
if (strcmp(u, "pc") == 0)
132
return ROUND(n * POINTS_PER_INCH / 6);
133
if (strcmp(u, "pt") == 0 || strcmp(u, "\"") == 0) /* ugly!! - if there are no inits then the %2s get the trailing '"' */
135
if (strcmp(u, "cm") == 0)
136
return ROUND(n * POINTS_PER_CM);
137
if (strcmp(u, "mm") == 0)
138
return ROUND(n * POINTS_PER_MM);
142
static void svg_size (usershape_t *us)
144
unsigned int w = 0, h = 0;
149
bool wFlag = false, hFlag = false;
151
fseek(us->f, -strlen(line), SEEK_CUR);
152
while (fgets(line, sizeof(line), us->f) != NULL && (!wFlag || !hFlag)) {
153
token = strtok(line, " ");
154
while (token != NULL && token[strlen(token)-1] != '>') {
155
if (sscanf(token, "width=\"%lf%2s\"", &n, u) == 2) {
156
w = svg_units_convert(n, u);
161
if (sscanf(token, "height=\"%lf%2s\"", &n, u) == 2) {
162
h = svg_units_convert(n, u);
167
token = strtok(NULL, " ");
108
175
static void png_size (usershape_t *us)
110
177
unsigned int w, h;