Skip to content

Commit dad8a05

Browse files
committed
Added support for custome encoding to build Adobe Font Metrics files (ie. not Unicode)
1 parent 0ab47bd commit dad8a05

24 files changed

+5318
-5
lines changed

classes/adobe_font_metrics.cls.php

+39-3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
/* $Id$ */
2828

29+
require_once dirname(__FILE__)."/encoding_map.cls.php";
30+
2931
class Adobe_Font_Metrics {
3032
private $f;
3133

@@ -38,15 +40,28 @@ function __construct(Font_TrueType $font) {
3840
$this->font = $font;
3941
}
4042

41-
function write($file){
43+
function write($file, $encoding = null){
44+
if ($encoding) {
45+
$encoding = preg_replace("/[^a-z0-9-_]/", "", $encoding);
46+
$map_file = dirname(__FILE__)."/../maps/$encoding.map";
47+
if (!file_exists($map_file)) {
48+
throw new Exception("Unkown encoding ($encoding)");
49+
}
50+
51+
$map = new Encoding_Map($map_file);
52+
$map_data = $map->parse();
53+
}
54+
4255
$this->f = fopen($file, "w+");
4356

4457
$font = $this->font;
4558

4659
$this->startSection("FontMetrics", 4.1);
4760
$this->addPair("Notice", "Converted by PHP-font-lib");
4861
$this->addPair("Comment", "http://php-font-lib.googlecode.com/");
49-
$this->addPair("EncodingScheme", "FontSpecific");
62+
63+
$encoding_scheme = ($encoding ? $encoding : "FontSpecific");
64+
$this->addPair("EncodingScheme", $encoding_scheme);
5065

5166
$nameRecords = $font->getData("name", "nameRecord");
5267
foreach($nameRecords as $id => $value) {
@@ -102,6 +117,26 @@ function write($file){
102117

103118
$this->startSection("CharMetrics", count($hmtx));
104119

120+
if ($encoding) {
121+
foreach($map_data as $code => $value) {
122+
list($c, $name) = $value;
123+
124+
if (!isset($glyphIndexArray[$c])) continue;
125+
126+
$g = $glyphIndexArray[$c];
127+
128+
if (!isset($hmtx[$g])) {
129+
$hmtx[$g] = $hmtx[0];
130+
}
131+
132+
$this->addMetric(array(
133+
"C" => ($code > 255 ? -1 : $code),
134+
"WX" => $font->normalizeFUnit($hmtx[$g]),
135+
"N" => $name,
136+
));
137+
}
138+
}
139+
else {
105140
foreach($glyphIndexArray as $c => $g) {
106141
if (!isset($hmtx[$g])) {
107142
$hmtx[$g] = $hmtx[0];
@@ -114,13 +149,14 @@ function write($file){
114149
"G" => $g,
115150
));
116151
}
152+
}
117153

118154
$this->endSection("CharMetrics");
119155

120156
$kern = $font->getData("kern", "subtable");
121157
$tree = $kern["tree"];
122158

123-
if (is_array($tree)) {
159+
if (!$encoding && is_array($tree)) {
124160
$this->startSection("KernData");
125161
$this->startSection("KernPairs", count($tree, COUNT_RECURSIVE) - count($tree));
126162

classes/encoding_map.cls.php

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
/**
3+
* This library is free software; you can redistribute it and/or
4+
* modify it under the terms of the GNU Lesser General Public
5+
* License as published by the Free Software Foundation; either
6+
* version 2.1 of the License, or (at your option) any later version.
7+
*
8+
* This library is distributed in the hope that it will be useful,
9+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+
* Lesser General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU Lesser General Public License
14+
* along with this library in the file LICENSE.LGPL; if not, write to the
15+
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
16+
* 02111-1307 USA
17+
*
18+
* Alternatively, you may distribute this software under the terms of the
19+
* PHP License, version 3.0 or later. A copy of this license should have
20+
* been distributed with this file in the file LICENSE.PHP . If this is not
21+
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
22+
*
23+
* @link http://php-font-lib.googlecode.com/
24+
* @author Fabien Ménager
25+
*/
26+
27+
/* $Id: adobe_font_metrics.cls.php 19 2011-07-16 13:21:12Z fabien.menager $ */
28+
29+
class Encoding_Map {
30+
private $f;
31+
32+
function __construct($file) {
33+
$this->f = fopen($file, "r");
34+
}
35+
36+
function parse(){
37+
$map = array();
38+
39+
while($line = fgets($this->f)) {
40+
if (preg_match("/^[\!\=]([0-9A-F]{2,})\s+U\+([0-9A-F]{2})([0-9A-F]{2})\s+([^\s]+)/", $line, $matches)) {
41+
$unicode = (hexdec($matches[2]) << 8) + hexdec($matches[3]);
42+
$map[hexdec($matches[1])] = array($unicode, $matches[4]);
43+
}
44+
}
45+
46+
ksort($map);
47+
48+
return $map;
49+
}
50+
}

classes/font_truetype.cls.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -821,8 +821,8 @@ public function getData($name, $key = null) {
821821
}
822822
}
823823

824-
function saveAdobeFontMetrics($file) {
824+
function saveAdobeFontMetrics($file, $encoding = null) {
825825
$afm = new Adobe_Font_Metrics($this);
826-
$afm->write($file);
826+
$afm->write($file, $encoding);
827827
}
828828
}

maps/adobe-standard-encoding.map

+231
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
// Adobe Standard Encoding table for ttf2pt1
2+
// Thomas Henlich <[email protected]>
3+
4+
=20 U+0020 SPACE
5+
=21 U+0021 EXCLAMATION MARK
6+
=22 U+0022 QUOTATION MARK
7+
=23 U+0023 NUMBER SIGN
8+
=24 U+0024 DOLLAR SIGN
9+
=25 U+0025 PERCENT SIGN
10+
=26 U+0026 AMPERSAND
11+
=27 U+2019 RIGHT SINGLE QUOTATION MARK
12+
=28 U+0028 LEFT PARENTHESIS
13+
=29 U+0029 RIGHT PARENTHESIS
14+
=2A U+002A ASTERISK
15+
=2B U+002B PLUS SIGN
16+
=2C U+002C COMMA
17+
=2D U+002D HYPHEN-MINUS
18+
=2E U+002E FULL STOP
19+
=2F U+002F SOLIDUS
20+
=30 U+0030 DIGIT ZERO
21+
=31 U+0031 DIGIT ONE
22+
=32 U+0032 DIGIT TWO
23+
=33 U+0033 DIGIT THREE
24+
=34 U+0034 DIGIT FOUR
25+
=35 U+0035 DIGIT FIVE
26+
=36 U+0036 DIGIT SIX
27+
=37 U+0037 DIGIT SEVEN
28+
=38 U+0038 DIGIT EIGHT
29+
=39 U+0039 DIGIT NINE
30+
=3A U+003A COLON
31+
=3B U+003B SEMICOLON
32+
=3C U+003C LESS-THAN SIGN
33+
=3D U+003D EQUALS SIGN
34+
=3E U+003E GREATER-THAN SIGN
35+
=3F U+003F QUESTION MARK
36+
=40 U+0040 COMMERCIAL AT
37+
=41 U+0041 LATIN CAPITAL LETTER A
38+
=42 U+0042 LATIN CAPITAL LETTER B
39+
=43 U+0043 LATIN CAPITAL LETTER C
40+
=44 U+0044 LATIN CAPITAL LETTER D
41+
=45 U+0045 LATIN CAPITAL LETTER E
42+
=46 U+0046 LATIN CAPITAL LETTER F
43+
=47 U+0047 LATIN CAPITAL LETTER G
44+
=48 U+0048 LATIN CAPITAL LETTER H
45+
=49 U+0049 LATIN CAPITAL LETTER I
46+
=4A U+004A LATIN CAPITAL LETTER J
47+
=4B U+004B LATIN CAPITAL LETTER K
48+
=4C U+004C LATIN CAPITAL LETTER L
49+
=4D U+004D LATIN CAPITAL LETTER M
50+
=4E U+004E LATIN CAPITAL LETTER N
51+
=4F U+004F LATIN CAPITAL LETTER O
52+
=50 U+0050 LATIN CAPITAL LETTER P
53+
=51 U+0051 LATIN CAPITAL LETTER Q
54+
=52 U+0052 LATIN CAPITAL LETTER R
55+
=53 U+0053 LATIN CAPITAL LETTER S
56+
=54 U+0054 LATIN CAPITAL LETTER T
57+
=55 U+0055 LATIN CAPITAL LETTER U
58+
=56 U+0056 LATIN CAPITAL LETTER V
59+
=57 U+0057 LATIN CAPITAL LETTER W
60+
=58 U+0058 LATIN CAPITAL LETTER X
61+
=59 U+0059 LATIN CAPITAL LETTER Y
62+
=5A U+005A LATIN CAPITAL LETTER Z
63+
=5B U+005B LEFT SQUARE BRACKET
64+
=5C U+005C REVERSE SOLIDUS
65+
=5D U+005D RIGHT SQUARE BRACKET
66+
=5E U+005E CIRCUMFLEX ACCENT
67+
=5F U+005F LOW LINE
68+
=60 U+2018 LEFT SINGLE QUOTATION MARK
69+
=61 U+0061 LATIN SMALL LETTER A
70+
=62 U+0062 LATIN SMALL LETTER B
71+
=63 U+0063 LATIN SMALL LETTER C
72+
=64 U+0064 LATIN SMALL LETTER D
73+
=65 U+0065 LATIN SMALL LETTER E
74+
=66 U+0066 LATIN SMALL LETTER F
75+
=67 U+0067 LATIN SMALL LETTER G
76+
=68 U+0068 LATIN SMALL LETTER H
77+
=69 U+0069 LATIN SMALL LETTER I
78+
=6A U+006A LATIN SMALL LETTER J
79+
=6B U+006B LATIN SMALL LETTER K
80+
=6C U+006C LATIN SMALL LETTER L
81+
=6D U+006D LATIN SMALL LETTER M
82+
=6E U+006E LATIN SMALL LETTER N
83+
=6F U+006F LATIN SMALL LETTER O
84+
=70 U+0070 LATIN SMALL LETTER P
85+
=71 U+0071 LATIN SMALL LETTER Q
86+
=72 U+0072 LATIN SMALL LETTER R
87+
=73 U+0073 LATIN SMALL LETTER S
88+
=74 U+0074 LATIN SMALL LETTER T
89+
=75 U+0075 LATIN SMALL LETTER U
90+
=76 U+0076 LATIN SMALL LETTER V
91+
=77 U+0077 LATIN SMALL LETTER W
92+
=78 U+0078 LATIN SMALL LETTER X
93+
=79 U+0079 LATIN SMALL LETTER Y
94+
=7A U+007A LATIN SMALL LETTER Z
95+
=7B U+007B LEFT CURLY BRACKET
96+
=7C U+007C VERTICAL LINE
97+
=7D U+007D RIGHT CURLY BRACKET
98+
=7E U+007E TILDE
99+
=A1 U+00A1 INVERTED EXCLAMATION MARK
100+
=A2 U+00A2 CENT SIGN
101+
=A3 U+00A3 POUND SIGN
102+
=A4 U+2044 FRACTION SLASH
103+
=A5 U+00A5 YEN SIGN
104+
=A6 U+0192 LATIN SMALL LETTER F WITH HOOK
105+
=A7 U+00A7 SECTION SIGN
106+
=A8 U+00A4 CURRENCY SIGN
107+
=A9 U+0027 APOSTROPHE
108+
=AA U+201C LEFT DOUBLE QUOTATION MARK
109+
=AB U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
110+
=AC U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
111+
=AD U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
112+
=AE U+FB01 LATIN SMALL LIGATURE FI
113+
=AF U+FB02 LATIN SMALL LIGATURE FL
114+
=B1 U+2013 EN DASH
115+
=B2 U+2020 DAGGER
116+
=B3 U+2021 DOUBLE DAGGER
117+
=B4 U+00B7 MIDDLE DOT
118+
=B6 U+00B6 PILCROW SIGN
119+
=B7 U+2022 BULLET
120+
=B8 U+201A SINGLE LOW-9 QUOTATION MARK
121+
=B9 U+201E DOUBLE LOW-9 QUOTATION MARK
122+
=BA U+201D RIGHT DOUBLE QUOTATION MARK
123+
=BB U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
124+
=BC U+2026 HORIZONTAL ELLIPSIS
125+
=BD U+2030 PER MILLE SIGN
126+
=BF U+00BF INVERTED QUESTION MARK
127+
=C1 U+0060 GRAVE ACCENT
128+
=C2 U+00B4 ACUTE ACCENT
129+
=C3 U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
130+
=C4 U+02DC SMALL TILDE
131+
=C5 U+00AF MACRON
132+
=C6 U+02D8 BREVE
133+
=C7 U+02D9 DOT ABOVE
134+
=C8 U+00A8 DIAERESIS
135+
=CA U+02DA RING ABOVE
136+
=CB U+00B8 CEDILLA
137+
=CD U+02DD DOUBLE ACUTE ACCENT
138+
=CE U+02DB OGONEK
139+
=CF U+02C7 CARON
140+
=D0 U+2014 EM DASH
141+
=E1 U+00C6 LATIN CAPITAL LETTER AE
142+
=E3 U+00AA FEMININE ORDINAL INDICATOR
143+
=E8 U+0141 LATIN CAPITAL LETTER L WITH STROKE
144+
=E9 U+00D8 LATIN CAPITAL LETTER O WITH STROKE
145+
=EA U+0152 LATIN CAPITAL LIGATURE OE
146+
=EB U+00BA MASCULINE ORDINAL INDICATOR
147+
=F1 U+00E6 LATIN SMALL LETTER AE
148+
=F5 U+0131 LATIN SMALL LETTER DOTLESS I
149+
=F8 U+0142 LATIN SMALL LETTER L WITH STROKE
150+
=F9 U+00F8 LATIN SMALL LETTER O WITH STROKE
151+
=FA U+0153 LATIN SMALL LIGATURE OE
152+
=FB U+00DF LATIN SMALL LETTER SHARP S
153+
154+
// unencoded characters:
155+
=100 U+00E7 LATIN SMALL LETTER C WITH CEDILLA
156+
=101 U+00FF LATIN SMALL LETTER Y WITH DIAERESIS
157+
=102 U+00E3 LATIN SMALL LETTER A WITH TILDE
158+
=103 U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX
159+
=104 U+00B3 SUPERSCRIPT THREE
160+
=105 U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX
161+
=106 U+00FE LATIN SMALL LETTER THORN
162+
=107 U+00E8 LATIN SMALL LETTER E WITH GRAVE
163+
=108 U+00B2 SUPERSCRIPT TWO
164+
=109 U+00E9 LATIN SMALL LETTER E WITH ACUTE
165+
=10A U+00F5 LATIN SMALL LETTER O WITH TILDE
166+
=10B U+00C1 LATIN CAPITAL LETTER A WITH ACUTE
167+
=10C U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX
168+
=10D U+00FD LATIN SMALL LETTER Y WITH ACUTE
169+
=10E U+00FC LATIN SMALL LETTER U WITH DIAERESIS
170+
=10F U+00BE VULGAR FRACTION THREE QUARTERS
171+
=110 U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX
172+
=111 U+00D0 LATIN CAPITAL LETTER ETH
173+
=112 U+00EB LATIN SMALL LETTER E WITH DIAERESIS
174+
=113 U+00F9 LATIN SMALL LETTER U WITH GRAVE
175+
=114 U+2122 TRADE MARK SIGN
176+
=115 U+00F2 LATIN SMALL LETTER O WITH GRAVE
177+
=116 U+0161 LATIN SMALL LETTER S WITH CARON
178+
=117 U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS
179+
=118 U+00FA LATIN SMALL LETTER U WITH ACUTE
180+
=119 U+00E0 LATIN SMALL LETTER A WITH GRAVE
181+
=11A U+00F1 LATIN SMALL LETTER N WITH TILDE
182+
=11B U+00E5 LATIN SMALL LETTER A WITH RING ABOVE
183+
=11C U+017E LATIN SMALL LETTER Z WITH CARON
184+
=11D U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX
185+
=11E U+00D1 LATIN CAPITAL LETTER N WITH TILDE
186+
=11F U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX
187+
=120 U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX
188+
=121 U+00CD LATIN CAPITAL LETTER I WITH ACUTE
189+
=122 U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA
190+
=123 U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS
191+
=124 U+0160 LATIN CAPITAL LETTER S WITH CARON
192+
=125 U+00CC LATIN CAPITAL LETTER I WITH GRAVE
193+
=126 U+00E4 LATIN SMALL LETTER A WITH DIAERESIS
194+
=127 U+00D2 LATIN CAPITAL LETTER O WITH GRAVE
195+
=128 U+00C8 LATIN CAPITAL LETTER E WITH GRAVE
196+
=129 U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
197+
=12A U+00AE REGISTERED SIGN
198+
=12B U+00D5 LATIN CAPITAL LETTER O WITH TILDE
199+
=12C U+00BC VULGAR FRACTION ONE QUARTER
200+
=12D U+00D9 LATIN CAPITAL LETTER U WITH GRAVE
201+
=12E U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX
202+
=12F U+00DE LATIN CAPITAL LETTER THORN
203+
=130 U+00F7 DIVISION SIGN
204+
=131 U+00C3 LATIN CAPITAL LETTER A WITH TILDE
205+
=132 U+00DA LATIN CAPITAL LETTER U WITH ACUTE
206+
=133 U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
207+
=134 U+00AC NOT SIGN
208+
=135 U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
209+
=136 U+00EF LATIN SMALL LETTER I WITH DIAERESIS
210+
=137 U+00ED LATIN SMALL LETTER I WITH ACUTE
211+
=138 U+00E1 LATIN SMALL LETTER A WITH ACUTE
212+
=139 U+00B1 PLUS-MINUS SIGN
213+
=13A U+00D7 MULTIPLICATION SIGN
214+
=13B U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS
215+
=13C U+2212 MINUS SIGN
216+
=13D U+00B9 SUPERSCRIPT ONE
217+
=13E U+00C9 LATIN CAPITAL LETTER E WITH ACUTE
218+
=13F U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
219+
=140 U+00A9 COPYRIGHT SIGN
220+
=141 U+00C0 LATIN CAPITAL LETTER A WITH GRAVE
221+
=142 U+00F6 LATIN SMALL LETTER O WITH DIAERESIS
222+
=143 U+00F3 LATIN SMALL LETTER O WITH ACUTE
223+
=144 U+00B0 DEGREE SIGN
224+
=145 U+00EC LATIN SMALL LETTER I WITH GRAVE
225+
=146 U+00B5 MICRO SIGN
226+
=147 U+00D3 LATIN CAPITAL LETTER O WITH ACUTE
227+
=148 U+00F0 LATIN SMALL LETTER ETH
228+
=149 U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS
229+
=14A U+00DD LATIN CAPITAL LETTER Y WITH ACUTE
230+
=14B U+00A6 BROKEN BAR
231+
=14C U+00BD VULGAR FRACTION ONE HALF

0 commit comments

Comments
 (0)