/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkOTTable_name_DEFINED
#define SkOTTable_name_DEFINED

#include "include/core/SkString.h"
#include "src/base/SkEndian.h"
#include "src/sfnt/SkOTTableTypes.h"

#pragma pack(push, 1)

struct SkOTTableName {
    static const SK_OT_CHAR TAG0 = 'n';
    static const SK_OT_CHAR TAG1 = 'a';
    static const SK_OT_CHAR TAG2 = 'm';
    static const SK_OT_CHAR TAG3 = 'e';
    static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableName>::value;

    SK_OT_USHORT format;
    static const SK_OT_USHORT format_0 = SkTEndian_SwapBE16(0);
    /** Format 1 was added in OpenType 1.6 (April 2009). */
    static const SK_OT_USHORT format_1 = SkTEndian_SwapBE16(1);

    /** The number of name records which follow. */
    SK_OT_USHORT count;

    /** Offset in SK_OT_BYTEs to start of string storage area (from start of table). */
    SK_OT_USHORT stringOffset;

    struct Record {
        /** The platform ID specifies how to interpret the encoding and language ID. */
        struct PlatformID {
            enum Value : SK_OT_USHORT {
                Unicode = SkTEndian_SwapBE16(0),
                Macintosh = SkTEndian_SwapBE16(1),
                ISO = SkTEndian_SwapBE16(2), // Deprecated, use Unicode instead.
                Windows = SkTEndian_SwapBE16(3),
                Custom = SkTEndian_SwapBE16(4),
            } value;
        } platformID;

        union EncodingID {
            SK_OT_USHORT custom;

            /** Always UTF-16BE. */
            struct Unicode {
                enum Value : SK_OT_USHORT {
                    Unicode10 = SkTEndian_SwapBE16(0),
                    Unicode11 = SkTEndian_SwapBE16(1),
                    ISO10646 = SkTEndian_SwapBE16(2), //deprecated, use Unicode11
                    Unicode20BMP = SkTEndian_SwapBE16(3),
                    Unicode20 = SkTEndian_SwapBE16(4),
                    UnicodeVariationSequences = SkTEndian_SwapBE16(5),
                    UnicodeFull = SkTEndian_SwapBE16(6),
                } value;
            } unicode;

            /** These are Mac encodings, see http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/
             *  for their mappings to unicode.
             *  Name table strings using PlatformID::Macintosh must use Roman.
             */
            struct Macintosh {
                enum Value : SK_OT_USHORT {
                    Roman = SkTEndian_SwapBE16(0),
                    Japanese = SkTEndian_SwapBE16(1),
                    ChineseTraditional = SkTEndian_SwapBE16(2),
                    Korean = SkTEndian_SwapBE16(3),
                    Arabic = SkTEndian_SwapBE16(4),
                    Hebrew = SkTEndian_SwapBE16(5),
                    Greek = SkTEndian_SwapBE16(6),
                    Russian = SkTEndian_SwapBE16(7),
                    RSymbol = SkTEndian_SwapBE16(8),
                    Devanagari = SkTEndian_SwapBE16(9),
                    Gurmukhi = SkTEndian_SwapBE16(10),
                    Gujarati = SkTEndian_SwapBE16(11),
                    Oriya = SkTEndian_SwapBE16(12),
                    Bengali = SkTEndian_SwapBE16(13),
                    Tamil = SkTEndian_SwapBE16(14),
                    Telugu = SkTEndian_SwapBE16(15),
                    Kannada = SkTEndian_SwapBE16(16),
                    Malayalam = SkTEndian_SwapBE16(17),
                    Sinhalese = SkTEndian_SwapBE16(18),
                    Burmese = SkTEndian_SwapBE16(19),
                    Khmer = SkTEndian_SwapBE16(20),
                    Thai = SkTEndian_SwapBE16(21),
                    Laotian = SkTEndian_SwapBE16(22),
                    Georgian = SkTEndian_SwapBE16(23),
                    Armenian = SkTEndian_SwapBE16(24),
                    ChineseSimplified = SkTEndian_SwapBE16(25),
                    Tibetan = SkTEndian_SwapBE16(26),
                    Mongolian = SkTEndian_SwapBE16(27),
                    Geez = SkTEndian_SwapBE16(28),
                    Slavic = SkTEndian_SwapBE16(29),
                    Vietnamese = SkTEndian_SwapBE16(30),
                    Sindhi = SkTEndian_SwapBE16(31),
                    Uninterpreted = SkTEndian_SwapBE16(32),
                } value;
            } macintosh;

            /** Deprecated, use Unicode instead. */
            struct ISO {
                enum Value : SK_OT_USHORT {
                    ASCII7 = SkTEndian_SwapBE16(0),
                    ISO10646 = SkTEndian_SwapBE16(1),
                    ISO88591 = SkTEndian_SwapBE16(2),
                } value;
            } iso;

            /** Name table strings using PlatformID::Windows must use Symbol, UnicodeBMPUCS2, or
             *  UnicodeUCS4. Symbol and UnicodeBMPUCS2 are both UCS2-BE, UnicodeUCS4 is actually
             *  UTF-16BE.
             */
            struct Windows {
                enum Value : SK_OT_USHORT {
                    Symbol = SkTEndian_SwapBE16(0), // UCS2-BE, but don't use this font to display it's own name.
                    UnicodeBMPUCS2 = SkTEndian_SwapBE16(1), // UCS2-BE, Windows default
                    ShiftJIS = SkTEndian_SwapBE16(2),
                    PRC = SkTEndian_SwapBE16(3),
                    Big5 = SkTEndian_SwapBE16(4),
                    Wansung = SkTEndian_SwapBE16(5),
                    Johab = SkTEndian_SwapBE16(6),
                    UnicodeUCS4 = SkTEndian_SwapBE16(10), // UTF-16BE. It means UCS4 in charmaps.
                } value;
            } windows;
        } encodingID;

        /** LanguageIDs <= 0x7FFF are predefined.
         *  LanguageIDs > 0x7FFF are indexes into the langTagRecord array
         *  (in format 1 name tables, see SkOTTableName::format).
         */
        union LanguageID {
            /** A value greater than 0x7FFF.
             *  languageTagID - 0x8000 is an index into the langTagRecord array.
             */
            SK_OT_USHORT languageTagID;

            /** These are known as Language Designators.
             *  Apple now uses BCP 47 (post OSX10.4), so there will be no new entries.
             */
            struct Macintosh {
                enum Value : SK_OT_USHORT {
                    English = SkTEndian_SwapBE16(0),
                    French = SkTEndian_SwapBE16(1),
                    German = SkTEndian_SwapBE16(2),
                    Italian = SkTEndian_SwapBE16(3),
                    Dutch = SkTEndian_SwapBE16(4),
                    Swedish = SkTEndian_SwapBE16(5),
                    Spanish = SkTEndian_SwapBE16(6),
                    Danish = SkTEndian_SwapBE16(7),
                    Portuguese = SkTEndian_SwapBE16(8),
                    Norwegian = SkTEndian_SwapBE16(9),
                    Hebrew = SkTEndian_SwapBE16(10),
                    Japanese = SkTEndian_SwapBE16(11),
                    Arabic = SkTEndian_SwapBE16(12),
                    Finnish = SkTEndian_SwapBE16(13),
                    Greek = SkTEndian_SwapBE16(14),
                    Icelandic = SkTEndian_SwapBE16(15),
                    Maltese = SkTEndian_SwapBE16(16),
                    Turkish = SkTEndian_SwapBE16(17),
                    Croatian = SkTEndian_SwapBE16(18),
                    ChineseTraditional = SkTEndian_SwapBE16(19),
                    Urdu = SkTEndian_SwapBE16(20),
                    Hindi = SkTEndian_SwapBE16(21),
                    Thai = SkTEndian_SwapBE16(22),
                    Korean = SkTEndian_SwapBE16(23),
                    Lithuanian = SkTEndian_SwapBE16(24),
                    Polish = SkTEndian_SwapBE16(25),
                    Hungarian = SkTEndian_SwapBE16(26),
                    Estonian = SkTEndian_SwapBE16(27),
                    Latvian = SkTEndian_SwapBE16(28),
                    Sami = SkTEndian_SwapBE16(29),
                    Faroese = SkTEndian_SwapBE16(30),
                    Farsi_Persian = SkTEndian_SwapBE16(31),
                    Russian = SkTEndian_SwapBE16(32),
                    ChineseSimplified = SkTEndian_SwapBE16(33),
                    Flemish = SkTEndian_SwapBE16(34),
                    IrishGaelic = SkTEndian_SwapBE16(35),
                    Albanian = SkTEndian_SwapBE16(36),
                    Romanian = SkTEndian_SwapBE16(37),
                    Czech = SkTEndian_SwapBE16(38),
                    Slovak = SkTEndian_SwapBE16(39),
                    Slovenian = SkTEndian_SwapBE16(40),
                    Yiddish = SkTEndian_SwapBE16(41),
                    Serbian = SkTEndian_SwapBE16(42),
                    Macedonian = SkTEndian_SwapBE16(43),
                    Bulgarian = SkTEndian_SwapBE16(44),
                    Ukrainian = SkTEndian_SwapBE16(45),
                    Byelorussian = SkTEndian_SwapBE16(46),
                    Uzbek = SkTEndian_SwapBE16(47),
                    Kazakh = SkTEndian_SwapBE16(48),
                    AzerbaijaniCyrillic = SkTEndian_SwapBE16(49),
                    AzerbaijaniArabic = SkTEndian_SwapBE16(50),
                    Armenian = SkTEndian_SwapBE16(51),
                    Georgian = SkTEndian_SwapBE16(52),
                    Moldavian = SkTEndian_SwapBE16(53),
                    Kirghiz = SkTEndian_SwapBE16(54),
                    Tajiki = SkTEndian_SwapBE16(55),
                    Turkmen = SkTEndian_SwapBE16(56),
                    MongolianTraditional = SkTEndian_SwapBE16(57),
                    MongolianCyrillic = SkTEndian_SwapBE16(58),
                    Pashto = SkTEndian_SwapBE16(59),
                    Kurdish = SkTEndian_SwapBE16(60),
                    Kashmiri = SkTEndian_SwapBE16(61),
                    Sindhi = SkTEndian_SwapBE16(62),
                    Tibetan = SkTEndian_SwapBE16(63),
                    Nepali = SkTEndian_SwapBE16(64),
                    Sanskrit = SkTEndian_SwapBE16(65),
                    Marathi = SkTEndian_SwapBE16(66),
                    Bengali = SkTEndian_SwapBE16(67),
                    Assamese = SkTEndian_SwapBE16(68),
                    Gujarati = SkTEndian_SwapBE16(69),
                    Punjabi = SkTEndian_SwapBE16(70),
                    Oriya = SkTEndian_SwapBE16(71),
                    Malayalam = SkTEndian_SwapBE16(72),
                    Kannada = SkTEndian_SwapBE16(73),
                    Tamil = SkTEndian_SwapBE16(74),
                    Telugu = SkTEndian_SwapBE16(75),
                    Sinhalese = SkTEndian_SwapBE16(76),
                    Burmese = SkTEndian_SwapBE16(77),
                    Khmer = SkTEndian_SwapBE16(78),
                    Lao = SkTEndian_SwapBE16(79),
                    Vietnamese = SkTEndian_SwapBE16(80),
                    Indonesian = SkTEndian_SwapBE16(81),
                    Tagalong = SkTEndian_SwapBE16(82),
                    MalayRoman = SkTEndian_SwapBE16(83),
                    MalayArabic = SkTEndian_SwapBE16(84),
                    Amharic = SkTEndian_SwapBE16(85),
                    Tigrinya = SkTEndian_SwapBE16(86),
                    Galla = SkTEndian_SwapBE16(87),
                    Somali = SkTEndian_SwapBE16(88),
                    Swahili = SkTEndian_SwapBE16(89),
                    Kinyarwanda_Ruanda = SkTEndian_SwapBE16(90),
                    Rundi = SkTEndian_SwapBE16(91),
                    Nyanja_Chewa = SkTEndian_SwapBE16(92),
                    Malagasy = SkTEndian_SwapBE16(93),
                    Esperanto = SkTEndian_SwapBE16(94),
                    Welsh = SkTEndian_SwapBE16(128),
                    Basque = SkTEndian_SwapBE16(129),
                    Catalan = SkTEndian_SwapBE16(130),
                    Latin = SkTEndian_SwapBE16(131),
                    Quenchua = SkTEndian_SwapBE16(132),
                    Guarani = SkTEndian_SwapBE16(133),
                    Aymara = SkTEndian_SwapBE16(134),
                    Tatar = SkTEndian_SwapBE16(135),
                    Uighur = SkTEndian_SwapBE16(136),
                    Dzongkha = SkTEndian_SwapBE16(137),
                    JavaneseRoman = SkTEndian_SwapBE16(138),
                    SundaneseRoman = SkTEndian_SwapBE16(139),
                    Galician = SkTEndian_SwapBE16(140),
                    Afrikaans = SkTEndian_SwapBE16(141),
                    Breton = SkTEndian_SwapBE16(142),
                    Inuktitut = SkTEndian_SwapBE16(143),
                    ScottishGaelic = SkTEndian_SwapBE16(144),
                    ManxGaelic = SkTEndian_SwapBE16(145),
                    IrishGaelicWithLenition = SkTEndian_SwapBE16(146),
                    Tongan = SkTEndian_SwapBE16(147),
                    GreekPolytonic = SkTEndian_SwapBE16(148),
                    Greenlandic = SkTEndian_SwapBE16(149),
                    AzerbaijaniRoman = SkTEndian_SwapBE16(150),
                } value;
            } macintosh;

            /** These are known as LCIDs.
             *  On Windows the current set can be had from EnumSystemLocalesEx and LocaleNameToLCID.
             */
            struct Windows {
                enum Value : SK_OT_USHORT {
                    Afrikaans_SouthAfrica = SkTEndian_SwapBE16(0x0436),
                    Albanian_Albania = SkTEndian_SwapBE16(0x041C),
                    Alsatian_France = SkTEndian_SwapBE16(0x0484),
                    Amharic_Ethiopia = SkTEndian_SwapBE16(0x045E),
                    Arabic_Algeria = SkTEndian_SwapBE16(0x1401),
                    Arabic_Bahrain = SkTEndian_SwapBE16(0x3C01),
                    Arabic_Egypt = SkTEndian_SwapBE16(0x0C01),
                    Arabic_Iraq = SkTEndian_SwapBE16(0x0801),
                    Arabic_Jordan = SkTEndian_SwapBE16(0x2C01),
                    Arabic_Kuwait = SkTEndian_SwapBE16(0x3401),
                    Arabic_Lebanon = SkTEndian_SwapBE16(0x3001),
                    Arabic_Libya = SkTEndian_SwapBE16(0x1001),
                    Arabic_Morocco = SkTEndian_SwapBE16(0x1801),
                    Arabic_Oman = SkTEndian_SwapBE16(0x2001),
                    Arabic_Qatar = SkTEndian_SwapBE16(0x4001),
                    Arabic_SaudiArabia = SkTEndian_SwapBE16(0x0401),
                    Arabic_Syria = SkTEndian_SwapBE16(0x2801),
                    Arabic_Tunisia = SkTEndian_SwapBE16(0x1C01),
                    Arabic_UAE = SkTEndian_SwapBE16(0x3801),
                    Arabic_Yemen = SkTEndian_SwapBE16(0x2401),
                    Armenian_Armenia = SkTEndian_SwapBE16(0x042B),
                    Assamese_India = SkTEndian_SwapBE16(0x044D),
                    AzeriCyrillic_Azerbaijan = SkTEndian_SwapBE16(0x082C),
                    AzeriLatin_Azerbaijan = SkTEndian_SwapBE16(0x042C),
                    Bashkir_Russia = SkTEndian_SwapBE16(0x046D),
                    Basque_Basque = SkTEndian_SwapBE16(0x042D),
                    Belarusian_Belarus = SkTEndian_SwapBE16(0x0423),
                    Bengali_Bangladesh = SkTEndian_SwapBE16(0x0845),
                    Bengali_India = SkTEndian_SwapBE16(0x0445),
                    BosnianCyrillic_BosniaAndHerzegovina = SkTEndian_SwapBE16(0x201A),
                    BosnianLatin_BosniaAndHerzegovina = SkTEndian_SwapBE16(0x141A),
                    Breton_France = SkTEndian_SwapBE16(0x047E),
                    Bulgarian_Bulgaria = SkTEndian_SwapBE16(0x0402),
                    Catalan_Catalan = SkTEndian_SwapBE16(0x0403),
                    Chinese_HongKongSAR = SkTEndian_SwapBE16(0x0C04),
                    Chinese_MacaoSAR = SkTEndian_SwapBE16(0x1404),
                    Chinese_PeoplesRepublicOfChina = SkTEndian_SwapBE16(0x0804),
                    Chinese_Singapore = SkTEndian_SwapBE16(0x1004),
                    Chinese_Taiwan = SkTEndian_SwapBE16(0x0404),
                    Corsican_France = SkTEndian_SwapBE16(0x0483),
                    Croatian_Croatia = SkTEndian_SwapBE16(0x041A),
                    CroatianLatin_BosniaAndHerzegovina = SkTEndian_SwapBE16(0x101A),
                    Czech_CzechRepublic = SkTEndian_SwapBE16(0x0405),
                    Danish_Denmark = SkTEndian_SwapBE16(0x0406),
                    Dari_Afghanistan = SkTEndian_SwapBE16(0x048C),
                    Divehi_Maldives = SkTEndian_SwapBE16(0x0465),
                    Dutch_Belgium = SkTEndian_SwapBE16(0x0813),
                    Dutch_Netherlands = SkTEndian_SwapBE16(0x0413),
                    English_Australia = SkTEndian_SwapBE16(0x0C09),
                    English_Belize = SkTEndian_SwapBE16(0x2809),
                    English_Canada = SkTEndian_SwapBE16(0x1009),
                    English_Caribbean = SkTEndian_SwapBE16(0x2409),
                    English_India = SkTEndian_SwapBE16(0x4009),
                    English_Ireland = SkTEndian_SwapBE16(0x1809),
                    English_Jamaica = SkTEndian_SwapBE16(0x2009),
                    English_Malaysia = SkTEndian_SwapBE16(0x4409),
                    English_NewZealand = SkTEndian_SwapBE16(0x1409),
                    English_RepublicOfThePhilippines = SkTEndian_SwapBE16(0x3409),
                    English_Singapore = SkTEndian_SwapBE16(0x4809),
                    English_SouthAfrica = SkTEndian_SwapBE16(0x1C09),
                    English_TrinidadAndTobago = SkTEndian_SwapBE16(0x2C09),
                    English_UnitedKingdom = SkTEndian_SwapBE16(0x0809),
                    English_UnitedStates = SkTEndian_SwapBE16(0x0409),
                    English_Zimbabwe = SkTEndian_SwapBE16(0x3009),
                    Estonian_Estonia = SkTEndian_SwapBE16(0x0425),
                    Faroese_FaroeIslands = SkTEndian_SwapBE16(0x0438),
                    Filipino_Philippines = SkTEndian_SwapBE16(0x0464),
                    Finnish_Finland = SkTEndian_SwapBE16(0x040B),
                    French_Belgium = SkTEndian_SwapBE16(0x080C),
                    French_Canada = SkTEndian_SwapBE16(0x0C0C),
                    French_France = SkTEndian_SwapBE16(0x040C),
                    French_Luxembourg = SkTEndian_SwapBE16(0x140c),
                    French_PrincipalityOfMonoco = SkTEndian_SwapBE16(0x180C),
                    French_Switzerland = SkTEndian_SwapBE16(0x100C),
                    Frisian_Netherlands = SkTEndian_SwapBE16(0x0462),
                    Galician_Galician = SkTEndian_SwapBE16(0x0456),
                    Georgian_Georgia = SkTEndian_SwapBE16(0x0437),
                    German_Austria = SkTEndian_SwapBE16(0x0C07),
                    German_Germany = SkTEndian_SwapBE16(0x0407),
                    German_Liechtenstein = SkTEndian_SwapBE16(0x1407),
                    German_Luxembourg = SkTEndian_SwapBE16(0x1007),
                    German_Switzerland = SkTEndian_SwapBE16(0x0807),
                    Greek_Greece = SkTEndian_SwapBE16(0x0408),
                    Greenlandic_Greenland = SkTEndian_SwapBE16(0x046F),
                    Gujarati_India = SkTEndian_SwapBE16(0x0447),
                    HausaLatin_Nigeria = SkTEndian_SwapBE16(0x0468),
                    Hebrew_Israel = SkTEndian_SwapBE16(0x040D),
                    Hindi_India = SkTEndian_SwapBE16(0x0439),
                    Hungarian_Hungary = SkTEndian_SwapBE16(0x040E),
                    Icelandic_Iceland = SkTEndian_SwapBE16(0x040F),
                    Igbo_Nigeria = SkTEndian_SwapBE16(0x0470),
                    Indonesian_Indonesia = SkTEndian_SwapBE16(0x0421),
                    Inuktitut_Canada = SkTEndian_SwapBE16(0x045D),
                    InuktitutLatin_Canada = SkTEndian_SwapBE16(0x085D),
                    Irish_Ireland = SkTEndian_SwapBE16(0x083C),
                    isiXhosa_SouthAfrica = SkTEndian_SwapBE16(0x0434),
                    isiZulu_SouthAfrica = SkTEndian_SwapBE16(0x0435),
                    Italian_Italy = SkTEndian_SwapBE16(0x0410),
                    Italian_Switzerland = SkTEndian_SwapBE16(0x0810),
                    Japanese_Japan = SkTEndian_SwapBE16(0x0411),
                    Kannada_India = SkTEndian_SwapBE16(0x044B),
                    Kazakh_Kazakhstan = SkTEndian_SwapBE16(0x043F),
                    Khmer_Cambodia = SkTEndian_SwapBE16(0x0453),
                    Kiche_Guatemala = SkTEndian_SwapBE16(0x0486),
                    Kinyarwanda_Rwanda = SkTEndian_SwapBE16(0x0487),
                    Kiswahili_Kenya = SkTEndian_SwapBE16(0x0441),
                    Konkani_India = SkTEndian_SwapBE16(0x0457),
                    Korean_Korea = SkTEndian_SwapBE16(0x0412),
                    Kyrgyz_Kyrgyzstan = SkTEndian_SwapBE16(0x0440),
                    Lao_LaoPDR = SkTEndian_SwapBE16(0x0454),
                    Latvian_Latvia = SkTEndian_SwapBE16(0x0426),
                    Lithuanian_Lithuania = SkTEndian_SwapBE16(0x0427),
                    LowerSorbian_Germany = SkTEndian_SwapBE16(0x082E),
                    Luxembourgish_Luxembourg = SkTEndian_SwapBE16(0x046E),
                    MacedonianFYROM_FormerYugoslavRepublicOfMacedonia = SkTEndian_SwapBE16(0x042F),
                    Malay_BruneiDarussalam = SkTEndian_SwapBE16(0x083E),
                    Malay_Malaysia = SkTEndian_SwapBE16(0x043E),
                    Malayalam_India = SkTEndian_SwapBE16(0x044C),
                    Maltese_Malta = SkTEndian_SwapBE16(0x043A),
                    Maori_NewZealand = SkTEndian_SwapBE16(0x0481),
                    Mapudungun_Chile = SkTEndian_SwapBE16(0x047A),
                    Marathi_India = SkTEndian_SwapBE16(0x044E),
                    Mohawk_Mohawk = SkTEndian_SwapBE16(0x047C),
                    MongolianCyrillic_Mongolia = SkTEndian_SwapBE16(0x0450),
                    MongolianTraditional_PeoplesRepublicOfChina = SkTEndian_SwapBE16(0x0850),
                    Nepali_Nepal = SkTEndian_SwapBE16(0x0461),
                    NorwegianBokmal_Norway = SkTEndian_SwapBE16(0x0414),
                    NorwegianNynorsk_Norway = SkTEndian_SwapBE16(0x0814),
                    Occitan_France = SkTEndian_SwapBE16(0x0482),
                    Odia_India = SkTEndian_SwapBE16(0x0448),
                    Pashto_Afghanistan = SkTEndian_SwapBE16(0x0463),
                    Polish_Poland = SkTEndian_SwapBE16(0x0415),
                    Portuguese_Brazil = SkTEndian_SwapBE16(0x0416),
                    Portuguese_Portugal = SkTEndian_SwapBE16(0x0816),
                    Punjabi_India = SkTEndian_SwapBE16(0x0446),
                    Quechua_Bolivia = SkTEndian_SwapBE16(0x046B),
                    Quechua_Ecuador = SkTEndian_SwapBE16(0x086B),
                    Quechua_Peru = SkTEndian_SwapBE16(0x0C6B),
                    Romanian_Romania = SkTEndian_SwapBE16(0x0418),
                    Romansh_Switzerland = SkTEndian_SwapBE16(0x0417),
                    Russian_Russia = SkTEndian_SwapBE16(0x0419),
                    SamiInari_Finland = SkTEndian_SwapBE16(0x243B),
                    SamiLule_Norway = SkTEndian_SwapBE16(0x103B),
                    SamiLule_Sweden = SkTEndian_SwapBE16(0x143B),
                    SamiNorthern_Finland = SkTEndian_SwapBE16(0x0C3B),
                    SamiNorthern_Norway = SkTEndian_SwapBE16(0x043B),
                    SamiNorthern_Sweden = SkTEndian_SwapBE16(0x083B),
                    SamiSkolt_Finland = SkTEndian_SwapBE16(0x203B),
                    SamiSouthern_Norway = SkTEndian_SwapBE16(0x183B),
                    SamiSouthern_Sweden = SkTEndian_SwapBE16(0x1C3B),
                    Sanskrit_India = SkTEndian_SwapBE16(0x044F),
                    SerbianCyrillic_BosniaAndHerzegovina = SkTEndian_SwapBE16(0x1C1A),
                    SerbianCyrillic_Serbia = SkTEndian_SwapBE16(0x0C1A),
                    SerbianLatin_BosniaAndHerzegovina = SkTEndian_SwapBE16(0x181A),
                    SerbianLatin_Serbia = SkTEndian_SwapBE16(0x081A),
                    SesothoSaLeboa_SouthAfrica = SkTEndian_SwapBE16(0x046C),
                    Setswana_SouthAfrica = SkTEndian_SwapBE16(0x0432),
                    Sinhala_SriLanka = SkTEndian_SwapBE16(0x045B),
                    Slovak_Slovakia = SkTEndian_SwapBE16(0x041B),
                    Slovenian_Slovenia = SkTEndian_SwapBE16(0x0424),
                    Spanish_Argentina = SkTEndian_SwapBE16(0x2C0A),
                    Spanish_Bolivia = SkTEndian_SwapBE16(0x400A),
                    Spanish_Chile = SkTEndian_SwapBE16(0x340A),
                    Spanish_Colombia = SkTEndian_SwapBE16(0x240A),
                    Spanish_CostaRica = SkTEndian_SwapBE16(0x140A),
                    Spanish_DominicanRepublic = SkTEndian_SwapBE16(0x1C0A),
                    Spanish_Ecuador = SkTEndian_SwapBE16(0x300A),
                    Spanish_ElSalvador = SkTEndian_SwapBE16(0x440A),
                    Spanish_Guatemala = SkTEndian_SwapBE16(0x100A),
                    Spanish_Honduras = SkTEndian_SwapBE16(0x480A),
                    Spanish_Mexico = SkTEndian_SwapBE16(0x080A),
                    Spanish_Nicaragua = SkTEndian_SwapBE16(0x4C0A),
                    Spanish_Panama = SkTEndian_SwapBE16(0x180A),
                    Spanish_Paraguay = SkTEndian_SwapBE16(0x3C0A),
                    Spanish_Peru = SkTEndian_SwapBE16(0x280A),
                    Spanish_PuertoRico = SkTEndian_SwapBE16(0x500A),
                    SpanishModernSort_Spain = SkTEndian_SwapBE16(0x0C0A),
                    SpanishTraditionalSort_Spain = SkTEndian_SwapBE16(0x040A),
                    Spanish_UnitedStates = SkTEndian_SwapBE16(0x540A),
                    Spanish_Uruguay = SkTEndian_SwapBE16(0x380A),
                    Spanish_Venezuela = SkTEndian_SwapBE16(0x200A),
                    Sweden_Finland = SkTEndian_SwapBE16(0x081D),
                    Swedish_Sweden = SkTEndian_SwapBE16(0x041D),
                    Syriac_Syria = SkTEndian_SwapBE16(0x045A),
                    TajikCyrillic_Tajikistan = SkTEndian_SwapBE16(0x0428),
                    TamazightLatin_Algeria = SkTEndian_SwapBE16(0x085F),
                    Tamil_India = SkTEndian_SwapBE16(0x0449),
                    Tatar_Russia = SkTEndian_SwapBE16(0x0444),
                    Telugu_India = SkTEndian_SwapBE16(0x044A),
                    Thai_Thailand = SkTEndian_SwapBE16(0x041E),
                    Tibetan_PRC = SkTEndian_SwapBE16(0x0451),
                    Turkish_Turkey = SkTEndian_SwapBE16(0x041F),
                    Turkmen_Turkmenistan = SkTEndian_SwapBE16(0x0442),
                    Uighur_PRC = SkTEndian_SwapBE16(0x0480),
                    Ukrainian_Ukraine = SkTEndian_SwapBE16(0x0422),
                    UpperSorbian_Germany = SkTEndian_SwapBE16(0x042E),
                    Urdu_IslamicRepublicOfPakistan = SkTEndian_SwapBE16(0x0420),
                    UzbekCyrillic_Uzbekistan = SkTEndian_SwapBE16(0x0843),
                    UzbekLatin_Uzbekistan = SkTEndian_SwapBE16(0x0443),
                    Vietnamese_Vietnam = SkTEndian_SwapBE16(0x042A),
                    Welsh_UnitedKingdom = SkTEndian_SwapBE16(0x0452),
                    Wolof_Senegal = SkTEndian_SwapBE16(0x0488),
                    Yakut_Russia = SkTEndian_SwapBE16(0x0485),
                    Yi_PRC = SkTEndian_SwapBE16(0x0478),
                    Yoruba_Nigeria = SkTEndian_SwapBE16(0x046A),
                } value;
            } windows;
        } languageID;

        /** NameIDs <= 0xFF are predefined. Those > 0xFF are font specific. */
        union NameID {
           /** A font specific name id which should be greater than 0xFF. */
           SK_OT_USHORT fontSpecific;
           struct Predefined {
                enum Value : SK_OT_USHORT {
                    CopyrightNotice = SkTEndian_SwapBE16(0),
                    FontFamilyName = SkTEndian_SwapBE16(1),
                    FontSubfamilyName = SkTEndian_SwapBE16(2),
                    UniqueFontIdentifier = SkTEndian_SwapBE16(3),
                    FullFontName = SkTEndian_SwapBE16(4),
                    VersionString = SkTEndian_SwapBE16(5), //Version <number>.<number>
                    PostscriptName = SkTEndian_SwapBE16(6), //See spec for constraints.
                    Trademark = SkTEndian_SwapBE16(7),
                    ManufacturerName = SkTEndian_SwapBE16(8),
                    Designer = SkTEndian_SwapBE16(9),
                    Description = SkTEndian_SwapBE16(10),
                    URLVendor = SkTEndian_SwapBE16(11),
                    URLDesigner = SkTEndian_SwapBE16(12),
                    LicenseDescription = SkTEndian_SwapBE16(13),
                    LicenseInfoURL = SkTEndian_SwapBE16(14),
                    PreferredFamily = SkTEndian_SwapBE16(16),
                    PreferredSubfamily = SkTEndian_SwapBE16(17),
                    CompatibleFullName = SkTEndian_SwapBE16(18),
                    SampleText = SkTEndian_SwapBE16(19),
                    PostscriptCIDFindfontName = SkTEndian_SwapBE16(20),
                    WWSFamilyName = SkTEndian_SwapBE16(21),
                    WWSSubfamilyName = SkTEndian_SwapBE16(22),
                } value;
            } predefined;
        } nameID;

        /** The length of the string in SK_OT_BYTEs. */
        SK_OT_USHORT length;

        /** Offset in SK_OT_BYTEs from start of string storage area
         *  (see SkOTTableName::stringOffset).
         */
        SK_OT_USHORT offset;
    }; //nameRecord[count];

    struct Format1Ext {
        /** The number of languageTagRecords which follow. */
        SK_OT_USHORT langTagCount;

        /** The encoding of a langTagRecord string is always UTF-16BE.
         *  The content should follow IETF specification BCP 47.
         */
        struct LangTagRecord {
            /** The length of the string in SK_OT_BYTEs. */
            SK_OT_USHORT length;

            /** Offset in SK_OT_BYTEs from start of string storage area
             *  (see SkOTTableName::stringOffset).
             */
            SK_OT_USHORT offset;
        }; //langTagRecord[langTagCount]
    }; //format1ext (if format == format_1)

// The iterator should not be packed.
#pragma pack(pop)

    class Iterator {
    public:
        Iterator(const uint8_t* nameTable, size_t size)
            : fNameTable(nameTable), fNameTableSize(size), fIndex(0), fType(-1) { }
        Iterator(const uint8_t* nameTable, size_t size, SK_OT_USHORT type)
            : fNameTable(nameTable), fNameTableSize(size), fIndex(0), fType(type)
        { }

        void reset(SK_OT_USHORT type) {
            fIndex = 0;
            fType = type;
        }

        struct Record {
            SkString name;
            SkString language;
            SK_OT_USHORT type;
        };
        bool next(Record&);

    private:
        const uint8_t* fNameTable;
        const size_t fNameTableSize;
        size_t fIndex;
        int fType;
    };
};


static_assert(sizeof(SkOTTableName) == 6, "sizeof(SkOTTableName) not 6");
static_assert(sizeof(SkOTTableName::Format1Ext) == 2, "sizeof(SkOTTableNameF1) not 2");
static_assert(sizeof(SkOTTableName::Format1Ext::LangTagRecord) == 4, "sizeof(SkOTTableNameLangTagRecord) not 4");
static_assert(sizeof(SkOTTableName::Record) == 12, "sizeof(SkOTTableNameRecord) not 12");

#endif
