diff options
Diffstat (limited to 'Build/source/texk/ttfdump/src/ttfdump.c')
-rw-r--r-- | Build/source/texk/ttfdump/src/ttfdump.c | 600 |
1 files changed, 600 insertions, 0 deletions
diff --git a/Build/source/texk/ttfdump/src/ttfdump.c b/Build/source/texk/ttfdump/src/ttfdump.c new file mode 100644 index 00000000000..d1848a08e95 --- /dev/null +++ b/Build/source/texk/ttfdump/src/ttfdump.c @@ -0,0 +1,600 @@ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#ifdef WIN32 +#include <kpathsea/getopt.h> +#else +#include <unistd.h> +#endif + +#include "config.h" +#include "ttf.h" +#include "ttfutil.h" +#include "ttc.h" + +#ifdef MEMCHECK +#include <dmalloc.h> +#endif + + +/* $Id: ttfdump.c,v 1.2 1998/07/04 13:17:52 werner Exp $ */ + + +#ifndef lint + +static char vcid[] = "$Id: ttfdump.c,v 1.2 1998/07/04 13:17:52 werner Exp $"; + +#endif /* lint */ + + +#define MAXLEN 256 +#define ALL_GLYF -1 +#define NO_GLYF -2 + +static char ttfname[MAXLEN], dumpname[MAXLEN]; +static TTFontPtr font; + +static void print_ttc(TTCHeaderPtr ttc, FILE *out); +static void print_prologue(FILE *out); +static void print_offset(FILE *out); +static void print_dir(FILE *out); +static void print_all_tables(FILE *dp_file); +static void print_table(FILE *out, char *tablename); + +static void print_cmap(FILE *out); +static void print_glyf(FILE *out, ULONG index); +static void print_all_glyfs(FILE *out); +static void print_head(FILE *out); +static void print_hhea(FILE *out); +static void print_hmtx(FILE *out); +static void print_loca(FILE *out); +static void print_maxp(FILE *out); +static void print_name(FILE *out); +static void print_post(FILE *out); +static void print_os2(FILE *out); + +static void print_cvt(FILE *out); +static void print_fpgm(FILE *out); +static void print_gasp(FILE *out); +static void print_hdmx(FILE *out); +static void print_kern(FILE *out); +static void print_ltsh(FILE *out); +static void print_pclt(FILE *out); +static void print_prep(FILE *out); +static void print_vdmx(FILE *out); +static void print_vhea(FILE *out); +static void print_vmtx(FILE *out); + +static void dialog (int argc, char *argv[]); +static void usage (void); +static void add_suffix (char *name, char *suffix); + + +#if !defined(EXIT_FAILURE) +#define EXIT_FAILURE 1 +#endif + +#if !defined(EXIT_SUCCESS) +#define EXIT_SUCCESS 0 +#endif + + +/* strdup() is not available on all platforms; this version has been + * contributed by Nelson Beebe. */ + +char * +Strdup(const char *s) +{ + char *p; + + + p = malloc(((s == (const char *)NULL) ? 0 : strlen (s)) + 1); + if (p == (char *)NULL) + { + (void)fprintf(stderr, "Out of memory in Strdup()\n"); + exit(EXIT_FAILURE); + } + return strcpy(p, s); +} + + +int +main(int argc, char *argv[]) +{ + FILE *tt_file, *dp_file; + TTCHeaderPtr ttc; + + int c; + extern int optind; + extern char *optarg; + char *options, *value; + + char *tablename = NULL; + + + /* print all glyphs by default */ + int glyphnum = ALL_GLYF, collection = 0; + + if (argc < 2) + { + usage(); + exit(EXIT_FAILURE); + } + + while ((c = getopt(argc, argv, "t:g:c:i:o:h")) != EOF) + { + switch (c) + { + case 't': + tablename = Strdup(optarg); + break; + case 'g': + if (strcmp(optarg, "x") == 0) + glyphnum = NO_GLYF; + else + glyphnum = atoi(optarg); + break; + case 'c': + collection = atoi(optarg); + break; + case 'i': + strcpy(ttfname, optarg); + break; + case 'o': + strcpy(dumpname, optarg); + break; + case 'h': + case '?': + usage(); + exit(EXIT_FAILURE); + break; + } + } + + /* processing ttf file if -i flag is not given */ + if (*ttfname == 0 && optind < argc) + { + strcpy(ttfname, argv[optind]); + } + + /* processing dumping file if -o flag is not given */ + if (*dumpname == 0) + { + if (optind + 1 < argc) + { + /* no -o flag but dumping filename specified */ + strcpy(dumpname, argv[optind + 1]); + } + else + strcpy(dumpname, "-"); + } + if (!strcmp(dumpname, "-")) + { + dp_file = stdout; + } + else if ((dp_file = fopen(dumpname, "wt")) == NULL) + { + fprintf(stderr, "Can't open dumping file\n"); + exit(EXIT_FAILURE); + } + + if (strstr (ttfname, "ttc") != NULL) + { + ttc = ttfLoadTTCHeader(ttfname); + if (collection < ttc->DirCount) + font = ttc->font + collection; + else + fprintf (stderr, "TrueType collection number too large\n" + "should between 0 and %d\n", ttc->DirCount - 1); + } + else + font = ttfInitFont(ttfname); + + if (font == NULL) + exit(EXIT_FAILURE); + + print_prologue(dp_file); + if (strstr(ttfname, "ttc") != NULL) + { + print_ttc(ttc, dp_file); + } + print_offset(dp_file); + print_dir(dp_file); + + if (tablename == NULL) + { + /* no table specified */ + print_all_tables(dp_file); + if (glyphnum == ALL_GLYF) + print_all_glyfs(dp_file); + else if (glyphnum == NO_GLYF) + ; + else + print_glyf(dp_file, glyphnum); + } + else + { + /* table specified */ + print_table(dp_file, tablename); + if (!strcmp(tablename, "glyf")) + { + if (glyphnum == ALL_GLYF) + print_all_glyfs(dp_file); + else if (glyphnum == NO_GLYF) + ; + else + print_glyf(dp_file, glyphnum); + } + } + + if (strstr(ttfname, "ttc") != NULL) + { + ttfFreeTTCFont(ttc); + } + else + { + ttfFreeFont(font); + } + exit(EXIT_SUCCESS); +} + + +static void +print_table(FILE *out, char *tablename) +{ + if (!strcmp(tablename, "cmap")) + print_cmap(out); + if (!strcmp(tablename, "head")) + print_head(out); + if (!strcmp(tablename, "hhea")) + print_hhea(out); + if (!strcmp(tablename, "hmtx")) + print_hmtx(out); + if (!strcmp(tablename, "loca")) + print_loca(out); + if (!strcmp(tablename, "maxp")) + print_maxp(out); + if (!strcmp(tablename, "name")) + print_name(out); + if (!strcmp(tablename, "post")) + print_post(out); + if (!strcmp(tablename, "OS/2")) + print_os2(out); + if (!strcmp(tablename, "cvt")) + print_cvt(out); + if (!strcmp(tablename, "fpgm")) + print_fpgm(out); + if (!strcmp(tablename, "gasp")) + print_gasp(out); + if (!strcmp(tablename, "hdmx")) + print_hdmx(out); + if (!strcmp(tablename, "kern")) + print_kern(out); + if (!strcmp(tablename, "LTSH")) + print_ltsh(out); + if (!strcmp(tablename, "prep")) + print_prep(out); + if (!strcmp(tablename, "VDMX")) + print_vdmx(out); + if (!strcmp(tablename, "vhea")) + print_vhea(out); + if (!strcmp(tablename, "vmtx")) + print_vmtx(out); +} + + +static void +print_all_tables(FILE *dp_file) +{ + print_cmap(dp_file); + print_head(dp_file); + print_hhea(dp_file); + print_hmtx(dp_file); + print_loca(dp_file); + print_maxp(dp_file); + print_name(dp_file); + print_post(dp_file); + print_os2(dp_file); + + /*optional tables */ + print_cvt(dp_file); + print_gasp(dp_file); + print_hdmx(dp_file); + print_kern(dp_file); + print_ltsh(dp_file); + print_pclt(dp_file); + print_vdmx(dp_file); + print_vhea(dp_file); + print_vmtx(dp_file); +} + + +static void +print_ttc(TTCHeaderPtr ttc, FILE *out) +{ + int i, b[2]; + + + FixedSplit(ttc->version, b); + + fprintf(out, "TrueType Collection Header\n"); + fprintf(out, "--------------------------\n"); + fprintf(out, "TTC version: \t\t %d.%d\n", b[1], b[0]); + fprintf(out, "Number of fonts:\t %d\n", ttc->DirCount); + for (i = 0; i < ttc->DirCount; i++) + fprintf(out, "Offset of Directory #%d:\t %d\n", i, ttc->offset[i]); + fprintf(out, "\n"); +} + + +static void +print_prologue(FILE *out) +{ + fprintf(out, "True Type Font File Dumper: v 0.5.5\n"); + fprintf(out, "Copyright 1996-1998 ollie@ms1.hinet.net \n"); + fprintf(out, "Dumping File:%s\n\n\n", font->ttfname); +} + + +static void +print_offset(FILE *out) +{ + fprintf(out, "Offset Table \n"); + fprintf(out, "------------ \n"); + fprintf(out, "\t sfnt version:\n"); + fprintf(out, "\t number of tables: %d\n", font->numTables); +} + + +static void +print_dir(FILE *out) +{ + int i; + + + for (i = 0; i < font->numTables; i++) + { + fprintf(out, " %2d. ", i); + ttfPrintTableDir(out, font->dir + i); + } + fprintf(out, "\n"); +} + +static void +print_cmap(FILE *out) +{ + ttfPrintCMAP(out, font->cmap); + fprintf(out, "\n"); +} + +static void +print_glyf(FILE *out, ULONG index) +{ + GLYFPtr glyf; + + + glyf = ttfLoadGlyphIndex(font, index); + fprintf(out, "Glyph %6d.\n", index); + ttfPrintGLYF(out, glyf); +} + + +static void +print_all_glyfs(FILE *out) +{ + int i; + GLYFPtr glyf; + + + for (i = 0; i < font->maxp->numGlyphs; i++) + { + glyf = ttfLoadGlyphIndex(font, i); + fprintf(out, "Glyph %6d.\n", i); + ttfPrintGLYF(out, glyf); + } +} + + +static void +print_head(FILE *out) +{ + ttfPrintHEAD(out, font->head); + fprintf(out, "\n"); +} + + +static void +print_hhea(FILE *out) +{ + ttfPrintHHEA(out, font->hhea); + fprintf(out, "\n"); +} + + +static void +print_hmtx(FILE *out) +{ + /* because of interdependencies between tables + * we have to init hhea and maxp before hmtx */ + ttfPrintHMTX(out, font->hmtx); + fprintf(out, "\n"); +} + + +static void +print_loca(FILE *out) +{ + /* because of interdependencies between tables + * we have to init head and maxp before loca */ + ttfPrintLOCA(out, font->loca); + fprintf(out, "\n"); +} + + +static void +print_maxp(FILE *out) +{ + ttfPrintMAXP(out, font->maxp); + fprintf(out, "\n"); +} + + +static void +print_name(FILE *out) +{ + ttfPrintNAME(out, font->name); + fprintf(out, "\n"); +} + + +static void +print_post(FILE *out) +{ + ttfPrintPOST(out, font->post); +} + +static void +print_os2(FILE *out) +{ + ttfPrintOS2(out, font->os2); +} + + +static void +print_cvt(FILE *out) +{ + if (font->cvt != NULL) + ttfPrintCVT(out, font->cvt, font->cvtLength); +} + + +static void +print_fpgm(FILE *out) +{ + if (font->fpgm != NULL) + ttfPrintFPGM(out, font->fpgm, font->fpgmLength); +} + + +static void +print_gasp(FILE *out) +{ + if (font->gasp != NULL) + ttfPrintGASP(out, font->gasp); +} + + +static void +print_hdmx(FILE *out) +{ + if (font->hdmx != NULL) + ttfPrintHDMX(out, font->hdmx); +} + + +static void +print_kern(FILE *out) +{ + if (font->kern != NULL) + ttfPrintKERN(out, font->kern); +} + + +static void +print_ltsh(FILE *out) +{ + if (font->ltsh != NULL) + ttfPrintLTSH(out, font->ltsh); +} + + +static void +print_pclt(FILE *out) +{ + if (font->pclt != NULL) + ttfPrintPCLT(out, font->pclt); +} + + +static void +print_prep(FILE *out) +{ + if (font->prep != NULL) + ttfPrintPREP(out, font->prep, font->prepLength); +} + + +static void +print_vdmx(FILE *out) +{ + if (font->vdmx != NULL) + ttfPrintVDMX(out, font->vdmx); +} + + +static void +print_vhea(FILE *out) +{ + if (font->vhea != NULL) + ttfPrintVHEA(out, font->vhea); +} + + +static void +print_vmtx(FILE *out) +{ + if (font->vmtx != NULL) + ttfPrintVMTX(out, font->vmtx); +} + + +static void +dialog(int argc, char *argv[]) +{ + if (--argc < 1) + usage(); + + strcpy(ttfname, *++argv); + add_suffix(ttfname, "ttf"); + + if (--argc < 1) + strcpy(dumpname, "-"); + else + strcpy(dumpname, *++argv); +} + + +static void +usage(void) +{ + fprintf(stderr, "Usage: ttfdump ttfname dumpname [options]\n"); + exit(EXIT_FAILURE); +} + + +static void +add_suffix(char *name, char *suffix) +{ + int haveext = 0; + + + if (name && strcmp(name, "-")) + { + while (*name) + { + if (*name == '/') + haveext = 0; + else if (*name == '.') + haveext = 1; + name++; + } + if (!haveext) + { + *name++ = '.'; + strcpy(name, suffix); + } + } +} + + +/* end of ttfdump.c */ |