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