1 /* GlyphNamer.java -- Provides glyph names.
2 Copyright (C) 2006 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
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)
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.
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
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
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. */
38 package gnu.java.awt.font.opentype;
40 import gnu.java.lang.CPStringBuilder;
42 import java.nio.ByteBuffer;
43 import java.nio.IntBuffer;
44 import java.nio.CharBuffer;
48 * Provides names for glyphs, which is useful when embedding fonts
49 * in PostScript or PDF documents.
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’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.
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
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
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
78 * @author Sascha Brawer (brawer@dandelis.ch)
80 final class GlyphNamer
83 * The 'post' table of the font.
85 private ByteBuffer postTable;
89 * The 'Zapf' table of the font, or null if the font has no
92 private ByteBuffer zapfTable;
96 * The offset of each glyph relative to the Zapf table,
97 * or null if the font does not have a Zapf table.
99 private IntBuffer zapfOffsets;
103 * The offset from the start of the Zapf table to the start
104 * of the extra info area.
106 private int zapfExtraInfo;
110 * The format of the post table, a Fixed 16.16 number.
112 private int postFormat;
116 * An array of glyph names. Used for table formats 1, 2, 2.5.
118 private String[] glyphNames;
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.
126 private CharBuffer glyphCharacterCodes;
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
136 private static final String[] STANDARD_POSTSCRIPT_GLYPH_NAMES =
138 ".notdef", // glyph #0
140 "nonmarkingreturn", // glyph #2
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
153 "comma", // glyph #15
154 "hyphen", // glyph #16
155 "period", // glyph #17
156 "slash", // glyph #18
160 "three", // glyph #22
164 "seven", // glyph #26
165 "eight", // glyph #27
167 "colon", // glyph #29
168 "semicolon", // glyph #30
170 "equal", // glyph #32
171 "greater", // glyph #33
172 "question", // glyph #34
200 "bracketleft", // glyph #62
201 "backslash", // glyph #63
202 "bracketright", // glyph #64
203 "asciicircum", // glyph #65
204 "underscore", // glyph #66
205 "grave", // glyph #67
232 "braceleft", // glyph #94
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
283 "Oslash", // glyph #145
284 "infinity", // glyph #146
285 "plusminus", // glyph #147
286 "lessequal", // glyph #148
287 "greaterequal", // glyph #149
290 "partialdiff", // glyph #152
291 "summation", // glyph #153
292 "product", // glyph #154
294 "integral", // glyph #156
295 "ordfeminine", // glyph #157
296 "ordmasculine", // glyph #158
297 "Omega", // glyph #159
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
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
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
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
399 private GlyphNamer(int numGlyphs,
400 ByteBuffer postTable,
401 ByteBuffer zapfTable)
403 this.postTable = postTable;
404 this.zapfTable = zapfTable;
406 if ((zapfTable != null) && (zapfTable.getInt(0) == 0x00010000))
417 * Sets up the information which allows to retrieve the information
420 * @param numGlyphs the number of glyphs in the font. This value
421 * comes from the <code>maxp</code> table.
423 public static GlyphNamer forTables(int numGlyphs,
424 ByteBuffer postTable,
425 ByteBuffer zapfTable)
427 return new GlyphNamer(numGlyphs, postTable, zapfTable);
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.
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
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).
451 * @param glyph the index of the glyph whose name is to be
454 * @return the glyph name, such as <code>A</code>,
455 * <code>gcircumflex</code>, <code>z_uni0302</code>, or
456 * <code>u11C42</code>.</li>
458 String getGlyphName(int glyph)
460 if (zapfOffsets != null)
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);
471 /* Type 1, Type 2, Type 2.5 */
472 if (glyphNames != null)
473 return glyphNames[glyph];
475 /* Type 4: Synthesized glyph name. */
476 if (glyphCharacterCodes != null)
477 return "a" + glyphCharacterCodes.get(glyph);
479 /* Type 3: Arbitrary, but unique name for the glyph.
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".
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.
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.
505 * Sets up some buffers which allow to quickly read information from
509 * "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6Zapf.html">
510 * Apple’s documentation of the <code>Zapf</code> table</a>
512 private void readZapf(int numGlyphs)
514 zapfExtraInfo = zapfTable.getInt(4);
515 zapfTable.position(8);
516 zapfOffsets = zapfTable.asIntBuffer();
517 zapfOffsets.limit(numGlyphs);
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.
526 private void readPost()
528 int numGlyphs, nameIndex, maxNameIndex;
533 postTable.position(0);
534 postFormat = postTable.getInt();
538 glyphNames = STANDARD_POSTSCRIPT_GLYPH_NAMES;
542 postTable.position(32);
543 numGlyphs = postTable.getChar();
544 glyphNames = new String[numGlyphs];
545 pascalName = new byte[255];
546 nameIndices = new char[numGlyphs];
548 for (int i = 0; i < numGlyphs; i++)
549 maxNameIndex = Math.max(maxNameIndex,
550 nameIndices[i] = postTable.getChar());
552 names = new String[Math.max(maxNameIndex - 258 + 1, 0)];
553 for (int i = 258; i <= maxNameIndex; i++)
555 int nameLen = (postTable.get() & 0xff);
556 postTable.get(pascalName, 0, nameLen);
557 names[i - 258] = new String(pascalName, 0, nameLen);
559 for (int i = 0; i < numGlyphs; i++)
561 nameIndex = nameIndices[i];
563 glyphNames[i] = STANDARD_POSTSCRIPT_GLYPH_NAMES[nameIndex];
565 glyphNames[i] = names[nameIndex - 258];
569 case 0x00025000: // in case some font has a wrong representation of 2.5
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,
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()];
584 /* Format 3 leaves it to the printer driver to choose whatever
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
595 postTable.position(32);
596 numGlyphs = postTable.getChar();
597 glyphCharacterCodes = postTable.asCharBuffer();
598 glyphCharacterCodes.limit(numGlyphs);
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).
614 * javaEscapes = {0x22:'\\"', 0x5c:'\\\\'}
616 * if javaEscapes.has_key(c):
617 * return javaEscapes[c]
618 * elif 0x20 <= c <= 0x7e:
621 * return '\\u%04x' % c
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]
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
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)
652 * A String that contains the Unicode codepoint for each glyph
653 * in the Adobe Glyph List. The characters are in sorted order.
655 * Generated from the Adobe Glyph List for New Fonts, version 1.1
659 * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
660 * Glyph List for New Fonts</a>
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";
742 * The offset of each glyph name in AGLFN_NAMES.
744 * Generated from the Adobe Glyph List for New Fonts, version 1.1
748 * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
749 * Glyph List for New Fonts</a>
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";
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).
844 * <p>Generated from the Adobe Glyph List for New Fonts, version 1.1
848 * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
849 * Glyph List for New Fonts</a>
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/";
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.
981 * @param c the Unicode codepoint that corresponds to the glyph, for
982 * example <code>0x010a</code> for <code>LATIN CAPITAL LETTER C WITH
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.
990 * "http://partners.adobe.com/asn/tech/type/aglfn13.txt" >Adobe
991 * Glyph List for New Fonts (AGLFN), version 1.1 of April 17,
995 * "http://partners.adobe.com/asn/developer/type/unicodegn.html#6"
996 * >Adobe’s guidelines related to Unicode</a>
998 private static String getAGLFNName(char c)
1003 /* Performs a binary search in the sorted array (actually, a
1004 * String) of glyphs in the Adobe Glyph List for New Fonts.
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.
1011 max = AGLFN_GLYPHS.length() - 1;
1013 midChar = AGLFN_GLYPHS.charAt(mid);
1018 else if (midChar < c)
1022 mid = (min + max) >> 1;
1023 midChar = AGLFN_GLYPHS.charAt(mid);
1030 int pos = AGLFN_NAME_OFFSET.charAt(mid);
1031 return AGLFN_NAMES.substring(pos, AGLFN_NAMES.indexOf('/', pos));
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’s glyph naming recommendations
1039 * in order to allow searching and indexing of the produced
1040 * PostScript and PDF.
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>
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>.
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>
1061 private static String getGlyphName(char[] chars)
1066 boolean hasSurrogates = false;
1068 if ((chars == null) || ((numChars = chars.length) == 0))
1071 /* The vast majority of cases will be just a single character.
1072 * Therefore, we have a special code path for this case.
1077 name = getAGLFNName(c);
1082 CPStringBuilder buf = new CPStringBuilder(numChars * 8);
1083 for (int i = 0; i < numChars; i++)
1089 /* handle surrogate pairs */
1090 if (c >> 10 == 0x36) // U+D800 .. U+DBFF: High surrogate
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.
1097 * For further information, please refer to this page:
1098 * http://partners.adobe.com/asn/tech/type/glyphnamelimits.jsp#3
1100 int ucs4 = (((c & 0x3ff) << 10) | (chars[++i] & 0x3ff)) + 0x10000;
1102 buf.append(Integer.toHexString(ucs4).toUpperCase());
1106 /* Try the Adobe Glyph List. */
1107 name = getAGLFNName(c);
1114 nibble = (char) (((c >> 12) & 0xf) + 0x30);
1118 nibble = (char) (((c >> 8) & 0xf) + 0x30);
1122 nibble = (char) (((c >> 4) & 0xf) + 0x30);
1126 nibble = (char) (((c >> 0) & 0xf) + 0x30);
1133 return buf.toString();