?? ttfdump.c
字號:
#include <string.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#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 lintstatic 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 -2static 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);}intmain(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 voidprint_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 voidprint_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 voidprint_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 voidprint_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 voidprint_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 voidprint_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 voidprint_cmap(FILE *out){ ttfPrintCMAP(out, font->cmap); fprintf(out, "\n");}static voidprint_glyf(FILE *out, ULONG index){ GLYFPtr glyf; glyf = ttfLoadGlyphIndex(font, index); fprintf(out, "Glyph %6d.\n", index); ttfPrintGLYF(out, glyf);}static voidprint_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 voidprint_head(FILE *out){ ttfPrintHEAD(out, font->head); fprintf(out, "\n");}static voidprint_hhea(FILE *out){ ttfPrintHHEA(out, font->hhea); fprintf(out, "\n");}static voidprint_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 voidprint_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 voidprint_maxp(FILE *out){ ttfPrintMAXP(out, font->maxp); fprintf(out, "\n");}static voidprint_name(FILE *out){ ttfPrintNAME(out, font->name); fprintf(out, "\n");}static voidprint_post(FILE *out){ ttfPrintPOST(out, font->post);}static voidprint_os2(FILE *out){ ttfPrintOS2(out, font->os2);}static voidprint_cvt(FILE *out){ if (font->cvt != NULL) ttfPrintCVT(out, font->cvt, font->cvtLength);}static voidprint_fpgm(FILE *out){ if (font->fpgm != NULL) ttfPrintFPGM(out, font->fpgm, font->fpgmLength);}static voidprint_gasp(FILE *out){ if (font->gasp != NULL) ttfPrintGASP(out, font->gasp);}static voidprint_hdmx(FILE *out){ if (font->hdmx != NULL) ttfPrintHDMX(out, font->hdmx);}static voidprint_kern(FILE *out){ if (font->kern != NULL) ttfPrintKERN(out, font->kern);}static voidprint_ltsh(FILE *out){ if (font->ltsh != NULL) ttfPrintLTSH(out, font->ltsh);}static voidprint_pclt(FILE *out){ if (font->pclt != NULL) ttfPrintPCLT(out, font->pclt);}static voidprint_prep(FILE *out){ if (font->prep != NULL) ttfPrintPREP(out, font->prep, font->prepLength);}static voidprint_vdmx(FILE *out){ if (font->vdmx != NULL) ttfPrintVDMX(out, font->vdmx);}static voidprint_vhea(FILE *out){ if (font->vhea != NULL) ttfPrintVHEA(out, font->vhea);}static voidprint_vmtx(FILE *out){ if (font->vmtx != NULL) ttfPrintVMTX(out, font->vmtx);}static voiddialog(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 voidusage(void){ fprintf(stderr, "Usage: ttfdump ttfname dumpname [options]\n"); exit(EXIT_FAILURE);}static voidadd_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 */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -