Home | History | Annotate | Download | only in sfnt
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkOTTable_name_DEFINED
      9 #define SkOTTable_name_DEFINED
     10 
     11 #include "SkEndian.h"
     12 #include "SkOTTableTypes.h"
     13 #include "SkString.h"
     14 
     15 #pragma pack(push, 1)
     16 
     17 struct SkOTTableName {
     18     static const SK_OT_CHAR TAG0 = 'n';
     19     static const SK_OT_CHAR TAG1 = 'a';
     20     static const SK_OT_CHAR TAG2 = 'm';
     21     static const SK_OT_CHAR TAG3 = 'e';
     22     static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableName>::value;
     23 
     24     SK_OT_USHORT format;
     25     static const SK_OT_USHORT format_0 = SkTEndian_SwapBE16(0);
     26     /** Format 1 was added in OpenType 1.6 (April 2009). */
     27     static const SK_OT_USHORT format_1 = SkTEndian_SwapBE16(1);
     28 
     29     /** The number of name records which follow. */
     30     SK_OT_USHORT count;
     31 
     32     /** Offset in SK_OT_BYTEs to start of string storage area (from start of table). */
     33     SK_OT_USHORT stringOffset;
     34 
     35     struct Record {
     36         /** The platform ID specifies how to interpret the encoding and language ID. */
     37         struct PlatformID {
     38             enum Value : SK_OT_USHORT {
     39                 Unicode = SkTEndian_SwapBE16(0),
     40                 Macintosh = SkTEndian_SwapBE16(1),
     41                 ISO = SkTEndian_SwapBE16(2), // Deprecated, use Unicode instead.
     42                 Windows = SkTEndian_SwapBE16(3),
     43                 Custom = SkTEndian_SwapBE16(4),
     44             } value;
     45         } platformID;
     46 
     47         union EncodingID {
     48             SK_OT_USHORT custom;
     49 
     50             /** Always UTF-16BE. */
     51             struct Unicode {
     52                 enum Value : SK_OT_USHORT {
     53                     Unicode10 = SkTEndian_SwapBE16(0),
     54                     Unicode11 = SkTEndian_SwapBE16(1),
     55                     ISO10646 = SkTEndian_SwapBE16(2), //deprecated, use Unicode11
     56                     Unicode20BMP = SkTEndian_SwapBE16(3),
     57                     Unicode20 = SkTEndian_SwapBE16(4),
     58                     UnicodeVariationSequences = SkTEndian_SwapBE16(5),
     59                     UnicodeFull = SkTEndian_SwapBE16(6),
     60                 } value;
     61             } unicode;
     62 
     63             /** These are Mac encodings, see http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/
     64              *  for their mappings to unicode.
     65              *  Name table strings using PlatformID::Macintosh must use Roman.
     66              */
     67             struct Macintosh {
     68                 enum Value : SK_OT_USHORT {
     69                     Roman = SkTEndian_SwapBE16(0),
     70                     Japanese = SkTEndian_SwapBE16(1),
     71                     ChineseTraditional = SkTEndian_SwapBE16(2),
     72                     Korean = SkTEndian_SwapBE16(3),
     73                     Arabic = SkTEndian_SwapBE16(4),
     74                     Hebrew = SkTEndian_SwapBE16(5),
     75                     Greek = SkTEndian_SwapBE16(6),
     76                     Russian = SkTEndian_SwapBE16(7),
     77                     RSymbol = SkTEndian_SwapBE16(8),
     78                     Devanagari = SkTEndian_SwapBE16(9),
     79                     Gurmukhi = SkTEndian_SwapBE16(10),
     80                     Gujarati = SkTEndian_SwapBE16(11),
     81                     Oriya = SkTEndian_SwapBE16(12),
     82                     Bengali = SkTEndian_SwapBE16(13),
     83                     Tamil = SkTEndian_SwapBE16(14),
     84                     Telugu = SkTEndian_SwapBE16(15),
     85                     Kannada = SkTEndian_SwapBE16(16),
     86                     Malayalam = SkTEndian_SwapBE16(17),
     87                     Sinhalese = SkTEndian_SwapBE16(18),
     88                     Burmese = SkTEndian_SwapBE16(19),
     89                     Khmer = SkTEndian_SwapBE16(20),
     90                     Thai = SkTEndian_SwapBE16(21),
     91                     Laotian = SkTEndian_SwapBE16(22),
     92                     Georgian = SkTEndian_SwapBE16(23),
     93                     Armenian = SkTEndian_SwapBE16(24),
     94                     ChineseSimplified = SkTEndian_SwapBE16(25),
     95                     Tibetan = SkTEndian_SwapBE16(26),
     96                     Mongolian = SkTEndian_SwapBE16(27),
     97                     Geez = SkTEndian_SwapBE16(28),
     98                     Slavic = SkTEndian_SwapBE16(29),
     99                     Vietnamese = SkTEndian_SwapBE16(30),
    100                     Sindhi = SkTEndian_SwapBE16(31),
    101                     Uninterpreted = SkTEndian_SwapBE16(32),
    102                 } value;
    103             } macintosh;
    104 
    105             /** Deprecated, use Unicode instead. */
    106             struct ISO {
    107                 enum Value : SK_OT_USHORT {
    108                     ASCII7 = SkTEndian_SwapBE16(0),
    109                     ISO10646 = SkTEndian_SwapBE16(1),
    110                     ISO88591 = SkTEndian_SwapBE16(2),
    111                 } value;
    112             } iso;
    113 
    114             /** Name table strings using PlatformID::Windows must use Symbol, UnicodeBMPUCS2, or
    115              *  UnicodeUCS4. Symbol and UnicodeBMPUCS2 are both UCS2-BE, UnicodeUCS4 is actually
    116              *  UTF-16BE.
    117              */
    118             struct Windows {
    119                 enum Value : SK_OT_USHORT {
    120                     Symbol = SkTEndian_SwapBE16(0), // UCS2-BE, but don't use this font to display it's own name.
    121                     UnicodeBMPUCS2 = SkTEndian_SwapBE16(1), // UCS2-BE, Windows default
    122                     ShiftJIS = SkTEndian_SwapBE16(2),
    123                     PRC = SkTEndian_SwapBE16(3),
    124                     Big5 = SkTEndian_SwapBE16(4),
    125                     Wansung = SkTEndian_SwapBE16(5),
    126                     Johab = SkTEndian_SwapBE16(6),
    127                     UnicodeUCS4 = SkTEndian_SwapBE16(10), // UTF-16BE. It means UCS4 in charmaps.
    128                 } value;
    129             } windows;
    130         } encodingID;
    131 
    132         /** LanguageIDs <= 0x7FFF are predefined.
    133          *  LanguageIDs > 0x7FFF are indexes into the langTagRecord array
    134          *  (in format 1 name tables, see SkOTTableName::format).
    135          */
    136         union LanguageID {
    137             /** A value greater than 0x7FFF.
    138              *  languageTagID - 0x8000 is an index into the langTagRecord array.
    139              */
    140             SK_OT_USHORT languageTagID;
    141 
    142             /** These are known as Language Designators.
    143              *  Apple now uses BCP 47 (post OSX10.4), so there will be no new entries.
    144              */
    145             struct Macintosh {
    146                 enum Value : SK_OT_USHORT {
    147                     English = SkTEndian_SwapBE16(0),
    148                     French = SkTEndian_SwapBE16(1),
    149                     German = SkTEndian_SwapBE16(2),
    150                     Italian = SkTEndian_SwapBE16(3),
    151                     Dutch = SkTEndian_SwapBE16(4),
    152                     Swedish = SkTEndian_SwapBE16(5),
    153                     Spanish = SkTEndian_SwapBE16(6),
    154                     Danish = SkTEndian_SwapBE16(7),
    155                     Portuguese = SkTEndian_SwapBE16(8),
    156                     Norwegian = SkTEndian_SwapBE16(9),
    157                     Hebrew = SkTEndian_SwapBE16(10),
    158                     Japanese = SkTEndian_SwapBE16(11),
    159                     Arabic = SkTEndian_SwapBE16(12),
    160                     Finnish = SkTEndian_SwapBE16(13),
    161                     Greek = SkTEndian_SwapBE16(14),
    162                     Icelandic = SkTEndian_SwapBE16(15),
    163                     Maltese = SkTEndian_SwapBE16(16),
    164                     Turkish = SkTEndian_SwapBE16(17),
    165                     Croatian = SkTEndian_SwapBE16(18),
    166                     ChineseTraditional = SkTEndian_SwapBE16(19),
    167                     Urdu = SkTEndian_SwapBE16(20),
    168                     Hindi = SkTEndian_SwapBE16(21),
    169                     Thai = SkTEndian_SwapBE16(22),
    170                     Korean = SkTEndian_SwapBE16(23),
    171                     Lithuanian = SkTEndian_SwapBE16(24),
    172                     Polish = SkTEndian_SwapBE16(25),
    173                     Hungarian = SkTEndian_SwapBE16(26),
    174                     Estonian = SkTEndian_SwapBE16(27),
    175                     Latvian = SkTEndian_SwapBE16(28),
    176                     Sami = SkTEndian_SwapBE16(29),
    177                     Faroese = SkTEndian_SwapBE16(30),
    178                     Farsi_Persian = SkTEndian_SwapBE16(31),
    179                     Russian = SkTEndian_SwapBE16(32),
    180                     ChineseSimplified = SkTEndian_SwapBE16(33),
    181                     Flemish = SkTEndian_SwapBE16(34),
    182                     IrishGaelic = SkTEndian_SwapBE16(35),
    183                     Albanian = SkTEndian_SwapBE16(36),
    184                     Romanian = SkTEndian_SwapBE16(37),
    185                     Czech = SkTEndian_SwapBE16(38),
    186                     Slovak = SkTEndian_SwapBE16(39),
    187                     Slovenian = SkTEndian_SwapBE16(40),
    188                     Yiddish = SkTEndian_SwapBE16(41),
    189                     Serbian = SkTEndian_SwapBE16(42),
    190                     Macedonian = SkTEndian_SwapBE16(43),
    191                     Bulgarian = SkTEndian_SwapBE16(44),
    192                     Ukrainian = SkTEndian_SwapBE16(45),
    193                     Byelorussian = SkTEndian_SwapBE16(46),
    194                     Uzbek = SkTEndian_SwapBE16(47),
    195                     Kazakh = SkTEndian_SwapBE16(48),
    196                     AzerbaijaniCyrillic = SkTEndian_SwapBE16(49),
    197                     AzerbaijaniArabic = SkTEndian_SwapBE16(50),
    198                     Armenian = SkTEndian_SwapBE16(51),
    199                     Georgian = SkTEndian_SwapBE16(52),
    200                     Moldavian = SkTEndian_SwapBE16(53),
    201                     Kirghiz = SkTEndian_SwapBE16(54),
    202                     Tajiki = SkTEndian_SwapBE16(55),
    203                     Turkmen = SkTEndian_SwapBE16(56),
    204                     MongolianTraditional = SkTEndian_SwapBE16(57),
    205                     MongolianCyrillic = SkTEndian_SwapBE16(58),
    206                     Pashto = SkTEndian_SwapBE16(59),
    207                     Kurdish = SkTEndian_SwapBE16(60),
    208                     Kashmiri = SkTEndian_SwapBE16(61),
    209                     Sindhi = SkTEndian_SwapBE16(62),
    210                     Tibetan = SkTEndian_SwapBE16(63),
    211                     Nepali = SkTEndian_SwapBE16(64),
    212                     Sanskrit = SkTEndian_SwapBE16(65),
    213                     Marathi = SkTEndian_SwapBE16(66),
    214                     Bengali = SkTEndian_SwapBE16(67),
    215                     Assamese = SkTEndian_SwapBE16(68),
    216                     Gujarati = SkTEndian_SwapBE16(69),
    217                     Punjabi = SkTEndian_SwapBE16(70),
    218                     Oriya = SkTEndian_SwapBE16(71),
    219                     Malayalam = SkTEndian_SwapBE16(72),
    220                     Kannada = SkTEndian_SwapBE16(73),
    221                     Tamil = SkTEndian_SwapBE16(74),
    222                     Telugu = SkTEndian_SwapBE16(75),
    223                     Sinhalese = SkTEndian_SwapBE16(76),
    224                     Burmese = SkTEndian_SwapBE16(77),
    225                     Khmer = SkTEndian_SwapBE16(78),
    226                     Lao = SkTEndian_SwapBE16(79),
    227                     Vietnamese = SkTEndian_SwapBE16(80),
    228                     Indonesian = SkTEndian_SwapBE16(81),
    229                     Tagalong = SkTEndian_SwapBE16(82),
    230                     MalayRoman = SkTEndian_SwapBE16(83),
    231                     MalayArabic = SkTEndian_SwapBE16(84),
    232                     Amharic = SkTEndian_SwapBE16(85),
    233                     Tigrinya = SkTEndian_SwapBE16(86),
    234                     Galla = SkTEndian_SwapBE16(87),
    235                     Somali = SkTEndian_SwapBE16(88),
    236                     Swahili = SkTEndian_SwapBE16(89),
    237                     Kinyarwanda_Ruanda = SkTEndian_SwapBE16(90),
    238                     Rundi = SkTEndian_SwapBE16(91),
    239                     Nyanja_Chewa = SkTEndian_SwapBE16(92),
    240                     Malagasy = SkTEndian_SwapBE16(93),
    241                     Esperanto = SkTEndian_SwapBE16(94),
    242                     Welsh = SkTEndian_SwapBE16(128),
    243                     Basque = SkTEndian_SwapBE16(129),
    244                     Catalan = SkTEndian_SwapBE16(130),
    245                     Latin = SkTEndian_SwapBE16(131),
    246                     Quenchua = SkTEndian_SwapBE16(132),
    247                     Guarani = SkTEndian_SwapBE16(133),
    248                     Aymara = SkTEndian_SwapBE16(134),
    249                     Tatar = SkTEndian_SwapBE16(135),
    250                     Uighur = SkTEndian_SwapBE16(136),
    251                     Dzongkha = SkTEndian_SwapBE16(137),
    252                     JavaneseRoman = SkTEndian_SwapBE16(138),
    253                     SundaneseRoman = SkTEndian_SwapBE16(139),
    254                     Galician = SkTEndian_SwapBE16(140),
    255                     Afrikaans = SkTEndian_SwapBE16(141),
    256                     Breton = SkTEndian_SwapBE16(142),
    257                     Inuktitut = SkTEndian_SwapBE16(143),
    258                     ScottishGaelic = SkTEndian_SwapBE16(144),
    259                     ManxGaelic = SkTEndian_SwapBE16(145),
    260                     IrishGaelicWithLenition = SkTEndian_SwapBE16(146),
    261                     Tongan = SkTEndian_SwapBE16(147),
    262                     GreekPolytonic = SkTEndian_SwapBE16(148),
    263                     Greenlandic = SkTEndian_SwapBE16(149),
    264                     AzerbaijaniRoman = SkTEndian_SwapBE16(150),
    265                 } value;
    266             } macintosh;
    267 
    268             /** These are known as LCIDs.
    269              *  On Windows the current set can be had from EnumSystemLocalesEx and LocaleNameToLCID.
    270              */
    271             struct Windows {
    272                 enum Value : SK_OT_USHORT {
    273                     Afrikaans_SouthAfrica = SkTEndian_SwapBE16(0x0436),
    274                     Albanian_Albania = SkTEndian_SwapBE16(0x041C),
    275                     Alsatian_France = SkTEndian_SwapBE16(0x0484),
    276                     Amharic_Ethiopia = SkTEndian_SwapBE16(0x045E),
    277                     Arabic_Algeria = SkTEndian_SwapBE16(0x1401),
    278                     Arabic_Bahrain = SkTEndian_SwapBE16(0x3C01),
    279                     Arabic_Egypt = SkTEndian_SwapBE16(0x0C01),
    280                     Arabic_Iraq = SkTEndian_SwapBE16(0x0801),
    281                     Arabic_Jordan = SkTEndian_SwapBE16(0x2C01),
    282                     Arabic_Kuwait = SkTEndian_SwapBE16(0x3401),
    283                     Arabic_Lebanon = SkTEndian_SwapBE16(0x3001),
    284                     Arabic_Libya = SkTEndian_SwapBE16(0x1001),
    285                     Arabic_Morocco = SkTEndian_SwapBE16(0x1801),
    286                     Arabic_Oman = SkTEndian_SwapBE16(0x2001),
    287                     Arabic_Qatar = SkTEndian_SwapBE16(0x4001),
    288                     Arabic_SaudiArabia = SkTEndian_SwapBE16(0x0401),
    289                     Arabic_Syria = SkTEndian_SwapBE16(0x2801),
    290                     Arabic_Tunisia = SkTEndian_SwapBE16(0x1C01),
    291                     Arabic_UAE = SkTEndian_SwapBE16(0x3801),
    292                     Arabic_Yemen = SkTEndian_SwapBE16(0x2401),
    293                     Armenian_Armenia = SkTEndian_SwapBE16(0x042B),
    294                     Assamese_India = SkTEndian_SwapBE16(0x044D),
    295                     AzeriCyrillic_Azerbaijan = SkTEndian_SwapBE16(0x082C),
    296                     AzeriLatin_Azerbaijan = SkTEndian_SwapBE16(0x042C),
    297                     Bashkir_Russia = SkTEndian_SwapBE16(0x046D),
    298                     Basque_Basque = SkTEndian_SwapBE16(0x042D),
    299                     Belarusian_Belarus = SkTEndian_SwapBE16(0x0423),
    300                     Bengali_Bangladesh = SkTEndian_SwapBE16(0x0845),
    301                     Bengali_India = SkTEndian_SwapBE16(0x0445),
    302                     BosnianCyrillic_BosniaAndHerzegovina = SkTEndian_SwapBE16(0x201A),
    303                     BosnianLatin_BosniaAndHerzegovina = SkTEndian_SwapBE16(0x141A),
    304                     Breton_France = SkTEndian_SwapBE16(0x047E),
    305                     Bulgarian_Bulgaria = SkTEndian_SwapBE16(0x0402),
    306                     Catalan_Catalan = SkTEndian_SwapBE16(0x0403),
    307                     Chinese_HongKongSAR = SkTEndian_SwapBE16(0x0C04),
    308                     Chinese_MacaoSAR = SkTEndian_SwapBE16(0x1404),
    309                     Chinese_PeoplesRepublicOfChina = SkTEndian_SwapBE16(0x0804),
    310                     Chinese_Singapore = SkTEndian_SwapBE16(0x1004),
    311                     Chinese_Taiwan = SkTEndian_SwapBE16(0x0404),
    312                     Corsican_France = SkTEndian_SwapBE16(0x0483),
    313                     Croatian_Croatia = SkTEndian_SwapBE16(0x041A),
    314                     CroatianLatin_BosniaAndHerzegovina = SkTEndian_SwapBE16(0x101A),
    315                     Czech_CzechRepublic = SkTEndian_SwapBE16(0x0405),
    316                     Danish_Denmark = SkTEndian_SwapBE16(0x0406),
    317                     Dari_Afghanistan = SkTEndian_SwapBE16(0x048C),
    318                     Divehi_Maldives = SkTEndian_SwapBE16(0x0465),
    319                     Dutch_Belgium = SkTEndian_SwapBE16(0x0813),
    320                     Dutch_Netherlands = SkTEndian_SwapBE16(0x0413),
    321                     English_Australia = SkTEndian_SwapBE16(0x0C09),
    322                     English_Belize = SkTEndian_SwapBE16(0x2809),
    323                     English_Canada = SkTEndian_SwapBE16(0x1009),
    324                     English_Caribbean = SkTEndian_SwapBE16(0x2409),
    325                     English_India = SkTEndian_SwapBE16(0x4009),
    326                     English_Ireland = SkTEndian_SwapBE16(0x1809),
    327                     English_Jamaica = SkTEndian_SwapBE16(0x2009),
    328                     English_Malaysia = SkTEndian_SwapBE16(0x4409),
    329                     English_NewZealand = SkTEndian_SwapBE16(0x1409),
    330                     English_RepublicOfThePhilippines = SkTEndian_SwapBE16(0x3409),
    331                     English_Singapore = SkTEndian_SwapBE16(0x4809),
    332                     English_SouthAfrica = SkTEndian_SwapBE16(0x1C09),
    333                     English_TrinidadAndTobago = SkTEndian_SwapBE16(0x2C09),
    334                     English_UnitedKingdom = SkTEndian_SwapBE16(0x0809),
    335                     English_UnitedStates = SkTEndian_SwapBE16(0x0409),
    336                     English_Zimbabwe = SkTEndian_SwapBE16(0x3009),
    337                     Estonian_Estonia = SkTEndian_SwapBE16(0x0425),
    338                     Faroese_FaroeIslands = SkTEndian_SwapBE16(0x0438),
    339                     Filipino_Philippines = SkTEndian_SwapBE16(0x0464),
    340                     Finnish_Finland = SkTEndian_SwapBE16(0x040B),
    341                     French_Belgium = SkTEndian_SwapBE16(0x080C),
    342                     French_Canada = SkTEndian_SwapBE16(0x0C0C),
    343                     French_France = SkTEndian_SwapBE16(0x040C),
    344                     French_Luxembourg = SkTEndian_SwapBE16(0x140c),
    345                     French_PrincipalityOfMonoco = SkTEndian_SwapBE16(0x180C),
    346                     French_Switzerland = SkTEndian_SwapBE16(0x100C),
    347                     Frisian_Netherlands = SkTEndian_SwapBE16(0x0462),
    348                     Galician_Galician = SkTEndian_SwapBE16(0x0456),
    349                     Georgian_Georgia = SkTEndian_SwapBE16(0x0437),
    350                     German_Austria = SkTEndian_SwapBE16(0x0C07),
    351                     German_Germany = SkTEndian_SwapBE16(0x0407),
    352                     German_Liechtenstein = SkTEndian_SwapBE16(0x1407),
    353                     German_Luxembourg = SkTEndian_SwapBE16(0x1007),
    354                     German_Switzerland = SkTEndian_SwapBE16(0x0807),
    355                     Greek_Greece = SkTEndian_SwapBE16(0x0408),
    356                     Greenlandic_Greenland = SkTEndian_SwapBE16(0x046F),
    357                     Gujarati_India = SkTEndian_SwapBE16(0x0447),
    358                     HausaLatin_Nigeria = SkTEndian_SwapBE16(0x0468),
    359                     Hebrew_Israel = SkTEndian_SwapBE16(0x040D),
    360                     Hindi_India = SkTEndian_SwapBE16(0x0439),
    361                     Hungarian_Hungary = SkTEndian_SwapBE16(0x040E),
    362                     Icelandic_Iceland = SkTEndian_SwapBE16(0x040F),
    363                     Igbo_Nigeria = SkTEndian_SwapBE16(0x0470),
    364                     Indonesian_Indonesia = SkTEndian_SwapBE16(0x0421),
    365                     Inuktitut_Canada = SkTEndian_SwapBE16(0x045D),
    366                     InuktitutLatin_Canada = SkTEndian_SwapBE16(0x085D),
    367                     Irish_Ireland = SkTEndian_SwapBE16(0x083C),
    368                     isiXhosa_SouthAfrica = SkTEndian_SwapBE16(0x0434),
    369                     isiZulu_SouthAfrica = SkTEndian_SwapBE16(0x0435),
    370                     Italian_Italy = SkTEndian_SwapBE16(0x0410),
    371                     Italian_Switzerland = SkTEndian_SwapBE16(0x0810),
    372                     Japanese_Japan = SkTEndian_SwapBE16(0x0411),
    373                     Kannada_India = SkTEndian_SwapBE16(0x044B),
    374                     Kazakh_Kazakhstan = SkTEndian_SwapBE16(0x043F),
    375                     Khmer_Cambodia = SkTEndian_SwapBE16(0x0453),
    376                     Kiche_Guatemala = SkTEndian_SwapBE16(0x0486),
    377                     Kinyarwanda_Rwanda = SkTEndian_SwapBE16(0x0487),
    378                     Kiswahili_Kenya = SkTEndian_SwapBE16(0x0441),
    379                     Konkani_India = SkTEndian_SwapBE16(0x0457),
    380                     Korean_Korea = SkTEndian_SwapBE16(0x0412),
    381                     Kyrgyz_Kyrgyzstan = SkTEndian_SwapBE16(0x0440),
    382                     Lao_LaoPDR = SkTEndian_SwapBE16(0x0454),
    383                     Latvian_Latvia = SkTEndian_SwapBE16(0x0426),
    384                     Lithuanian_Lithuania = SkTEndian_SwapBE16(0x0427),
    385                     LowerSorbian_Germany = SkTEndian_SwapBE16(0x082E),
    386                     Luxembourgish_Luxembourg = SkTEndian_SwapBE16(0x046E),
    387                     MacedonianFYROM_FormerYugoslavRepublicOfMacedonia = SkTEndian_SwapBE16(0x042F),
    388                     Malay_BruneiDarussalam = SkTEndian_SwapBE16(0x083E),
    389                     Malay_Malaysia = SkTEndian_SwapBE16(0x043E),
    390                     Malayalam_India = SkTEndian_SwapBE16(0x044C),
    391                     Maltese_Malta = SkTEndian_SwapBE16(0x043A),
    392                     Maori_NewZealand = SkTEndian_SwapBE16(0x0481),
    393                     Mapudungun_Chile = SkTEndian_SwapBE16(0x047A),
    394                     Marathi_India = SkTEndian_SwapBE16(0x044E),
    395                     Mohawk_Mohawk = SkTEndian_SwapBE16(0x047C),
    396                     MongolianCyrillic_Mongolia = SkTEndian_SwapBE16(0x0450),
    397                     MongolianTraditional_PeoplesRepublicOfChina = SkTEndian_SwapBE16(0x0850),
    398                     Nepali_Nepal = SkTEndian_SwapBE16(0x0461),
    399                     NorwegianBokmal_Norway = SkTEndian_SwapBE16(0x0414),
    400                     NorwegianNynorsk_Norway = SkTEndian_SwapBE16(0x0814),
    401                     Occitan_France = SkTEndian_SwapBE16(0x0482),
    402                     Odia_India = SkTEndian_SwapBE16(0x0448),
    403                     Pashto_Afghanistan = SkTEndian_SwapBE16(0x0463),
    404                     Polish_Poland = SkTEndian_SwapBE16(0x0415),
    405                     Portuguese_Brazil = SkTEndian_SwapBE16(0x0416),
    406                     Portuguese_Portugal = SkTEndian_SwapBE16(0x0816),
    407                     Punjabi_India = SkTEndian_SwapBE16(0x0446),
    408                     Quechua_Bolivia = SkTEndian_SwapBE16(0x046B),
    409                     Quechua_Ecuador = SkTEndian_SwapBE16(0x086B),
    410                     Quechua_Peru = SkTEndian_SwapBE16(0x0C6B),
    411                     Romanian_Romania = SkTEndian_SwapBE16(0x0418),
    412                     Romansh_Switzerland = SkTEndian_SwapBE16(0x0417),
    413                     Russian_Russia = SkTEndian_SwapBE16(0x0419),
    414                     SamiInari_Finland = SkTEndian_SwapBE16(0x243B),
    415                     SamiLule_Norway = SkTEndian_SwapBE16(0x103B),
    416                     SamiLule_Sweden = SkTEndian_SwapBE16(0x143B),
    417                     SamiNorthern_Finland = SkTEndian_SwapBE16(0x0C3B),
    418                     SamiNorthern_Norway = SkTEndian_SwapBE16(0x043B),
    419                     SamiNorthern_Sweden = SkTEndian_SwapBE16(0x083B),
    420                     SamiSkolt_Finland = SkTEndian_SwapBE16(0x203B),
    421                     SamiSouthern_Norway = SkTEndian_SwapBE16(0x183B),
    422                     SamiSouthern_Sweden = SkTEndian_SwapBE16(0x1C3B),
    423                     Sanskrit_India = SkTEndian_SwapBE16(0x044F),
    424                     SerbianCyrillic_BosniaAndHerzegovina = SkTEndian_SwapBE16(0x1C1A),
    425                     SerbianCyrillic_Serbia = SkTEndian_SwapBE16(0x0C1A),
    426                     SerbianLatin_BosniaAndHerzegovina = SkTEndian_SwapBE16(0x181A),
    427                     SerbianLatin_Serbia = SkTEndian_SwapBE16(0x081A),
    428                     SesothoSaLeboa_SouthAfrica = SkTEndian_SwapBE16(0x046C),
    429                     Setswana_SouthAfrica = SkTEndian_SwapBE16(0x0432),
    430                     Sinhala_SriLanka = SkTEndian_SwapBE16(0x045B),
    431                     Slovak_Slovakia = SkTEndian_SwapBE16(0x041B),
    432                     Slovenian_Slovenia = SkTEndian_SwapBE16(0x0424),
    433                     Spanish_Argentina = SkTEndian_SwapBE16(0x2C0A),
    434                     Spanish_Bolivia = SkTEndian_SwapBE16(0x400A),
    435                     Spanish_Chile = SkTEndian_SwapBE16(0x340A),
    436                     Spanish_Colombia = SkTEndian_SwapBE16(0x240A),
    437                     Spanish_CostaRica = SkTEndian_SwapBE16(0x140A),
    438                     Spanish_DominicanRepublic = SkTEndian_SwapBE16(0x1C0A),
    439                     Spanish_Ecuador = SkTEndian_SwapBE16(0x300A),
    440                     Spanish_ElSalvador = SkTEndian_SwapBE16(0x440A),
    441                     Spanish_Guatemala = SkTEndian_SwapBE16(0x100A),
    442                     Spanish_Honduras = SkTEndian_SwapBE16(0x480A),
    443                     Spanish_Mexico = SkTEndian_SwapBE16(0x080A),
    444                     Spanish_Nicaragua = SkTEndian_SwapBE16(0x4C0A),
    445                     Spanish_Panama = SkTEndian_SwapBE16(0x180A),
    446                     Spanish_Paraguay = SkTEndian_SwapBE16(0x3C0A),
    447                     Spanish_Peru = SkTEndian_SwapBE16(0x280A),
    448                     Spanish_PuertoRico = SkTEndian_SwapBE16(0x500A),
    449                     SpanishModernSort_Spain = SkTEndian_SwapBE16(0x0C0A),
    450                     SpanishTraditionalSort_Spain = SkTEndian_SwapBE16(0x040A),
    451                     Spanish_UnitedStates = SkTEndian_SwapBE16(0x540A),
    452                     Spanish_Uruguay = SkTEndian_SwapBE16(0x380A),
    453                     Spanish_Venezuela = SkTEndian_SwapBE16(0x200A),
    454                     Sweden_Finland = SkTEndian_SwapBE16(0x081D),
    455                     Swedish_Sweden = SkTEndian_SwapBE16(0x041D),
    456                     Syriac_Syria = SkTEndian_SwapBE16(0x045A),
    457                     TajikCyrillic_Tajikistan = SkTEndian_SwapBE16(0x0428),
    458                     TamazightLatin_Algeria = SkTEndian_SwapBE16(0x085F),
    459                     Tamil_India = SkTEndian_SwapBE16(0x0449),
    460                     Tatar_Russia = SkTEndian_SwapBE16(0x0444),
    461                     Telugu_India = SkTEndian_SwapBE16(0x044A),
    462                     Thai_Thailand = SkTEndian_SwapBE16(0x041E),
    463                     Tibetan_PRC = SkTEndian_SwapBE16(0x0451),
    464                     Turkish_Turkey = SkTEndian_SwapBE16(0x041F),
    465                     Turkmen_Turkmenistan = SkTEndian_SwapBE16(0x0442),
    466                     Uighur_PRC = SkTEndian_SwapBE16(0x0480),
    467                     Ukrainian_Ukraine = SkTEndian_SwapBE16(0x0422),
    468                     UpperSorbian_Germany = SkTEndian_SwapBE16(0x042E),
    469                     Urdu_IslamicRepublicOfPakistan = SkTEndian_SwapBE16(0x0420),
    470                     UzbekCyrillic_Uzbekistan = SkTEndian_SwapBE16(0x0843),
    471                     UzbekLatin_Uzbekistan = SkTEndian_SwapBE16(0x0443),
    472                     Vietnamese_Vietnam = SkTEndian_SwapBE16(0x042A),
    473                     Welsh_UnitedKingdom = SkTEndian_SwapBE16(0x0452),
    474                     Wolof_Senegal = SkTEndian_SwapBE16(0x0488),
    475                     Yakut_Russia = SkTEndian_SwapBE16(0x0485),
    476                     Yi_PRC = SkTEndian_SwapBE16(0x0478),
    477                     Yoruba_Nigeria = SkTEndian_SwapBE16(0x046A),
    478                 } value;
    479             } windows;
    480         } languageID;
    481 
    482         /** NameIDs <= 0xFF are predefined. Those > 0xFF are font specific. */
    483         union NameID {
    484            /** A font specific name id which should be greater than 0xFF. */
    485            SK_OT_USHORT fontSpecific;
    486            struct Predefined {
    487                 enum Value : SK_OT_USHORT {
    488                     CopyrightNotice = SkTEndian_SwapBE16(0),
    489                     FontFamilyName = SkTEndian_SwapBE16(1),
    490                     FontSubfamilyName = SkTEndian_SwapBE16(2),
    491                     UniqueFontIdentifier = SkTEndian_SwapBE16(3),
    492                     FullFontName = SkTEndian_SwapBE16(4),
    493                     VersionString = SkTEndian_SwapBE16(5), //Version <number>.<number>
    494                     PostscriptName = SkTEndian_SwapBE16(6), //See spec for constraints.
    495                     Trademark = SkTEndian_SwapBE16(7),
    496                     ManufacturerName = SkTEndian_SwapBE16(8),
    497                     Designer = SkTEndian_SwapBE16(9),
    498                     Description = SkTEndian_SwapBE16(10),
    499                     URLVendor = SkTEndian_SwapBE16(11),
    500                     URLDesigner = SkTEndian_SwapBE16(12),
    501                     LicenseDescription = SkTEndian_SwapBE16(13),
    502                     LicenseInfoURL = SkTEndian_SwapBE16(14),
    503                     PreferredFamily = SkTEndian_SwapBE16(16),
    504                     PreferredSubfamily = SkTEndian_SwapBE16(17),
    505                     CompatibleFullName = SkTEndian_SwapBE16(18),
    506                     SampleText = SkTEndian_SwapBE16(19),
    507                     PostscriptCIDFindfontName = SkTEndian_SwapBE16(20),
    508                     WWSFamilyName = SkTEndian_SwapBE16(21),
    509                     WWSSubfamilyName = SkTEndian_SwapBE16(22),
    510                 } value;
    511             } predefined;
    512         } nameID;
    513 
    514         /** The length of the string in SK_OT_BYTEs. */
    515         SK_OT_USHORT length;
    516 
    517         /** Offset in SK_OT_BYTEs from start of string storage area
    518          *  (see SkOTTableName::stringOffset).
    519          */
    520         SK_OT_USHORT offset;
    521     }; //nameRecord[count];
    522 
    523     struct Format1Ext {
    524         /** The number of languageTagRecords which follow. */
    525         SK_OT_USHORT langTagCount;
    526 
    527         /** The encoding of a langTagRecord string is always UTF-16BE.
    528          *  The content should follow IETF specification BCP 47.
    529          */
    530         struct LangTagRecord {
    531             /** The length of the string in SK_OT_BYTEs. */
    532             SK_OT_USHORT length;
    533 
    534             /** Offset in SK_OT_BYTEs from start of string storage area
    535              *  (see SkOTTableName::stringOffset).
    536              */
    537             SK_OT_USHORT offset;
    538         }; //langTagRecord[langTagCount]
    539     }; //format1ext (if format == format_1)
    540 
    541     class Iterator {
    542     public:
    543         Iterator(const SkOTTableName& name) : fName(name), fIndex(0), fType(-1) { }
    544         Iterator(const SkOTTableName& name, SkOTTableName::Record::NameID::Predefined::Value type)
    545             : fName(name), fIndex(0), fType(type)
    546         { }
    547 
    548         void reset(SkOTTableName::Record::NameID::Predefined::Value type) {
    549             fIndex = 0;
    550             fType = type;
    551         }
    552 
    553         struct Record {
    554             SkString name;
    555             SkString language;
    556             SK_OT_USHORT type;
    557         };
    558         bool next(Record&);
    559 
    560     private:
    561         const SkOTTableName& fName;
    562         size_t fIndex;
    563         int fType;
    564     };
    565 };
    566 
    567 #pragma pack(pop)
    568 
    569 
    570 static_assert(sizeof(SkOTTableName) == 6, "sizeof_SkOTTableName_not_6");
    571 static_assert(sizeof(SkOTTableName::Format1Ext) == 2, "sizeof_SkOTTableNameF1_not_2");
    572 static_assert(sizeof(SkOTTableName::Format1Ext::LangTagRecord) == 4, "sizeof_SkOTTableNameLangTagRecord_not_4");
    573 static_assert(sizeof(SkOTTableName::Record) == 12, "sizeof_SkOTTableNameRecord_not_12");
    574 
    575 #endif
    576