diff options
Diffstat (limited to 'Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc')
-rw-r--r-- | Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc | 369 |
1 files changed, 0 insertions, 369 deletions
diff --git a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc b/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc deleted file mode 100644 index eaf919d1e28..00000000000 --- a/Build/source/texk/lcdf-typetools/lcdf-typetools-src/t1rawafm/t1rawafm.cc +++ /dev/null @@ -1,369 +0,0 @@ -/* t1rawafm.cc -- driver for generating a raw AFM file from a font - * - * Copyright (c) 2008-2019 Eddie Kohler - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. This program is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif -#include <efont/psres.hh> -#include <efont/t1rw.hh> -#include <efont/t1font.hh> -#include <efont/t1item.hh> -#include <efont/t1mm.hh> -#include <efont/t1interp.hh> -#include <efont/t1bounds.hh> -#include <lcdf/clp.h> -#include <lcdf/error.hh> -#include <lcdf/globmatch.hh> -#include <lcdf/transform.hh> -#include <algorithm> -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <stdarg.h> -#include <ctype.h> -#include <errno.h> -#ifdef HAVE_CTIME -# include <time.h> -#endif -#if defined(_MSDOS) || defined(_WIN32) -# include <fcntl.h> -# include <io.h> -#endif - -using namespace Efont; - -#define VERSION_OPT 301 -#define HELP_OPT 302 -#define OUTPUT_OPT 303 -#define SMOKE_OPT 305 - -const Clp_Option options[] = { - { "help", 'h', HELP_OPT, 0, 0 }, - { "output", 'o', OUTPUT_OPT, Clp_ValString, 0 }, - { "version", 0, VERSION_OPT, 0, 0 }, -}; - - -static const char *program_name; -static PermString::Initializer initializer; - - -void -usage_error(ErrorHandler *errh, const char *error_message, ...) -{ - va_list val; - va_start(val, error_message); - if (!error_message) - errh->message("Usage: %s [OPTION]... [FONT [OUTPUT]]", program_name); - else - errh->xmessage(ErrorHandler::e_error, error_message, val); - errh->message("Type %s --help for more information.", program_name); - exit(1); -} - -void -usage() -{ - FileErrorHandler uerrh(stdout); - uerrh.message("\ -%<T1rawafm%> generates a raw (kernless and ligatureless) AFM file corresponding\n\ -to the specified Type 1 font file and writes it to the standard output.\n\ -\n\ -Usage: %s [OPTION]... [FONT [OUTPUT]]\n\ -\n\ -FONT is the name of a PFA or PFB font file. If omitted, t1rawafm will read a\n\ -font file from the standard input.\n\ -\n\ -Options:\n\ - -o, --output=FILE Write output to FILE instead of standard output.\n\ - -h, --help Print this message and exit.\n\ - --version Print version number and exit.\n\ -\n\ -Report bugs to <ekohler@gmail.com>.\n", program_name); -} - - -// MAIN - -static Type1Font *font; - -static void -do_file(const char *filename, PsresDatabase *psres, ErrorHandler *errh) -{ - FILE *f; - if (!filename || strcmp(filename, "-") == 0) { - f = stdin; - filename = "<stdin>"; -#if defined(_MSDOS) || defined(_WIN32) - _setmode(_fileno(f), _O_BINARY); -#endif - } else - f = fopen(filename, "rb"); - - if (!f) { - // check for PostScript name - Filename fn = psres->filename_value("FontOutline", filename); - f = fn.open_read(); - } - - if (!f) - errh->fatal("%s: %s", filename, strerror(errno)); - - Type1Reader *reader; - int c = getc(f); - ungetc(c, f); - if (c == EOF) - errh->fatal("%s: empty file", filename); - if (c == 128) - reader = new Type1PFBReader(f); - else - reader = new Type1PFAReader(f); - - font = new Type1Font(*reader); - if (!font->ok()) - errh->fatal("%s: not a Type 1 font", filename); - - delete reader; -} - - -/***** - * MAIN PROGRAM - **/ - -struct fontinfo_t { - const char *afm_name; - int dict; - const char *dict_name; - bool as_string; -}; - -static const fontinfo_t fontinfo_strings[] = { - { "Version", Type1Font::dFI, "version", true }, - { "Notice", Type1Font::dFI, "Notice", true }, - { "FullName", Type1Font::dFI, "FullName", true }, - { "FamilyName", Type1Font::dFI, "FamilyName", true }, - { "Weight", Type1Font::dFI, "Weight", true }, - { "ItalicAngle", Type1Font::dFI, "ItalicAngle", false }, - { "IsFixedPitch", Type1Font::dFI, "isFixedPitch", false }, - { "UnderlinePosition", Type1Font::dFI, "UnderlinePosition", false }, - { "UnderlineThickness", Type1Font::dFI, "UnderlineThickness", false } -}; - -static String -strip_newlines(const String &str) -{ - StringAccum sa; - const char *end = str.end(), *last = str.begin(); - for (const char *s = str.begin(); s != end; ++s) - if (*s == '\n' || *s == '\r' || *s == '\f' || *s == '\v') { - sa.append(last, s); - last = s + 1; - } - if (last == str.begin()) - return str; - else { - sa.append(last, end); - return sa.take_string(); - } -} - -static void -write_char(FILE *outf, int c, PermString n, Type1Charstring *g, const Transform &font_transform, Type1Font *font) -{ - double bb[4], wx; - CharstringBounds::bounds(font_transform, CharstringContext(font, g), bb, wx); - fprintf(outf, "C %d ; WX %d ; N %s ; B %d %d %d %d ;\n", - c, (int) ceil(wx), n.c_str(), - (int) floor(bb[0]), (int) floor(bb[1]), - (int) ceil(bb[2]), (int) ceil(bb[3])); -} - -static void -write_afm(FILE *outf, Type1Font *font) -{ - fprintf(outf, "StartFontMetrics 2.0\n\ -Comment Generated by t1rawafm\n"); - - for (size_t i = 0; i < sizeof(fontinfo_strings) / sizeof(fontinfo_t); ++i) - if (Type1Definition *t1d = font->dict(fontinfo_strings[i].dict, - fontinfo_strings[i].dict_name)) { - if (!fontinfo_strings[i].as_string) - fprintf(outf, "%s %s\n", fontinfo_strings[i].afm_name, t1d->value().c_str()); - else { - String s; - if (t1d->value_string(s)) - fprintf(outf, "%s %s\n", fontinfo_strings[i].afm_name, strip_newlines(s).c_str()); - } - } - - Transform font_transform; - { - double font_matrix[6]; - font->font_matrix(font_matrix); - font_transform = Transform(font_matrix); - font_transform.scale(1000); - } - - double bb[4], wx; - if (Type1Charstring *t1cs = font->glyph("H")) { - CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx); - if (bb[3]) - fprintf(outf, "CapHeight %d\n", (int) ceil(bb[3])); - } - if (Type1Charstring *t1cs = font->glyph("x")) { - CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx); - if (bb[3]) - fprintf(outf, "XHeight %d\n", (int) ceil(bb[3])); - } - if (Type1Charstring *t1cs = font->glyph("d")) { - CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx); - if (bb[3]) - fprintf(outf, "Ascender %d\n", (int) ceil(bb[3])); - } - if (Type1Charstring *t1cs = font->glyph("p")) { - CharstringBounds::bounds(font_transform, CharstringContext(font, t1cs), bb, wx); - if (bb[1]) - fprintf(outf, "Descender %d\n", (int) floor(bb[1])); - } - - Vector<double> vd; - if (Type1Definition *t1d = font->p_dict("StdHW")) - if (t1d->value_numvec(vd) && vd.size() > 0) - fprintf(outf, "StdHW %d\n", (int) ceil(vd[0])); - if (Type1Definition *t1d = font->p_dict("StdVW")) - if (t1d->value_numvec(vd) && vd.size() > 0) - fprintf(outf, "StdVW %d\n", (int) ceil(vd[0])); - - double fontbb[4] = { 1000000, 1000000, -1000000, -1000000 }; - for (int i = 0; i < font->nglyphs(); ++i) { - CharstringBounds::bounds(font_transform, CharstringContext(font, font->glyph(i)), bb, wx); - fontbb[0] = std::min(fontbb[0], bb[0]); - fontbb[1] = std::min(fontbb[1], bb[1]); - fontbb[2] = std::max(fontbb[2], bb[2]); - fontbb[3] = std::max(fontbb[3], bb[3]); - } - fprintf(outf, "FontBBox %d %d %d %d\n", - (int) floor(fontbb[0]), (int) floor(fontbb[1]), - (int) ceil(fontbb[2]), (int) ceil(fontbb[3])); - - fprintf(outf, "FontName %s\n", font->font_name().c_str()); - - int nglyphs = font->nglyphs(); - PermString dot_notdef(".notdef"); - if (font->glyph(dot_notdef)) - --nglyphs; - fprintf(outf, "Characters %d\n", nglyphs); - - fprintf(outf, "StartCharMetrics %d\n", nglyphs); - HashMap<PermString, int> done_yet(0); - done_yet.insert(dot_notdef, 1); - if (Type1Encoding *enc = font->type1_encoding()) { - for (int i = 0; i < 256; ++i) { - PermString n = enc->elt(i); - if (!done_yet[n]) - if (Type1Charstring *g = font->glyph(n)) { - write_char(outf, i, n, g, font_transform, font); - done_yet.insert(n, true); - } - } - } - for (int i = 0; i < font->nglyphs(); ++i) { - PermString n = font->glyph_name(i); - if (!done_yet[n]) - write_char(outf, -1, n, font->glyph(i), font_transform, font); - } - fprintf(outf, "EndCharMetrics\n"); - - fprintf(outf, "EndFontMetrics\n"); -} - -int -main(int argc, char *argv[]) -{ - PsresDatabase *psres = new PsresDatabase; - psres->add_psres_path(getenv("PSRESOURCEPATH"), 0, false); - - Clp_Parser *clp = - Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options); - program_name = Clp_ProgramName(clp); - - ErrorHandler *errh = ErrorHandler::static_initialize(new FileErrorHandler(stderr)); - const char *output_file = 0; - Vector<String> glyph_patterns; - - while (1) { - int opt = Clp_Next(clp); - switch (opt) { - - case OUTPUT_OPT: - output_file: - if (output_file) - errh->fatal("output file already specified"); - output_file = clp->vstr; - break; - - case VERSION_OPT: - printf("t1rawafm (LCDF typetools) %s\n", VERSION); - printf("Copyright (C) 2008-2019 Eddie Kohler\n\ -This is free software; see the source for copying conditions.\n\ -There is NO warranty, not even for merchantability or fitness for a\n\ -particular purpose.\n"); - exit(0); - break; - - case HELP_OPT: - usage(); - exit(0); - break; - - case Clp_NotOption: - if (font) - goto output_file; - else - do_file(clp->vstr, psres, errh); - break; - - case Clp_Done: - goto done; - - case Clp_BadOption: - usage_error(errh, 0); - break; - - default: - break; - - } - } - - done: - if (!font) - do_file(0, psres, errh); - - FILE *outf; - if (!output_file || strcmp(output_file, "-") == 0) - outf = stdout; - else { - outf = fopen(output_file, "w"); - if (!outf) - errh->fatal("%s: %s", output_file, strerror(errno)); - } -#if defined(_MSDOS) || defined(_WIN32) - _setmode(_fileno(outf), _O_BINARY); -#endif - - write_afm(outf, font); - - exit(0); -} |