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