#include <stdio.h>
#include <X11/Xosdefs.h>
#include <stdlib.h>
#include <string.h>
#include "fstobdf.h"
unsigned long pointSize;
unsigned long yResolution;
static char *warning[] =
{
"COMMENT ",
"COMMENT WARNING: This bdf file was generated from a font server using",
"COMMENT fstobdf. The resulting font is subject to the same copyright,",
"COMMENT license, and trademark restrictions as the original font. The",
"COMMENT authors and distributors of fstobdf disclaim all liability for",
"COMMENT misuse of the program or its output.",
"COMMENT ",
NULL
};
static char *
FindStringProperty(char *propName,
int *propLength,
FSPropInfo *propInfo,
FSPropOffset *propOffsets,
unsigned char *propData)
{
FSPropOffset *propOffset;
int length;
int i;
propOffset = &propOffsets[0];
length = strlen(propName);
for (i = propInfo->num_offsets; i--; propOffset++) {
if (propOffset->type == PropTypeString) {
#ifdef DEBUG
char pname[256];
memmove( pname, propData + propOffset->name.position,
propOffset->name.length);
pname[propOffset->name.length] = '\0';
fprintf(stderr, "prop name: %s (len %d)\n",
pname, propOffset->name.length);
#endif
if ((propOffset->name.length == length) &&
!strncmp((char*)propData + propOffset->name.position, propName, length)) {
*propLength = propOffset->value.length;
return (char *)(propData + propOffset->value.position);
}
}
}
*propLength = 0;
return (NULL);
}
static int
FindNumberProperty(char *propName,
unsigned long *propValue,
FSPropInfo *propInfo,
FSPropOffset *propOffsets,
unsigned char *propData)
{
FSPropOffset *propOffset;
int i;
int length;
propOffset = &propOffsets[0];
length = strlen(propName);
for (i = propInfo->num_offsets; i--; propOffset++) {
if ((propOffset->type == PropTypeSigned) ||
(propOffset->type == PropTypeUnsigned)) {
if ((propOffset->name.length == length) &&
!strncmp((char*)propData + propOffset->name.position, propName, length)) {
*propValue = propOffset->value.position;
return (propOffset->type);
}
}
}
return (-1);
}
Bool
EmitHeader(FILE *outFile,
FSXFontInfoHeader *fontHeader,
FSPropInfo *propInfo,
FSPropOffset *propOffsets,
unsigned char *propData)
{
int len;
int type;
char *cp;
char **cpp;
unsigned long xResolution;
fprintf(outFile, "STARTFONT 2.1\n");
cp = FindStringProperty("COPYRIGHT", &len, propInfo, propOffsets,
propData);
if (cp) {
fprintf(outFile, "COMMENT \nCOMMENT ");
fwrite(cp, 1, len, outFile);
fputc('\n', outFile);
}
for (cpp = warning; *cpp; cpp++)
fprintf(outFile, "%s\n", *cpp);
cp = FindStringProperty("FONT", &len, propInfo, propOffsets, propData);
if (cp) {
fprintf(outFile, "FONT ");
fwrite(cp, 1, len, outFile);
fputc('\n', outFile);
} else {
fprintf(stderr, "unable to find FONT property\n");
return (False);
}
type = FindNumberProperty("RESOLUTION_X", &xResolution, propInfo,
propOffsets, propData);
if ((type != PropTypeUnsigned) && (type != PropTypeSigned))
xResolution = 72;
type = FindNumberProperty("RESOLUTION_Y", &yResolution, propInfo,
propOffsets, propData);
if ((type != PropTypeUnsigned) && (type != PropTypeSigned))
yResolution = 72;
type = FindNumberProperty("POINT_SIZE", &pointSize, propInfo,
propOffsets, propData);
if ((type == PropTypeUnsigned) || (type == PropTypeSigned))
pointSize = (pointSize + 5) / 10;
else
pointSize = ((fontHeader->font_ascent + fontHeader->font_descent)
* 72) / yResolution;
fprintf(outFile, "SIZE %lu %lu %lu\n", pointSize, xResolution,
yResolution);
fprintf(outFile, "FONTBOUNDINGBOX %d %d %d %d\n",
fontHeader->max_bounds.right - fontHeader->min_bounds.left,
fontHeader->max_bounds.ascent + fontHeader->max_bounds.descent,
fontHeader->min_bounds.left,
-fontHeader->max_bounds.descent);
return (True);
}