#!/usr/bin/perl
#
# Copyright (c) 1998
# Sergey A. Babkin. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net)
#
#
# Force the font to use the encoding as close to ISO Latin-1 as possible
#
# Use:
# forceiso [format] <file1.t1a >file2.t1a
# where format is a printf-type format used to select names for the
# glyphs without standard Latin-1 names. It must expect one argument,
# the character code. The default format is "_%d".
%latin1=(
0, "",
1, "",
2, "",
3, "",
4, "",
5, "",
6, "",
7, "",
8, "",
9, "",
10, "",
11, "",
12, "",
13, "",
14, "",
15, "",
16, "",
17, "",
18, "",
19, "",
20, "",
21, "",
22, "",
23, "",
24, "",
25, "",
26, "",
27, "",
28, "",
29, "",
30, "",
31, "",
32, "space",
33, "exclam",
34, "quotedbl",
35, "numbersign",
36, "dollar",
37, "percent",
38, "ampersand",
39, "quoteright",
40, "parenleft",
41, "parenright",
42, "asterisk",
43, "plus",
44, "comma",
45, "hyphen",
46, "period",
47, "slash",
48, "zero",
49, "one",
50, "two",
51, "three",
52, "four",
53, "five",
54, "six",
55, "seven",
56, "eight",
57, "nine",
58, "colon",
59, "semicolon",
60, "less",
61, "equal",
62, "greater",
63, "question",
64, "at",
65, "A",
66, "B",
67, "C",
68, "D",
69, "E",
70, "F",
71, "G",
72, "H",
73, "I",
74, "J",
75, "K",
76, "L",
77, "M",
78, "N",
79, "O",
80, "P",
81, "Q",
82, "R",
83, "S",
84, "T",
85, "U",
86, "V",
87, "W",
88, "X",
89, "Y",
90, "Z",
91, "bracketleft",
92, "backslash",
93, "bracketright",
94, "asciicircum",
95, "underscore",
96, "grave",
97, "a",
98, "b",
99, "c",
100, "d",
101, "e",
102, "f",
103, "g",
104, "h",
105, "i",
106, "j",
107, "k",
108, "l",
109, "m",
110, "n",
111, "o",
112, "p",
113, "q",
114, "r",
115, "s",
116, "t",
117, "u",
118, "v",
119, "w",
120, "x",
121, "y",
122, "z",
123, "braceleft",
124, "bar",
125, "braceright",
126, "asciitilde",
127, "",
128, "",
129, "",
130, "",
131, "",
132, "",
133, "",
134, "",
135, "",
136, "",
137, "",
138, "",
139, "",
140, "",
141, "",
142, "",
143, "",
144, "",
145, "",
146, "",
147, "",
148, "",
149, "",
150, "",
151, "",
152, "",
153, "",
154, "",
155, "",
156, "",
157, "",
158, "",
159, "",
160, "",
161, "exclamdown",
162, "cent",
163, "sterling",
164, "currency",
165, "yen",
166, "brokenbar",
167, "section",
168, "dieresis",
169, "copyright",
170, "ordfeminine",
171, "guillemotleft",
172, "logicalnot",
173, "minus",
174, "registered",
175, "macron",
176, "degree",
177, "plusminus",
178, "twosuperior",
179, "threesuperior",
180, "acute",
181, "mu",
182, "paragraph",
183, "periodcentered",
184, "cedilla",
185, "onesuperior",
186, "ordmasculine",
187, "guillemotright",
188, "onequarter",
189, "onehalf",
190, "threequarters",
191, "questiondown",
192, "Agrave",
193, "Aacute",
194, "Acircumflex",
195, "Atilde",
196, "Adieresis",
197, "Aring",
198, "AE",
199, "Ccedilla",
200, "Egrave",
201, "Eacute",
202, "Ecircumflex",
203, "Edieresis",
204, "Igrave",
205, "Iacute",
206, "Icircumflex",
207, "Idieresis",
208, "Eth",
209, "Ntilde",
210, "Ograve",
211, "Oacute",
212, "Ocircumflex",
213, "Otilde",
214, "Odieresis",
215, "multiply",
216, "Oslash",
217, "Ugrave",
218, "Uacute",
219, "Ucircumflex",
220, "Udieresis",
221, "Yacute",
222, "Thorn",
223, "germandbls",
224, "agrave",
225, "aacute",
226, "acircumflex",
227, "atilde",
228, "adieresis",
229, "aring",
230, "ae",
231, "ccedilla",
232, "egrave",
233, "eacute",
234, "ecircumflex",
235, "edieresis",
236, "igrave",
237, "iacute",
238, "icircumflex",
239, "idieresis",
240, "eth",
241, "ntilde",
242, "ograve",
243, "oacute",
244, "ocircumflex",
245, "otilde",
246, "odieresis",
247, "divide",
248, "oslash",
249, "ugrave",
250, "uacute",
251, "ucircumflex",
252, "udieresis",
253, "yacute",
254, "thorn",
255, "ydieresis"
);
# how to treat the unknown characters
$unk = "_%d";
if($#ARGV >= 0) {
$unk = $ARGV[0];
}
# fill in the unnamed characters
if( sprintf($unk, 0) eq sprintf($unk, 1) ) {
die "The format for unnamed characters must not be a constant"
}
for($i=0; $i < 256; $i++) {
if($latin1{$i} eq "") {
$latin1{$i} = sprintf($unk, $i);
}
}
while(<STDIN>) {
print $_;
if(/^\/Encoding\s+.*\s+array/) {
$fontfile=1;
last;
}
if(/^StartCharMetrics\s+/) {
$fontfile=0;
last;
}
}
$ndups=0;
if($fontfile) { # .t1a file
while(<STDIN>) {
if($_ !~ /^dup\s+(\d+)\s+\/(\S+)\s+put/) {
print $_;
last;
}
$code=$1+0;
$name=$2;
if($name eq ".notdef") {
print $_;
} else {
printf("dup %d /%s put\n",$code,$latin1{$code});
if($trans{$name}) { # two or more references to the same glyph
$ndups++;
#printf(STDERR "forceiso: %d dups\n", $ndups);
if($copies{$name} eq "") {
$copies{$name} = $latin1{$code};
} else {
$copies{$name} .= "|" . $latin1{$code};
}
} else {
$trans{$name}=$latin1{$code};
}
}
}
while(<STDIN>) {
if( /\/CharStrings\s+(\d+)\s/) {
$nchars=$1+$ndups;
#printf(STDERR "forceiso: %d dups %d chars\n", $ndups, $nchars);
$_ =~ s|/CharStrings\s+\d+\s|/CharStrings $nchars |;
print $_;
last;
}
print $_;
}
while(<STDIN>) {
if(/^\/(\S+)/) {
$name=$1;
$to=$trans{$name};
$header=$_;
$body="";
if($to ne "") {
$_ =~ s/^\/\S+/\/$to/;
}
print $_;
} elsif(/endchar/) {
print $_;
if($copies{$name}) {
for $to (split(/\|/,$copies{$name})) {
$header =~ s/^\/\S+/\/$to/;
print($header, $body, $_);
}
}
} else {
print $_;
$body .= $_;
}
}
} else { # .afm file
while(<STDIN>) {
if($_ !~ /^C\s+(\d+)(\s*;.*N\s+)(\S+)(\s*;.*)\n/) {
print $_;
last;
}
$code=$1+0;
$name=$3;
$part2=$2;
$part4=$4;
if($name eq ".notdef") {
print $_;
} else {
printf("C %d%s%s%s\n",$code,$part2,$latin1{$code},$part4);
if($copies{$name} eq "") {
$copies{$name} = $latin1{$code};
} else {
$copies{$name} .= "|" . $latin1{$code};
$ndups++;
#printf(STDERR "forceiso: %d dups\n", $ndups);
}
}
}
while(<STDIN>) {
if(/^StartKernPairs\s+(\d+)/) {
last;
}
print $_;
}
$npairs=0;
$kps="";
while(<STDIN>) {
if(/^KPX\s+(\S+)\s+(\S+)\s+(.*)\n/) {
$name1=$1;
$name2=$2;
$metric=$3;
$cp1=$copies{$name1};
if($cp1 eq "") {
$cp1=$name1;
}
$cp2=$copies{$name2};
if($cp2 eq "") {
$cp2=$name2;
}
for $to1 (split(/\|/,$cp1)) {
for $to2 (split(/\|/,$cp2)) {
$kps .= sprintf("KPX %s %s %s\n", $to1, $to2, $metric);
$npairs++;
}
}
} else {
if($npairs!=0) {
printf("StartKernPairs %d\n", $npairs);
printf("%s", $kps);
$npairs=0;
$kps="";
}
print $_;
}
}
}
|