SkOTTable_name.h revision a980269c2498836101146adc729ef780fb89824e
18ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com/*
28ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com * Copyright 2012 Google Inc.
38ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com *
48ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com * Use of this source code is governed by a BSD-style license that can be
58ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com * found in the LICENSE file.
68ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com */
78ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com
88ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com#ifndef SkOTTable_name_DEFINED
98ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com#define SkOTTable_name_DEFINED
108ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com
118ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com#include "SkEndian.h"
128ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com#include "SkOTTableTypes.h"
1307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com#include "SkString.h"
148ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com#include "SkTypedEnum.h"
158ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com
168ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com#pragma pack(push, 1)
178ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com
188ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.comstruct SkOTTableName {
19ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com    static const SK_OT_CHAR TAG0 = 'n';
20ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com    static const SK_OT_CHAR TAG1 = 'a';
21ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com    static const SK_OT_CHAR TAG2 = 'm';
22ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com    static const SK_OT_CHAR TAG3 = 'e';
23ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com    static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableName>::value;
24ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com
258ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com    SK_OT_USHORT format;
268ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com    static const SK_OT_USHORT format_0 = SkTEndian_SwapBE16(0);
2707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    /** Format 1 was added in OpenType 1.6 (April 2009). */
288ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com    static const SK_OT_USHORT format_1 = SkTEndian_SwapBE16(1);
2907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
3007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    /** The number of name records which follow. */
318ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com    SK_OT_USHORT count;
328ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com
3307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    /** Offset in SK_OT_BYTEs to start of string storage area (from start of table). */
3407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    SK_OT_USHORT stringOffset;
358ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com
3607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    struct Record {
3707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        /** The platform ID specifies how to interpret the encoding and language ID. */
3807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        struct PlatformID {
398ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com            SK_TYPED_ENUM(Value, SK_OT_USHORT,
4007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                ((Unicode, SkTEndian_SwapBE16(0)))
4107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                ((Macintosh, SkTEndian_SwapBE16(1)))
4207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                ((ISO, SkTEndian_SwapBE16(2))) // Deprecated, use Unicode instead.
4307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                ((Windows, SkTEndian_SwapBE16(3)))
4407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                ((Custom, SkTEndian_SwapBE16(4)))
458ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com                SK_SEQ_END,
468ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com            (value)SK_SEQ_END)
4707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        } platformID;
4807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
4907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        union EncodingID {
5007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            SK_OT_USHORT custom;
5107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
5207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            /** Always UTF-16BE. */
5307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            struct Unicode {
5407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                SK_TYPED_ENUM(Value, SK_OT_USHORT,
5507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Unicode10, SkTEndian_SwapBE16(0)))
5607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Unicode11, SkTEndian_SwapBE16(1)))
5707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ISO10646, SkTEndian_SwapBE16(2))) //deprecated, use Unicode11
5807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Unicode20BMP, SkTEndian_SwapBE16(3)))
5907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Unicode20, SkTEndian_SwapBE16(4)))
6007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((UnicodeVariationSequences, SkTEndian_SwapBE16(5)))
6107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((UnicodeFull, SkTEndian_SwapBE16(6)))
6207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    SK_SEQ_END,
6307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                (value)SK_SEQ_END)
6407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            } unicode;
6507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
6607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            /** These are Mac encodings, see http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/
6707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             *  for their mappings to unicode.
6807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             *  Name table strings using PlatformID::Macintosh must use Roman.
6907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             */
7007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            struct Macintosh {
7107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                SK_TYPED_ENUM(Value, SK_OT_USHORT,
7207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Roman, SkTEndian_SwapBE16(0)))
7307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Japanese, SkTEndian_SwapBE16(1)))
7407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ChineseTraditional, SkTEndian_SwapBE16(2)))
7507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Korean, SkTEndian_SwapBE16(3)))
7607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic, SkTEndian_SwapBE16(4)))
7707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Hebrew, SkTEndian_SwapBE16(5)))
7807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Greek, SkTEndian_SwapBE16(6)))
7907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Russian, SkTEndian_SwapBE16(7)))
8007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((RSymbol, SkTEndian_SwapBE16(8)))
8107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Devanagari, SkTEndian_SwapBE16(9)))
8207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Gurmukhi, SkTEndian_SwapBE16(10)))
8307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Gujarati, SkTEndian_SwapBE16(11)))
8407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Oriya, SkTEndian_SwapBE16(12)))
8507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Bengali, SkTEndian_SwapBE16(13)))
8607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tamil, SkTEndian_SwapBE16(14)))
8707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Telugu, SkTEndian_SwapBE16(15)))
8807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kannada, SkTEndian_SwapBE16(16)))
8907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Malayalam, SkTEndian_SwapBE16(17)))
9007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Sinhalese, SkTEndian_SwapBE16(18)))
9107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Burmese, SkTEndian_SwapBE16(19)))
9207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Khmer, SkTEndian_SwapBE16(20)))
9307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Thai, SkTEndian_SwapBE16(21)))
9407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Laotian, SkTEndian_SwapBE16(22)))
9507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Georgian, SkTEndian_SwapBE16(23)))
9607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Armenian, SkTEndian_SwapBE16(24)))
9707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ChineseSimplified, SkTEndian_SwapBE16(25)))
9807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tibetan, SkTEndian_SwapBE16(26)))
9907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Mongolian, SkTEndian_SwapBE16(27)))
10007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Geez, SkTEndian_SwapBE16(28)))
10107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Slavic, SkTEndian_SwapBE16(29)))
10207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Vietnamese, SkTEndian_SwapBE16(30)))
10307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Sindhi, SkTEndian_SwapBE16(31)))
10407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Uninterpreted, SkTEndian_SwapBE16(32)))
10507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    SK_SEQ_END,
10607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                (value)SK_SEQ_END)
10707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            } macintosh;
10807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
10907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            /** Deprecated, use Unicode instead. */
11007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            struct ISO {
11107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                SK_TYPED_ENUM(Value, SK_OT_USHORT,
11207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ASCII7, SkTEndian_SwapBE16(0)))
11307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ISO10646, SkTEndian_SwapBE16(1)))
11407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ISO88591, SkTEndian_SwapBE16(2)))
11507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    SK_SEQ_END,
11607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                (value)SK_SEQ_END)
11707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            } iso;
11807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
11907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            /** Name table strings using PlatformID::Windows must use Symbol, UnicodeBMPUCS2, or
12007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             *  UnicodeUCS4. Symbol and UnicodeBMPUCS2 are both UCS2-BE, UnicodeUCS4 is actually
12107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             *  UTF-16BE.
12207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             */
12307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            struct Windows {
12407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                SK_TYPED_ENUM(Value, SK_OT_USHORT,
12507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Symbol, SkTEndian_SwapBE16(0))) // UCS2-BE, but don't use this font to display it's own name.
12607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((UnicodeBMPUCS2, SkTEndian_SwapBE16(1))) // UCS2-BE, Windows default
12707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ShiftJIS, SkTEndian_SwapBE16(2)))
12807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((PRC, SkTEndian_SwapBE16(3)))
12907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Big5, SkTEndian_SwapBE16(4)))
13007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Wansung, SkTEndian_SwapBE16(5)))
13107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Johab, SkTEndian_SwapBE16(6)))
13207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((UnicodeUCS4, SkTEndian_SwapBE16(10))) // UTF-16BE. It means UCS4 in charmaps.
13307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    SK_SEQ_END,
13407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                (value)SK_SEQ_END)
13507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            } windows;
13607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        } encodingID;
13707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
13807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        /** LanguageIDs <= 0x7FFF are predefined.
13907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com         *  LanguageIDs > 0x7FFF are indexes into the langTagRecord array
14007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com         *  (in format 1 name tables, see SkOTTableName::format).
14107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com         */
14207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        union LanguageID {
14307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            /** A value greater than 0x7FFF.
14407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             *  languageTagID - 0x8000 is an index into the langTagRecord array.
14507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             */
14607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            SK_OT_USHORT languageTagID;
14707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
14807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            /** These are known as Language Designators.
14907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             *  Apple now uses BCP 47 (post OSX10.4), so there will be no new entries.
15007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             */
15107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            struct Macintosh {
15207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                SK_TYPED_ENUM(Value, SK_OT_USHORT,
15307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English, SkTEndian_SwapBE16(0)))
15407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((French, SkTEndian_SwapBE16(1)))
15507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((German, SkTEndian_SwapBE16(2)))
15607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Italian, SkTEndian_SwapBE16(3)))
15707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Dutch, SkTEndian_SwapBE16(4)))
15807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Swedish, SkTEndian_SwapBE16(5)))
15907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish, SkTEndian_SwapBE16(6)))
16007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Danish, SkTEndian_SwapBE16(7)))
16107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Portuguese, SkTEndian_SwapBE16(8)))
16207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Norwegian, SkTEndian_SwapBE16(9)))
16307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Hebrew, SkTEndian_SwapBE16(10)))
16407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Japanese, SkTEndian_SwapBE16(11)))
16507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic, SkTEndian_SwapBE16(12)))
16607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Finnish, SkTEndian_SwapBE16(13)))
16707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Greek, SkTEndian_SwapBE16(14)))
16807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Icelandic, SkTEndian_SwapBE16(15)))
16907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Maltese, SkTEndian_SwapBE16(16)))
17007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Turkish, SkTEndian_SwapBE16(17)))
17107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Croatian, SkTEndian_SwapBE16(18)))
17207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ChineseTraditional, SkTEndian_SwapBE16(19)))
17307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Urdu, SkTEndian_SwapBE16(20)))
17407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Hindi, SkTEndian_SwapBE16(21)))
17507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Thai, SkTEndian_SwapBE16(22)))
17607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Korean, SkTEndian_SwapBE16(23)))
17707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Lithuanian, SkTEndian_SwapBE16(24)))
17807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Polish, SkTEndian_SwapBE16(25)))
17907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Hungarian, SkTEndian_SwapBE16(26)))
18007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Estonian, SkTEndian_SwapBE16(27)))
18107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Latvian, SkTEndian_SwapBE16(28)))
18207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Sami, SkTEndian_SwapBE16(29)))
18307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Faroese, SkTEndian_SwapBE16(30)))
18407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Farsi_Persian, SkTEndian_SwapBE16(31)))
18507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Russian, SkTEndian_SwapBE16(32)))
18607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ChineseSimplified, SkTEndian_SwapBE16(33)))
18707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Flemish, SkTEndian_SwapBE16(34)))
18807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((IrishGaelic, SkTEndian_SwapBE16(35)))
18907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Albanian, SkTEndian_SwapBE16(36)))
19007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Romanian, SkTEndian_SwapBE16(37)))
19107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Czech, SkTEndian_SwapBE16(38)))
19207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Slovak, SkTEndian_SwapBE16(39)))
19307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Slovenian, SkTEndian_SwapBE16(40)))
19407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Yiddish, SkTEndian_SwapBE16(41)))
19507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Serbian, SkTEndian_SwapBE16(42)))
19607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Macedonian, SkTEndian_SwapBE16(43)))
19707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Bulgarian, SkTEndian_SwapBE16(44)))
19807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Ukrainian, SkTEndian_SwapBE16(45)))
19907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Byelorussian, SkTEndian_SwapBE16(46)))
20007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Uzbek, SkTEndian_SwapBE16(47)))
20107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kazakh, SkTEndian_SwapBE16(48)))
20207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((AzerbaijaniCyrillic, SkTEndian_SwapBE16(49)))
20307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((AzerbaijaniArabic, SkTEndian_SwapBE16(50)))
20407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Armenian, SkTEndian_SwapBE16(51)))
20507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Georgian, SkTEndian_SwapBE16(52)))
20607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Moldavian, SkTEndian_SwapBE16(53)))
20707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kirghiz, SkTEndian_SwapBE16(54)))
20807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tajiki, SkTEndian_SwapBE16(55)))
20907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Turkmen, SkTEndian_SwapBE16(56)))
21007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((MongolianTraditional, SkTEndian_SwapBE16(57)))
21107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((MongolianCyrillic, SkTEndian_SwapBE16(58)))
21207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Pashto, SkTEndian_SwapBE16(59)))
21307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kurdish, SkTEndian_SwapBE16(60)))
21407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kashmiri, SkTEndian_SwapBE16(61)))
21507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Sindhi, SkTEndian_SwapBE16(62)))
21607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tibetan, SkTEndian_SwapBE16(63)))
21707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Nepali, SkTEndian_SwapBE16(64)))
21807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Sanskrit, SkTEndian_SwapBE16(65)))
21907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Marathi, SkTEndian_SwapBE16(66)))
22007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Bengali, SkTEndian_SwapBE16(67)))
22107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Assamese, SkTEndian_SwapBE16(68)))
22207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Gujarati, SkTEndian_SwapBE16(69)))
22307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Punjabi, SkTEndian_SwapBE16(70)))
22407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Oriya, SkTEndian_SwapBE16(71)))
22507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Malayalam, SkTEndian_SwapBE16(72)))
22607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kannada, SkTEndian_SwapBE16(73)))
22707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tamil, SkTEndian_SwapBE16(74)))
22807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Telugu, SkTEndian_SwapBE16(75)))
22907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Sinhalese, SkTEndian_SwapBE16(76)))
23007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Burmese, SkTEndian_SwapBE16(77)))
23107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Khmer, SkTEndian_SwapBE16(78)))
23207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Lao, SkTEndian_SwapBE16(79)))
23307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Vietnamese, SkTEndian_SwapBE16(80)))
23407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Indonesian, SkTEndian_SwapBE16(81)))
23507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tagalong, SkTEndian_SwapBE16(82)))
23607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((MalayRoman, SkTEndian_SwapBE16(83)))
23707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((MalayArabic, SkTEndian_SwapBE16(84)))
23807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Amharic, SkTEndian_SwapBE16(85)))
23907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tigrinya, SkTEndian_SwapBE16(86)))
24007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Galla, SkTEndian_SwapBE16(87)))
24107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Somali, SkTEndian_SwapBE16(88)))
24207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Swahili, SkTEndian_SwapBE16(89)))
24307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kinyarwanda_Ruanda, SkTEndian_SwapBE16(90)))
24407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Rundi, SkTEndian_SwapBE16(91)))
24507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Nyanja_Chewa, SkTEndian_SwapBE16(92)))
24607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Malagasy, SkTEndian_SwapBE16(93)))
24707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Esperanto, SkTEndian_SwapBE16(94)))
24807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Welsh, SkTEndian_SwapBE16(128)))
24907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Basque, SkTEndian_SwapBE16(129)))
25007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Catalan, SkTEndian_SwapBE16(130)))
25107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Latin, SkTEndian_SwapBE16(131)))
25207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Quenchua, SkTEndian_SwapBE16(132)))
25307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Guarani, SkTEndian_SwapBE16(133)))
25407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Aymara, SkTEndian_SwapBE16(134)))
25507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tatar, SkTEndian_SwapBE16(135)))
25607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Uighur, SkTEndian_SwapBE16(136)))
25707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Dzongkha, SkTEndian_SwapBE16(137)))
25807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((JavaneseRoman, SkTEndian_SwapBE16(138)))
25907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SundaneseRoman, SkTEndian_SwapBE16(139)))
26007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Galician, SkTEndian_SwapBE16(140)))
26107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Afrikaans, SkTEndian_SwapBE16(141)))
26207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Breton, SkTEndian_SwapBE16(142)))
26307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Inuktitut, SkTEndian_SwapBE16(143)))
26407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ScottishGaelic, SkTEndian_SwapBE16(144)))
26507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ManxGaelic, SkTEndian_SwapBE16(145)))
26607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((IrishGaelicWithLenition, SkTEndian_SwapBE16(146)))
26707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tongan, SkTEndian_SwapBE16(147)))
26807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((GreekPolytonic, SkTEndian_SwapBE16(148)))
26907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Greenlandic, SkTEndian_SwapBE16(149)))
27007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((AzerbaijaniRoman, SkTEndian_SwapBE16(150)))
27107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    SK_SEQ_END,
27207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                (value)SK_SEQ_END)
27307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            } macintosh;
27407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
27507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            /** These are known as LCIDs.
27607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             *  On Windows the current set can be had from EnumSystemLocalesEx and LocaleNameToLCID.
27707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             */
27807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            struct Windows {
27907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                SK_TYPED_ENUM(Value, SK_OT_USHORT,
28007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Afrikaans_SouthAfrica, SkTEndian_SwapBE16(0x0436)))
28107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Albanian_Albania, SkTEndian_SwapBE16(0x041C)))
28207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Alsatian_France, SkTEndian_SwapBE16(0x0484)))
28307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Amharic_Ethiopia, SkTEndian_SwapBE16(0x045E)))
28407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Algeria, SkTEndian_SwapBE16(0x1401)))
28507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Bahrain, SkTEndian_SwapBE16(0x3C01)))
28607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Egypt, SkTEndian_SwapBE16(0x0C01)))
28707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Iraq, SkTEndian_SwapBE16(0x0801)))
28807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Jordan, SkTEndian_SwapBE16(0x2C01)))
28907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Kuwait, SkTEndian_SwapBE16(0x3401)))
29007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Lebanon, SkTEndian_SwapBE16(0x3001)))
29107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Libya, SkTEndian_SwapBE16(0x1001)))
29207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Morocco, SkTEndian_SwapBE16(0x1801)))
29307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Oman, SkTEndian_SwapBE16(0x2001)))
29407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Qatar, SkTEndian_SwapBE16(0x4001)))
29507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_SaudiArabia, SkTEndian_SwapBE16(0x0401)))
29607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Syria, SkTEndian_SwapBE16(0x2801)))
29707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Tunisia, SkTEndian_SwapBE16(0x1C01)))
29807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_UAE, SkTEndian_SwapBE16(0x3801)))
29907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Arabic_Yemen, SkTEndian_SwapBE16(0x2401)))
30007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Armenian_Armenia, SkTEndian_SwapBE16(0x042B)))
30107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Assamese_India, SkTEndian_SwapBE16(0x044D)))
30207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((AzeriCyrillic_Azerbaijan, SkTEndian_SwapBE16(0x082C)))
30307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((AzeriLatin_Azerbaijan, SkTEndian_SwapBE16(0x042C)))
30407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Bashkir_Russia, SkTEndian_SwapBE16(0x046D)))
30507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Basque_Basque, SkTEndian_SwapBE16(0x042D)))
30607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Belarusian_Belarus, SkTEndian_SwapBE16(0x0423)))
30707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Bengali_Bangladesh, SkTEndian_SwapBE16(0x0845)))
30807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Bengali_India, SkTEndian_SwapBE16(0x0445)))
30907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((BosnianCyrillic_BosniaAndHerzegovina, SkTEndian_SwapBE16(0x201A)))
31007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((BosnianLatin_BosniaAndHerzegovina, SkTEndian_SwapBE16(0x141A)))
31107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Breton_France, SkTEndian_SwapBE16(0x047E)))
31207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Bulgarian_Bulgaria, SkTEndian_SwapBE16(0x0402)))
31307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Catalan_Catalan, SkTEndian_SwapBE16(0x0403)))
31407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Chinese_HongKongSAR, SkTEndian_SwapBE16(0x0C04)))
31507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Chinese_MacaoSAR, SkTEndian_SwapBE16(0x1404)))
31607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Chinese_PeoplesRepublicOfChina, SkTEndian_SwapBE16(0x0804)))
31707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Chinese_Singapore, SkTEndian_SwapBE16(0x1004)))
31807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Chinese_Taiwan, SkTEndian_SwapBE16(0x0404)))
31907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Corsican_France, SkTEndian_SwapBE16(0x0483)))
32007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Croatian_Croatia, SkTEndian_SwapBE16(0x041A)))
32107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((CroatianLatin_BosniaAndHerzegovina, SkTEndian_SwapBE16(0x101A)))
32207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Czech_CzechRepublic, SkTEndian_SwapBE16(0x0405)))
32307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Danish_Denmark, SkTEndian_SwapBE16(0x0406)))
32407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Dari_Afghanistan, SkTEndian_SwapBE16(0x048C)))
32507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Divehi_Maldives, SkTEndian_SwapBE16(0x0465)))
32607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Dutch_Belgium, SkTEndian_SwapBE16(0x0813)))
32707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Dutch_Netherlands, SkTEndian_SwapBE16(0x0413)))
32807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_Australia, SkTEndian_SwapBE16(0x0C09)))
32907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_Belize, SkTEndian_SwapBE16(0x2809)))
33007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_Canada, SkTEndian_SwapBE16(0x1009)))
33107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_Caribbean, SkTEndian_SwapBE16(0x2409)))
33207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_India, SkTEndian_SwapBE16(0x4009)))
33307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_Ireland, SkTEndian_SwapBE16(0x1809)))
33407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_Jamaica, SkTEndian_SwapBE16(0x2009)))
33507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_Malaysia, SkTEndian_SwapBE16(0x4409)))
33607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_NewZealand, SkTEndian_SwapBE16(0x1409)))
33707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_RepublicOfThePhilippines, SkTEndian_SwapBE16(0x3409)))
33807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_Singapore, SkTEndian_SwapBE16(0x4809)))
33907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_SouthAfrica, SkTEndian_SwapBE16(0x1C09)))
34007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_TrinidadAndTobago, SkTEndian_SwapBE16(0x2C09)))
34107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_UnitedKingdom, SkTEndian_SwapBE16(0x0809)))
34207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_UnitedStates, SkTEndian_SwapBE16(0x0409)))
34307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((English_Zimbabwe, SkTEndian_SwapBE16(0x3009)))
34407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Estonian_Estonia, SkTEndian_SwapBE16(0x0425)))
34507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Faroese_FaroeIslands, SkTEndian_SwapBE16(0x0438)))
34607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Filipino_Philippines, SkTEndian_SwapBE16(0x0464)))
34707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Finnish_Finland, SkTEndian_SwapBE16(0x040B)))
34807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((French_Belgium, SkTEndian_SwapBE16(0x080C)))
34907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((French_Canada, SkTEndian_SwapBE16(0x0C0C)))
35007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((French_France, SkTEndian_SwapBE16(0x040C)))
35107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((French_Luxembourg, SkTEndian_SwapBE16(0x140c)))
35207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((French_PrincipalityOfMonoco, SkTEndian_SwapBE16(0x180C)))
35307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((French_Switzerland, SkTEndian_SwapBE16(0x100C)))
35407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Frisian_Netherlands, SkTEndian_SwapBE16(0x0462)))
35507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Galician_Galician, SkTEndian_SwapBE16(0x0456)))
35607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Georgian_Georgia, SkTEndian_SwapBE16(0x0437)))
35707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((German_Austria, SkTEndian_SwapBE16(0x0C07)))
35807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((German_Germany, SkTEndian_SwapBE16(0x0407)))
35907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((German_Liechtenstein, SkTEndian_SwapBE16(0x1407)))
36007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((German_Luxembourg, SkTEndian_SwapBE16(0x1007)))
36107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((German_Switzerland, SkTEndian_SwapBE16(0x0807)))
36207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Greek_Greece, SkTEndian_SwapBE16(0x0408)))
36307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Greenlandic_Greenland, SkTEndian_SwapBE16(0x046F)))
36407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Gujarati_India, SkTEndian_SwapBE16(0x0447)))
36507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((HausaLatin_Nigeria, SkTEndian_SwapBE16(0x0468)))
36607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Hebrew_Israel, SkTEndian_SwapBE16(0x040D)))
36707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Hindi_India, SkTEndian_SwapBE16(0x0439)))
36807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Hungarian_Hungary, SkTEndian_SwapBE16(0x040E)))
36907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Icelandic_Iceland, SkTEndian_SwapBE16(0x040F)))
37007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Igbo_Nigeria, SkTEndian_SwapBE16(0x0470)))
37107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Indonesian_Indonesia, SkTEndian_SwapBE16(0x0421)))
37207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Inuktitut_Canada, SkTEndian_SwapBE16(0x045D)))
37307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((InuktitutLatin_Canada, SkTEndian_SwapBE16(0x085D)))
37407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Irish_Ireland, SkTEndian_SwapBE16(0x083C)))
37507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((isiXhosa_SouthAfrica, SkTEndian_SwapBE16(0x0434)))
37607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((isiZulu_SouthAfrica, SkTEndian_SwapBE16(0x0435)))
37707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Italian_Italy, SkTEndian_SwapBE16(0x0410)))
37807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Italian_Switzerland, SkTEndian_SwapBE16(0x0810)))
37907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Japanese_Japan, SkTEndian_SwapBE16(0x0411)))
38007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kannada_India, SkTEndian_SwapBE16(0x044B)))
38107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kazakh_Kazakhstan, SkTEndian_SwapBE16(0x043F)))
38207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Khmer_Cambodia, SkTEndian_SwapBE16(0x0453)))
38307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kiche_Guatemala, SkTEndian_SwapBE16(0x0486)))
38407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kinyarwanda_Rwanda, SkTEndian_SwapBE16(0x0487)))
38507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kiswahili_Kenya, SkTEndian_SwapBE16(0x0441)))
38607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Konkani_India, SkTEndian_SwapBE16(0x0457)))
38707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Korean_Korea, SkTEndian_SwapBE16(0x0412)))
38807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Kyrgyz_Kyrgyzstan, SkTEndian_SwapBE16(0x0440)))
38907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Lao_LaoPDR, SkTEndian_SwapBE16(0x0454)))
39007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Latvian_Latvia, SkTEndian_SwapBE16(0x0426)))
39107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Lithuanian_Lithuania, SkTEndian_SwapBE16(0x0427)))
39207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((LowerSorbian_Germany, SkTEndian_SwapBE16(0x082E)))
39307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Luxembourgish_Luxembourg, SkTEndian_SwapBE16(0x046E)))
39407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((MacedonianFYROM_FormerYugoslavRepublicOfMacedonia, SkTEndian_SwapBE16(0x042F)))
39507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Malay_BruneiDarussalam, SkTEndian_SwapBE16(0x083E)))
39607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Malay_Malaysia, SkTEndian_SwapBE16(0x043E)))
39707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Malayalam_India, SkTEndian_SwapBE16(0x044C)))
39807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Maltese_Malta, SkTEndian_SwapBE16(0x043A)))
39907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Maori_NewZealand, SkTEndian_SwapBE16(0x0481)))
40007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Mapudungun_Chile, SkTEndian_SwapBE16(0x047A)))
40107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Marathi_India, SkTEndian_SwapBE16(0x044E)))
40207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Mohawk_Mohawk, SkTEndian_SwapBE16(0x047C)))
40307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((MongolianCyrillic_Mongolia, SkTEndian_SwapBE16(0x0450)))
40407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((MongolianTraditional_PeoplesRepublicOfChina, SkTEndian_SwapBE16(0x0850)))
40507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Nepali_Nepal, SkTEndian_SwapBE16(0x0461)))
40607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((NorwegianBokmal_Norway, SkTEndian_SwapBE16(0x0414)))
40707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((NorwegianNynorsk_Norway, SkTEndian_SwapBE16(0x0814)))
40807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Occitan_France, SkTEndian_SwapBE16(0x0482)))
40907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Odia_India, SkTEndian_SwapBE16(0x0448)))
41007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Pashto_Afghanistan, SkTEndian_SwapBE16(0x0463)))
41107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Polish_Poland, SkTEndian_SwapBE16(0x0415)))
41207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Portuguese_Brazil, SkTEndian_SwapBE16(0x0416)))
41307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Portuguese_Portugal, SkTEndian_SwapBE16(0x0816)))
41407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Punjabi_India, SkTEndian_SwapBE16(0x0446)))
41507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Quechua_Bolivia, SkTEndian_SwapBE16(0x046B)))
41607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Quechua_Ecuador, SkTEndian_SwapBE16(0x086B)))
41707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Quechua_Peru, SkTEndian_SwapBE16(0x0C6B)))
41807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Romanian_Romania, SkTEndian_SwapBE16(0x0418)))
41907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Romansh_Switzerland, SkTEndian_SwapBE16(0x0417)))
42007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Russian_Russia, SkTEndian_SwapBE16(0x0419)))
42107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SamiInari_Finland, SkTEndian_SwapBE16(0x243B)))
42207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SamiLule_Norway, SkTEndian_SwapBE16(0x103B)))
42307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SamiLule_Sweden, SkTEndian_SwapBE16(0x143B)))
42407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SamiNorthern_Finland, SkTEndian_SwapBE16(0x0C3B)))
42507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SamiNorthern_Norway, SkTEndian_SwapBE16(0x043B)))
42607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SamiNorthern_Sweden, SkTEndian_SwapBE16(0x083B)))
42707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SamiSkolt_Finland, SkTEndian_SwapBE16(0x203B)))
42807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SamiSouthern_Norway, SkTEndian_SwapBE16(0x183B)))
42907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SamiSouthern_Sweden, SkTEndian_SwapBE16(0x1C3B)))
43007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Sanskrit_India, SkTEndian_SwapBE16(0x044F)))
43107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SerbianCyrillic_BosniaAndHerzegovina, SkTEndian_SwapBE16(0x1C1A)))
43207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SerbianCyrillic_Serbia, SkTEndian_SwapBE16(0x0C1A)))
43307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SerbianLatin_BosniaAndHerzegovina, SkTEndian_SwapBE16(0x181A)))
43407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SerbianLatin_Serbia, SkTEndian_SwapBE16(0x081A)))
43507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SesothoSaLeboa_SouthAfrica, SkTEndian_SwapBE16(0x046C)))
43607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Setswana_SouthAfrica, SkTEndian_SwapBE16(0x0432)))
43707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Sinhala_SriLanka, SkTEndian_SwapBE16(0x045B)))
43807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Slovak_Slovakia, SkTEndian_SwapBE16(0x041B)))
43907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Slovenian_Slovenia, SkTEndian_SwapBE16(0x0424)))
44007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Argentina, SkTEndian_SwapBE16(0x2C0A)))
44107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Bolivia, SkTEndian_SwapBE16(0x400A)))
44207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Chile, SkTEndian_SwapBE16(0x340A)))
44307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Colombia, SkTEndian_SwapBE16(0x240A)))
44407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_CostaRica, SkTEndian_SwapBE16(0x140A)))
44507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_DominicanRepublic, SkTEndian_SwapBE16(0x1C0A)))
44607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Ecuador, SkTEndian_SwapBE16(0x300A)))
44707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_ElSalvador, SkTEndian_SwapBE16(0x440A)))
44807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Guatemala, SkTEndian_SwapBE16(0x100A)))
44907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Honduras, SkTEndian_SwapBE16(0x480A)))
45007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Mexico, SkTEndian_SwapBE16(0x080A)))
45107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Nicaragua, SkTEndian_SwapBE16(0x4C0A)))
45207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Panama, SkTEndian_SwapBE16(0x180A)))
45307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Paraguay, SkTEndian_SwapBE16(0x3C0A)))
45407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Peru, SkTEndian_SwapBE16(0x280A)))
45507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_PuertoRico, SkTEndian_SwapBE16(0x500A)))
45607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SpanishModernSort_Spain, SkTEndian_SwapBE16(0x0C0A)))
45707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SpanishTraditionalSort_Spain, SkTEndian_SwapBE16(0x040A)))
45807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_UnitedStates, SkTEndian_SwapBE16(0x540A)))
45907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Uruguay, SkTEndian_SwapBE16(0x380A)))
46007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Spanish_Venezuela, SkTEndian_SwapBE16(0x200A)))
46107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Sweden_Finland, SkTEndian_SwapBE16(0x081D)))
46207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Swedish_Sweden, SkTEndian_SwapBE16(0x041D)))
46307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Syriac_Syria, SkTEndian_SwapBE16(0x045A)))
46407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((TajikCyrillic_Tajikistan, SkTEndian_SwapBE16(0x0428)))
46507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((TamazightLatin_Algeria, SkTEndian_SwapBE16(0x085F)))
46607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tamil_India, SkTEndian_SwapBE16(0x0449)))
46707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tatar_Russia, SkTEndian_SwapBE16(0x0444)))
46807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Telugu_India, SkTEndian_SwapBE16(0x044A)))
46907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Thai_Thailand, SkTEndian_SwapBE16(0x041E)))
47007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Tibetan_PRC, SkTEndian_SwapBE16(0x0451)))
47107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Turkish_Turkey, SkTEndian_SwapBE16(0x041F)))
47207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Turkmen_Turkmenistan, SkTEndian_SwapBE16(0x0442)))
47307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Uighur_PRC, SkTEndian_SwapBE16(0x0480)))
47407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Ukrainian_Ukraine, SkTEndian_SwapBE16(0x0422)))
47507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((UpperSorbian_Germany, SkTEndian_SwapBE16(0x042E)))
47607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Urdu_IslamicRepublicOfPakistan, SkTEndian_SwapBE16(0x0420)))
47707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((UzbekCyrillic_Uzbekistan, SkTEndian_SwapBE16(0x0843)))
47807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((UzbekLatin_Uzbekistan, SkTEndian_SwapBE16(0x0443)))
47907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Vietnamese_Vietnam, SkTEndian_SwapBE16(0x042A)))
48007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Welsh_UnitedKingdom, SkTEndian_SwapBE16(0x0452)))
48107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Wolof_Senegal, SkTEndian_SwapBE16(0x0488)))
48207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Yakut_Russia, SkTEndian_SwapBE16(0x0485)))
48307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Yi_PRC, SkTEndian_SwapBE16(0x0478)))
48407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Yoruba_Nigeria, SkTEndian_SwapBE16(0x046A)))
48507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    SK_SEQ_END,
48607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                (value)SK_SEQ_END)
48707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            } windows;
48807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        } languageID;
48907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
49007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        /** NameIDs <= 0xFF are predefined. Those > 0xFF are font specific. */
49107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        union NameID {
49207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com           /** A font specific name id which should be greater than 0xFF. */
49307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com           SK_OT_USHORT fontSpecific;
49407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com           struct Predefined {
49507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                SK_TYPED_ENUM(Value, SK_OT_USHORT,
49607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((CopyrightNotice, SkTEndian_SwapBE16(0)))
49707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((FontFamilyName, SkTEndian_SwapBE16(1)))
49807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((FontSubfamilyName, SkTEndian_SwapBE16(2)))
49907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((UniqueFontIdentifier, SkTEndian_SwapBE16(3)))
50007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((FullFontName, SkTEndian_SwapBE16(4)))
50107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((VersionString, SkTEndian_SwapBE16(5))) //Version <number>.<number>
50207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((PostscriptName, SkTEndian_SwapBE16(6))) //See spec for constraints.
50307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Trademark, SkTEndian_SwapBE16(7)))
50407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((ManufacturerName, SkTEndian_SwapBE16(8)))
50507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Designer, SkTEndian_SwapBE16(9)))
50607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((Description, SkTEndian_SwapBE16(10)))
50707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((URLVendor, SkTEndian_SwapBE16(11)))
50807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((URLDesigner, SkTEndian_SwapBE16(12)))
50907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((LicenseDescription, SkTEndian_SwapBE16(13)))
51007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((LicenseInfoURL, SkTEndian_SwapBE16(14)))
51107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((PreferredFamily, SkTEndian_SwapBE16(16)))
51207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((PreferredSubfamily, SkTEndian_SwapBE16(17)))
51307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((CompatibleFullName, SkTEndian_SwapBE16(18)))
51407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((SampleText, SkTEndian_SwapBE16(19)))
51507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((PostscriptCIDFindfontName, SkTEndian_SwapBE16(20)))
51607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((WWSFamilyName, SkTEndian_SwapBE16(21)))
51707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    ((WWSSubfamilyName, SkTEndian_SwapBE16(22)))
51807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                    SK_SEQ_END,
51907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com                (value)SK_SEQ_END)
52007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            } predefined;
52107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        } nameID;
52207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
52307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        /** The length of the string in SK_OT_BYTEs. */
52407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        SK_OT_USHORT length;
52507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
52607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        /** Offset in SK_OT_BYTEs from start of string storage area
52707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com         *  (see SkOTTableName::stringOffset).
52807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com         */
52907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        SK_OT_USHORT offset;
53007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    }; //nameRecord[count];
53107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
53207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    struct Format1Ext {
53307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        /** The number of languageTagRecords which follow. */
53407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        SK_OT_USHORT langTagCount;
53507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
53607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        /** The encoding of a langTagRecord string is always UTF-16BE.
53707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com         *  The content should follow IETF specification BCP 47.
53807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com         */
53907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        struct LangTagRecord {
54007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            /** The length of the string in SK_OT_BYTEs. */
54107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            SK_OT_USHORT length;
54207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
54307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            /** Offset in SK_OT_BYTEs from start of string storage area
54407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             *  (see SkOTTableName::stringOffset).
54507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com             */
54607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            SK_OT_USHORT offset;
54707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        }; //langTagRecord[langTagCount]
54807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    }; //format1ext (if format == format_1)
54907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
55007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    class Iterator {
55107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    public:
55207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        Iterator(const SkOTTableName& name) : fName(name), fIndex(0), fType(-1) { }
55307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        Iterator(const SkOTTableName& name, SkOTTableName::Record::NameID::Predefined::Value type)
554041e2dbc0614e3341e1349fd0e962744a45b6194skia.committer@gmail.com            : fName(name), fIndex(0), fType(type)
55507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        { }
55607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
557a980269c2498836101146adc729ef780fb89824ebungeman@google.com        void reset(SkOTTableName::Record::NameID::Predefined::Value type) {
558a980269c2498836101146adc729ef780fb89824ebungeman@google.com            fIndex = 0;
559a980269c2498836101146adc729ef780fb89824ebungeman@google.com            fType = type;
560a980269c2498836101146adc729ef780fb89824ebungeman@google.com        }
561a980269c2498836101146adc729ef780fb89824ebungeman@google.com
56207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        struct Record {
563a980269c2498836101146adc729ef780fb89824ebungeman@google.com            SK_OT_USHORT type;
56407a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            SkString name;
56507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com            SkString language;
56607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        };
56707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        bool next(Record&);
56807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com
56907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    private:
57007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        const SkOTTableName& fName;
57107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        size_t fIndex;
57207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com        int fType;
57307a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com    };
5748ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com};
5758ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com
5768ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com#pragma pack(pop)
5778ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com
5788ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com
5798ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.comSK_COMPILE_ASSERT(sizeof(SkOTTableName) == 6, sizeof_SkOTTableName_not_6);
58007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.comSK_COMPILE_ASSERT(sizeof(SkOTTableName::Format1Ext) == 2, sizeof_SkOTTableNameF1_not_2);
58107a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.comSK_COMPILE_ASSERT(sizeof(SkOTTableName::Format1Ext::LangTagRecord) == 4, sizeof_SkOTTableNameLangTagRecord_not_4);
58207a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.comSK_COMPILE_ASSERT(sizeof(SkOTTableName::Record) == 12, sizeof_SkOTTableNameRecord_not_12);
5838ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com
5848ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com#endif
585