diff -urN freetype/contrib/ttf2pk/newobj.c.orig freetype/contrib/ttf2pk/newobj.c --- freetype/contrib/ttf2pk/newobj.c.orig Sat Apr 15 02:53:50 2000 +++ freetype/contrib/ttf2pk/newobj.c Wed Nov 28 13:11:04 2001 @@ -304,6 +304,8 @@ fnt->sawligkern = False; fnt->subfont_ligs = False; + fnt->subfont_ligs_hlatex = False; + fnt->write_enc = False; fnt->charlist = NULL; diff -urN freetype/contrib/ttf2pk/tfmaux.c.orig freetype/contrib/ttf2pk/tfmaux.c --- freetype/contrib/ttf2pk/tfmaux.c.orig Sat Apr 15 02:53:50 2000 +++ freetype/contrib/ttf2pk/tfmaux.c Wed Nov 28 13:13:32 2001 @@ -291,6 +291,18 @@ if (fnt->subfont_ligs) { +/* + * Patched by ChoF on Nov 27, 2001 to support HLaTeX ligature + * + * TrueType fonts with Pid=3, Eid=1 (Unicode) do not contain KSX-1001 + * character codes (Wansung) so that we need to load KSX-1001 character + * codes before processing ligatures. + */ + if (fnt->subfont_ligs_hlatex) + load_ksx_codes(fnt, sf_array); + else + { + for (i = 0; i < 256; i++) { ti = fnt->inencptrs[i]; @@ -305,6 +317,8 @@ sf_array[i].position = -1; } } + + } /* endif */ /* we sort the subfont character codes before we build a ligkern list */ qsort(sf_array, 256, sizeof (struct sf), compare_sf); @@ -573,6 +587,227 @@ free(header); fclose(out); +} + + +/* + * writeenc() was written by ChoF on Nov 27, 2001 to generate enconding + * vectors containing glyph indices. The new option -w enables this + * feature. + */ +void +writeenc(Font *fnt) +{ + FILE *out; + char *enc_name; + int i, len = 0; + + + if (fnt->tfm_path) + len += strlen(fnt->tfm_path); + len += strlen(fnt->fullname); + len += 5; /* ".enc" + 1 */ + + enc_name = (char *)mymalloc(len); + enc_name[0] = '\0'; + if (fnt->tfm_path) + strcat(enc_name, fnt->tfm_path); + strcat(enc_name, fnt->fullname); + strcat(enc_name, ".enc"); + + if ((out = fopen(enc_name, "wb")) == NULL) + oops("Cannot open enc file `%s'.", enc_name); + + free(enc_name); + + fprintf(out, "/%sEncoding [", fnt->fullname); + for (i = 0; i < 256; i++) + { + if (i % 4 == 0) + fputc('\n', out); + if (fnt->inencptrs[i] == NULL) + fputs("/.notdef ", out); + else if (strcmp(fnt->inencptrs[i]->adobename, ".notdef") == 0 || + strcmp(fnt->inencptrs[i]->adobename, ".null") == 0 || + strcmp(fnt->inencptrs[i]->adobename, ".nonmarkingreturn") == 0 || + strcmp(fnt->inencptrs[i]->adobename, ".dummy") == 0) + fputs("/.notdef ", out); + else + fprintf(out, "/index0x%04X ", fnt->inencptrs[i]->glyphindex); + } + fputs("\n] def", out); + + fclose(out); +} + + +/* + * load_ksx_codes() was written by ChoF on Nov 27, 2001 to support + * HLaTeX ligature which is enabled by the new option -L. + */ +struct _coderange { + unsigned int b, e; +}; +typedef struct _coderange coderange; + +/* KSX-1001 Hangul Codes for HLaTeX */ +static coderange HAN0[] = { + {0xB0A1,0xB0FE}, {0xB1A1,0xB1FE}, {0xB2A1,0xB2E4}, {0,0} +}; +static coderange HAN1[] = { + {0xB2E5,0xB2FE}, {0xB3A1,0xB3FE}, {0xB4A1,0xB4FE}, {0xB5A1,0xB5CA}, {0,0} +}; +static coderange HAN2[] = { + {0xB5CB,0xB5FE}, {0xB6A1,0xB6FE}, {0xB7A1,0xB7FE}, {0xB8A1,0xB8B0}, {0,0} +}; +static coderange HAN3[] = { + {0xB8B1,0xB8FE}, {0xB9A1,0xB9FE}, {0xBAA1,0xBAF4}, {0,0} +}; +static coderange HAN4[] = { + {0xBAF5,0xBAFE}, {0xBBA1,0xBBFE}, {0xBCA1,0xBCFE}, {0xBDA1,0xBDDA}, {0,0} +}; +static coderange HAN5[] = { + {0xBDDB,0xBDFE}, {0xBEA1,0xBEFE}, {0xBFA1,0xBFFE}, {0xC0A1,0xC0C0}, {0,0} +}; +static coderange HAN6[] = { + {0xC0C1,0xC0FE}, {0xC1A1,0xC1FE}, {0xC2A1,0xC2FE}, {0xC3A1,0xC3A6}, {0,0} +}; +static coderange HAN7[] = { + {0xC3A7,0xC3FE}, {0xC4A1,0xC4FE}, {0xC5A1,0xC5EA}, {0,0} +}; +static coderange HAN8[] = { + {0xC5EB,0xC5FE}, {0xC6A1,0xC6FE}, {0xC7A1,0xC7FE}, {0xC8A1,0xC8D0}, {0,0} +}; +static coderange HAN9[] = { + {0xC8D1,0xC8FE}, {0,0} +}; + +/* KSX-1001 Hanja Codes for HLaTeX */ +static coderange HJ10[] = { + {0xCAA1,0xCAFE}, {0xCBA1,0xCBFE}, {0xCCA1,0xCCE4}, {0,0} +}; +static coderange HJ11[] = { + {0xCCE5,0xCCFE}, {0xCDA1,0xCDFE}, {0xCEA1,0xCEFE}, {0xCFA1,0xCFCA}, {0,0} +}; +static coderange HJ12[] = { + {0xCFCB,0xCFFE}, {0xD0A1,0xD0FE}, {0xD1A1,0xD1FE}, {0xD2A1,0xD2B0}, {0,0} +}; +static coderange HJ13[] = { + {0xD2B1,0xD2FE}, {0xD3A1,0xD3FE}, {0xD4A1,0xD4F4}, {0,0} +}; +static coderange HJ14[] = { + {0xD4F5,0xD4FE}, {0xD5A1,0xD5FE}, {0xD6A1,0xD6FE}, {0xD7A1,0xD7DA}, {0,0} +}; +static coderange HJ15[] = { + {0xD7DB,0xD7FE}, {0xD8A1,0xD8FE}, {0xD9A1,0xD9FE}, {0xDAA1,0xDAC0}, {0,0} +}; +static coderange HJ16[] = { + {0xDAC1,0xDAFE}, {0xDBA1,0xDBFE}, {0xDCA1,0xDCFE}, {0xDDA1,0xDDA6}, {0,0} +}; +static coderange HJ17[] = { + {0xDDA7,0xDDFE}, {0xDEA1,0xDEFE}, {0xDFA1,0xDFEA}, {0,0} +}; +static coderange HJ18[] = { + {0xDFEB,0xDFFE}, {0xE0A1,0xE0FE}, {0xE1A1,0xE1FE}, {0xE2A1,0xE2D0}, {0,0} +}; +static coderange HJ19[] = { + {0xE2D1,0xE2FE}, {0xE3A1,0xE3FE}, {0xE4A1,0xE4FE}, {0xE5A1,0xE5B6}, {0,0} +}; +static coderange HJ20[] = { + {0xE5B7,0xE5FE}, {0xE6A1,0xE6FE}, {0xE7A1,0xE7FA}, {0,0} +}; +static coderange HJ21[] = { + {0xE7FB,0xE7FE}, {0xE8A1,0xE8FE}, {0xE9A1,0xE9FE}, {0xEAA1,0xEAE0}, {0,0} +}; +static coderange HJ22[] = { + {0xEAE1,0xEAFE}, {0xEBA1,0xEBFE}, {0xECA1,0xECFE}, {0xEDA1,0xEDC6}, {0,0} +}; +static coderange HJ23[] = { + {0xEDC7,0xEDFE}, {0xEEA1,0xEEFE}, {0xEFA1,0xEFFE}, {0xF0A1,0xF0AC}, {0,0} +}; +static coderange HJ24[] = { + {0xF0AD,0xF0FE}, {0xF1A1,0xF1FE}, {0xF2A1,0xF2F0}, {0,0} +}; +static coderange HJ25[] = { + {0xF2F1,0xF2FE}, {0xF3A1,0xF3FE}, {0xF4A1,0xF4FE}, {0xF5A1,0xF5D6}, {0,0} +}; +static coderange HJ26[] = { + {0xF5D7,0xF5FE}, {0xF6A1,0xF6FE}, {0xF7A1,0xF7FE}, {0xF8A1,0xF8BC}, {0,0} +}; +static coderange HJ27[] = { + {0xF8BD,0xF8FE}, {0xF9A1,0xF9FE}, {0xFAA1,0xFAFE}, {0xFBA1,0xFBA2}, {0,0} +}; +static coderange HJ28[] = { + {0xFBA3,0xFBFE}, {0xFCA1,0xFCFE}, {0xFDA1,0xFDE6}, {0,0} +}; +static coderange HJ29[] = { + {0xFDE7,0xFDFE}, {0,0} +}; + +/* KSX-1001 Symbol Codes for HLaTeX */ +static coderange SY04[] = { + {0xA4A1,0xA4D3}, {0xA3DC,0xA3DC}, {0xA4D5,0xA4FE}, {0xA8B1,0xA8F5}, + {0xA9B1,0xA9F5}, {0,0} +}; +static coderange SY05[] = { + {0xA1A2,0xA1FE}, {0xA2A1,0xA2E5}, {0xA7A1,0xA7EF}, {0,0} +}; +static coderange SY06[] = { + {0xA6A1,0xA6E4}, {0xA8F6,0xA8FE}, {0xA9F6,0xA9FE}, {0xAAA1,0xAAF3}, + {0xABA1,0xABF6}, {0,0} +}; +static coderange SY07[] = { + {0xA3A1,0xA3DB}, {0xA3DD,0xA3FE}, {0xA5A1,0xA5AA}, {0xA5B0,0xA5B9}, + {0xA5C1,0xA5D8}, {0xA5E1,0xA5F8}, {0xA8A1,0xA8A4}, {0xA8A6,0xA8A6}, + {0xA8A8,0xA8AF}, {0xA9A1,0xA9B0}, {0xACA1,0xACC1}, {0xACD1,0xACF1}, {0,0} +}; + +static coderange *KSX[] = { + HAN0, HAN1, HAN2, HAN3, HAN4, HAN5, HAN6, HAN7, HAN8, HAN9, + HJ10, HJ11, HJ12, HJ13, HJ14, HJ15, HJ16, HJ17, HJ18, HJ19, + HJ20, HJ21, HJ22, HJ23, HJ24, HJ25, HJ26, HJ27, HJ28, HJ29, + SY04, SY05, SY06, SY07 +}; + + +void +load_ksx_codes(Font *fnt, struct sf *sf_array) +{ + register int i; + register unsigned int code; + register coderange *range; + + + i = atoi(fnt->subfont_name); + + if (i >=4 && i <=7 && strlen(fnt->subfont_name) == 2) + i += 26; /* Symbol 04-07 correspond to KSX[30-33] */ + else if (i < 0 || i > 29) + oops("Invalid subfont name %d.", i); + + range = KSX[i]; + + for (i = 0, code = range->b; i < 256 && code; i++) + { + if (fnt->inencptrs[i]) + { + sf_array[i].sf_code = (long)code; + sf_array[i].position = i; + } + else + { + sf_array[i].sf_code = -1; + sf_array[i].position = -1; + } + if (++code > range->e) + code = (++range)->b; + } + + for (; i < 256; i++) + { + sf_array[i].sf_code = -1; + sf_array[i].position = -1; + } } diff -urN freetype/contrib/ttf2pk/tfmaux.h.orig freetype/contrib/ttf2pk/tfmaux.h --- freetype/contrib/ttf2pk/tfmaux.h.orig Sat Apr 15 02:53:50 2000 +++ freetype/contrib/ttf2pk/tfmaux.h Wed Nov 28 13:13:54 2001 @@ -21,6 +21,8 @@ int buildtfm(Font *fnt); void writetfm(Font *fnt); +void writeenc(Font *fnt); +void load_ksx_codes(); #endif /* TFMAUX_H */ diff -urN freetype/contrib/ttf2pk/ttf2pk.c.orig freetype/contrib/ttf2pk/ttf2pk.c --- freetype/contrib/ttf2pk/ttf2pk.c.orig Sat Apr 15 02:53:50 2000 +++ freetype/contrib/ttf2pk/ttf2pk.c Wed Nov 28 13:18:00 2001 @@ -27,8 +27,10 @@ #include "subfont.h" -char ident[] = "ttf2pk version 1.4"; +char ident[] = "ttf2pk version 1.4 (patched by ChoF on Nov 27, 2001)"; char progname[] = "ttf2pk"; /* for error/warning messages */ +static char *cfg_filename = "ttf2pk.cfg"; +char *mapfiles; Boolean have_sfd = False; @@ -88,6 +90,8 @@ ttf2pk is partially based on gsftopk from P. Vojta\n\ and the FreeType project from\n\ David Turner, Robert Wilhelm, and Werner Lemberg\n\ +\n\ +Patched by ChoF on Nov 27, 2001 to support multiple map files.\n\ " static void @@ -196,21 +200,104 @@ } +/* + * add_mapfile() was written by ChoF on Nov 27, 2001 + * to support multiple map files. + */ +static void +add_mapfile(char *p) +{ + char *q; + + if (*p != '+') /* if the fist character is not '+' reset mapfiles */ + { + if (mapfiles != 0) + { + free(mapfiles); + mapfiles = 0; + } + } + else + while (isspace(*++p)); + for (q = p; *q != 0 && !isspace(*q); q++); + *q = '\n'; /* '\n' is the splitting character */ + if (mapfiles == 0) + { + mapfiles = (char *)malloc((q - p + 2) * sizeof(char)); + *mapfiles = '\0'; + } + else + mapfiles = (char *)realloc(mapfiles, + (strlen(mapfiles) + q - p + 2) * sizeof(char *)); + strncat(mapfiles, p, (unsigned)(q - p)); + strcat(mapfiles, "\n"); +} + + +/* + * read_config_file() was written by ChoF on Nov 27, 2001 + * to support multiple map files. + */ +static void +read_config_file(Boolean quiet) +{ + FILE *config_file; + char *p, *configline, *real_cfg_filename; + + + real_cfg_filename = TeX_search_config_file(&cfg_filename); + if (real_cfg_filename) + { + config_file = fopen(real_cfg_filename, "rt"); + if (config_file != NULL) + { + for (;;) + { + if (!(configline = get_line(config_file))) + oops("Error while reading %s.", cfg_filename); + if (!*configline) + break; + p = configline; + while (isspace(*p)) + p++; + if (*p == '*' || *p == '#' || *p == ';' || *p == '%') /* ignore comments */ + continue; + if (strncmp(p, "map", 3) != 0 || strlen(p) < 5) + continue; + p+=3; /* move by the size of "map" */ + while (isspace(*p)) + p++; + if (*p) + add_mapfile(p); + } + fclose(config_file); + } + else if (!quiet) + warning("Cannot open file %s.", cfg_filename); + } + else if (!quiet) + warning("Cannot find file %s. Use ttfonts.map instead.", cfg_filename); + + if (mapfiles == 0) + mapfiles = newstring("ttfonts.map\n"); +} + + int main(int argc, char** argv) { size_t l; unsigned int i; long index, code; - FILE *config_file; + FILE *map_file; char *configline, *oldconfigline, *p, *q; Font font; encoding *enc; long inenc_array[256]; char *fontname; size_t fontname_len; - char *pk_filename, *tfm_filename, *enc_filename, *cfg_filename; - char *real_ttfname, *real_cfg_filename; + char *pk_filename, *tfm_filename, *enc_filename, *map_filename; + char *real_ttfname, *real_map_filename; int dpi = 0, ptsize; Boolean hinting = True; Boolean quiet = False; @@ -273,36 +360,60 @@ init_font_structure(&font); - cfg_filename = newstring("ttfonts.map"); - real_cfg_filename = TeX_search_config_file(&cfg_filename); - if (!real_cfg_filename) - oops("Cannot find file ttfonts.map."); - - config_file = fopen(real_cfg_filename, "rt"); - if (config_file == NULL) - oops("Cannot open file ttfonts.map."); +/* patched by ChoF on Nov 27, 2001 to support multiple map files */ + mapfiles = 0; + read_config_file(quiet); - do + p = mapfiles; + while (*p != 0) { - configline = get_line(config_file); - if (!configline) - oops("Error while reading ttfonts.map."); - if (!*configline) + map_filename = p; + while (*p != '\n') p++; + *p++ = '\0'; + + real_map_filename = TeX_search_config_file(&map_filename); + if (!real_map_filename) { - /* - * This is the only error message we suppress if the -q flag - * is set, making it possible to call ttf2pk silently. - */ if (!quiet) - fprintf(stdout, - "%s: ERROR: Cannot find font %s in ttfonts.map.\n", - progname, fontname); - exit(2); + warning("Cannot find file %s.", map_filename); + continue; } - } while (compare(&font, configline, fontname)); - fclose(config_file); + map_file = fopen(real_map_filename, "rt"); + if (map_file == NULL) + { + if (!quiet) + warning("Cannot open file %s.", map_filename); + continue; + } + + for (;;) + { + if (!(configline = get_line(map_file))) + oops("Error while reading %s.", map_filename); + if (!*configline) + break; + if (compare(&font, configline, fontname) == 0) + { + fclose(map_file); + goto font_found; + } + } + + fclose(map_file); + } + + /* + * This is the only error message we suppress if the -q flag + * is set, making it possible to call ttf2pk silently. + */ + if (!quiet) + fprintf(stdout, + "%s: ERROR: Cannot find font %s in the map files.\n", + progname, fontname); + exit(2); +font_found: if (testing) { if (!quiet) diff -urN freetype/contrib/ttf2pk/ttf2tfm.c.orig freetype/contrib/ttf2pk/ttf2tfm.c --- freetype/contrib/ttf2pk/ttf2tfm.c.orig Sat Apr 15 02:53:50 2000 +++ freetype/contrib/ttf2pk/ttf2tfm.c Wed Nov 28 13:21:50 2001 @@ -38,7 +38,7 @@ #include "subfont.h" -char ident[] = "ttf2tfm version 1.4"; +char ident[] = "ttf2tfm version 1.4 (patched by ChoF on Nov 27, 2001)"; char progname[] = "ttf2tfm"; /* for error/warning messages */ /* command line options */ @@ -245,6 +245,9 @@ ttf2tfm is based on afm2tfm from T. Rokicki\n\ and the FreeType project from\n\ David Turner, Robert Wilhelm, and Werner Lemberg.\n\ +\n\ +Patched by ChoF on Nov 27, 2001 to support HLaTeX ligature\n\ +and generate encoding vectors.\n\ " static void @@ -265,6 +268,7 @@ -E INT select INT as the TTF encoding ID [1]\n\ -f INT select INT as the font index in a TTC [0]\n\ -l create 1st/2nd byte ligatures in subfonts\n\ +-L create 1st/2nd byte ligatures in subfonts for HLaTeX\n\ -n use PS names of TrueType font\n\ -N use only PS names and no cmap\n\ -O use octal for all character codes in the vpl file\n\ @@ -279,6 +283,7 @@ -u output only characters from encodings, nothing extra\n\ -v FILE[.vpl] make a VPL file for conversion to VF\n\ -V SCFILE[.vpl] like -v, but synthesize smallcaps as lowercase\n\ +-w generate encoding vectors containing glyph indices\n\ -x rotate subfont glyphs by 90 degrees\n\ -y REAL move rotated glyphs down by a factor of REAL [0.25]\n\ --help print this message and exit\n\ @@ -498,11 +503,19 @@ arginc = 1; break; + case 'L': + fnt->subfont_ligs_hlatex = True; + case 'l': fnt->subfont_ligs = True; arginc = 1; break; + case 'w': + fnt->write_enc = True; + arginc = 1; + break; + case 'x': fnt->rotate = True; arginc = 1; @@ -683,6 +696,12 @@ fnt->rotate = False; } + if (fnt->write_enc) + { + warning("Ignoring `-w' switch for non-subfont."); + fnt->write_enc = False; + } + if (fnt->y_offsetparam) warning("Ignoring `-y' switch for non-subfont."); } @@ -841,7 +860,11 @@ font.fontspace = transform(500, 0, font.efactor, font.slant); if (buildtfm(&font)) + { writetfm(&font); + if (font.write_enc) + writeenc(&font); + } } close_sfd(); diff -urN freetype/contrib/ttf2pk/ttf2tfm.h.orig freetype/contrib/ttf2pk/ttf2tfm.h --- freetype/contrib/ttf2pk/ttf2tfm.h.orig Sat Apr 15 02:53:50 2000 +++ freetype/contrib/ttf2pk/ttf2tfm.h Wed Nov 28 13:22:44 2001 @@ -173,6 +173,10 @@ output encoding file */ Boolean subfont_ligs; /* ligatures 1st byte/2nd byte in subfonts wanted */ + Boolean subfont_ligs_hlatex; /* ligatures 1st byte/2nd byte in + subfonts for HLaTeX wanted */ + Boolean write_enc; /* generate encoding vectors + containing glyph indices wanted */ ttfinfo *charlist; /* a linked list of all valid chars */