OSDN Git Service

libjava/ChangeLog:
[pf3gnuchains/gcc-fork.git] / libjava / classpath / gnu / java / awt / font / opentype / GlyphNamer.java
1 /* GlyphNamer.java -- Provides glyph names.
2    Copyright (C) 2006 Free Software Foundation, Inc.
3
4 This file is part of GNU Classpath.
5
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37
38 package gnu.java.awt.font.opentype;
39
40 import gnu.java.lang.CPStringBuilder;
41
42 import java.nio.ByteBuffer;
43 import java.nio.IntBuffer;
44 import java.nio.CharBuffer;
45
46
47 /**
48  * Provides names for glyphs, which is useful when embedding fonts
49  * in PostScript or PDF documents.
50  *
51  * <p>If the font has a <code>Zapf</code> table, it is used to map
52  * glyph IDs back to a sequence of Unicode codepoints, which then
53  * makes it possible to look up or synthesize a PostScript glyph name
54  * according to Adobe&#x2019;s conventions. This allows to extract the
55  * original text from the generated PDF or PostScript file, which is
56  * important for indexing, searching and extracting.
57  *
58  * <p>Otherwise, glyph names are taken from the <a href=
59  * "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6post.html"
60  * ><code>post</code> table</a>. All known formats (1, 2, 2.5, 3 and
61  * 4) are supported.
62  *
63  * <p><b>Open Tasks:</b> The code could be cleaner structured by
64  * having separate sub-classes for each variant of the POST table.
65  * Also, the implementation should not read in all glyph names if a
66  * font provides them in a POST table of type 2. It would be
67  * sufficient to just read in the offsets and delay the String
68  * fetching and conversion to the time when the glyph name is actually
69  * requested.
70  *
71  * <p><b>Lack of Thread Safety:</b> The GlyphNamer class is
72  * intentionally <i>not</i> safe to access from multiple concurrent
73  * threads. Synchronization needs to be performed externally. Usually,
74  * the font has already obtained a lock before calling the GlyphNamer.
75  * It would thus be wasteful to acquire additional locks for the
76  * GlyphNamer.
77  *
78  * @author Sascha Brawer (brawer@dandelis.ch)
79  */
80 final class GlyphNamer
81 {
82   /**
83    * The 'post' table of the font.
84    */
85   private ByteBuffer postTable;
86
87
88   /**
89    * The 'Zapf' table of the font, or null if the font has no
90    * such table.
91    */
92   private ByteBuffer zapfTable;
93
94
95   /**
96    * The offset of each glyph relative to the Zapf table,
97    * or null if the font does not have a Zapf table.
98    */
99   private IntBuffer zapfOffsets;
100
101
102   /**
103    * The offset from the start of the Zapf table to the start
104    * of the extra info area.
105    */
106   private int zapfExtraInfo;
107
108
109   /**
110    * The format of the post table, a Fixed 16.16 number.
111    */
112   private int postFormat;
113
114
115   /**
116    * An array of glyph names. Used for table formats 1, 2, 2.5.
117    */
118   private String[] glyphNames;
119
120
121   /**
122    * An array from glyph to character codes. Similar to the
123    * workings of a Zapf table, but maps to CID instead of
124    * Unicode. Used for table format 4.
125    */
126   private CharBuffer glyphCharacterCodes;
127
128
129   /**
130    * The PostScript names of the 258 standard Macintosh glyphs.  Note
131    * that some of these glyphs are not in the Adobe Standard Glyph
132    * List for New Fonts, namely .notdef, .null, nonmarkingreturn,
133    * nonbreakingspace, apple, onesuperior, twosuperior, and
134    * threesuperior.
135    */
136   private static final String[] STANDARD_POSTSCRIPT_GLYPH_NAMES =
137   {
138     ".notdef",               // glyph #0
139     ".null",                 // glyph #1
140     "nonmarkingreturn",      // glyph #2
141     "space",                 // glyph #3
142     "exclam",                // glyph #4
143     "quotedbl",              // glyph #5
144     "numbersign",            // glyph #6
145     "dollar",                // glyph #7
146     "percent",               // glyph #8
147     "ampersand",             // glyph #9
148     "quotesingle",           // glyph #10
149     "parenleft",             // glyph #11
150     "parenright",            // glyph #12
151     "asterisk",              // glyph #13
152     "plus",                  // glyph #14
153     "comma",                 // glyph #15
154     "hyphen",                // glyph #16
155     "period",                // glyph #17
156     "slash",                 // glyph #18
157     "zero",                  // glyph #19
158     "one",                   // glyph #20
159     "two",                   // glyph #21
160     "three",                 // glyph #22
161     "four",                  // glyph #23
162     "five",                  // glyph #24
163     "six",                   // glyph #25
164     "seven",                 // glyph #26
165     "eight",                 // glyph #27
166     "nine",                  // glyph #28
167     "colon",                 // glyph #29
168     "semicolon",             // glyph #30
169     "less",                  // glyph #31
170     "equal",                 // glyph #32
171     "greater",               // glyph #33
172     "question",              // glyph #34
173     "at",                    // glyph #35
174     "A",                     // glyph #36
175     "B",                     // glyph #37
176     "C",                     // glyph #38
177     "D",                     // glyph #39
178     "E",                     // glyph #40
179     "F",                     // glyph #41
180     "G",                     // glyph #42
181     "H",                     // glyph #43
182     "I",                     // glyph #44
183     "J",                     // glyph #45
184     "K",                     // glyph #46
185     "L",                     // glyph #47
186     "M",                     // glyph #48
187     "N",                     // glyph #49
188     "O",                     // glyph #50
189     "P",                     // glyph #51
190     "Q",                     // glyph #52
191     "R",                     // glyph #53
192     "S",                     // glyph #54
193     "T",                     // glyph #55
194     "U",                     // glyph #56
195     "V",                     // glyph #57
196     "W",                     // glyph #58
197     "X",                     // glyph #59
198     "Y",                     // glyph #60
199     "Z",                     // glyph #61
200     "bracketleft",           // glyph #62
201     "backslash",             // glyph #63
202     "bracketright",          // glyph #64
203     "asciicircum",           // glyph #65
204     "underscore",            // glyph #66
205     "grave",                 // glyph #67
206     "a",                     // glyph #68
207     "b",                     // glyph #69
208     "c",                     // glyph #70
209     "d",                     // glyph #71
210     "e",                     // glyph #72
211     "f",                     // glyph #73
212     "g",                     // glyph #74
213     "h",                     // glyph #75
214     "i",                     // glyph #76
215     "j",                     // glyph #77
216     "k",                     // glyph #78
217     "l",                     // glyph #79
218     "m",                     // glyph #80
219     "n",                     // glyph #81
220     "o",                     // glyph #82
221     "p",                     // glyph #83
222     "q",                     // glyph #84
223     "r",                     // glyph #85
224     "s",                     // glyph #86
225     "t",                     // glyph #87
226     "u",                     // glyph #88
227     "v",                     // glyph #89
228     "w",                     // glyph #90
229     "x",                     // glyph #91
230     "y",                     // glyph #92
231     "z",                     // glyph #93
232     "braceleft",             // glyph #94
233     "bar",                   // glyph #95
234     "braceright",            // glyph #96
235     "asciitilde",            // glyph #97
236     "Adieresis",             // glyph #98
237     "Aring",                 // glyph #99
238     "Ccedilla",              // glyph #100
239     "Eacute",                // glyph #101
240     "Ntilde",                // glyph #102
241     "Odieresis",             // glyph #103
242     "Udieresis",             // glyph #104
243     "aacute",                // glyph #105
244     "agrave",                // glyph #106
245     "acircumflex",           // glyph #107
246     "adieresis",             // glyph #108
247     "atilde",                // glyph #109
248     "aring",                 // glyph #110
249     "ccedilla",              // glyph #111
250     "eacute",                // glyph #112
251     "egrave",                // glyph #113
252     "ecircumflex",           // glyph #114
253     "edieresis",             // glyph #115
254     "iacute",                // glyph #116
255     "igrave",                // glyph #117
256     "icircumflex",           // glyph #118
257     "idieresis",             // glyph #119
258     "ntilde",                // glyph #120
259     "oacute",                // glyph #121
260     "ograve",                // glyph #122
261     "ocircumflex",           // glyph #123
262     "odieresis",             // glyph #124
263     "otilde",                // glyph #125
264     "uacute",                // glyph #126
265     "ugrave",                // glyph #127
266     "ucircumflex",           // glyph #128
267     "udieresis",             // glyph #129
268     "dagger",                // glyph #130
269     "degree",                // glyph #131
270     "cent",                  // glyph #132
271     "sterling",              // glyph #133
272     "section",               // glyph #134
273     "bullet",                // glyph #135
274     "paragraph",             // glyph #136
275     "germandbls",            // glyph #137
276     "registered",            // glyph #138
277     "copyright",             // glyph #139
278     "trademark",             // glyph #140
279     "acute",                 // glyph #141
280     "dieresis",              // glyph #142
281     "notequal",              // glyph #143
282     "AE",                    // glyph #144
283     "Oslash",                // glyph #145
284     "infinity",              // glyph #146
285     "plusminus",             // glyph #147
286     "lessequal",             // glyph #148
287     "greaterequal",          // glyph #149
288     "yen",                   // glyph #150
289     "mu",                    // glyph #151
290     "partialdiff",           // glyph #152
291     "summation",             // glyph #153
292     "product",               // glyph #154
293     "pi",                    // glyph #155
294     "integral",              // glyph #156
295     "ordfeminine",           // glyph #157
296     "ordmasculine",          // glyph #158
297     "Omega",                 // glyph #159
298     "ae",                    // glyph #160
299     "oslash",                // glyph #161
300     "questiondown",          // glyph #162
301     "exclamdown",            // glyph #163
302     "logicalnot",            // glyph #164
303     "radical",               // glyph #165
304     "florin",                // glyph #166
305     "approxequal",           // glyph #167
306     "Delta",                 // glyph #168
307     "guillemotleft",         // glyph #169
308     "guillemotright",        // glyph #170
309     "ellipsis",              // glyph #171
310     "nonbreakingspace",      // glyph #172
311     "Agrave",                // glyph #173
312     "Atilde",                // glyph #174
313     "Otilde",                // glyph #175
314     "OE",                    // glyph #176
315     "oe",                    // glyph #177
316     "endash",                // glyph #178
317     "emdash",                // glyph #179
318     "quotedblleft",          // glyph #180
319     "quotedblright",         // glyph #181
320     "quoteleft",             // glyph #182
321     "quoteright",            // glyph #183
322     "divide",                // glyph #184
323     "lozenge",               // glyph #185
324     "ydieresis",             // glyph #186
325     "Ydieresis",             // glyph #187
326     "fraction",              // glyph #188
327     "currency",              // glyph #189
328     "guilsinglleft",         // glyph #190
329     "guilsinglright",        // glyph #191
330     "fi",                    // glyph #192
331     "fl",                    // glyph #193
332     "daggerdbl",             // glyph #194
333     "periodcentered",        // glyph #195
334     "quotesinglbase",        // glyph #196
335     "quotedblbase",          // glyph #197
336     "perthousand",           // glyph #198
337     "Acircumflex",           // glyph #199
338     "Ecircumflex",           // glyph #200
339     "Aacute",                // glyph #201
340     "Edieresis",             // glyph #202
341     "Egrave",                // glyph #203
342     "Iacute",                // glyph #204
343     "Icircumflex",           // glyph #205
344     "Idieresis",             // glyph #206
345     "Igrave",                // glyph #207
346     "Oacute",                // glyph #208
347     "Ocircumflex",           // glyph #209
348     "apple",                 // glyph #210
349     "Ograve",                // glyph #211
350     "Uacute",                // glyph #212
351     "Ucircumflex",           // glyph #213
352     "Ugrave",                // glyph #214
353     "dotlessi",              // glyph #215
354     "circumflex",            // glyph #216
355     "tilde",                 // glyph #217
356     "macron",                // glyph #218
357     "breve",                 // glyph #219
358     "dotaccent",             // glyph #220
359     "ring",                  // glyph #221
360     "cedilla",               // glyph #222
361     "hungarumlaut",          // glyph #223
362     "ogonek",                // glyph #224
363     "caron",                 // glyph #225
364     "Lslash",                // glyph #226
365     "lslash",                // glyph #227
366     "Scaron",                // glyph #228
367     "scaron",                // glyph #229
368     "Zcaron",                // glyph #230
369     "zcaron",                // glyph #231
370     "brokenbar",             // glyph #232
371     "Eth",                   // glyph #233
372     "eth",                   // glyph #234
373     "Yacute",                // glyph #235
374     "yacute",                // glyph #236
375     "Thorn",                 // glyph #237
376     "thorn",                 // glyph #238
377     "minus",                 // glyph #239
378     "multiply",              // glyph #240
379     "onesuperior",           // glyph #241
380     "twosuperior",           // glyph #242
381     "threesuperior",         // glyph #243
382     "onehalf",               // glyph #244
383     "onequarter",            // glyph #245
384     "threequarters",         // glyph #246
385     "franc",                 // glyph #247
386     "Gbreve",                // glyph #248
387     "gbreve",                // glyph #249
388     "Idotaccent",            // glyph #250
389     "Scedilla",              // glyph #251
390     "scedilla",              // glyph #252
391     "Cacute",                // glyph #253
392     "cacute",                // glyph #254
393     "Ccaron",                // glyph #255
394     "ccaron",                // glyph #256
395     "dcroat"                 // glyph #257
396   };
397
398
399   private GlyphNamer(int numGlyphs,
400                      ByteBuffer postTable,
401                      ByteBuffer zapfTable)
402   {
403     this.postTable = postTable;
404     this.zapfTable = zapfTable;
405
406     if ((zapfTable != null) && (zapfTable.getInt(0) == 0x00010000))
407     {
408       readZapf(numGlyphs);
409       return;
410     }
411
412     readPost();
413   }
414   
415
416   /**
417    * Sets up the information which allows to retrieve the information
418    * on demand.
419    *
420    * @param numGlyphs the number of glyphs in the font. This value
421    * comes from the <code>maxp</code> table.
422    */
423   public static GlyphNamer forTables(int numGlyphs,
424                                      ByteBuffer postTable,
425                                      ByteBuffer zapfTable)
426   {
427     return new GlyphNamer(numGlyphs, postTable, zapfTable);
428   }
429
430
431   /**
432    * Retrieves or synthesizes a PostScript name for the glyph.
433    * Although the code is reasonably fast, it is recommended
434    * to cache the results in the printer driver.
435    *
436    * <p>If a font provides a 'Zapf' table, the reverse mapping
437    * from glyph to UTF-16 sequence is performed, and a glyph
438    * name is synthesized following the recommendations by Adobe.
439    * This allows to extract the original text from the generated
440    * PostScript or PDF, which is a requirement for indexing
441    * and searching.
442    *
443    * <p>If a font does not provide a 'Zapf' table, the glyph name
444    * is taken from the 'post' table. Note that some fonts have
445    * wrong data in their post data, in which case the resulting
446    * name will be garbage. Usually, this does not hurt, unless
447    * the user wants to extract text from the generated PostScript
448    * or PDF file. The GNU implementation understands all known
449    * formats of the post table (1, 2, 2.5, 3 and 4).
450    *
451    * @param glyph the index of the glyph whose name is to be
452    * retrieved.
453    *
454    * @return the glyph name, such as <code>A</code>,
455    * <code>gcircumflex</code>, <code>z_uni0302</code>, or
456    * <code>u11C42</code>.</li>
457    */
458   String getGlyphName(int glyph)
459   {
460     if (zapfOffsets != null)
461     {
462       zapfTable.position(zapfOffsets.get(glyph) + 8);
463       int numChars = zapfTable.getChar();
464       char[] chars = new char[numChars];
465       for (int i = 0; i < numChars; i++)
466         chars[i] = zapfTable.getChar();
467       return getGlyphName(chars);
468     }
469
470
471     /* Type 1, Type 2, Type 2.5 */
472     if (glyphNames != null)
473       return glyphNames[glyph];
474
475     /* Type 4: Synthesized glyph name. */
476     if (glyphCharacterCodes != null)
477       return "a" + glyphCharacterCodes.get(glyph);
478
479     /* Type 3: Arbitrary, but unique name for the glyph.
480      *
481      * To find out what a good naming scheme would be, we have printed
482      * a document containing the character U+201C in the font
483      * "Hiragino Kaku Gothic Pro W3" (by Dainippon Screen Mfg. Co.,
484      * Ltd.) on Apple MacOS X 10.1.5.  This font has a type 3 'post'
485      * table, and its 'cmap' maps U+201C to glyph #108. The generated
486      * PostScript file defined a character whose name was "g108".
487      *
488      * Therefore, we use 'g' as name prefix. According to the
489      * TrueType/OpenType specification, it should not matter what
490      * prefix we use. On the other hand, it does not hurt either to be
491      * compatible with a good printer driver.
492      *
493      * Actually, that specific font also contains a 'Zapf' table,
494      * which allows to generate glyph names according to Adobe's
495      * conventions, so that extracting text from and searching in the
496      * generated PostScript or PDF becomes possible. While the Apple
497      * PostScript printer driver does not seem to use the 'Zapf' table
498      * for this purpose, we do.
499      */
500     return "g" + glyph;
501   }
502
503
504   /**
505    * Sets up some buffers which allow to quickly read information from
506    * the Zapf table.
507    *
508    * @see <a href=
509    *      "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6Zapf.html">
510    *      Apple&#x2019;s documentation of the <code>Zapf</code> table</a>
511    */
512   private void readZapf(int numGlyphs)
513   {
514     zapfExtraInfo = zapfTable.getInt(4);
515     zapfTable.position(8);
516     zapfOffsets = zapfTable.asIntBuffer();
517     zapfOffsets.limit(numGlyphs);
518   }
519
520
521   /**
522    * Reads in the PostScript data from a <code>post</code> table of a
523    * TrueType or OpenType font. The implementation currently
524    * understands the table formats 1, 2, 2.5, 3, and 4.
525    */
526   private void readPost()
527   {
528     int numGlyphs, nameIndex, maxNameIndex;
529     char[] nameIndices;
530     String[] names;
531     byte[] pascalName;
532
533     postTable.position(0);
534     postFormat = postTable.getInt();
535     switch (postFormat)
536     {
537     case 0x00010000:
538       glyphNames = STANDARD_POSTSCRIPT_GLYPH_NAMES;
539       return;
540
541     case 0x00020000:
542       postTable.position(32);
543       numGlyphs = postTable.getChar();
544       glyphNames = new String[numGlyphs];
545       pascalName = new byte[255];
546       nameIndices = new char[numGlyphs];
547       maxNameIndex = 0;
548       for (int i = 0; i < numGlyphs; i++)
549         maxNameIndex = Math.max(maxNameIndex,
550                                 nameIndices[i] = postTable.getChar());
551
552       names = new String[Math.max(maxNameIndex - 258 + 1, 0)];
553       for (int i = 258; i <= maxNameIndex; i++)
554       {
555         int nameLen = (postTable.get() & 0xff);
556         postTable.get(pascalName, 0, nameLen);
557         names[i - 258] = new String(pascalName, 0, nameLen);
558       }
559       for (int i = 0; i < numGlyphs; i++)
560       {
561         nameIndex = nameIndices[i];
562         if (nameIndex < 258)
563           glyphNames[i] = STANDARD_POSTSCRIPT_GLYPH_NAMES[nameIndex];
564         else
565           glyphNames[i] = names[nameIndex - 258];
566       }
567       return;
568
569     case 0x00025000: // in case some font has a wrong representation of 2.5
570     case 0x00028000:
571       /* Format 2.5 is a re-ordering of the standard names. It has
572        * been deprecated in February 2000, but might still occasionally
573        * float around. Since it can be supported with so little code,
574        * we do so.
575        */
576       postTable.position(32);
577       numGlyphs = postTable.getChar();
578       glyphNames = new String[numGlyphs];
579       for (int i = 0; i < numGlyphs; i++)
580         glyphNames[i] = STANDARD_POSTSCRIPT_GLYPH_NAMES[i + postTable.get()];
581       return;
582
583     case 0x00030000:
584       /* Format 3 leaves it to the printer driver to choose whatever
585        * name it wants to.
586        */
587       return;
588
589     case 0x00040000:
590       /* Format 4 is used by Apple for composite fonts that have
591        * synthetic glyph names. The name of a glyph is "a" plus
592        * the integer (in decimal notation) that follows the table
593        * after numGlyphs.
594        */
595       postTable.position(32);
596       numGlyphs = postTable.getChar();
597       glyphCharacterCodes = postTable.asCharBuffer();
598       glyphCharacterCodes.limit(numGlyphs);
599       return;
600     }
601   }
602
603
604
605   /* For generating the following tables, a quick-and-dirty Python
606    * script was used. It is unlikely that we ever need to run it
607    * again, but for information and convenient access, it is included
608    * below. Initial '#' characters need to be removed from the generated
609    * strings, they are present so that the lines not break in the middle
610    * of Java escape sequences (no, this is not very clean).
611    *
612    * import string
613    *
614    * javaEscapes = {0x22:'\\"', 0x5c:'\\\\'}
615    * def escape(c):
616    *     if javaEscapes.has_key(c):
617    *         return javaEscapes[c]
618    *     elif 0x20 <= c <= 0x7e:
619    *         return chr(c)
620    *     else:
621    *         return '\\u%04x' % c
622    *
623    * def dump(name, s, stride):
624    *     s = ('#' * stride) + s
625    *     print "  private static final String %s" % name
626    *     for i in range(0, len(s), 60):
627    *         print '    + "%s"' % s[i:i+60]
628    *     
629    * glyphs = {}
630    * for line in open('aglfn13.txt', 'r').readlines():
631    *     if line[0] == '#': continue
632    *     [ucs, glyphName, desc] = line.split(';')
633    *     glyph = int('0x' + ucs, 0)
634    *     assert (not glyphs.has_key(glyph)) or (glyphs[glyph] == glyphName)
635    *     glyphs[glyph] = glyphName
636    * del glyphs[0] # arrowvertex
637    * k = glyphs.keys()
638    * k.sort()
639    * numGlyphs = len(k)
640    * names = ''
641    * pos = []
642    * for glyph in k:
643    *     pos.append(len(names) + 1)
644    *     names = names + '/' + glyphs[glyph]
645    * dump('AGLFN_GLYPHS', string.join(map(escape, k), ''), 5)
646    * dump('AGLFN_NAME_OFFSET', string.join(map(escape, pos), ''), 4)
647    * dump('AGLFN_NAMES', names + '/', 0)
648    */
649
650
651   /**
652    * A String that contains the Unicode codepoint for each glyph
653    * in the Adobe Glyph List. The characters are in sorted order.
654    *
655    * Generated from the Adobe Glyph List for New Fonts, version 1.1
656    * of 17 April 2003.
657    *
658    * @see <a href=
659    * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
660    * Glyph List for New Fonts</a>
661    */
662   private static final String AGLFN_GLYPHS
663     = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU"
664     + "VWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u00a1\u00a2\u00a3"
665     + "\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ae"
666     + "\u00af\u00b0\u00b1\u00b4\u00b5\u00b6\u00b7\u00b8\u00ba\u00bb"
667     + "\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5"
668     + "\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf"
669     + "\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9"
670     + "\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3"
671     + "\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed"
672     + "\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7"
673     + "\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe\u00ff\u0100\u0101"
674     + "\u0102\u0103\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b"
675     + "\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0115"
676     + "\u0116\u0117\u0118\u0119\u011a\u011b\u011c\u011d\u011e\u011f"
677     + "\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129"
678     + "\u012a\u012b\u012c\u012d\u012e\u012f\u0130\u0131\u0132\u0133"
679     + "\u0134\u0135\u0136\u0137\u0138\u0139\u013a\u013b\u013c\u013d"
680     + "\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147"
681     + "\u0148\u0149\u014a\u014b\u014c\u014d\u014e\u014f\u0150\u0151"
682     + "\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b"
683     + "\u015c\u015d\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165"
684     + "\u0166\u0167\u0168\u0169\u016a\u016b\u016c\u016d\u016e\u016f"
685     + "\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179"
686     + "\u017a\u017b\u017c\u017d\u017e\u017f\u0192\u01a0\u01a1\u01af"
687     + "\u01b0\u01e6\u01e7\u01fa\u01fb\u01fc\u01fd\u01fe\u01ff\u0218"
688     + "\u0219\u02bc\u02bd\u02c6\u02c7\u02d8\u02d9\u02da\u02db\u02dc"
689     + "\u02dd\u0300\u0301\u0303\u0309\u0323\u0384\u0385\u0386\u0387"
690     + "\u0388\u0389\u038a\u038c\u038e\u038f\u0390\u0391\u0392\u0393"
691     + "\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e"
692     + "\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03aa"
693     + "\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4"
694     + "\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bd\u03be\u03bf"
695     + "\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9"
696     + "\u03ca\u03cb\u03cc\u03cd\u03ce\u03d1\u03d2\u03d5\u03d6\u0401"
697     + "\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b"
698     + "\u040c\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416"
699     + "\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420"
700     + "\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a"
701     + "\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434"
702     + "\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e"
703     + "\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448"
704     + "\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0451\u0452\u0453"
705     + "\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045e"
706     + "\u045f\u0462\u0463\u0472\u0473\u0474\u0475\u0490\u0491\u04d9"
707     + "\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9"
708     + "\u05bb\u05bc\u05bd\u05be\u05bf\u05c0\u05c1\u05c2\u05c3\u05d0"
709     + "\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da"
710     + "\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4"
711     + "\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u05f0\u05f1\u05f2\u060c"
712     + "\u061b\u061f\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628"
713     + "\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632"
714     + "\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\u0640\u0641"
715     + "\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u064b"
716     + "\u064c\u064d\u064e\u064f\u0650\u0651\u0652\u0660\u0661\u0662"
717     + "\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u066a\u066d\u0679"
718     + "\u067e\u0686\u0688\u0691\u0698\u06a4\u06af\u06ba\u06d2\u06d5"
719     + "\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1ef2\u1ef3\u200c\u200d"
720     + "\u200e\u200f\u2012\u2013\u2014\u2015\u2017\u2018\u2019\u201a"
721     + "\u201b\u201c\u201d\u201e\u2020\u2021\u2022\u2024\u2025\u2026"
722     + "\u202c\u202d\u202e\u2030\u2032\u2033\u2039\u203a\u203c\u2044"
723     + "\u20a1\u20a3\u20a4\u20a7\u20aa\u20ab\u20ac\u2105\u2111\u2113"
724     + "\u2116\u2118\u211c\u211e\u2122\u2126\u212e\u2135\u2153\u2154"
725     + "\u215b\u215c\u215d\u215e\u2190\u2191\u2192\u2193\u2194\u2195"
726     + "\u21a8\u21b5\u21d0\u21d1\u21d2\u21d3\u21d4\u2200\u2202\u2203"
727     + "\u2205\u2206\u2207\u2208\u2209\u220b\u220f\u2211\u2212\u2217"
728     + "\u221a\u221d\u221e\u221f\u2220\u2227\u2228\u2229\u222a\u222b"
729     + "\u2234\u223c\u2245\u2248\u2260\u2261\u2264\u2265\u2282\u2283"
730     + "\u2284\u2286\u2287\u2295\u2297\u22a5\u22c5\u2302\u2310\u2320"
731     + "\u2321\u2329\u232a\u2500\u2502\u250c\u2510\u2514\u2518\u251c"
732     + "\u2524\u252c\u2534\u253c\u2550\u2551\u2552\u2553\u2554\u2555"
733     + "\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f"
734     + "\u2560\u2561\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569"
735     + "\u256a\u256b\u256c\u2580\u2584\u2588\u258c\u2590\u2591\u2592"
736     + "\u2593\u25a0\u25a1\u25aa\u25ab\u25ac\u25b2\u25ba\u25bc\u25c4"
737     + "\u25ca\u25cb\u25cf\u25d8\u25d9\u25e6\u263a\u263b\u263c\u2640"
738     + "\u2642\u2660\u2663\u2665\u2666\u266a\u266b";
739
740
741   /**
742    * The offset of each glyph name in AGLFN_NAMES.
743    *
744    * Generated from the Adobe Glyph List for New Fonts, version 1.1
745    * of 17 April 2003.
746    *
747    * @see <a href=
748    * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
749    * Glyph List for New Fonts</a>
750    */
751   private static final String AGLFN_NAME_OFFSET
752     = "\u0001\u0007\u000e\u0017\")1;GQ\\ejpw~\u0084\u0089\u008d"
753     + "\u0091\u0097\u009c\u00a1\u00a5\u00ab\u00b1\u00b6\u00bc\u00c6"
754     + "\u00cb\u00d1\u00d9\u00e2\u00e5\u00e7\u00e9\u00eb\u00ed\u00ef"
755     + "\u00f1\u00f3\u00f5\u00f7\u00f9\u00fb\u00fd\u00ff\u0101\u0103"
756     + "\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117"
757     + "\u0119\u0125\u012f\u013c\u0148\u0153\u0159\u015b\u015d\u015f"
758     + "\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173"
759     + "\u0175\u0177\u0179\u017b\u017d\u017f\u0181\u0183\u0185\u0187"
760     + "\u0189\u018b\u018d\u0197\u019b\u01a6\u01b1\u01bc\u01c1\u01ca"
761     + "\u01d3\u01d7\u01e1\u01e9\u01f2\u01fc\u0208\u0216\u0221\u022c"
762     + "\u0233\u023a\u0244\u024a\u024d\u0257\u0266\u026e\u027b\u028a"
763     + "\u0295\u029d\u02ab\u02b8\u02bf\u02c6\u02d2\u02d9\u02e3\u02e9"
764     + "\u02ec\u02f5\u02fc\u0303\u030f\u0319\u0320\u0327\u0333\u033d"
765     + "\u0341\u0348\u034f\u0356\u0362\u0369\u0373\u037c\u0383\u038a"
766     + "\u0391\u039d\u03a7\u03ae\u03b4\u03bf\u03c6\u03cd\u03d9\u03e0"
767     + "\u03ea\u03f0\u03f3\u03fc\u0403\u040a\u0416\u0420\u0427\u042e"
768     + "\u043a\u0444\u0448\u044f\u0456\u045d\u0469\u0470\u047a\u0481"
769     + "\u0488\u048f\u0496\u04a2\u04ac\u04b3\u04b9\u04c3\u04cb\u04d3"
770     + "\u04da\u04e1\u04e9\u04f1\u04f8\u04ff\u050b\u0517\u0522\u052d"
771     + "\u0534\u053b\u0542\u0549\u0550\u0557\u055f\u0567\u056e\u0575"
772     + "\u0580\u058b\u0593\u059b\u05a2\u05a9\u05b5\u05c1\u05c8\u05cf"
773     + "\u05da\u05e5\u05f2\u05ff\u060b\u0617\u061c\u0621\u0628\u062f"
774     + "\u0637\u063f\u0646\u064d\u0655\u065d\u0668\u0671\u0674\u0677"
775     + "\u0683\u068f\u069c\u06a9\u06b6\u06bd\u06c4\u06d1\u06de\u06e5"
776     + "\u06ec\u06f1\u06f6\u06fd\u0704\u070b\u0712\u071f\u072c\u0733"
777     + "\u073a\u0746\u074a\u074e\u0756\u075e\u0765\u076c\u077a\u0788"
778     + "\u078b\u078e\u0795\u079c\u07a9\u07b6\u07bd\u07c4\u07cb\u07d2"
779     + "\u07de\u07ea\u07f3\u07fc\u0803\u080a\u0817\u0824\u082b\u0832"
780     + "\u0837\u083c\u0843\u084a\u0852\u085a\u0861\u0868\u086e\u0874"
781     + "\u0882\u0890\u0898\u08a0\u08ac\u08b8\u08c4\u08d0\u08da\u08e1"
782     + "\u08e8\u08f3\u08fe\u0905\u090c\u0912\u0919\u091f\u0925\u092b"
783     + "\u0931\u0938\u093f\u094a\u0955\u095d\u0965\u0971\u097d\u098a"
784     + "\u0997\u09a1\u09ab\u09b6\u09bc\u09c2\u09cc\u09d1\u09d8\u09de"
785     + "\u09eb\u09f5\u09ff\u0a09\u0a17\u0a24\u0a2a\u0a38\u0a43\u0a4d"
786     + "\u0a5a\u0a63\u0a6d\u0a7a\u0a87\u0a92\u0aa4\u0aaa\u0aaf\u0ab5"
787     + "\u0abd\u0ac2\u0ac6\u0acc\u0ad1\u0ad7\u0ade\u0ae1\u0ae4\u0ae7"
788     + "\u0aef\u0af2\u0af6\u0afc\u0b00\u0b08\u0b0c\u0b10\u0b14\u0b21"
789     + "\u0b31\u0b3c\u0b49\u0b52\u0b5c\u0b71\u0b77\u0b7c\u0b82\u0b88"
790     + "\u0b90\u0b95\u0b99\u0b9f\u0ba4\u0baa\u0bb1\u0bb4\u0bb7\u0bbf"
791     + "\u0bc2\u0bc6\u0bcd\u0bd3\u0bd7\u0bdf\u0be3\u0be7\u0beb\u0bf1"
792     + "\u0bfe\u0c0e\u0c1b\u0c28\u0c33\u0c3a\u0c43\u0c48\u0c4f\u0c59"
793     + "\u0c63\u0c6d\u0c77\u0c81\u0c8b\u0c95\u0c9f\u0ca9\u0cb3\u0cbd"
794     + "\u0cc7\u0cd1\u0cdb\u0ce5\u0cef\u0cf9\u0d03\u0d0d\u0d17\u0d21"
795     + "\u0d2b\u0d35\u0d3f\u0d49\u0d53\u0d5d\u0d67\u0d71\u0d7b\u0d85"
796     + "\u0d8f\u0d99\u0da3\u0dad\u0db7\u0dc1\u0dcb\u0dd5\u0ddf\u0de9"
797     + "\u0df3\u0dfd\u0e07\u0e11\u0e1b\u0e25\u0e2f\u0e39\u0e43\u0e4d"
798     + "\u0e57\u0e61\u0e6b\u0e75\u0e7f\u0e89\u0e93\u0e9d\u0ea7\u0eb1"
799     + "\u0ebb\u0ec5\u0ecf\u0ed9\u0ee3\u0eed\u0ef7\u0f01\u0f0b\u0f15"
800     + "\u0f1f\u0f29\u0f33\u0f3d\u0f47\u0f51\u0f5b\u0f65\u0f6f\u0f79"
801     + "\u0f83\u0f8d\u0f97\u0fa1\u0fab\u0fb5\u0fbf\u0fc9\u0fd3\u0fdd"
802     + "\u0fe7\u0ff1\u0ffb\u1005\u100f\u1019\u1023\u102d\u1037\u1041"
803     + "\u104b\u1055\u105f\u1069\u1073\u107d\u1087\u1091\u109b\u10a5"
804     + "\u10af\u10b9\u10c3\u10cd\u10d7\u10e1\u10eb\u10f5\u10ff\u1109"
805     + "\u1113\u111d\u1127\u1131\u113b\u1145\u114f\u1159\u1163\u116d"
806     + "\u1177\u1181\u118b\u1195\u119f\u11a9\u11b3\u11bd\u11c7\u11d1"
807     + "\u11db\u11e5\u11ef\u11f9\u1203\u120d\u1217\u1221\u122b\u1235"
808     + "\u123f\u1249\u1253\u125d\u1267\u1271\u127b\u1285\u128f\u1299"
809     + "\u12a3\u12ad\u12b7\u12c1\u12cb\u12d5\u12df\u12e9\u12f3\u12fd"
810     + "\u1307\u1311\u131b\u1325\u132f\u1339\u1343\u134d\u1357\u1361"
811     + "\u136b\u1375\u137f\u1389\u1393\u139d\u13a7\u13b1\u13bb\u13c5"
812     + "\u13cf\u13d9\u13e3\u13ed\u13f7\u1401\u140b\u1415\u141f\u1429"
813     + "\u1433\u143d\u1447\u1451\u145b\u1465\u146f\u1479\u1483\u148d"
814     + "\u1497\u14a1\u14ab\u14b5\u14bf\u14c9\u14d3\u14dd\u14e7\u14f1"
815     + "\u14f8\u14ff\u1506\u150d\u1517\u1521\u1528\u152f\u1539\u1541"
816     + "\u1549\u1551\u155c\u1563\u156a\u1574\u1582\u158c\u1597\u15a6"
817     + "\u15b4\u15c1\u15cf\u15dc\u15e3\u15ed\u15f4\u1603\u1612\u161b"
818     + "\u1625\u162f\u1639\u1645\u164c\u1653\u1661\u1670\u167a\u1683"
819     + "\u1691\u1697\u169c\u16a3\u16ad\u16b2\u16b7\u16c1\u16ca\u16d4"
820     + "\u16de\u16ea\u16f3\u1700\u170a\u1710\u171a\u1720\u1729\u1733"
821     + "\u173d\u174a\u1756\u1763\u176d\u1775\u1780\u178a\u1794\u179e"
822     + "\u17ab\u17ba\u17c7\u17d2\u17e0\u17ed\u17fa\u1804\u1810\u181c"
823     + "\u1825\u182b\u1834\u183c\u1847\u1850\u1858\u1862\u1868\u1875"
824     + "\u187d\u188a\u1893\u189e\u18a4\u18af\u18b9\u18c6\u18cc\u18d5"
825     + "\u18df\u18e7\u18f1\u18fd\u1906\u1912\u191c\u1929\u1936\u1945"
826     + "\u194f\u195c\u196b\u1976\u1985\u1993\u199b\u19a1\u19af\u19ba"
827     + "\u19c5\u19cf\u19da\u19e3\u19ec\u19f5\u19fe\u1a07\u1a10\u1a19"
828     + "\u1a22\u1a2b\u1a34\u1a3d\u1a46\u1a4f\u1a58\u1a61\u1a6a\u1a73"
829     + "\u1a7c\u1a85\u1a8e\u1a97\u1aa0\u1aa9\u1ab2\u1abb\u1ac4\u1acd"
830     + "\u1ad6\u1adf\u1ae8\u1af1\u1afa\u1b03\u1b0c\u1b15\u1b1e\u1b27"
831     + "\u1b30\u1b39\u1b42\u1b4a\u1b52\u1b58\u1b60\u1b68\u1b70\u1b76"
832     + "\u1b7e\u1b88\u1b8f\u1b96\u1b9d\u1ba8\u1bb0\u1bb8\u1bc0\u1bc8"
833     + "\u1bd0\u1bd7\u1bde\u1be8\u1bf2\u1bfd\u1c07\u1c14\u1c18\u1c1f"
834     + "\u1c24\u1c2a\u1c2f\u1c35\u1c3d\u1c49";
835
836
837   /**
838    * The name of each glyph in the Adobe Glyph List for New Fonts
839    * (AGLFN). The name of the n-th glyph starts at position
840    * AGLFN_NAME_OFFSET.charAt(n). It ends before the following
841    * slash (slashes cannot be part of a PostScript name, which
842    * is why we use it for separation).
843    *
844    * <p>Generated from the Adobe Glyph List for New Fonts, version 1.1
845    * of 17 April 2003.
846    *
847    * @see <a href=
848    * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
849    * Glyph List for New Fonts</a>
850    */
851   private static final String AGLFN_NAMES
852     = "/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/q"
853     + "uotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/p"
854     + "eriod/slash/zero/one/two/three/four/five/six/seven/eight/nin"
855     + "e/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F"
856     + "/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backsla"
857     + "sh/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h"
858     + "/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/bracerigh"
859     + "t/asciitilde/exclamdown/cent/sterling/currency/yen/brokenbar"
860     + "/section/dieresis/copyright/ordfeminine/guillemotleft/logica"
861     + "lnot/registered/macron/degree/plusminus/acute/mu/paragraph/p"
862     + "eriodcentered/cedilla/ordmasculine/guillemotright/onequarter"
863     + "/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumfle"
864     + "x/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumfl"
865     + "ex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/"
866     + "Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/U"
867     + "grave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/a"
868     + "grave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/"
869     + "egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumfle"
870     + "x/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odie"
871     + "resis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacu"
872     + "te/thorn/ydieresis/Amacron/amacron/Abreve/abreve/Aogonek/aog"
873     + "onek/Cacute/cacute/Ccircumflex/ccircumflex/Cdotaccent/cdotac"
874     + "cent/Ccaron/ccaron/Dcaron/dcaron/Dcroat/dcroat/Emacron/emacr"
875     + "on/Ebreve/ebreve/Edotaccent/edotaccent/Eogonek/eogonek/Ecaro"
876     + "n/ecaron/Gcircumflex/gcircumflex/Gbreve/gbreve/Gdotaccent/gd"
877     + "otaccent/Gcommaaccent/gcommaaccent/Hcircumflex/hcircumflex/H"
878     + "bar/hbar/Itilde/itilde/Imacron/imacron/Ibreve/ibreve/Iogonek"
879     + "/iogonek/Idotaccent/dotlessi/IJ/ij/Jcircumflex/jcircumflex/K"
880     + "commaaccent/kcommaaccent/kgreenlandic/Lacute/lacute/Lcommaac"
881     + "cent/lcommaaccent/Lcaron/lcaron/Ldot/ldot/Lslash/lslash/Nacu"
882     + "te/nacute/Ncommaaccent/ncommaaccent/Ncaron/ncaron/napostroph"
883     + "e/Eng/eng/Omacron/omacron/Obreve/obreve/Ohungarumlaut/ohunga"
884     + "rumlaut/OE/oe/Racute/racute/Rcommaaccent/rcommaaccent/Rcaron"
885     + "/rcaron/Sacute/sacute/Scircumflex/scircumflex/Scedilla/scedi"
886     + "lla/Scaron/scaron/Tcommaaccent/tcommaaccent/Tcaron/tcaron/Tb"
887     + "ar/tbar/Utilde/utilde/Umacron/umacron/Ubreve/ubreve/Uring/ur"
888     + "ing/Uhungarumlaut/uhungarumlaut/Uogonek/uogonek/Wcircumflex/"
889     + "wcircumflex/Ycircumflex/ycircumflex/Ydieresis/Zacute/zacute/"
890     + "Zdotaccent/zdotaccent/Zcaron/zcaron/longs/florin/Ohorn/ohorn"
891     + "/Uhorn/uhorn/Gcaron/gcaron/Aringacute/aringacute/AEacute/aea"
892     + "cute/Oslashacute/oslashacute/Scommaaccent/scommaaccent/afii5"
893     + "7929/afii64937/circumflex/caron/breve/dotaccent/ring/ogonek/"
894     + "tilde/hungarumlaut/gravecomb/acutecomb/tildecomb/hookaboveco"
895     + "mb/dotbelowcomb/tonos/dieresistonos/Alphatonos/anoteleia/Eps"
896     + "ilontonos/Etatonos/Iotatonos/Omicrontonos/Upsilontonos/Omega"
897     + "tonos/iotadieresistonos/Alpha/Beta/Gamma/Epsilon/Zeta/Eta/Th"
898     + "eta/Iota/Kappa/Lambda/Mu/Nu/Xi/Omicron/Pi/Rho/Sigma/Tau/Upsi"
899     + "lon/Phi/Chi/Psi/Iotadieresis/Upsilondieresis/alphatonos/epsi"
900     + "lontonos/etatonos/iotatonos/upsilondieresistonos/alpha/beta/"
901     + "gamma/delta/epsilon/zeta/eta/theta/iota/kappa/lambda/nu/xi/o"
902     + "micron/pi/rho/sigma1/sigma/tau/upsilon/phi/chi/psi/omega/iot"
903     + "adieresis/upsilondieresis/omicrontonos/upsilontonos/omegaton"
904     + "os/theta1/Upsilon1/phi1/omega1/afii10023/afii10051/afii10052"
905     + "/afii10053/afii10054/afii10055/afii10056/afii10057/afii10058"
906     + "/afii10059/afii10060/afii10061/afii10062/afii10145/afii10017"
907     + "/afii10018/afii10019/afii10020/afii10021/afii10022/afii10024"
908     + "/afii10025/afii10026/afii10027/afii10028/afii10029/afii10030"
909     + "/afii10031/afii10032/afii10033/afii10034/afii10035/afii10036"
910     + "/afii10037/afii10038/afii10039/afii10040/afii10041/afii10042"
911     + "/afii10043/afii10044/afii10045/afii10046/afii10047/afii10048"
912     + "/afii10049/afii10065/afii10066/afii10067/afii10068/afii10069"
913     + "/afii10070/afii10072/afii10073/afii10074/afii10075/afii10076"
914     + "/afii10077/afii10078/afii10079/afii10080/afii10081/afii10082"
915     + "/afii10083/afii10084/afii10085/afii10086/afii10087/afii10088"
916     + "/afii10089/afii10090/afii10091/afii10092/afii10093/afii10094"
917     + "/afii10095/afii10096/afii10097/afii10071/afii10099/afii10100"
918     + "/afii10101/afii10102/afii10103/afii10104/afii10105/afii10106"
919     + "/afii10107/afii10108/afii10109/afii10110/afii10193/afii10146"
920     + "/afii10194/afii10147/afii10195/afii10148/afii10196/afii10050"
921     + "/afii10098/afii10846/afii57799/afii57801/afii57800/afii57802"
922     + "/afii57793/afii57794/afii57795/afii57798/afii57797/afii57806"
923     + "/afii57796/afii57807/afii57839/afii57645/afii57841/afii57842"
924     + "/afii57804/afii57803/afii57658/afii57664/afii57665/afii57666"
925     + "/afii57667/afii57668/afii57669/afii57670/afii57671/afii57672"
926     + "/afii57673/afii57674/afii57675/afii57676/afii57677/afii57678"
927     + "/afii57679/afii57680/afii57681/afii57682/afii57683/afii57684"
928     + "/afii57685/afii57686/afii57687/afii57688/afii57689/afii57690"
929     + "/afii57716/afii57717/afii57718/afii57388/afii57403/afii57407"
930     + "/afii57409/afii57410/afii57411/afii57412/afii57413/afii57414"
931     + "/afii57415/afii57416/afii57417/afii57418/afii57419/afii57420"
932     + "/afii57421/afii57422/afii57423/afii57424/afii57425/afii57426"
933     + "/afii57427/afii57428/afii57429/afii57430/afii57431/afii57432"
934     + "/afii57433/afii57434/afii57440/afii57441/afii57442/afii57443"
935     + "/afii57444/afii57445/afii57446/afii57470/afii57448/afii57449"
936     + "/afii57450/afii57451/afii57452/afii57453/afii57454/afii57455"
937     + "/afii57456/afii57457/afii57458/afii57392/afii57393/afii57394"
938     + "/afii57395/afii57396/afii57397/afii57398/afii57399/afii57400"
939     + "/afii57401/afii57381/afii63167/afii57511/afii57506/afii57507"
940     + "/afii57512/afii57513/afii57508/afii57505/afii57509/afii57514"
941     + "/afii57519/afii57534/Wgrave/wgrave/Wacute/wacute/Wdieresis/w"
942     + "dieresis/Ygrave/ygrave/afii61664/afii301/afii299/afii300/fig"
943     + "uredash/endash/emdash/afii00208/underscoredbl/quoteleft/quot"
944     + "eright/quotesinglbase/quotereversed/quotedblleft/quotedblrig"
945     + "ht/quotedblbase/dagger/daggerdbl/bullet/onedotenleader/twodo"
946     + "tenleader/ellipsis/afii61573/afii61574/afii61575/perthousand"
947     + "/minute/second/guilsinglleft/guilsinglright/exclamdbl/fracti"
948     + "on/colonmonetary/franc/lira/peseta/afii57636/dong/Euro/afii6"
949     + "1248/Ifraktur/afii61289/afii61352/weierstrass/Rfraktur/presc"
950     + "ription/trademark/Omega/estimated/aleph/onethird/twothirds/o"
951     + "neeighth/threeeighths/fiveeighths/seveneighths/arrowleft/arr"
952     + "owup/arrowright/arrowdown/arrowboth/arrowupdn/arrowupdnbse/c"
953     + "arriagereturn/arrowdblleft/arrowdblup/arrowdblright/arrowdbl"
954     + "down/arrowdblboth/universal/partialdiff/existential/emptyset"
955     + "/Delta/gradient/element/notelement/suchthat/product/summatio"
956     + "n/minus/asteriskmath/radical/proportional/infinity/orthogona"
957     + "l/angle/logicaland/logicalor/intersection/union/integral/the"
958     + "refore/similar/congruent/approxequal/notequal/equivalence/le"
959     + "ssequal/greaterequal/propersubset/propersuperset/notsubset/r"
960     + "eflexsubset/reflexsuperset/circleplus/circlemultiply/perpend"
961     + "icular/dotmath/house/revlogicalnot/integraltp/integralbt/ang"
962     + "leleft/angleright/SF100000/SF110000/SF010000/SF030000/SF0200"
963     + "00/SF040000/SF080000/SF090000/SF060000/SF070000/SF050000/SF4"
964     + "30000/SF240000/SF510000/SF520000/SF390000/SF220000/SF210000/"
965     + "SF250000/SF500000/SF490000/SF380000/SF280000/SF270000/SF2600"
966     + "00/SF360000/SF370000/SF420000/SF190000/SF200000/SF230000/SF4"
967     + "70000/SF480000/SF410000/SF450000/SF460000/SF400000/SF540000/"
968     + "SF530000/SF440000/upblock/dnblock/block/lfblock/rtblock/ltsh"
969     + "ade/shade/dkshade/filledbox/H22073/H18543/H18551/filledrect/"
970     + "triagup/triagrt/triagdn/triaglf/lozenge/circle/H18533/invbul"
971     + "let/invcircle/openbullet/smileface/invsmileface/sun/female/m"
972     + "ale/spade/club/heart/diamond/musicalnote/musicalnotedbl/";
973
974
975   /**
976    * Determines the name of a glyph according to the Adobe Glyph List
977    * for New Fonts (AGLFN). Because all glyphs in AGLFN correspond to
978    * a precomposed Unicode codepoint, the mismatch between characters
979    * and glyphs is not an issue here.
980    *
981    * @param c the Unicode codepoint that corresponds to the glyph, for
982    * example <code>0x010a</code> for <code>LATIN CAPITAL LETTER C WITH
983    * DOT ABOVE</code>.
984    *
985    * @return the glyph name, for example <code>Cdotaccent</code>. If
986    * the glyph is not in the <i>Adobe Glyph List for New Fonts</i>,
987    * <code>null</code> is returned.
988    *
989    * @see <a href=
990    * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
991    * Glyph List for New Fonts (AGLFN), version 1.1 of April 17,
992    * 2003</a>
993    *
994    * @see <a href=
995    * "http://partners.adobe.com/asn/developer/type/unicodegn.html#6"
996    * >Adobe&#x2019;s guidelines related to Unicode</a>
997    */
998   private static String getAGLFNName(char c)
999   {
1000     int min, max, mid;
1001     char midChar;
1002
1003     /* Performs a binary search in the sorted array (actually, a
1004      * String) of glyphs in the Adobe Glyph List for New Fonts.
1005      *
1006      * A good compiler might be able to optimize a call to charAt for
1007      * a static final String, but this routine is probably not that
1008      * critical to performance.
1009      */
1010     min = 0;
1011     max = AGLFN_GLYPHS.length() - 1;
1012     mid = max >> 1;    
1013     midChar = AGLFN_GLYPHS.charAt(mid);
1014     do
1015     {
1016       if (midChar == c)
1017         break;
1018       else if (midChar < c)
1019         min = mid + 1;
1020       else
1021         max = mid;
1022       mid = (min + max) >> 1;
1023       midChar = AGLFN_GLYPHS.charAt(mid);
1024     }
1025     while (min < max);
1026     
1027     if (midChar != c)
1028       return null;
1029
1030     int pos = AGLFN_NAME_OFFSET.charAt(mid);
1031     return AGLFN_NAMES.substring(pos, AGLFN_NAMES.indexOf('/', pos));
1032   }
1033
1034
1035   /**
1036    * Returns the PostScript name of a glyph, given the sequence of
1037    * Unicode characters that is required to produce the glyph.  The
1038    * returned name follows Adobe&#x2019;s glyph naming recommendations
1039    * in order to allow searching and indexing of the produced
1040    * PostScript and PDF.
1041    *
1042    * <p>Some examples:
1043    * <ul><li><code>U+0041</code> gives <code>A</code>;</li>
1044    * <li><code>U+011D</code> gives <code>gcircumflex</code>;</li>
1045    * <li><code>U+007A U+0302</code> gives <code>z_uni0302</code>;</li>
1046    * <li><code>U+D807 U+DC42</code> (an UTF-16 escape sequence)
1047    * gives <code>u11C42</code>;</li>
1048    *  </ul>.
1049    *
1050    * <p>The routine does <i>not</i> bring sequences in any canonical
1051    * form. Therefore, the result for <code>U+0067 U+0302</code> (the
1052    * decomposition of <code>U+011D</code>) will be
1053    * <code>g_uni0302</code>, not <code>gcircumflex</code>.
1054    *
1055    * @see <a href=
1056    * "http://partners.adobe.com/asn/tech/type/unicodegn.jsp" >Unicode
1057    * and Glyph Names</a> and <a href=
1058    * "http://partners.adobe.com/asn/tech/type/glyphnamelimits.jsp"
1059    * >Glyph Names and Current Implementations</a>
1060    */
1061   private static String getGlyphName(char[] chars)
1062   {
1063     char c;
1064     String name;
1065     int numChars;
1066     boolean hasSurrogates = false;
1067
1068     if ((chars == null) || ((numChars = chars.length) == 0))
1069       return ".notdef";
1070
1071     /* The vast majority of cases will be just a single character.
1072      * Therefore, we have a special code path for this case.
1073      */
1074     if (numChars == 1)
1075     {
1076       c = chars[0];
1077       name = getAGLFNName(c);
1078       if (name != null)
1079         return name;
1080     }
1081     
1082     CPStringBuilder buf = new CPStringBuilder(numChars * 8);
1083     for (int i = 0; i < numChars; i++)
1084     {
1085       if (i > 0)
1086         buf.append('_');
1087       c = chars[i];
1088
1089       /* handle surrogate pairs */
1090       if (c >> 10 == 0x36) // U+D800 .. U+DBFF: High surrogate
1091       {
1092         /* Adobe recommends using the 'u' prefix only for
1093          * characters outside the Unicode Basic Multilingual Plane,
1094          * because Acrobat 4 and 5 understand only the "uni" prefix.
1095          * The 'u' prefix will be supported by Acrobat 6 and later.
1096          *
1097          * For further information, please refer to this page:
1098          * http://partners.adobe.com/asn/tech/type/glyphnamelimits.jsp#3
1099          */
1100         int ucs4 = (((c & 0x3ff) << 10) | (chars[++i] & 0x3ff)) + 0x10000;
1101         buf.append('u');
1102         buf.append(Integer.toHexString(ucs4).toUpperCase());
1103       }
1104       else
1105       {
1106         /* Try the Adobe Glyph List. */
1107         name = getAGLFNName(c);
1108         if (name != null)
1109           buf.append(name);
1110         else
1111         {
1112           char nibble;
1113           buf.append("uni");
1114           nibble = (char) (((c >> 12) & 0xf) + 0x30);
1115           if (nibble > 0x39)
1116             nibble += 7;
1117           buf.append(nibble);
1118           nibble = (char) (((c >> 8) & 0xf) + 0x30);
1119           if (nibble > 0x39)
1120             nibble += 7;
1121           buf.append(nibble);
1122           nibble = (char) (((c >> 4) & 0xf) + 0x30);
1123           if (nibble > 0x39)
1124             nibble += 7;
1125           buf.append(nibble);
1126           nibble = (char) (((c >> 0) & 0xf) + 0x30);
1127           if (nibble > 0x39)
1128             nibble += 7;
1129           buf.append(nibble);
1130         }
1131       }
1132     }
1133     return buf.toString();
1134   }
1135 }