KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > lowagie > text > pdf > Pfm2afm


1 /*
2  * $Id: Pfm2afm.java 2700 2007-04-19 14:11:50Z blowagie $
3  *
4  * Copyright 2005-2007 Paulo Soares
5  *
6  * The contents of this file are subject to the Mozilla Public License Version 1.1
7  * (the "License"); you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at http://www.mozilla.org/MPL/
9  *
10  * Software distributed under the License is distributed on an "AS IS" basis,
11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12  * for the specific language governing rights and limitations under the License.
13  *
14  * The Original Code is 'iText, a free JAVA-PDF library'.
15  *
16  * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
17  * the Initial Developer are Copyright (C) 1999-2007 by Bruno Lowagie.
18  * All Rights Reserved.
19  * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
20  * are Copyright (C) 2000-2007 by Paulo Soares. All Rights Reserved.
21  *
22  * Contributor(s): all the names of the contributors are added in the source code
23  * where applicable.
24  *
25  * Alternatively, the contents of this file may be used under the terms of the
26  * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
27  * provisions of LGPL are applicable instead of those above. If you wish to
28  * allow use of your version of this file only under the terms of the LGPL
29  * License and not to allow others to use your version of this file under
30  * the MPL, indicate your decision by deleting the provisions above and
31  * replace them with the notice and other provisions required by the LGPL.
32  * If you do not delete the provisions above, a recipient may use your version
33  * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
34  *
35  * This library is free software; you can redistribute it and/or modify it
36  * under the terms of the MPL as stated above or under the terms of the GNU
37  * Library General Public License as published by the Free Software Foundation;
38  * either version 2 of the License, or any later version.
39  *
40  * This library is distributed in the hope that it will be useful, but WITHOUT
41  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
42  * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
43  * details.
44  *
45  * If you didn't download this code from the following link, you should check if
46  * you aren't using an obsolete version:
47  * http://www.lowagie.com/iText/
48  */

49 /********************************************************************
50  * *
51  * Title: pfm2afm - Convert Windows .pfm files to .afm files *
52  * *
53  * Author: Ken Borgendale 10/9/91 Version 1.0 *
54  * *
55  * Function: *
56  * Convert a Windows .pfm (Printer Font Metrics) file to a *
57  * .afm (Adobe Font Metrics) file. The purpose of this is *
58  * to allow fonts put out for Windows to be used with OS/2. *
59  * *
60  * Syntax: *
61  * pfm2afm infile [outfile] -a *
62  * *
63  * Copyright: *
64  * pfm2afm - Copyright (C) IBM Corp., 1991 *
65  * *
66  * This code is released for public use as long as the *
67  * copyright remains intact. This code is provided asis *
68  * without any warrenties, express or implied. *
69  * *
70  * Notes: *
71  * 1. Much of the information in the original .afm file is *
72  * lost when the .pfm file is created, and thus cannot be *
73  * reconstructed by this utility. This is especially true *
74  * of data for characters not in the Windows character set. *
75  * *
76  * 2. This module is coded to be compiled by the MSC 6.0. *
77  * For other compilers, be careful of the packing of the *
78  * PFM structure. *
79  * *
80  ********************************************************************/

81
82 /********************************************************************
83  * *
84  * Modifications by Rod Smith, 5/22/96 *
85  * *
86  * These changes look for the strings "italic", "bold", "black", *
87  * and "light" in the font's name and set the weight accordingly *
88  * and adds an ItalicAngle line with a value of "0" or "-12.00". *
89  * This allows OS/2 programs such as DeScribe to handle the bold *
90  * and italic attributes appropriately, which was not the case *
91  * when I used the original version on fonts from the KeyFonts *
92  * Pro 2002 font CD. *
93  * *
94  * I've also increased the size of the buffer used to load the *
95  * .PFM file; the old size was inadequate for most of the fonts *
96  * from the SoftKey collection. *
97  * *
98  * Compiled with Watcom C 10.6 *
99  * *
100  ********************************************************************/

101  
102 /********************************************************************
103  * *
104  * Further modifications, 4/21/98, by Rod Smith *
105  * *
106  * Minor changes to get the program to compile with gcc under *
107  * Linux (Red Hat 5.0, to be precise). I had to add an itoa *
108  * function from the net (the function was buggy, so I had to fix *
109  * it, too!). I also made the program more friendly towards *
110  * files with mixed-case filenames. *
111  * *
112  ********************************************************************/

113
114 /********************************************************************
115  * *
116  * 1/31/2005, by Paulo Soares *
117  * *
118  * This code was integrated into iText. *
119  * Note that the itoa function mentioned in the comment by Rod *
120  * Smith is no longer in the code because Java has native support *
121  * in PrintWriter to convert integers to strings *
122  * *
123  ********************************************************************/

124
125 /********************************************************************
126  * *
127  * 7/16/2005, by Bruno Lowagie *
128  * *
129  * I solved an Eclipse Warning. *
130  * *
131  ********************************************************************/

132
133 /********************************************************************
134  * *
135  * 9/14/2006, by Xavier Le Vourch *
136  * *
137  * expand import clauses (import java.io.*) *
138  * the removal of an exception in readString was restored on 9/16 *
139  * *
140  ********************************************************************/

141 package com.lowagie.text.pdf;
142
143 import java.io.FileOutputStream JavaDoc;
144 import java.io.IOException JavaDoc;
145 import java.io.OutputStream JavaDoc;
146 import java.io.OutputStreamWriter JavaDoc;
147 import java.io.PrintWriter JavaDoc;
148
149 /**
150  * Converts a PFM file into an AFM file.
151  */

152 public class Pfm2afm {
153     private RandomAccessFileOrArray in;
154     private PrintWriter JavaDoc out;
155     
156     /** Creates a new instance of Pfm2afm */
157     private Pfm2afm(RandomAccessFileOrArray in, OutputStream JavaDoc out) throws IOException JavaDoc {
158         this.in = in;
159         this.out = new PrintWriter JavaDoc(new OutputStreamWriter JavaDoc(out, "ISO-8859-1"));
160     }
161     
162     /**
163      * Converts a PFM file into an AFM file.
164      * @param in the PFM file
165      * @param out the AFM file
166      * @throws IOException on error
167      */

168     public static void convert(RandomAccessFileOrArray in, OutputStream JavaDoc out) throws IOException JavaDoc {
169         Pfm2afm p = new Pfm2afm(in, out);
170         p.openpfm();
171         p.putheader();
172         p.putchartab();
173         p.putkerntab();
174         p.puttrailer();
175         p.out.flush();
176     }
177     
178     public static void main(String JavaDoc[] args) {
179         try {
180             RandomAccessFileOrArray in = new RandomAccessFileOrArray(args[0]);
181             OutputStream JavaDoc out = new FileOutputStream JavaDoc(args[1]);
182             convert(in, out);
183             in.close();
184             out.close();
185         }
186         catch (Exception JavaDoc e) {
187             e.printStackTrace();
188         }
189     }
190     
191     private String JavaDoc readString(int n) throws IOException JavaDoc {
192         byte b[] = new byte[n];
193         in.readFully(b);
194         int k;
195         for (k = 0; k < b.length; ++k) {
196             if (b[k] == 0)
197                 break;
198         }
199         return new String JavaDoc(b, 0, k, "ISO-8859-1");
200     }
201     
202     private String JavaDoc readString() throws IOException JavaDoc {
203         StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
204         while (true) {
205             int c = in.read();
206             if (c <= 0)
207                 break;
208             buf.append((char)c);
209         }
210         return buf.toString();
211     }
212     
213     private void outval(int n) {
214         out.print(' ');
215         out.print(n);
216     }
217     
218     /*
219      * Output a character entry
220      */

221     private void outchar(int code, int width, String JavaDoc name) {
222         out.print("C ");
223         outval(code);
224         out.print(" ; WX ");
225         outval(width);
226         if (name != null) {
227             out.print(" ; N ");
228             out.print(name);
229         }
230         out.print(" ;\n");
231     }
232     
233     private void openpfm() throws IOException JavaDoc {
234         in.seek(0);
235         vers = in.readShortLE();
236         h_len = in.readIntLE();
237         copyright = readString(60);
238         type = in.readShortLE();
239         points = in.readShortLE();
240         verres = in.readShortLE();
241         horres = in.readShortLE();
242         ascent = in.readShortLE();
243         intleading = in.readShortLE();
244         extleading = in.readShortLE();
245         italic = (byte)in.read();
246         uline = (byte)in.read();
247         overs = (byte)in.read();
248         weight = in.readShortLE();
249         charset = (byte)in.read();
250         pixwidth = in.readShortLE();
251         pixheight = in.readShortLE();
252         kind = (byte)in.read();
253         avgwidth = in.readShortLE();
254         maxwidth = in.readShortLE();
255         firstchar = in.read();
256         lastchar = in.read();
257         defchar = (byte)in.read();
258         brkchar = (byte)in.read();
259         widthby = in.readShortLE();
260         device = in.readIntLE();
261         face = in.readIntLE();
262         bits = in.readIntLE();
263         bitoff = in.readIntLE();
264         extlen = in.readShortLE();
265         psext = in.readIntLE();
266         chartab = in.readIntLE();
267         res1 = in.readIntLE();
268         kernpairs = in.readIntLE();
269         res2 = in.readIntLE();
270         fontname = in.readIntLE();
271         if (h_len != in.length() || extlen != 30 || fontname < 75 || fontname > 512)
272             throw new IOException JavaDoc("Not a valid PFM file.");
273         in.seek(psext + 14);
274         capheight = in.readShortLE();
275         xheight = in.readShortLE();
276         ascender = in.readShortLE();
277         descender = in.readShortLE();
278     }
279     
280     private void putheader() throws IOException JavaDoc {
281         out.print("StartFontMetrics 2.0\n");
282         if (copyright.length() > 0)
283             out.print("Comment " + copyright + '\n');
284         out.print("FontName ");
285         in.seek(fontname);
286         String JavaDoc fname = readString();
287         out.print(fname);
288         out.print("\nEncodingScheme ");
289         if (charset != 0)
290             out.print("FontSpecific\n");
291         else
292             out.print("AdobeStandardEncoding\n");
293         /*
294          * The .pfm is missing full name, so construct from font name by
295          * changing the hyphen to a space. This actually works in a lot
296          * of cases.
297          */

298         out.print("FullName " + fname.replace('-', ' '));
299         if (face != 0) {
300             in.seek(face);
301             out.print("\nFamilyName " + readString());
302         }
303
304         out.print("\nWeight ");
305         if (weight > 475 || fname.toLowerCase().indexOf("bold") >= 0)
306            out.print("Bold");
307         else if ((weight < 325 && weight != 0) || fname.toLowerCase().indexOf("light") >= 0)
308             out.print("Light");
309         else if (fname.toLowerCase().indexOf("black") >= 0)
310             out.print("Black");
311         else
312             out.print("Medium");
313
314         out.print("\nItalicAngle ");
315         if (italic != 0 || fname.toLowerCase().indexOf("italic") >= 0)
316             out.print("-12.00");
317             /* this is a typical value; something else may work better for a
318                specific font */

319         else
320             out.print("0");
321
322         /*
323          * The mono flag in the pfm actually indicates whether there is a
324          * table of font widths, not if they are all the same.
325          */

326         out.print("\nIsFixedPitch ");
327         if ((kind & 1) == 0 || /* Flag for mono */
328             avgwidth == maxwidth ) { /* Avg width = max width */
329             out.print("true");
330             isMono = true;
331         }
332         else {
333             out.print("false");
334             isMono = false;
335         }
336
337         /*
338          * The font bounding box is lost, but try to reconstruct it.
339          * Much of this is just guess work. The bounding box is required in
340          * the .afm, but is not used by the PM font installer.
341          */

342         out.print("\nFontBBox");
343         if (isMono)
344             outval(-20); /* Just guess at left bounds */
345         else
346             outval(-100);
347         outval(-(descender+5)); /* Descender is given as positive value */
348         outval(maxwidth+10);
349         outval(ascent+5);
350
351         /*
352          * Give other metrics that were kept
353          */

354         out.print("\nCapHeight");
355         outval(capheight);
356         out.print("\nXHeight");
357         outval(xheight);
358         out.print("\nDescender");
359         outval(descender);
360         out.print("\nAscender");
361         outval(ascender);
362         out.print('\n');
363     }
364     
365     private void putchartab() throws IOException JavaDoc {
366         int count = lastchar - firstchar + 1;
367         int ctabs[] = new int[count];
368         in.seek(chartab);
369         for (int k = 0; k < count; ++k)
370             ctabs[k] = in.readUnsignedShortLE();
371         int back[] = new int[256];
372         if (charset == 0) {
373             for (int i = firstchar; i <= lastchar; ++i) {
374                 if (Win2PSStd[i] != 0)
375                     back[Win2PSStd[i]] = i;
376             }
377         }
378         /* Put out the header */
379         out.print("StartCharMetrics");
380         outval(count);
381         out.print('\n');
382
383         /* Put out all encoded chars */
384         if (charset != 0) {
385         /*
386          * If the charset is not the Windows standard, just put out
387          * unnamed entries.
388          */

389             for (int i = firstchar; i <= lastchar; i++) {
390                 if (ctabs[i - firstchar] != 0) {
391                     outchar(i, ctabs[i - firstchar], null);
392                 }
393             }
394         }
395         else {
396             for (int i = 0; i < 256; i++) {
397                 int j = back[i];
398                 if (j != 0) {
399                     outchar(i, ctabs[j - firstchar], WinChars[j]);
400                     ctabs[j - firstchar] = 0;
401                 }
402             }
403             /* Put out all non-encoded chars */
404             for (int i = firstchar; i <= lastchar; i++) {
405                 if (ctabs[i - firstchar] != 0) {
406                     outchar(-1, ctabs[i - firstchar], WinChars[i]);
407                 }
408             }
409         }
410         /* Put out the trailer */
411         out.print("EndCharMetrics\n");
412         
413     }
414     
415     private void putkerntab() throws IOException JavaDoc {
416         if (kernpairs == 0)
417             return;
418         in.seek(kernpairs);
419         int count = in.readUnsignedShortLE();
420         int nzero = 0;
421         int kerns[] = new int[count * 3];
422         for (int k = 0; k < kerns.length;) {
423             kerns[k++] = in.read();
424             kerns[k++] = in.read();
425             if ((kerns[k++] = in.readShortLE()) != 0)
426                 ++nzero;
427         }
428         if (nzero == 0)
429             return;
430         out.print("StartKernData\nStartKernPairs");
431         outval(nzero);
432         out.print('\n');
433         for (int k = 0; k < kerns.length; k += 3) {
434             if (kerns[k + 2] != 0) {
435                 out.print("KPX ");
436                 out.print(WinChars[kerns[k]]);
437                 out.print(' ');
438                 out.print(WinChars[kerns[k + 1]]);
439                 outval(kerns[k + 2]);
440                 out.print('\n');
441             }
442         }
443         /* Put out trailer */
444         out.print("EndKernPairs\nEndKernData\n");
445     }
446     
447
448     private void puttrailer() {
449         out.print("EndFontMetrics\n");
450     }
451
452     private short vers;
453     private int h_len; /* Total length of .pfm file */
454     private String JavaDoc copyright; /* Copyright string [60]*/
455     private short type;
456     private short points;
457     private short verres;
458     private short horres;
459     private short ascent;
460     private short intleading;
461     private short extleading;
462     private byte italic;
463     private byte uline;
464     private byte overs;
465     private short weight;
466     private byte charset; /* 0=windows, otherwise nomap */
467     private short pixwidth; /* Width for mono fonts */
468     private short pixheight;
469     private byte kind; /* Lower bit off in mono */
470     private short avgwidth; /* Mono if avg=max width */
471     private short maxwidth; /* Use to compute bounding box */
472     private int firstchar; /* First char in table */
473     private int lastchar; /* Last char in table */
474     private byte defchar;
475     private byte brkchar;
476     private short widthby;
477     private int device;
478     private int face; /* Face name */
479     private int bits;
480     private int bitoff;
481     private short extlen;
482     private int psext; /* PostScript extension */
483     private int chartab; /* Character width tables */
484     private int res1;
485     private int kernpairs; /* Kerning pairs */
486     private int res2;
487     private int fontname; /* Font name */
488
489 /*
490  * Some metrics from the PostScript extension
491  */

492     private short capheight; /* Cap height */
493     private short xheight; /* X height */
494     private short ascender; /* Ascender */
495     private short descender; /* Descender (positive) */
496
497     
498     private boolean isMono;
499 /*
500  * Translate table from 1004 to psstd. 1004 is an extension of the
501  * Windows translate table used in PM.
502  */

503     private int Win2PSStd[] = {
504         0, 0, 0, 0, 197, 198, 199, 0, 202, 0, 205, 206, 207, 0, 0, 0,
505         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
506         32, 33, 34, 35, 36, 37, 38, 169, 40, 41, 42, 43, 44, 45, 46, 47,
507         48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
508         64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
509         80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
510         193, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
511         112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
512         0, 0, 184, 0, 185, 188, 178, 179, 94, 189, 0, 172, 234, 0, 0, 0,
513         0, 96, 0, 170, 186, 0, 177, 208, 126, 0, 0, 173, 250, 0, 0, 0,
514         0, 161, 162, 163, 168, 165, 0, 167, 200, 0, 227, 171, 0, 0, 0, 0,
515         0, 0, 0, 0, 194, 0, 182, 180, 203, 0, 235, 187, 0, 0, 0, 191,
516         0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0,
517         0, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 251,
518         0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0,
519         0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0
520     };
521     
522 /*
523  * Character class. This is a minor attempt to overcome the problem that
524  * in the pfm file, all unused characters are given the width of space.
525  */

526     private int WinClass[] = {
527         0, 0, 0, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 0, 0, /* 00 */
528         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 */
529         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 20 */
530         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 30 */
531         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 40 */
532         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 50 */
533         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 60 */
534         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, /* 70 */
535         0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, /* 80 */
536         0, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, /* 90 */
537         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* a0 */
538         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* b0 */
539         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* c0 */
540         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* d0 */
541         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* e0 */
542         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 /* f0 */
543     };
544     
545 /*
546  * Windows chararacter names. Give a name to the usused locations
547  * for when the all flag is specified.
548  */

549     private String JavaDoc WinChars[] = {
550         "W00", /* 00 */
551         "W01", /* 01 */
552         "W02", /* 02 */
553         "W03", /* 03 */
554         "macron", /* 04 */
555         "breve", /* 05 */
556         "dotaccent", /* 06 */
557         "W07", /* 07 */
558         "ring", /* 08 */
559         "W09", /* 09 */
560         "W0a", /* 0a */
561         "W0b", /* 0b */
562         "W0c", /* 0c */
563         "W0d", /* 0d */
564         "W0e", /* 0e */
565         "W0f", /* 0f */
566         "hungarumlaut", /* 10 */
567         "ogonek", /* 11 */
568         "caron", /* 12 */
569         "W13", /* 13 */
570         "W14", /* 14 */
571         "W15", /* 15 */
572         "W16", /* 16 */
573         "W17", /* 17 */
574         "W18", /* 18 */
575         "W19", /* 19 */
576         "W1a", /* 1a */
577         "W1b", /* 1b */
578         "W1c", /* 1c */
579         "W1d", /* 1d */
580         "W1e", /* 1e */
581         "W1f", /* 1f */
582         "space", /* 20 */
583         "exclam", /* 21 */
584         "quotedbl", /* 22 */
585         "numbersign", /* 23 */
586         "dollar", /* 24 */
587         "percent", /* 25 */
588         "ampersand", /* 26 */
589         "quotesingle", /* 27 */
590         "parenleft", /* 28 */
591         "parenright", /* 29 */
592         "asterisk", /* 2A */
593         "plus", /* 2B */
594         "comma", /* 2C */
595         "hyphen", /* 2D */
596         "period", /* 2E */
597         "slash", /* 2F */
598         "zero", /* 30 */
599         "one", /* 31 */
600         "two", /* 32 */
601         "three", /* 33 */
602         "four", /* 34 */
603         "five", /* 35 */
604         "six", /* 36 */
605         "seven", /* 37 */
606         "eight", /* 38 */
607         "nine", /* 39 */
608         "colon", /* 3A */
609         "semicolon", /* 3B */
610         "less", /* 3C */
611         "equal", /* 3D */
612         "greater", /* 3E */
613         "question", /* 3F */
614         "at", /* 40 */
615         "A", /* 41 */
616         "B", /* 42 */
617         "C", /* 43 */
618         "D", /* 44 */
619         "E", /* 45 */
620         "F", /* 46 */
621         "G", /* 47 */
622         "H", /* 48 */
623         "I", /* 49 */
624         "J", /* 4A */
625         "K", /* 4B */
626         "L", /* 4C */
627         "M", /* 4D */
628         "N", /* 4E */
629         "O", /* 4F */
630         "P", /* 50 */
631         "Q", /* 51 */
632         "R", /* 52 */
633         "S", /* 53 */
634         "T", /* 54 */
635         "U", /* 55 */
636         "V", /* 56 */
637         "W", /* 57 */
638         "X", /* 58 */
639         "Y", /* 59 */
640         "Z", /* 5A */
641         "bracketleft", /* 5B */
642         "backslash", /* 5C */
643         "bracketright", /* 5D */
644         "asciicircum", /* 5E */
645         "underscore", /* 5F */
646         "grave", /* 60 */
647         "a", /* 61 */
648         "b", /* 62 */
649         "c", /* 63 */
650         "d", /* 64 */
651         "e", /* 65 */
652         "f", /* 66 */
653         "g", /* 67 */
654         "h", /* 68 */
655         "i", /* 69 */
656         "j", /* 6A */
657         "k", /* 6B */
658         "l", /* 6C */
659         "m", /* 6D */
660         "n", /* 6E */
661         "o", /* 6F */
662         "p", /* 70 */
663         "q", /* 71 */
664         "r", /* 72 */
665         "s", /* 73 */
666         "t", /* 74 */
667         "u", /* 75 */
668         "v", /* 76 */
669         "w", /* 77 */
670         "x", /* 78 */
671         "y", /* 79 */
672         "z", /* 7A */
673         "braceleft", /* 7B */
674         "bar", /* 7C */
675         "braceright", /* 7D */
676         "asciitilde", /* 7E */
677         "W7f", /* 7F */
678         "W80", /* 80 */
679         "W81", /* 81 */
680         "quotesinglbase", /* 82 */
681         "W83", /* 83 */
682         "quotedblbase", /* 84 */
683         "ellipsis", /* 85 */
684         "dagger", /* 86 */
685         "daggerdbl", /* 87 */
686         "asciicircum", /* 88 */
687         "perthousand", /* 89 */
688         "Scaron", /* 8A */
689         "guilsinglleft", /* 8B */
690         "OE", /* 8C */
691         "W8d", /* 8D */
692         "W8e", /* 8E */
693         "W8f", /* 8F */
694         "W90", /* 90 */
695         "quoteleft", /* 91 */
696         "quoteright", /* 92 */
697         "quotedblleft", /* 93 */
698         "quotedblright", /* 94 */
699         "bullet1", /* 95 */
700         "endash", /* 96 */
701         "emdash", /* 97 */
702         "asciitilde", /* 98 */
703         "trademark", /* 99 */
704         "scaron", /* 9A */
705         "guilsinglright", /* 9B */
706         "oe", /* 9C */
707         "W9d", /* 9D */
708         "W9e", /* 9E */
709         "Ydieresis", /* 9F */
710         "reqspace", /* A0 */
711         "exclamdown", /* A1 */
712         "cent", /* A2 */
713         "sterling", /* A3 */
714         "currency", /* A4 */
715         "yen", /* A5 */
716         "brokenbar", /* A6 */
717         "section", /* A7 */
718         "dieresis", /* A8 */
719         "copyright", /* A9 */
720         "ordfeminine", /* AA */
721         "guillemotleft", /* AB */
722         "logicalnot", /* AC */
723         "syllable", /* AD */
724         "registered", /* AE */
725         "overbar", /* AF */
726         "degree", /* B0 */
727         "plusminus", /* B1 */
728         "twosuperior", /* B2 */
729         "threesuperior", /* B3 */
730         "acute", /* B4 */
731         "mu", /* B5 */
732         "paragraph", /* B6 */
733         "periodcentered", /* B7 */
734         "cedilla", /* B8 */
735         "onesuperior", /* B9 */
736         "ordmasculine", /* BA */
737         "guillemotright", /* BB */
738         "onequarter", /* BC */
739         "onehalf", /* BD */
740         "threequarters", /* BE */
741         "questiondown", /* BF */
742         "Agrave", /* C0 */
743         "Aacute", /* C1 */
744         "Acircumflex", /* C2 */
745         "Atilde", /* C3 */
746         "Adieresis", /* C4 */
747         "Aring", /* C5 */
748         "AE", /* C6 */
749         "Ccedilla", /* C7 */
750         "Egrave", /* C8 */
751         "Eacute", /* C9 */
752         "Ecircumflex", /* CA */
753         "Edieresis", /* CB */
754         "Igrave", /* CC */
755         "Iacute", /* CD */
756         "Icircumflex", /* CE */
757         "Idieresis", /* CF */
758         "Eth", /* D0 */
759         "Ntilde", /* D1 */
760         "Ograve", /* D2 */
761         "Oacute", /* D3 */
762         "Ocircumflex", /* D4 */
763         "Otilde", /* D5 */
764         "Odieresis", /* D6 */
765         "multiply", /* D7 */
766         "Oslash", /* D8 */
767         "Ugrave", /* D9 */
768         "Uacute", /* DA */
769         "Ucircumflex", /* DB */
770         "Udieresis", /* DC */
771         "Yacute", /* DD */
772         "Thorn", /* DE */
773         "germandbls", /* DF */
774         "agrave", /* E0 */
775         "aacute", /* E1 */
776         "acircumflex", /* E2 */
777         "atilde", /* E3 */
778         "adieresis", /* E4 */
779         "aring", /* E5 */
780         "ae", /* E6 */
781         "ccedilla", /* E7 */
782         "egrave", /* E8 */
783         "eacute", /* E9 */
784         "ecircumflex", /* EA */
785         "edieresis", /* EB */
786         "igrave", /* EC */
787         "iacute", /* ED */
788         "icircumflex", /* EE */
789         "idieresis", /* EF */
790         "eth", /* F0 */
791         "ntilde", /* F1 */
792         "ograve", /* F2 */
793         "oacute", /* F3 */
794         "ocircumflex", /* F4 */
795         "otilde", /* F5 */
796         "odieresis", /* F6 */
797         "divide", /* F7 */
798         "oslash", /* F8 */
799         "ugrave", /* F9 */
800         "uacute", /* FA */
801         "ucircumflex", /* FB */
802         "udieresis", /* FC */
803         "yacute", /* FD */
804         "thorn", /* FE */
805         "ydieresis" /* FF */
806     };
807 }
Popular Tags