clang-format all pdfium code.
[pdfium.git] / core / src / fpdfapi / fpdf_font / fpdf_font_charset.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../../include/fpdfapi/fpdf_page.h"
8 #include "../../../include/fpdfapi/fpdf_resource.h"
9 #include "../../../include/fxge/fx_freetype.h"
10
11 // TODO(tsepez): These belong in headers, too.
12 extern const FX_WORD PDFDocEncoding[256];
13
14 static const struct _UnicodeAlt {
15   FX_WORD m_Unicode;
16   const FX_CHAR* m_Alter;
17 } UnicodeAlts[] = {
18     {0x00a0, " "},    {0x00a1, "!"},   {0x00a2, "c"},   {0x00a3, "P"},
19     {0x00a4, "o"},    {0x00a5, "Y"},   {0x00a6, "|"},   {0x00a7, "S"},
20     {0x00a9, "(C)"},  {0x00aa, "a"},   {0x00ab, "<<"},  {0x00ac, "-|"},
21     {0x00ae, "(R)"},  {0x00af, "-"},   {0x00b0, "o"},   {0x00b1, "+/-"},
22     {0x00b2, "^2"},   {0x00b3, "^3"},  {0x00b4, "'"},   {0x00b5, "u"},
23     {0x00b6, "P"},    {0x00b7, "."},   {0x00b9, "^1"},  {0x00ba, "o"},
24     {0x00bb, ">>"},   {0x00bc, "1/4"}, {0x00bd, "1/2"}, {0x00be, "3/4"},
25     {0x00bf, "?"},    {0x00c0, "A"},   {0x00c1, "A"},   {0x00c2, "A"},
26     {0x00c3, "A"},    {0x00c4, "A"},   {0x00c5, "A"},   {0x00c6, "AE"},
27     {0x00c7, "C"},    {0x00c8, "E"},   {0x00c9, "E"},   {0x00ca, "E"},
28     {0x00cb, "E"},    {0x00cc, "I"},   {0x00cd, "I"},   {0x00ce, "I"},
29     {0x00cf, "I"},    {0x00d1, "N"},   {0x00d2, "O"},   {0x00d3, "O"},
30     {0x00d4, "O"},    {0x00d5, "O"},   {0x00d6, "O"},   {0x00d7, "x"},
31     {0x00d8, "O"},    {0x00d9, "U"},   {0x00da, "U"},   {0x00db, "U"},
32     {0x00dc, "U"},    {0x00dd, "Y"},   {0x00df, "S"},   {0x00e0, "a"},
33     {0x00e1, "a"},    {0x00e2, "a"},   {0x00e3, "a"},   {0x00e4, "a"},
34     {0x00e5, "a"},    {0x00e6, "ae"},  {0x00e7, "c"},   {0x00e8, "e"},
35     {0x00e9, "e"},    {0x00ea, "e"},   {0x00eb, "e"},   {0x00ec, "i"},
36     {0x00ed, "i"},    {0x00ee, "i"},   {0x00ef, "i"},   {0x00f1, "n"},
37     {0x00f2, "o"},    {0x00f3, "o"},   {0x00f4, "o"},   {0x00f5, "o"},
38     {0x00f6, "o"},    {0x00f7, "/"},   {0x00f8, "o"},   {0x00f9, "u"},
39     {0x00fa, "u"},    {0x00fb, "u"},   {0x00fc, "u"},   {0x00fd, "y"},
40     {0x00ff, "y"},    {0x02b0, "h"},   {0x02b2, "j"},   {0x02b3, "r"},
41     {0x02b7, "w"},    {0x02b8, "y"},   {0x02b9, "'"},   {0x02ba, "\""},
42     {0x02bb, "'"},    {0x02bc, "'"},   {0x02bd, "'"},   {0x02be, "'"},
43     {0x02bf, "'"},    {0x02c2, "<"},   {0x02c3, ">"},   {0x02c4, "^"},
44     {0x02c5, "v"},    {0x02c6, "^"},   {0x02c7, "v"},   {0x02c8, "'"},
45     {0x02c9, "-"},    {0x02ca, "'"},   {0x02cb, "'"},   {0x02cc, "."},
46     {0x02cd, "_"},    {0x2010, "-"},   {0x2012, "-"},   {0x2013, "-"},
47     {0x2014, "--"},   {0x2015, "--"},  {0x2016, "|"},   {0x2017, "_"},
48     {0x2018, "'"},    {0x2019, "'"},   {0x201a, ","},   {0x201b, "'"},
49     {0x201c, "\""},   {0x201d, "\""},  {0x201e, ","},   {0x201f, "'"},
50     {0x2020, "+"},    {0x2021, "+"},   {0x2022, "*"},   {0x2023, ">"},
51     {0x2024, "."},    {0x2025, ".."},  {0x2027, "."},   {0x2032, "'"},
52     {0x2033, "\""},   {0x2035, "'"},   {0x2036, "\""},  {0x2038, "^"},
53     {0x2039, "<"},    {0x203a, ">"},   {0x203b, "*"},   {0x203c, "!!"},
54     {0x203d, "?!"},   {0x203e, "-"},   {0x2044, "/"},   {0x2047, "??"},
55     {0x2048, "?!"},   {0x2049, "!?"},  {0x204e, "*"},   {0x2052, "%"},
56     {0x2122, "(TM)"}, {0x2212, "-"},   {0x2215, "/"},   {0x2216, "\\"},
57     {0x2217, "*"},    {0x2218, "*"},   {0x2219, "*"},   {0x2223, "|"},
58     {0x22c5, "."},    {0x266f, "#"},   {0XF6D9, "(C)"}, {0XF6DA, "(C)"},
59     {0XF6DB, "(TM)"}, {0XF8E8, "(C)"}, {0xf8e9, "(C)"}, {0XF8EA, "(TM)"},
60     {0xfb01, "fi"},   {0xfb02, "fl"}};
61 const FX_CHAR* FCS_GetAltStr(FX_WCHAR unicode) {
62   int begin = 0;
63   int end = sizeof UnicodeAlts / sizeof(struct _UnicodeAlt) - 1;
64   while (begin <= end) {
65     int middle = (begin + end) / 2;
66     FX_WORD middlecode = UnicodeAlts[middle].m_Unicode;
67     if (middlecode > unicode) {
68       end = middle - 1;
69     } else if (middlecode < unicode) {
70       begin = middle + 1;
71     } else {
72       return UnicodeAlts[middle].m_Alter;
73     }
74   }
75   return NULL;
76 }
77 static const FX_WORD StandardEncoding[256] = {
78     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
79     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
80     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
81     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023,
82     0x0024, 0x0025, 0x0026, 0x2019, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c,
83     0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
84     0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e,
85     0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
86     0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050,
87     0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
88     0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x2018, 0x0061, 0x0062,
89     0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b,
90     0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
91     0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d,
92     0x007e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
93     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
94     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
95     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a1,
96     0x00a2, 0x00a3, 0x2044, 0x00a5, 0x0192, 0x00a7, 0x00a4, 0x0027, 0x201c,
97     0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, 0x0000, 0x2013, 0x2020, 0x2021,
98     0x00b7, 0x0000, 0x00b6, 0x2022, 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026,
99     0x2030, 0x0000, 0x00bf, 0x0000, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00af,
100     0x02d8, 0x02d9, 0x00a8, 0x0000, 0x02da, 0x00b8, 0x0000, 0x02dd, 0x02db,
101     0x02c7, 0x2014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
102     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
103     0x00c6, 0x0000, 0x00aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0141, 0x00d8,
104     0x0152, 0x00ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x0000,
105     0x0000, 0x0000, 0x0131, 0x0000, 0x0000, 0x0142, 0x00f8, 0x0153, 0x00df,
106     0x0000, 0x0000, 0x0000, 0x0000};
107 static const FX_WORD MacRomanEncoding[256] = {
108     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
109     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
110     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
111     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023,
112     0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c,
113     0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
114     0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e,
115     0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
116     0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050,
117     0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
118     0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062,
119     0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b,
120     0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
121     0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d,
122     0x007e, 0x0000, 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc,
123     0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8,
124     0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, 0x00f2,
125     0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, 0x2020, 0x00b0,
126     0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9, 0x2122,
127     0x00b4, 0x00a8, 0x0000, 0x00c6, 0x00d8, 0x0000, 0x00b1, 0x0000, 0x0000,
128     0x00a5, 0x00b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa, 0x00ba,
129     0x0000, 0x00e6, 0x00f8, 0x00bf, 0x00a3, 0x00ac, 0x0000, 0x0192, 0x0000,
130     0x0000, 0x00ab, 0x00bb, 0x2026, 0x0020, 0x00c0, 0x00c3, 0x00d5, 0x0152,
131     0x0153, 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x0000,
132     0x00ff, 0x0178, 0x2044, 0x00a4, 0x2039, 0x203a, 0xfb01, 0xfb02, 0x2021,
133     0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, 0x00cb, 0x00c8,
134     0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, 0x0000, 0x00d2, 0x00da,
135     0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9, 0x02da,
136     0x00b8, 0x02dd, 0x02db, 0x02c7};
137 static const FX_WORD AdobeWinAnsiEncoding[256] = {
138     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
139     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
140     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
141     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023,
142     0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c,
143     0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
144     0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e,
145     0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
146     0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050,
147     0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
148     0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062,
149     0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b,
150     0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
151     0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d,
152     0x007e, 0x2022, 0x20ac, 0x2022, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020,
153     0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x2022, 0x017d, 0x2022,
154     0x2022, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc,
155     0x2122, 0x0161, 0x203a, 0x0153, 0x2022, 0x017e, 0x0178, 0x0020, 0x00a1,
156     0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa,
157     0x00ab, 0x00ac, 0x002d, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3,
158     0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc,
159     0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5,
160     0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
161     0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
162     0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0,
163     0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9,
164     0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2,
165     0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb,
166     0x00fc, 0x00fd, 0x00fe, 0x00ff};
167 static const FX_WORD MacExpertEncoding[256] = {
168     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
169     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
170     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
171     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0xf721, 0xf6f8, 0xf7a2,
172     0xf724, 0xf6e4, 0xf726, 0xf7b4, 0x207d, 0x207e, 0x2025, 0x2024, 0x002c,
173     0x002d, 0x002e, 0x2044, 0xf730, 0xf731, 0xf732, 0xf733, 0xf734, 0xf735,
174     0xf736, 0xf737, 0xf738, 0xf739, 0x003a, 0x003b, 0x0000, 0xf6de, 0x0000,
175     0xf73f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f0, 0x0000, 0x0000, 0x00bc,
176     0x00bd, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, 0x2153, 0x2154, 0x0000,
177     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb00, 0xfb01, 0xfb02, 0xfb03,
178     0xfb04, 0x208d, 0x0000, 0x208e, 0xf6f6, 0xf6e5, 0xf760, 0xf761, 0xf762,
179     0xf763, 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b,
180     0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774,
181     0xf775, 0xf776, 0xf777, 0xf778, 0xf779, 0xf77a, 0x20a1, 0xf6dc, 0xf6dd,
182     0xf6fe, 0x0000, 0x0000, 0xf6e9, 0xf6e0, 0x0000, 0x0000, 0x0000, 0x0000,
183     0xf7e1, 0xf7e0, 0xf7e2, 0xf7e4, 0xf7e3, 0xf7e5, 0xf7e7, 0xf7e9, 0xf7e8,
184     0xf7ea, 0xf7eb, 0xf7ed, 0xf7ec, 0xf7ee, 0xf7ef, 0xf7f1, 0xf7f3, 0xf7f2,
185     0xf7f4, 0xf7f6, 0xf7f5, 0xf7fa, 0xf7f9, 0xf7fb, 0xf7fc, 0x0000, 0x2078,
186     0x2084, 0x2083, 0x2086, 0x2088, 0x2087, 0xf6fd, 0x0000, 0xf6df, 0x2082,
187     0x0000, 0xf7a8, 0x0000, 0xf6f5, 0xf6fd, 0x2085, 0x0000, 0xf6e1, 0xf6e7,
188     0xf7fd, 0x0000, 0xf6e3, 0x0000, 0x0000, 0xf7fe, 0x0000, 0x2089, 0x2080,
189     0xf6ff, 0xf7e6, 0xf7f8, 0xf7bf, 0x2081, 0xf6e9, 0x0000, 0x0000, 0x0000,
190     0x0000, 0x0000, 0x0000, 0xf7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
191     0xf6fa, 0x2012, 0xf6e6, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7a1, 0x0000,
192     0xf7ff, 0x0000, 0x00b9, 0x00b2, 0x00b3, 0x2074, 0x2075, 0x2076, 0x2077,
193     0x2079, 0x2070, 0x0000, 0xf6ec, 0xf6f1, 0x0000, 0x0000, 0x0000, 0xf6ed,
194     0xf6f2, 0xf6eb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6ee, 0xf6fb,
195     0xf6f4, 0xf7af, 0xf6ea, 0x207f, 0xf6ef, 0xf6e2, 0xf6e8, 0xf6f7, 0xf6fc,
196     0x0000, 0x0000, 0x0000, 0x0000};
197 static const FX_WORD AdobeSymbolEncoding[256] = {
198     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
199     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
200     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
201     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0021, 0x2200, 0x0023,
202     0x2203, 0x0025, 0x0026, 0x220B, 0x0028, 0x0029, 0x2217, 0x002B, 0x002C,
203     0x2212, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
204     0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
205     0x003F, 0x2245, 0x0391, 0x0392, 0x03A7, 0x0394, 0x0395, 0x03A6, 0x0393,
206     0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F, 0x03A0,
207     0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x03A9, 0x039E, 0x03A8,
208     0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F, 0xF8E5, 0x03B1, 0x03B2,
209     0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3, 0x03B7, 0x03B9, 0x03D5, 0x03BA,
210     0x03BB, 0x03BC, 0x03BD, 0x03BF, 0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4,
211     0x03C5, 0x03D6, 0x03C9, 0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D,
212     0x223C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
213     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
214     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
215     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20AC, 0x03D2,
216     0x2032, 0x2264, 0x2044, 0x221E, 0x0192, 0x2663, 0x2666, 0x2665, 0x2660,
217     0x2194, 0x2190, 0x2191, 0x2192, 0x2193, 0x00B0, 0x00B1, 0x2033, 0x2265,
218     0x00D7, 0x221D, 0x2202, 0x2022, 0x00F7, 0x2260, 0x2261, 0x2248, 0x2026,
219     0xF8E6, 0xF8E7, 0x21B5, 0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295,
220     0x2205, 0x2229, 0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208,
221     0x2209, 0x2220, 0x2207, 0xF6DA, 0xF6D9, 0xF6DB, 0x220F, 0x221A, 0x22C5,
222     0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3, 0x25CA,
223     0x2329, 0xF8E8, 0xF8E9, 0xF8EA, 0x2211, 0xF8EB, 0xF8EC, 0xF8ED, 0xF8EE,
224     0xF8EF, 0xF8F0, 0xF8F1, 0xF8F2, 0xF8F3, 0xF8F4, 0x0000, 0x232A, 0x222B,
225     0x2320, 0xF8F5, 0x2321, 0xF8F6, 0xF8F7, 0xF8F8, 0xF8F9, 0xF8FA, 0xF8FB,
226     0xF8FC, 0xF8FD, 0xF8FE, 0x0000,
227 };
228 static const FX_WORD ZapfEncoding[256] = {
229     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
230     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
231     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
232     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x2701, 0x2702, 0x2703,
233     0x2704, 0x260E, 0x2706, 0x2707, 0x2708, 0x2709, 0x261B, 0x261E, 0x270C,
234     0x270D, 0x270E, 0x270F, 0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715,
235     0x2716, 0x2717, 0x2718, 0x2719, 0x271A, 0x271B, 0x271C, 0x271D, 0x271E,
236     0x271F, 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727,
237     0x2605, 0x2729, 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F, 0x2730,
238     0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739,
239     0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F, 0x2740, 0x2741, 0x2742,
240     0x2743, 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0x274A, 0x274B,
241     0x25CF, 0x274D, 0x25A0, 0x274F, 0x2750, 0x2751, 0x2752, 0x25B2, 0x25BC,
242     0x25C6, 0x2756, 0x25D7, 0x2758, 0x2759, 0x275A, 0x275B, 0x275C, 0x275D,
243     0x275E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
244     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
245     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
246     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2761,
247     0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2663, 0x2666, 0x2665,
248     0x2660, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467,
249     0x2468, 0x2469, 0x2776, 0x2777, 0x2778, 0x2779, 0x277A, 0x277B, 0x277C,
250     0x277D, 0x277E, 0x277F, 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785,
251     0x2786, 0x2787, 0x2788, 0x2789, 0x278A, 0x278B, 0x278C, 0x278D, 0x278E,
252     0x278F, 0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2192, 0x2194, 0x2195,
253     0x2798, 0x2799, 0x279A, 0x279B, 0x279C, 0x279D, 0x279E, 0x279F, 0x27A0,
254     0x27A1, 0x27A2, 0x27A3, 0x27A4, 0x27A5, 0x27A6, 0x27A7, 0x27A8, 0x27A9,
255     0x27AA, 0x27AB, 0x27AC, 0x27AD, 0x27AE, 0x27AF, 0x0000, 0x27B1, 0x27B2,
256     0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7, 0x27B8, 0x27B9, 0x27BA, 0x27BB,
257     0x27BC, 0x27BD, 0x27BE, 0x0000,
258 };
259 static const FX_CHAR* const StandardEncodingNames[224] = {
260     "space",
261     "exclam",
262     "quotedbl",
263     "numbersign",
264     "dollar",
265     "percent",
266     "ampersand",
267     "quoteright",
268     "parenleft",
269     "parenright",
270     "asterisk",
271     "plus",
272     "comma",
273     "hyphen",
274     "period",
275     "slash",
276     "zero",
277     "one",
278     "two",
279     "three",
280     "four",
281     "five",
282     "six",
283     "seven",
284     "eight",
285     "nine",
286     "colon",
287     "semicolon",
288     "less",
289     "equal",
290     "greater",
291     "question",
292     "at",
293     "A",
294     "B",
295     "C",
296     "D",
297     "E",
298     "F",
299     "G",
300     "H",
301     "I",
302     "J",
303     "K",
304     "L",
305     "M",
306     "N",
307     "O",
308     "P",
309     "Q",
310     "R",
311     "S",
312     "T",
313     "U",
314     "V",
315     "W",
316     "X",
317     "Y",
318     "Z",
319     "bracketleft",
320     "backslash",
321     "bracketright",
322     "asciicircum",
323     "underscore",
324     "quoteleft",
325     "a",
326     "b",
327     "c",
328     "d",
329     "e",
330     "f",
331     "g",
332     "h",
333     "i",
334     "j",
335     "k",
336     "l",
337     "m",
338     "n",
339     "o",
340     "p",
341     "q",
342     "r",
343     "s",
344     "t",
345     "u",
346     "v",
347     "w",
348     "x",
349     "y",
350     "z",
351     "braceleft",
352     "bar",
353     "braceright",
354     "asciitilde",
355     NULL,
356     NULL,
357     NULL,
358     NULL,
359     NULL,
360     NULL,
361     NULL,
362     NULL,
363     NULL,
364     NULL,
365     NULL,
366     NULL,
367     NULL,
368     NULL,
369     NULL,
370     NULL,
371     NULL,
372     NULL,
373     NULL,
374     NULL,
375     NULL,
376     NULL,
377     NULL,
378     NULL,
379     NULL,
380     NULL,
381     NULL,
382     NULL,
383     NULL,
384     NULL,
385     NULL,
386     NULL,
387     NULL,
388     NULL,
389     "exclamdown",
390     "cent",
391     "sterling",
392     "fraction",
393     "yen",
394     "florin",
395     "section",
396     "currency",
397     "quotesingle",
398     "quotedblleft",
399     "guillemotleft",
400     "guilsinglleft",
401     "guilsinglright",
402     "fi",
403     "fl",
404     NULL,
405     "endash",
406     "dagger",
407     "daggerdbl",
408     "periodcentered",
409     NULL,
410     "paragraph",
411     "bullet",
412     "quotesinglbase",
413     "quotedblbase",
414     "quotedblright",
415     "guillemotright",
416     "ellipsis",
417     "perthousand",
418     NULL,
419     "questiondown",
420     NULL,
421     "grave",
422     "acute",
423     "circumflex",
424     "tilde",
425     "macron",
426     "breve",
427     "dotaccent",
428     "dieresis",
429     NULL,
430     "ring",
431     "cedilla",
432     NULL,
433     "hungarumlaut",
434     "ogonek",
435     "caron",
436     "emdash",
437     NULL,
438     NULL,
439     NULL,
440     NULL,
441     NULL,
442     NULL,
443     NULL,
444     NULL,
445     NULL,
446     NULL,
447     NULL,
448     NULL,
449     NULL,
450     NULL,
451     NULL,
452     NULL,
453     "AE",
454     NULL,
455     "ordfeminine",
456     NULL,
457     NULL,
458     NULL,
459     NULL,
460     "Lslash",
461     "Oslash",
462     "OE",
463     "ordmasculine",
464     NULL,
465     NULL,
466     NULL,
467     NULL,
468     NULL,
469     "ae",
470     NULL,
471     NULL,
472     NULL,
473     "dotlessi",
474     NULL,
475     NULL,
476     "lslash",
477     "oslash",
478     "oe",
479     "germandbls",
480     NULL,
481     NULL,
482     NULL,
483     NULL,
484 };
485 static const FX_CHAR* const AdobeWinAnsiEncodingNames[224] = {
486     "space",
487     "exclam",
488     "quotedbl",
489     "numbersign",
490     "dollar",
491     "percent",
492     "ampersand",
493     "quotesingle",
494     "parenleft",
495     "parenright",
496     "asterisk",
497     "plus",
498     "comma",
499     "hyphen",
500     "period",
501     "slash",
502     "zero",
503     "one",
504     "two",
505     "three",
506     "four",
507     "five",
508     "six",
509     "seven",
510     "eight",
511     "nine",
512     "colon",
513     "semicolon",
514     "less",
515     "equal",
516     "greater",
517     "question",
518     "at",
519     "A",
520     "B",
521     "C",
522     "D",
523     "E",
524     "F",
525     "G",
526     "H",
527     "I",
528     "J",
529     "K",
530     "L",
531     "M",
532     "N",
533     "O",
534     "P",
535     "Q",
536     "R",
537     "S",
538     "T",
539     "U",
540     "V",
541     "W",
542     "X",
543     "Y",
544     "Z",
545     "bracketleft",
546     "backslash",
547     "bracketright",
548     "asciicircum",
549     "underscore",
550     "grave",
551     "a",
552     "b",
553     "c",
554     "d",
555     "e",
556     "f",
557     "g",
558     "h",
559     "i",
560     "j",
561     "k",
562     "l",
563     "m",
564     "n",
565     "o",
566     "p",
567     "q",
568     "r",
569     "s",
570     "t",
571     "u",
572     "v",
573     "w",
574     "x",
575     "y",
576     "z",
577     "braceleft",
578     "bar",
579     "braceright",
580     "asciitilde",
581     "bullet",
582     "Euro",
583     "bullet",
584     "quotesinglbase",
585     "florin",
586     "quotedblbase",
587     "ellipsis",
588     "dagger",
589     "daggerdbl",
590     "circumflex",
591     "perthousand",
592     "Scaron",
593     "guilsinglleft",
594     "OE",
595     "bullet",
596     "Zcaron",
597     "bullet",
598     "bullet",
599     "quoteleft",
600     "quoteright",
601     "quotedblleft",
602     "quotedblright",
603     "bullet",
604     "endash",
605     "emdash",
606     "tilde",
607     "trademark",
608     "scaron",
609     "guilsinglright",
610     "oe",
611     "bullet",
612     "zcaron",
613     "Ydieresis",
614     "space",
615     "exclamdown",
616     "cent",
617     "sterling",
618     "currency",
619     "yen",
620     "brokenbar",
621     "section",
622     "dieresis",
623     "copyright",
624     "ordfeminine",
625     "guillemotleft",
626     "logicalnot",
627     "hyphen",
628     "registered",
629     "macron",
630     "degree",
631     "plusminus",
632     "twosuperior",
633     "threesuperior",
634     "acute",
635     "mu",
636     "paragraph",
637     "periodcentered",
638     "cedilla",
639     "onesuperior",
640     "ordmasculine",
641     "guillemotright",
642     "onequarter",
643     "onehalf",
644     "threequarters",
645     "questiondown",
646     "Agrave",
647     "Aacute",
648     "Acircumflex",
649     "Atilde",
650     "Adieresis",
651     "Aring",
652     "AE",
653     "Ccedilla",
654     "Egrave",
655     "Eacute",
656     "Ecircumflex",
657     "Edieresis",
658     "Igrave",
659     "Iacute",
660     "Icircumflex",
661     "Idieresis",
662     "Eth",
663     "Ntilde",
664     "Ograve",
665     "Oacute",
666     "Ocircumflex",
667     "Otilde",
668     "Odieresis",
669     "multiply",
670     "Oslash",
671     "Ugrave",
672     "Uacute",
673     "Ucircumflex",
674     "Udieresis",
675     "Yacute",
676     "Thorn",
677     "germandbls",
678     "agrave",
679     "aacute",
680     "acircumflex",
681     "atilde",
682     "adieresis",
683     "aring",
684     "ae",
685     "ccedilla",
686     "egrave",
687     "eacute",
688     "ecircumflex",
689     "edieresis",
690     "igrave",
691     "iacute",
692     "icircumflex",
693     "idieresis",
694     "eth",
695     "ntilde",
696     "ograve",
697     "oacute",
698     "ocircumflex",
699     "otilde",
700     "odieresis",
701     "divide",
702     "oslash",
703     "ugrave",
704     "uacute",
705     "ucircumflex",
706     "udieresis",
707     "yacute",
708     "thorn",
709     "ydieresis",
710 };
711 static const FX_CHAR* const MacRomanEncodingNames[224] = {
712     "space",
713     "exclam",
714     "quotedbl",
715     "numbersign",
716     "dollar",
717     "percent",
718     "ampersand",
719     "quotesingle",
720     "parenleft",
721     "parenright",
722     "asterisk",
723     "plus",
724     "comma",
725     "hyphen",
726     "period",
727     "slash",
728     "zero",
729     "one",
730     "two",
731     "three",
732     "four",
733     "five",
734     "six",
735     "seven",
736     "eight",
737     "nine",
738     "colon",
739     "semicolon",
740     "less",
741     "equal",
742     "greater",
743     "question",
744     "at",
745     "A",
746     "B",
747     "C",
748     "D",
749     "E",
750     "F",
751     "G",
752     "H",
753     "I",
754     "J",
755     "K",
756     "L",
757     "M",
758     "N",
759     "O",
760     "P",
761     "Q",
762     "R",
763     "S",
764     "T",
765     "U",
766     "V",
767     "W",
768     "X",
769     "Y",
770     "Z",
771     "bracketleft",
772     "backslash",
773     "bracketright",
774     "asciicircum",
775     "underscore",
776     "grave",
777     "a",
778     "b",
779     "c",
780     "d",
781     "e",
782     "f",
783     "g",
784     "h",
785     "i",
786     "j",
787     "k",
788     "l",
789     "m",
790     "n",
791     "o",
792     "p",
793     "q",
794     "r",
795     "s",
796     "t",
797     "u",
798     "v",
799     "w",
800     "x",
801     "y",
802     "z",
803     "braceleft",
804     "bar",
805     "braceright",
806     "asciitilde",
807     NULL,
808     "Adieresis",
809     "Aring",
810     "Ccedilla",
811     "Eacute",
812     "Ntilde",
813     "Odieresis",
814     "Udieresis",
815     "aacute",
816     "agrave",
817     "acircumflex",
818     "adieresis",
819     "atilde",
820     "aring",
821     "ccedilla",
822     "eacute",
823     "egrave",
824     "ecircumflex",
825     "edieresis",
826     "iacute",
827     "igrave",
828     "icircumflex",
829     "idieresis",
830     "ntilde",
831     "oacute",
832     "ograve",
833     "ocircumflex",
834     "odieresis",
835     "otilde",
836     "uacute",
837     "ugrave",
838     "ucircumflex",
839     "udieresis",
840     "dagger",
841     "degree",
842     "cent",
843     "sterling",
844     "section",
845     "bullet",
846     "paragraph",
847     "germandbls",
848     "registered",
849     "copyright",
850     "trademark",
851     "acute",
852     "dieresis",
853     "notequal",
854     "AE",
855     "Oslash",
856     "infinity",
857     "plusminus",
858     "lessequal",
859     "greaterequal",
860     "yen",
861     "mu",
862     "partialdiff",
863     "summation",
864     "product",
865     "pi",
866     "integral",
867     "ordfeminine",
868     "ordmasculine",
869     "Omega",
870     "ae",
871     "oslash",
872     "questiondown",
873     "exclamdown",
874     "logicalnot",
875     "radical",
876     "florin",
877     "approxequal",
878     "Delta",
879     "guillemotleft",
880     "guillemotright",
881     "ellipsis",
882     "space",
883     "Agrave",
884     "Atilde",
885     "Otilde",
886     "OE",
887     "oe",
888     "endash",
889     "emdash",
890     "quotedblleft",
891     "quotedblright",
892     "quoteleft",
893     "quoteright",
894     "divide",
895     "lozenge",
896     "ydieresis",
897     "Ydieresis",
898     "fraction",
899     "currency",
900     "guilsinglleft",
901     "guilsinglright",
902     "fi",
903     "fl",
904     "daggerdbl",
905     "periodcentered",
906     "quotesinglbase",
907     "quotedblbase",
908     "perthousand",
909     "Acircumflex",
910     "Ecircumflex",
911     "Aacute",
912     "Edieresis",
913     "Egrave",
914     "Iacute",
915     "Icircumflex",
916     "Idieresis",
917     "Igrave",
918     "Oacute",
919     "Ocircumflex",
920     "apple",
921     "Ograve",
922     "Uacute",
923     "Ucircumflex",
924     "Ugrave",
925     "dotlessi",
926     "circumflex",
927     "tilde",
928     "macron",
929     "breve",
930     "dotaccent",
931     "ring",
932     "cedilla",
933     "hungarumlaut",
934     "ogonek",
935     "caron",
936 };
937 static const FX_CHAR* const MacExpertEncodingNames[224] = {
938     "space",
939     "exclamsmall",
940     "Hungarumlautsmall",
941     "centoldstyle",
942     "dollaroldstyle",
943     "dollarsuperior",
944     "ampersandsmall",
945     "Acutesmall",
946     "parenleftsuperior",
947     "parenrightsuperior",
948     "twodotenleader",
949     "onedotenleader",
950     "comma",
951     "hyphen",
952     "period",
953     "fraction",
954     "zerooldstyle",
955     "oneoldstyle",
956     "twooldstyle",
957     "threeoldstyle",
958     "fouroldstyle",
959     "fiveoldstyle",
960     "sixoldstyle",
961     "sevenoldstyle",
962     "eightoldstyle",
963     "nineoldstyle",
964     "colon",
965     "semicolon",
966     NULL,
967     "threequartersemdash",
968     NULL,
969     "questionsmall",
970     NULL,
971     NULL,
972     NULL,
973     NULL,
974     "Ethsmall",
975     NULL,
976     NULL,
977     "onequarter",
978     "onehalf",
979     "threequarters",
980     "oneeighth",
981     "threeeighths",
982     "fiveeighths",
983     "seveneighths",
984     "onethird",
985     "twothirds",
986     NULL,
987     NULL,
988     NULL,
989     NULL,
990     NULL,
991     NULL,
992     "ff",
993     "fi",
994     "fl",
995     "ffi",
996     "ffl",
997     "parenleftinferior",
998     NULL,
999     "parenrightinferior",
1000     "Circumflexsmall",
1001     "hypheninferior",
1002     "Gravesmall",
1003     "Asmall",
1004     "Bsmall",
1005     "Csmall",
1006     "Dsmall",
1007     "Esmall",
1008     "Fsmall",
1009     "Gsmall",
1010     "Hsmall",
1011     "Ismall",
1012     "Jsmall",
1013     "Ksmall",
1014     "Lsmall",
1015     "Msmall",
1016     "Nsmall",
1017     "Osmall",
1018     "Psmall",
1019     "Qsmall",
1020     "Rsmall",
1021     "Ssmall",
1022     "Tsmall",
1023     "Usmall",
1024     "Vsmall",
1025     "Wsmall",
1026     "Xsmall",
1027     "Ysmall",
1028     "Zsmall",
1029     "colonmonetary",
1030     "onefitted",
1031     "rupiah",
1032     "Tildesmall",
1033     NULL,
1034     NULL,
1035     "asuperior",
1036     "centsuperior",
1037     NULL,
1038     NULL,
1039     NULL,
1040     NULL,
1041     "Aacutesmall",
1042     "Agravesmall",
1043     "Acircumflexsmall",
1044     "Adieresissmall",
1045     "Atildesmall",
1046     "Aringsmall",
1047     "Ccedillasmall",
1048     "Eacutesmall",
1049     "Egravesmall",
1050     "Ecircumflexsmall",
1051     "Edieresissmall",
1052     "Iacutesmall",
1053     "Igravesmall",
1054     "Icircumflexsmall",
1055     "Idieresissmall",
1056     "Ntildesmall",
1057     "Oacutesmall",
1058     "Ogravesmall",
1059     "Ocircumflexsmall",
1060     "Odieresissmall",
1061     "Otildesmall",
1062     "Uacutesmall",
1063     "Ugravesmall",
1064     "Ucircumflexsmall",
1065     "Udieresissmall",
1066     NULL,
1067     "eightsuperior",
1068     "fourinferior",
1069     "threeinferior",
1070     "sixinferior",
1071     "eightinferior",
1072     "seveninferior",
1073     "Scaronsmall",
1074     NULL,
1075     "centinferior",
1076     "twoinferior",
1077     NULL,
1078     "Dieresissmall",
1079     NULL,
1080     "Caronsmall",
1081     "Scaronsmall",
1082     "fiveinferior",
1083     NULL,
1084     "commainferior",
1085     "periodinferior",
1086     "Yacutesmall",
1087     NULL,
1088     "dollarinferior",
1089     NULL,
1090     NULL,
1091     "Thornsmall",
1092     NULL,
1093     "nineinferior",
1094     "zeroinferior",
1095     "Zcaronsmall",
1096     "AEsmall",
1097     "Oslashsmall",
1098     "questiondownsmall",
1099     "oneinferior",
1100     "asuperior",
1101     NULL,
1102     NULL,
1103     NULL,
1104     NULL,
1105     NULL,
1106     NULL,
1107     "Cedillasmall",
1108     NULL,
1109     NULL,
1110     NULL,
1111     NULL,
1112     NULL,
1113     "OEsmall",
1114     "figuredash",
1115     "hyphensuperior",
1116     NULL,
1117     NULL,
1118     NULL,
1119     NULL,
1120     "exclamdownsmall",
1121     NULL,
1122     "Ydieresissmall",
1123     NULL,
1124     "onesuperior",
1125     "twosuperior",
1126     "threesuperior",
1127     "foursuperior",
1128     "fivesuperior",
1129     "sixsuperior",
1130     "sevensuperior",
1131     "ninesuperior",
1132     "zerosuperior",
1133     NULL,
1134     "esuperior",
1135     "rsuperior",
1136     NULL,
1137     NULL,
1138     NULL,
1139     "isuperior",
1140     "ssuperior",
1141     "dsuperior",
1142     NULL,
1143     NULL,
1144     NULL,
1145     NULL,
1146     NULL,
1147     "lsuperior",
1148     "Ogoneksmall",
1149     "Brevesmall",
1150     "Macronsmall",
1151     "bsuperior",
1152     "nsuperior",
1153     "msuperior",
1154     "commasuperior",
1155     "periodsuperior",
1156     "Dotaccentsmall",
1157     "Ringsmall",
1158     NULL,
1159     NULL,
1160     NULL,
1161     NULL,
1162 };
1163 static const FX_CHAR* const PDFDocEncodingNames[232] = {
1164     "breve",
1165     "caron",
1166     "circumflex",
1167     "dotaccent",
1168     "hungarumlaut",
1169     "ogonek",
1170     "ring",
1171     "tilde",
1172     "space",
1173     "exclam",
1174     "quotedbl",
1175     "numbersign",
1176     "dollar",
1177     "percent",
1178     "ampersand",
1179     "quotesingle",
1180     "parenleft",
1181     "parenright",
1182     "asterisk",
1183     "plus",
1184     "comma",
1185     "hyphen",
1186     "period",
1187     "slash",
1188     "zero",
1189     "one",
1190     "two",
1191     "three",
1192     "four",
1193     "five",
1194     "six",
1195     "seven",
1196     "eight",
1197     "nine",
1198     "colon",
1199     "semicolon",
1200     "less",
1201     "equal",
1202     "greater",
1203     "question",
1204     "at",
1205     "A",
1206     "B",
1207     "C",
1208     "D",
1209     "E",
1210     "F",
1211     "G",
1212     "H",
1213     "I",
1214     "J",
1215     "K",
1216     "L",
1217     "M",
1218     "N",
1219     "O",
1220     "P",
1221     "Q",
1222     "R",
1223     "S",
1224     "T",
1225     "U",
1226     "V",
1227     "W",
1228     "X",
1229     "Y",
1230     "Z",
1231     "bracketleft",
1232     "backslash",
1233     "bracketright",
1234     "asciicircum",
1235     "underscore",
1236     "grave",
1237     "a",
1238     "b",
1239     "c",
1240     "d",
1241     "e",
1242     "f",
1243     "g",
1244     "h",
1245     "i",
1246     "j",
1247     "k",
1248     "l",
1249     "m",
1250     "n",
1251     "o",
1252     "p",
1253     "q",
1254     "r",
1255     "s",
1256     "t",
1257     "u",
1258     "v",
1259     "w",
1260     "x",
1261     "y",
1262     "z",
1263     "braceleft",
1264     "bar",
1265     "braceright",
1266     "asciitilde",
1267     NULL,
1268     "bullet3",
1269     "dagger",
1270     "daggerdbl",
1271     "ellipsis",
1272     "emdash",
1273     "endash",
1274     "florin",
1275     "fraction",
1276     "guilsinglleft",
1277     "guilsinglright",
1278     "minus",
1279     "perthousand",
1280     "quotedblbase",
1281     "quotedblleft",
1282     "quotedblright",
1283     "quoteleft",
1284     "quoteright",
1285     "quotesinglbase",
1286     "trademark",
1287     "fi",
1288     "fl",
1289     "Lslash",
1290     "OE",
1291     "Scaron",
1292     "Ydieresis",
1293     "Zcaron2",
1294     "dotlessi",
1295     "lslash",
1296     "oe",
1297     "scaron",
1298     "zcaron2",
1299     NULL,
1300     "Euro",
1301     "exclamdown",
1302     "cent",
1303     "sterling",
1304     "currency",
1305     "yen",
1306     "brokenbar",
1307     "section",
1308     "dieresis",
1309     "copyright",
1310     "ordfeminine",
1311     "guillemotleft4",
1312     "logicalnot",
1313     NULL,
1314     "registered",
1315     "macron",
1316     "degree",
1317     "plusminus",
1318     "twosuperior",
1319     "threesuperior",
1320     "acute",
1321     "mu",
1322     "paragraph",
1323     "periodcentered",
1324     "cedilla",
1325     "onesuperior",
1326     "ordmasculine",
1327     "guillemotright4",
1328     "onequarter",
1329     "onehalf",
1330     "threequarters",
1331     "questiondown",
1332     "Agrave",
1333     "Aacute",
1334     "Acircumflex",
1335     "Atilde",
1336     "Adieresis",
1337     "Aring",
1338     "AE",
1339     "Ccedilla",
1340     "Egrave",
1341     "Eacute",
1342     "Ecircumflex",
1343     "Edieresis",
1344     "Igrave",
1345     "Iacute",
1346     "Icircumflex",
1347     "Idieresis",
1348     "Eth",
1349     "Ntilde",
1350     "Ograve",
1351     "Oacute",
1352     "Ocircumflex",
1353     "Otilde",
1354     "Odieresis",
1355     "multiply",
1356     "Oslash",
1357     "Ugrave",
1358     "Uacute",
1359     "Ucircumflex",
1360     "Udieresis",
1361     "Yacute",
1362     "Thorn",
1363     "germandbls",
1364     "agrave",
1365     "aacute",
1366     "acircumflex",
1367     "atilde",
1368     "adieresis",
1369     "aring",
1370     "ae",
1371     "ccedilla",
1372     "egrave",
1373     "eacute",
1374     "ecircumflex",
1375     "edieresis",
1376     "igrave",
1377     "iacute",
1378     "icircumflex",
1379     "idieresis",
1380     "eth",
1381     "ntilde",
1382     "ograve",
1383     "oacute",
1384     "ocircumflex",
1385     "otilde",
1386     "odieresis",
1387     "divide",
1388     "oslash",
1389     "ugrave",
1390     "uacute",
1391     "ucircumflex",
1392     "udieresis",
1393     "yacute",
1394     "thorn",
1395     "ydieresis",
1396 };
1397 static const FX_CHAR* const AdobeSymbolEncodingNames[224] = {
1398     "space",
1399     "exclam",
1400     "universal",
1401     "numbersign",
1402     "existential",
1403     "percent",
1404     "ampersand",
1405     "suchthat",
1406     "parenleft",
1407     "parenright",
1408     "asteriskmath",
1409     "plus",
1410     "comma",
1411     "minus",
1412     "period",
1413     "slash",
1414     "zero",
1415     "one",
1416     "two",
1417     "three",
1418     "four",
1419     "five",
1420     "six",
1421     "seven",
1422     "eight",
1423     "nine",
1424     "colon",
1425     "semicolon",
1426     "less",
1427     "equal",
1428     "greater",
1429     "question",
1430     "congruent",
1431     "Alpha",
1432     "Beta",
1433     "Chi",
1434     "Delta",
1435     "Epsilon",
1436     "Phi",
1437     "Gamma",
1438     "Eta",
1439     "Iota",
1440     "theta1",
1441     "Kappa",
1442     "Lambda",
1443     "Mu",
1444     "Nu",
1445     "Omicron",
1446     "Pi",
1447     "Theta",
1448     "Rho",
1449     "Sigma",
1450     "Tau",
1451     "Upsilon",
1452     "sigma1",
1453     "Omega",
1454     "Xi",
1455     "Psi",
1456     "Zeta",
1457     "bracketleft",
1458     "therefore",
1459     "bracketright",
1460     "perpendicular",
1461     "underscore",
1462     "radicalex",
1463     "alpha",
1464     "beta",
1465     "chi",
1466     "delta",
1467     "epsilon",
1468     "phi",
1469     "gamma",
1470     "eta",
1471     "iota",
1472     "phi1",
1473     "kappa",
1474     "lambda",
1475     "mu",
1476     "nu",
1477     "omicron",
1478     "pi",
1479     "theta",
1480     "rho",
1481     "sigma",
1482     "tau",
1483     "upsilon",
1484     "omega1",
1485     "omega",
1486     "xi",
1487     "psi",
1488     "zeta",
1489     "braceleft",
1490     "bar",
1491     "braceright",
1492     "similar",
1493     NULL,
1494     NULL,
1495     NULL,
1496     NULL,
1497     NULL,
1498     NULL,
1499     NULL,
1500     NULL,
1501     NULL,
1502     NULL,
1503     NULL,
1504     NULL,
1505     NULL,
1506     NULL,
1507     NULL,
1508     NULL,
1509     NULL,
1510     NULL,
1511     NULL,
1512     NULL,
1513     NULL,
1514     NULL,
1515     NULL,
1516     NULL,
1517     NULL,
1518     NULL,
1519     NULL,
1520     NULL,
1521     NULL,
1522     NULL,
1523     NULL,
1524     NULL,
1525     NULL,
1526     "Euro",
1527     "Upsilon1",
1528     "minute",
1529     "lessequal",
1530     "fraction",
1531     "infinity",
1532     "florin",
1533     "club",
1534     "diamond",
1535     "heart",
1536     "spade",
1537     "arrowboth",
1538     "arrowleft",
1539     "arrowup",
1540     "arrowright",
1541     "arrowdown",
1542     "degree",
1543     "plusminus",
1544     "second",
1545     "greaterequal",
1546     "multiply",
1547     "proportional",
1548     "partialdiff",
1549     "bullet",
1550     "divide",
1551     "notequal",
1552     "equivalence",
1553     "approxequal",
1554     "ellipsis",
1555     "arrowvertex",
1556     "arrowhorizex",
1557     "carriagereturn",
1558     "aleph",
1559     "Ifraktur",
1560     "Rfraktur",
1561     "weierstrass",
1562     "circlemultiply",
1563     "circleplus",
1564     "emptyset",
1565     "intersection",
1566     "union",
1567     "propersuperset",
1568     "reflexsuperset",
1569     "notsubset",
1570     "propersubset",
1571     "reflexsubset",
1572     "element",
1573     "notelement",
1574     "angle",
1575     "gradient",
1576     "registerserif",
1577     "copyrightserif",
1578     "trademarkserif",
1579     "product",
1580     "radical",
1581     "dotmath",
1582     "logicalnot",
1583     "logicaland",
1584     "logicalor",
1585     "arrowdblboth",
1586     "arrowdblleft",
1587     "arrowdblup",
1588     "arrowdblright",
1589     "arrowdbldown",
1590     "lozenge",
1591     "angleleft",
1592     "registersans",
1593     "copyrightsans",
1594     "trademarksans",
1595     "summation",
1596     "parenlefttp",
1597     "parenleftex",
1598     "parenleftbt",
1599     "bracketlefttp",
1600     "bracketleftex",
1601     "bracketleftbt",
1602     "bracelefttp",
1603     "braceleftmid",
1604     "braceleftbt",
1605     "braceex",
1606     NULL,
1607     "angleright",
1608     "integral",
1609     "integraltp",
1610     "integralex",
1611     "integralbt",
1612     "parenrighttp",
1613     "parenrightex",
1614     "parenrightbt",
1615     "bracketrighttp",
1616     "bracketrightex",
1617     "bracketrightbt",
1618     "bracerighttp",
1619     "bracerightmid",
1620     "bracerightbt",
1621     NULL,
1622 };
1623 static const FX_CHAR* const ZapfEncodingNames[224] = {
1624     "space", "a1",   "a2",   "a202", "a3",   "a4",   "a5",   "a119", "a118",
1625     "a117",  "a11",  "a12",  "a13",  "a14",  "a15",  "a16",  "a105", "a17",
1626     "a18",   "a19",  "a20",  "a21",  "a22",  "a23",  "a24",  "a25",  "a26",
1627     "a27",   "a28",  "a6",   "a7",   "a8",   "a9",   "a10",  "a29",  "a30",
1628     "a31",   "a32",  "a33",  "a34",  "a35",  "a36",  "a37",  "a38",  "a39",
1629     "a40",   "a41",  "a42",  "a43",  "a44",  "a45",  "a46",  "a47",  "a48",
1630     "a49",   "a50",  "a51",  "a52",  "a53",  "a54",  "a55",  "a56",  "a57",
1631     "a58",   "a59",  "a60",  "a61",  "a62",  "a63",  "a64",  "a65",  "a66",
1632     "a67",   "a68",  "a69",  "a70",  "a71",  "a72",  "a73",  "a74",  "a203",
1633     "a75",   "a204", "a76",  "a77",  "a78",  "a79",  "a81",  "a82",  "a83",
1634     "a84",   "a97",  "a98",  "a99",  "a100", NULL,   "a89",  "a90",  "a93",
1635     "a94",   "a91",  "a92",  "a205", "a85",  "a206", "a86",  "a87",  "a88",
1636     "a95",   "a96",  NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
1637     NULL,    NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
1638     NULL,    NULL,   NULL,   "a101", "a102", "a103", "a104", "a106", "a107",
1639     "a108",  "a112", "a111", "a110", "a109", "a120", "a121", "a122", "a123",
1640     "a124",  "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132",
1641     "a133",  "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141",
1642     "a142",  "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150",
1643     "a151",  "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159",
1644     "a160",  "a161", "a163", "a164", "a196", "a165", "a192", "a166", "a167",
1645     "a168",  "a169", "a170", "a171", "a172", "a173", "a162", "a174", "a175",
1646     "a176",  "a177", "a178", "a179", "a193", "a180", "a199", "a181", "a200",
1647     "a182",  NULL,   "a201", "a183", "a184", "a197", "a185", "a194", "a198",
1648     "a186",  "a195", "a187", "a188", "a189", "a190", "a191", NULL};
1649 const FX_CHAR* PDF_CharNameFromPredefinedCharSet(int encoding,
1650                                                  uint8_t charcode) {
1651   if (encoding == PDFFONT_ENCODING_PDFDOC) {
1652     if (charcode < 24) {
1653       return NULL;
1654     }
1655     charcode -= 24;
1656   } else {
1657     if (charcode < 32) {
1658       return NULL;
1659     }
1660     charcode -= 32;
1661   }
1662   switch (encoding) {
1663     case PDFFONT_ENCODING_WINANSI:
1664       return AdobeWinAnsiEncodingNames[charcode];
1665     case PDFFONT_ENCODING_MACROMAN:
1666       return MacRomanEncodingNames[charcode];
1667     case PDFFONT_ENCODING_MACEXPERT:
1668       return MacExpertEncodingNames[charcode];
1669     case PDFFONT_ENCODING_STANDARD:
1670       return StandardEncodingNames[charcode];
1671     case PDFFONT_ENCODING_ADOBE_SYMBOL:
1672       return AdobeSymbolEncodingNames[charcode];
1673     case PDFFONT_ENCODING_ZAPFDINGBATS:
1674       return ZapfEncodingNames[charcode];
1675     case PDFFONT_ENCODING_PDFDOC:
1676       return PDFDocEncodingNames[charcode];
1677   }
1678   return NULL;
1679 }
1680 FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode) {
1681   switch (encoding) {
1682     case FXFT_ENCODING_UNICODE:
1683       return (FX_WORD)charcode;
1684     case FXFT_ENCODING_ADOBE_STANDARD:
1685       return StandardEncoding[(uint8_t)charcode];
1686     case FXFT_ENCODING_ADOBE_EXPERT:
1687       return MacExpertEncoding[(uint8_t)charcode];
1688     case FXFT_ENCODING_ADOBE_LATIN_1:
1689       return AdobeWinAnsiEncoding[(uint8_t)charcode];
1690     case FXFT_ENCODING_APPLE_ROMAN:
1691       return MacRomanEncoding[(uint8_t)charcode];
1692     case PDFFONT_ENCODING_PDFDOC:
1693       return PDFDocEncoding[(uint8_t)charcode];
1694   }
1695   return 0;
1696 }
1697 static FX_DWORD PDF_FindCode(const FX_WORD* pCodes, FX_WORD unicode) {
1698   for (FX_DWORD i = 0; i < 256; i++)
1699     if (pCodes[i] == unicode) {
1700       return i;
1701     }
1702   return 0;
1703 }
1704 static const FX_WORD MSSymbolEncoding[256] = {
1705     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1706     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1707     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1708     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32,     33,     8704,   35,
1709     8707,   37,     38,     8715,   40,     41,     8727,   43,     44,
1710     8722,   46,     47,     48,     49,     50,     51,     52,     53,
1711     54,     55,     56,     57,     58,     59,     60,     61,     62,
1712     63,     8773,   913,    914,    935,    916,    917,    934,    915,
1713     919,    921,    977,    922,    923,    924,    925,    927,    928,
1714     920,    929,    931,    932,    933,    962,    937,    926,    936,
1715     918,    91,     8756,   93,     8869,   95,     8254,   945,    946,
1716     967,    948,    949,    966,    947,    951,    953,    981,    954,
1717     955,    956,    957,    959,    960,    952,    961,    963,    964,
1718     965,    982,    969,    958,    968,    950,    123,    124,    125,
1719     8764,   0,      0,      0,      0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1720     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1721     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
1722     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 978,
1723     8242,   8804,   8725,   8734,   402,    9827,   9830,   9828,   9824,
1724     8596,   8592,   8593,   8594,   8595,   176,    177,    8243,   8805,
1725     215,    8733,   8706,   8729,   247,    8800,   8801,   8776,   8943,
1726     0,      0,      8629,   0,      8465,   8476,   8472,   8855,   8853,
1727     8709,   8745,   8746,   8835,   8839,   8836,   8834,   8838,   8712,
1728     8713,   8736,   8711,   174,    169,    8482,   8719,   8730,   8901,
1729     172,    8743,   8744,   8660,   8656,   8657,   8658,   8659,   9674,
1730     9001,   0,      0,      0,      8721,   0,      0,      0,      0,
1731     0,      0,      0,      0,      0,      0,      0x0000, 9002,   8747,
1732     8992,   0,      8993,   0,      0,      0,      0,      0,      0,
1733     0x0000, 0x0000, 0x0000, 0x0000};
1734 FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode) {
1735   switch (encoding) {
1736     case FXFT_ENCODING_UNICODE:
1737       return unicode;
1738     case FXFT_ENCODING_ADOBE_STANDARD:
1739       return PDF_FindCode(StandardEncoding, unicode);
1740     case FXFT_ENCODING_ADOBE_EXPERT:
1741       return PDF_FindCode(MacExpertEncoding, unicode);
1742     case FXFT_ENCODING_ADOBE_LATIN_1:
1743       return PDF_FindCode(AdobeWinAnsiEncoding, unicode);
1744     case FXFT_ENCODING_APPLE_ROMAN:
1745       return PDF_FindCode(MacRomanEncoding, unicode);
1746     case FXFT_ENCODING_ADOBE_CUSTOM:
1747       return PDF_FindCode(PDFDocEncoding, unicode);
1748     case FXFT_ENCODING_MS_SYMBOL:
1749       return PDF_FindCode(MSSymbolEncoding, unicode);
1750   }
1751   return 0;
1752 }
1753 const FX_WORD* PDF_UnicodesForPredefinedCharSet(int encoding) {
1754   switch (encoding) {
1755     case PDFFONT_ENCODING_WINANSI:
1756       return AdobeWinAnsiEncoding;
1757     case PDFFONT_ENCODING_MACROMAN:
1758       return MacRomanEncoding;
1759     case PDFFONT_ENCODING_MACEXPERT:
1760       return MacExpertEncoding;
1761     case PDFFONT_ENCODING_STANDARD:
1762       return StandardEncoding;
1763     case PDFFONT_ENCODING_ADOBE_SYMBOL:
1764       return AdobeSymbolEncoding;
1765     case PDFFONT_ENCODING_ZAPFDINGBATS:
1766       return ZapfEncoding;
1767     case PDFFONT_ENCODING_PDFDOC:
1768       return PDFDocEncoding;
1769     case PDFFONT_ENCODING_MS_SYMBOL:
1770       return MSSymbolEncoding;
1771   }
1772   return NULL;
1773 }
1774 FX_DWORD PDF_PredefinedCharCodeFromUnicode(int encoding, FX_WCHAR unicode) {
1775   return PDF_FindCode(PDF_UnicodesForPredefinedCharSet(encoding), unicode);
1776 }
1777 #ifdef __cplusplus
1778 extern "C" {
1779 #endif
1780 extern int FXFT_unicode_from_adobe_name(const char* name);
1781 extern void FXFT_adobe_name_from_unicode(char* glyph_name, FX_WCHAR unicode);
1782 #ifdef __cplusplus
1783 }
1784 #endif
1785 FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name) {
1786   return (FX_WCHAR)(FXFT_unicode_from_adobe_name(name) & 0x7FFFFFFF);
1787 }
1788 CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode) {
1789   char glyph_name[64];
1790   FXFT_adobe_name_from_unicode(glyph_name, unicode);
1791   return CFX_ByteString(glyph_name, -1);
1792 }