#include "speedo.h"
#include <stdio.h>
#define DEBUG 0
#if DEBUG
#define SHOW(X) printf("X = %d\n", X)
#else
#define SHOW(X)
#endif
#define FONT_BUFFER_SIZE 1000
static char pathname[100];
static ufix8 font_buffer[FONT_BUFFER_SIZE];
static FILE *fdescr;
FUNCTION main(argc,argv)
int argc;
char *argv[];
{
int bytes_read;
ufix8 tmpufix8;
fix15 tmpfix15;
ufix16 tmpufix16;
ufix32 tmpufix32;
ufix8 *pvt_header_org;
ufix8 read_1b();
fix15 read_2b();
fix31 read_4b();
if (argc != 2)
{
fprintf(stderr,"Usage: htest {fontfile}\n\n");
exit (1);
}
sprintf(pathname, argv[1]);
printf("\n SPEEDO FONT FILE HEADER DATA\n");
printf(" -------------------------\n\n");
fdescr = fopen (pathname, "rb");
if (fdescr == NULL)
{
printf("****** Cannot open file %s\n", pathname);
return;
}
bytes_read = fread(font_buffer, sizeof(ufix8), sizeof(font_buffer), fdescr);
if (bytes_read == 0)
{
printf("****** Error on reading %s: %x\n", pathname, bytes_read);
fclose(fdescr);
return;
}
printf("Format Identifier ...................... %.4s\n", font_buffer + FH_FMVER);
tmpufix32 = (ufix32)read_4b(font_buffer + FH_FMVER + 4);
printf("CR-LF-NULL-NULL data ............... %8.8lx %s\n", tmpufix32, (tmpufix32 != 0x0d0a0000)? "(incorrect)": " ");
printf("Font Size .............................. %4ld\n", (ufix32)read_4b(font_buffer + FH_FNTSZ));
printf("Minimum Font Buffer Size ............... %4ld\n", (ufix32)read_4b(font_buffer + FH_FBFSZ));
printf("Minimum Character Buffer Size .......... %4d\n", (ufix16)read_2b(font_buffer + FH_CBFSZ));
printf("Header Size ............................ %4d\n", (ufix16)read_2b(font_buffer + FH_HEDSZ));
printf("Font ID ................................ %4.4d\n", (ufix16)read_2b(font_buffer + FH_FNTID));
printf("Font Version Number .................... %4d\n", (ufix16)read_1b(font_buffer + FH_SFVNR));
printf("Font Full Name:\n %.70s\n", font_buffer + FH_FNTNM);
printf("Manufacturing Date ................ %10.10s\n", font_buffer + FH_MDATE);
printf("Character Set Name:\n %s\n", font_buffer + FH_LAYNM);
printf("Character Set ID: ...................... %.4s\n", font_buffer + FH_LAYNM + 66);
printf("Copyright Notice:\n %.70s\n", font_buffer + FH_CPYRT);
printf("Number of Char. Indexes in Char. Set ... %4d\n", (ufix16)read_2b(font_buffer + FH_NCHRL));
printf("Total number of Char. Indexes in Font .. %4d\n", (ufix16)read_2b(font_buffer + FH_NCHRF));
printf("Index of First Character ............... %4d\n", (ufix16)read_2b(font_buffer + FH_FCHRF));
printf("Number of Kerning Tracks ............... %4d\n", (ufix16)read_2b(font_buffer + FH_NKTKS));
printf("Number of Kerning Pairs ................ %4d\n", (ufix16)read_2b(font_buffer + FH_NKPRS));
printf("Font Flags:\n");
tmpufix8 = read_1b(font_buffer + FH_FLAGS);
printf(" Extended font ...................... %s\n", (tmpufix8 & BIT0)? " Yes": " No");
printf("Classification Flags:\n");
tmpufix8 = read_1b(font_buffer + FH_CLFGS);
printf(" Italic ............................. %s\n", (tmpufix8 & BIT0)? " Yes": " No");
printf(" Monospace .......................... %s\n", (tmpufix8 & BIT1)? " Yes": " No");
printf(" Serif .............................. %s\n", (tmpufix8 & BIT2)? " Yes": " No");
printf(" Display ............................ %s\n", (tmpufix8 & BIT3)? " Yes": " No");
tmpufix8 = read_1b(font_buffer + FH_FAMCL);
printf("Family Classification .................. %4d ", tmpufix8);
switch (tmpufix8)
{
case 0:
printf("(Don't care)\n");
break;
case 1:
printf("(Serif)\n");
break;
case 2:
printf("(Sans serif)\n");
break;
case 3:
printf("(Monospace)\n");
break;
case 4:
printf("(Script or calligraphic)\n");
break;
case 5:
printf("(Decorative)\n");
break;
default:
printf("\n");
break;
}
printf("Font Form Classification:\n");
tmpufix8 = read_1b(font_buffer + FH_FRMCL);
printf(" Width Type ......................... %4d ", (tmpufix8 & 0x0f));
switch (tmpufix8 & 0x0f)
{
case 4:
printf("(Condensed)\n");
break;
case 6:
printf("(Semi-condensed)\n");
break;
case 8:
printf("(Normal)\n");
break;
case 10:
printf("(Semi-expanded)\n");
break;
case 12:
printf("(Expanded)\n");
break;
default:
printf("\n");
break;
}
printf(" Weight ............................. %4d ", (tmpufix8 >> 4));
switch (tmpufix8 >> 4)
{
case 1:
printf("(Thin)\n");
break;
case 2:
printf("(Ultralight)\n");
break;
case 3:
printf("(Extra light)\n");
break;
case 4:
printf("(Light)\n");
break;
case 5:
printf("(Book)\n");
break;
case 6:
printf("(Normal)\n");
break;
case 7:
printf("(Medium)\n");
break;
case 8:
printf("(Semibold)\n");
break;
case 9:
printf("(Demibold)\n");
break;
case 10:
printf("(Bold)\n");
break;
case 11:
printf("(Extrabold)\n");
break;
case 12:
printf("(Ultrabold)\n");
break;
case 13:
printf("(Heavy)\n");
break;
case 14:
printf("(Black)\n");
break;
default:
printf("\n");
break;
}
printf("Short Font Name ........................ %.16s\n", font_buffer + FH_SFNTN);
printf("Short Face Name ........................ %.16s\n", font_buffer + FH_SFACN);
printf("Font Form .............................. %.14s\n", font_buffer + FH_FNTFM);
printf("Italic Angle ........................... %7.2f\n", ((real)read_2b(font_buffer + FH_ITANG) / 256.0));
printf("ORUs per Em ............................ %4d\n", (ufix16)read_2b(font_buffer + FH_ORUPM));
printf("Width of Word Space .................... %4d\n", (ufix16)read_2b(font_buffer + FH_WDWTH));
printf("Width of Em Space ...................... %4d\n", (ufix16)read_2b(font_buffer + FH_EMWTH));
printf("Width of En Space ...................... %4d\n", (ufix16)read_2b(font_buffer + FH_ENWTH));
printf("Width of Thin Space .................... %4d\n", (ufix16)read_2b(font_buffer + FH_TNWTH));
printf("Width of Figure Space .................. %4d\n", (ufix16)read_2b(font_buffer + FH_FGWTH));
printf("Min X coordinate in font ............... %4d\n", (fix15)read_2b(font_buffer + FH_FXMIN));
printf("Min Y coordinate in font ............... %4d\n", (fix15)read_2b(font_buffer + FH_FYMIN));
printf("Max X coordinate in font ............... %4d\n", (fix15)read_2b(font_buffer + FH_FXMAX));
printf("Max Y coordinate in font ............... %4d\n", (fix15)read_2b(font_buffer + FH_FYMAX));
printf("Underline Position ..................... %4d\n", (fix15)read_2b(font_buffer + FH_ULPOS));
printf("Underline Thickness .................... %4d\n", (fix15)read_2b(font_buffer + FH_ULTHK));
printf("Small Caps Y position .................. %4d\n", (fix15)read_2b(font_buffer + FH_SMCTR));
printf("Small Caps X scale ..................... %7.2f\n", ((real)read_2b(font_buffer + FH_SMCTR + 2) / 4096.0));
printf("Small Caps Y scale ..................... %7.2f\n", ((real)(fix15)read_2b(font_buffer + FH_SMCTR + 4) / 4096.0));
printf("Display Superiors Y position ........... %4d\n", (fix15)read_2b(font_buffer + FH_SMCTR));
printf("Display Superiors X scale .............. %7.2f\n", ((real)read_2b(font_buffer + FH_SMCTR + 2) / 4096.0));
printf("Display Superiors Y scale .............. %7.2f\n", ((real)read_2b(font_buffer + FH_SMCTR + 4) / 4096.0));
printf("Footnote Superiors Y position .......... %4d\n", (fix15)read_2b(font_buffer + FH_FNSTR));
printf("Footnote Superiors X scale ............. %7.2f\n", ((real)read_2b(font_buffer + FH_FNSTR + 2) / 4096.0));
printf("Footnote Superiors Y scale ............. %7.2f\n", ((real)read_2b(font_buffer + FH_FNSTR + 4) / 4096.0));
printf("Alpha Superiors Y position ............. %4d\n", (fix15)read_2b(font_buffer + FH_ALSTR));
printf("Alpha Superiors X scale ................ %7.2f\n", ((real)read_2b(font_buffer + FH_ALSTR + 2) / 4096.0));
printf("Alpha Superiors Y scale ................ %7.2f\n", ((real)read_2b(font_buffer + FH_ALSTR + 4) / 4096.0));
printf("Chemical Inferiors Y position .......... %4d\n", (fix15)read_2b(font_buffer + FH_CMITR));
printf("Chemical Inferiors X scale ............. %7.2f\n", ((real)read_2b(font_buffer + FH_CMITR + 2) / 4096.0));
printf("Chemical Inferiors Y scale ............. %7.2f\n", ((real)read_2b(font_buffer + FH_CMITR + 4) / 4096.0));
printf("Small Numerators Y position ............ %4d\n", (fix15)read_2b(font_buffer + FH_SNMTR));
printf("Small Numerators X scale ............... %7.2f\n", ((real)read_2b(font_buffer + FH_SNMTR + 2) / 4096.0));
printf("Small Numerators Y scale ............... %7.2f\n", ((real)read_2b(font_buffer + FH_SNMTR + 4) / 4096.0));
printf("Small Denominators Y position .......... %4d\n", (fix15)read_2b(font_buffer + FH_SDNTR));
printf("Small Denominators X scale ............. %7.2f\n", ((real)read_2b(font_buffer + FH_SDNTR + 2) / 4096.0));
printf("Small Denominators Y scale ............. %7.2f\n", ((real)read_2b(font_buffer + FH_SDNTR + 4) / 4096.0));
printf("Medium Numerators Y position ........... %4d\n", (fix15)read_2b(font_buffer + FH_MNMTR));
printf("Medium Numerators X scale .............. %7.2f\n", ((real)read_2b(font_buffer + FH_MNMTR + 2) / 4096.0));
printf("Medium Numerators Y scale .............. %7.2f\n", ((real)read_2b(font_buffer + FH_MNMTR + 4) / 4096.0));
printf("Medium Denominators Y position ......... %4d\n", (fix15)read_2b(font_buffer + FH_MDNTR));
printf("Medium Denominators X scale ............ %7.2f\n", ((real)read_2b(font_buffer + FH_MDNTR + 2) / 4096.0));
printf("Medium Denominators Y scale ............ %7.2f\n", ((real)read_2b(font_buffer + FH_MDNTR + 4) / 4096.0));
printf("Large Numerators Y position ............ %4d\n", (fix15)read_2b(font_buffer + FH_LNMTR));
printf("Large Numerators X scale ............... %7.2f\n", ((real)read_2b(font_buffer + FH_LNMTR + 2) / 4096.0));
printf("Large Numerators Y scale ............... %7.2f\n", ((real)read_2b(font_buffer + FH_LNMTR + 4) / 4096.0));
printf("Large Denominators Y position .......... %4d\n", (fix15)read_2b(font_buffer + FH_LDNTR));
printf("Large Denominators X scale ............. %7.2f\n", ((real)read_2b(font_buffer + FH_LDNTR + 2) / 4096.0));
printf("Large Denominators Y scale ............. %7.2f\n", ((real)read_2b(font_buffer + FH_LDNTR + 4) / 4096.0));
fclose(fdescr);
}
FUNCTION ufix8 read_1b(pointer)
ufix8 *pointer;
{
return *pointer;
}
FUNCTION fix15 read_2b(pointer)
ufix8 *pointer;
{
fix31 temp;
temp = *pointer++;
temp = (temp << 8) + *(pointer);
return temp;
}
FUNCTION fix31 read_4b(pointer)
ufix8 *pointer;
{
fix31 temp;
temp = *pointer++;
temp = (temp << 8) + *(pointer++);
temp = (temp << 8) + *(pointer++);
temp = (temp << 8) + *(pointer);
return temp;
}