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