michael@0: /* michael@0: * Copyright 2012 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: #ifndef SkOTTable_name_DEFINED michael@0: #define SkOTTable_name_DEFINED michael@0: michael@0: #include "SkEndian.h" michael@0: #include "SkOTTableTypes.h" michael@0: #include "SkString.h" michael@0: #include "SkTypedEnum.h" michael@0: michael@0: #pragma pack(push, 1) michael@0: michael@0: struct SkOTTableName { michael@0: static const SK_OT_CHAR TAG0 = 'n'; michael@0: static const SK_OT_CHAR TAG1 = 'a'; michael@0: static const SK_OT_CHAR TAG2 = 'm'; michael@0: static const SK_OT_CHAR TAG3 = 'e'; michael@0: static const SK_OT_ULONG TAG = SkOTTableTAG::value; michael@0: michael@0: SK_OT_USHORT format; michael@0: static const SK_OT_USHORT format_0 = SkTEndian_SwapBE16(0); michael@0: /** Format 1 was added in OpenType 1.6 (April 2009). */ michael@0: static const SK_OT_USHORT format_1 = SkTEndian_SwapBE16(1); michael@0: michael@0: /** The number of name records which follow. */ michael@0: SK_OT_USHORT count; michael@0: michael@0: /** Offset in SK_OT_BYTEs to start of string storage area (from start of table). */ michael@0: SK_OT_USHORT stringOffset; michael@0: michael@0: struct Record { michael@0: /** The platform ID specifies how to interpret the encoding and language ID. */ michael@0: struct PlatformID { michael@0: SK_TYPED_ENUM(Value, SK_OT_USHORT, michael@0: ((Unicode, SkTEndian_SwapBE16(0))) michael@0: ((Macintosh, SkTEndian_SwapBE16(1))) michael@0: ((ISO, SkTEndian_SwapBE16(2))) // Deprecated, use Unicode instead. michael@0: ((Windows, SkTEndian_SwapBE16(3))) michael@0: ((Custom, SkTEndian_SwapBE16(4))) michael@0: SK_SEQ_END, michael@0: (value)SK_SEQ_END) michael@0: } platformID; michael@0: michael@0: union EncodingID { michael@0: SK_OT_USHORT custom; michael@0: michael@0: /** Always UTF-16BE. */ michael@0: struct Unicode { michael@0: SK_TYPED_ENUM(Value, SK_OT_USHORT, michael@0: ((Unicode10, SkTEndian_SwapBE16(0))) michael@0: ((Unicode11, SkTEndian_SwapBE16(1))) michael@0: ((ISO10646, SkTEndian_SwapBE16(2))) //deprecated, use Unicode11 michael@0: ((Unicode20BMP, SkTEndian_SwapBE16(3))) michael@0: ((Unicode20, SkTEndian_SwapBE16(4))) michael@0: ((UnicodeVariationSequences, SkTEndian_SwapBE16(5))) michael@0: ((UnicodeFull, SkTEndian_SwapBE16(6))) michael@0: SK_SEQ_END, michael@0: (value)SK_SEQ_END) michael@0: } unicode; michael@0: michael@0: /** These are Mac encodings, see http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/ michael@0: * for their mappings to unicode. michael@0: * Name table strings using PlatformID::Macintosh must use Roman. michael@0: */ michael@0: struct Macintosh { michael@0: SK_TYPED_ENUM(Value, SK_OT_USHORT, michael@0: ((Roman, SkTEndian_SwapBE16(0))) michael@0: ((Japanese, SkTEndian_SwapBE16(1))) michael@0: ((ChineseTraditional, SkTEndian_SwapBE16(2))) michael@0: ((Korean, SkTEndian_SwapBE16(3))) michael@0: ((Arabic, SkTEndian_SwapBE16(4))) michael@0: ((Hebrew, SkTEndian_SwapBE16(5))) michael@0: ((Greek, SkTEndian_SwapBE16(6))) michael@0: ((Russian, SkTEndian_SwapBE16(7))) michael@0: ((RSymbol, SkTEndian_SwapBE16(8))) michael@0: ((Devanagari, SkTEndian_SwapBE16(9))) michael@0: ((Gurmukhi, SkTEndian_SwapBE16(10))) michael@0: ((Gujarati, SkTEndian_SwapBE16(11))) michael@0: ((Oriya, SkTEndian_SwapBE16(12))) michael@0: ((Bengali, SkTEndian_SwapBE16(13))) michael@0: ((Tamil, SkTEndian_SwapBE16(14))) michael@0: ((Telugu, SkTEndian_SwapBE16(15))) michael@0: ((Kannada, SkTEndian_SwapBE16(16))) michael@0: ((Malayalam, SkTEndian_SwapBE16(17))) michael@0: ((Sinhalese, SkTEndian_SwapBE16(18))) michael@0: ((Burmese, SkTEndian_SwapBE16(19))) michael@0: ((Khmer, SkTEndian_SwapBE16(20))) michael@0: ((Thai, SkTEndian_SwapBE16(21))) michael@0: ((Laotian, SkTEndian_SwapBE16(22))) michael@0: ((Georgian, SkTEndian_SwapBE16(23))) michael@0: ((Armenian, SkTEndian_SwapBE16(24))) michael@0: ((ChineseSimplified, SkTEndian_SwapBE16(25))) michael@0: ((Tibetan, SkTEndian_SwapBE16(26))) michael@0: ((Mongolian, SkTEndian_SwapBE16(27))) michael@0: ((Geez, SkTEndian_SwapBE16(28))) michael@0: ((Slavic, SkTEndian_SwapBE16(29))) michael@0: ((Vietnamese, SkTEndian_SwapBE16(30))) michael@0: ((Sindhi, SkTEndian_SwapBE16(31))) michael@0: ((Uninterpreted, SkTEndian_SwapBE16(32))) michael@0: SK_SEQ_END, michael@0: (value)SK_SEQ_END) michael@0: } macintosh; michael@0: michael@0: /** Deprecated, use Unicode instead. */ michael@0: struct ISO { michael@0: SK_TYPED_ENUM(Value, SK_OT_USHORT, michael@0: ((ASCII7, SkTEndian_SwapBE16(0))) michael@0: ((ISO10646, SkTEndian_SwapBE16(1))) michael@0: ((ISO88591, SkTEndian_SwapBE16(2))) michael@0: SK_SEQ_END, michael@0: (value)SK_SEQ_END) michael@0: } iso; michael@0: michael@0: /** Name table strings using PlatformID::Windows must use Symbol, UnicodeBMPUCS2, or michael@0: * UnicodeUCS4. Symbol and UnicodeBMPUCS2 are both UCS2-BE, UnicodeUCS4 is actually michael@0: * UTF-16BE. michael@0: */ michael@0: struct Windows { michael@0: SK_TYPED_ENUM(Value, SK_OT_USHORT, michael@0: ((Symbol, SkTEndian_SwapBE16(0))) // UCS2-BE, but don't use this font to display it's own name. michael@0: ((UnicodeBMPUCS2, SkTEndian_SwapBE16(1))) // UCS2-BE, Windows default michael@0: ((ShiftJIS, SkTEndian_SwapBE16(2))) michael@0: ((PRC, SkTEndian_SwapBE16(3))) michael@0: ((Big5, SkTEndian_SwapBE16(4))) michael@0: ((Wansung, SkTEndian_SwapBE16(5))) michael@0: ((Johab, SkTEndian_SwapBE16(6))) michael@0: ((UnicodeUCS4, SkTEndian_SwapBE16(10))) // UTF-16BE. It means UCS4 in charmaps. michael@0: SK_SEQ_END, michael@0: (value)SK_SEQ_END) michael@0: } windows; michael@0: } encodingID; michael@0: michael@0: /** LanguageIDs <= 0x7FFF are predefined. michael@0: * LanguageIDs > 0x7FFF are indexes into the langTagRecord array michael@0: * (in format 1 name tables, see SkOTTableName::format). michael@0: */ michael@0: union LanguageID { michael@0: /** A value greater than 0x7FFF. michael@0: * languageTagID - 0x8000 is an index into the langTagRecord array. michael@0: */ michael@0: SK_OT_USHORT languageTagID; michael@0: michael@0: /** These are known as Language Designators. michael@0: * Apple now uses BCP 47 (post OSX10.4), so there will be no new entries. michael@0: */ michael@0: struct Macintosh { michael@0: SK_TYPED_ENUM(Value, SK_OT_USHORT, michael@0: ((English, SkTEndian_SwapBE16(0))) michael@0: ((French, SkTEndian_SwapBE16(1))) michael@0: ((German, SkTEndian_SwapBE16(2))) michael@0: ((Italian, SkTEndian_SwapBE16(3))) michael@0: ((Dutch, SkTEndian_SwapBE16(4))) michael@0: ((Swedish, SkTEndian_SwapBE16(5))) michael@0: ((Spanish, SkTEndian_SwapBE16(6))) michael@0: ((Danish, SkTEndian_SwapBE16(7))) michael@0: ((Portuguese, SkTEndian_SwapBE16(8))) michael@0: ((Norwegian, SkTEndian_SwapBE16(9))) michael@0: ((Hebrew, SkTEndian_SwapBE16(10))) michael@0: ((Japanese, SkTEndian_SwapBE16(11))) michael@0: ((Arabic, SkTEndian_SwapBE16(12))) michael@0: ((Finnish, SkTEndian_SwapBE16(13))) michael@0: ((Greek, SkTEndian_SwapBE16(14))) michael@0: ((Icelandic, SkTEndian_SwapBE16(15))) michael@0: ((Maltese, SkTEndian_SwapBE16(16))) michael@0: ((Turkish, SkTEndian_SwapBE16(17))) michael@0: ((Croatian, SkTEndian_SwapBE16(18))) michael@0: ((ChineseTraditional, SkTEndian_SwapBE16(19))) michael@0: ((Urdu, SkTEndian_SwapBE16(20))) michael@0: ((Hindi, SkTEndian_SwapBE16(21))) michael@0: ((Thai, SkTEndian_SwapBE16(22))) michael@0: ((Korean, SkTEndian_SwapBE16(23))) michael@0: ((Lithuanian, SkTEndian_SwapBE16(24))) michael@0: ((Polish, SkTEndian_SwapBE16(25))) michael@0: ((Hungarian, SkTEndian_SwapBE16(26))) michael@0: ((Estonian, SkTEndian_SwapBE16(27))) michael@0: ((Latvian, SkTEndian_SwapBE16(28))) michael@0: ((Sami, SkTEndian_SwapBE16(29))) michael@0: ((Faroese, SkTEndian_SwapBE16(30))) michael@0: ((Farsi_Persian, SkTEndian_SwapBE16(31))) michael@0: ((Russian, SkTEndian_SwapBE16(32))) michael@0: ((ChineseSimplified, SkTEndian_SwapBE16(33))) michael@0: ((Flemish, SkTEndian_SwapBE16(34))) michael@0: ((IrishGaelic, SkTEndian_SwapBE16(35))) michael@0: ((Albanian, SkTEndian_SwapBE16(36))) michael@0: ((Romanian, SkTEndian_SwapBE16(37))) michael@0: ((Czech, SkTEndian_SwapBE16(38))) michael@0: ((Slovak, SkTEndian_SwapBE16(39))) michael@0: ((Slovenian, SkTEndian_SwapBE16(40))) michael@0: ((Yiddish, SkTEndian_SwapBE16(41))) michael@0: ((Serbian, SkTEndian_SwapBE16(42))) michael@0: ((Macedonian, SkTEndian_SwapBE16(43))) michael@0: ((Bulgarian, SkTEndian_SwapBE16(44))) michael@0: ((Ukrainian, SkTEndian_SwapBE16(45))) michael@0: ((Byelorussian, SkTEndian_SwapBE16(46))) michael@0: ((Uzbek, SkTEndian_SwapBE16(47))) michael@0: ((Kazakh, SkTEndian_SwapBE16(48))) michael@0: ((AzerbaijaniCyrillic, SkTEndian_SwapBE16(49))) michael@0: ((AzerbaijaniArabic, SkTEndian_SwapBE16(50))) michael@0: ((Armenian, SkTEndian_SwapBE16(51))) michael@0: ((Georgian, SkTEndian_SwapBE16(52))) michael@0: ((Moldavian, SkTEndian_SwapBE16(53))) michael@0: ((Kirghiz, SkTEndian_SwapBE16(54))) michael@0: ((Tajiki, SkTEndian_SwapBE16(55))) michael@0: ((Turkmen, SkTEndian_SwapBE16(56))) michael@0: ((MongolianTraditional, SkTEndian_SwapBE16(57))) michael@0: ((MongolianCyrillic, SkTEndian_SwapBE16(58))) michael@0: ((Pashto, SkTEndian_SwapBE16(59))) michael@0: ((Kurdish, SkTEndian_SwapBE16(60))) michael@0: ((Kashmiri, SkTEndian_SwapBE16(61))) michael@0: ((Sindhi, SkTEndian_SwapBE16(62))) michael@0: ((Tibetan, SkTEndian_SwapBE16(63))) michael@0: ((Nepali, SkTEndian_SwapBE16(64))) michael@0: ((Sanskrit, SkTEndian_SwapBE16(65))) michael@0: ((Marathi, SkTEndian_SwapBE16(66))) michael@0: ((Bengali, SkTEndian_SwapBE16(67))) michael@0: ((Assamese, SkTEndian_SwapBE16(68))) michael@0: ((Gujarati, SkTEndian_SwapBE16(69))) michael@0: ((Punjabi, SkTEndian_SwapBE16(70))) michael@0: ((Oriya, SkTEndian_SwapBE16(71))) michael@0: ((Malayalam, SkTEndian_SwapBE16(72))) michael@0: ((Kannada, SkTEndian_SwapBE16(73))) michael@0: ((Tamil, SkTEndian_SwapBE16(74))) michael@0: ((Telugu, SkTEndian_SwapBE16(75))) michael@0: ((Sinhalese, SkTEndian_SwapBE16(76))) michael@0: ((Burmese, SkTEndian_SwapBE16(77))) michael@0: ((Khmer, SkTEndian_SwapBE16(78))) michael@0: ((Lao, SkTEndian_SwapBE16(79))) michael@0: ((Vietnamese, SkTEndian_SwapBE16(80))) michael@0: ((Indonesian, SkTEndian_SwapBE16(81))) michael@0: ((Tagalong, SkTEndian_SwapBE16(82))) michael@0: ((MalayRoman, SkTEndian_SwapBE16(83))) michael@0: ((MalayArabic, SkTEndian_SwapBE16(84))) michael@0: ((Amharic, SkTEndian_SwapBE16(85))) michael@0: ((Tigrinya, SkTEndian_SwapBE16(86))) michael@0: ((Galla, SkTEndian_SwapBE16(87))) michael@0: ((Somali, SkTEndian_SwapBE16(88))) michael@0: ((Swahili, SkTEndian_SwapBE16(89))) michael@0: ((Kinyarwanda_Ruanda, SkTEndian_SwapBE16(90))) michael@0: ((Rundi, SkTEndian_SwapBE16(91))) michael@0: ((Nyanja_Chewa, SkTEndian_SwapBE16(92))) michael@0: ((Malagasy, SkTEndian_SwapBE16(93))) michael@0: ((Esperanto, SkTEndian_SwapBE16(94))) michael@0: ((Welsh, SkTEndian_SwapBE16(128))) michael@0: ((Basque, SkTEndian_SwapBE16(129))) michael@0: ((Catalan, SkTEndian_SwapBE16(130))) michael@0: ((Latin, SkTEndian_SwapBE16(131))) michael@0: ((Quenchua, SkTEndian_SwapBE16(132))) michael@0: ((Guarani, SkTEndian_SwapBE16(133))) michael@0: ((Aymara, SkTEndian_SwapBE16(134))) michael@0: ((Tatar, SkTEndian_SwapBE16(135))) michael@0: ((Uighur, SkTEndian_SwapBE16(136))) michael@0: ((Dzongkha, SkTEndian_SwapBE16(137))) michael@0: ((JavaneseRoman, SkTEndian_SwapBE16(138))) michael@0: ((SundaneseRoman, SkTEndian_SwapBE16(139))) michael@0: ((Galician, SkTEndian_SwapBE16(140))) michael@0: ((Afrikaans, SkTEndian_SwapBE16(141))) michael@0: ((Breton, SkTEndian_SwapBE16(142))) michael@0: ((Inuktitut, SkTEndian_SwapBE16(143))) michael@0: ((ScottishGaelic, SkTEndian_SwapBE16(144))) michael@0: ((ManxGaelic, SkTEndian_SwapBE16(145))) michael@0: ((IrishGaelicWithLenition, SkTEndian_SwapBE16(146))) michael@0: ((Tongan, SkTEndian_SwapBE16(147))) michael@0: ((GreekPolytonic, SkTEndian_SwapBE16(148))) michael@0: ((Greenlandic, SkTEndian_SwapBE16(149))) michael@0: ((AzerbaijaniRoman, SkTEndian_SwapBE16(150))) michael@0: SK_SEQ_END, michael@0: (value)SK_SEQ_END) michael@0: } macintosh; michael@0: michael@0: /** These are known as LCIDs. michael@0: * On Windows the current set can be had from EnumSystemLocalesEx and LocaleNameToLCID. michael@0: */ michael@0: struct Windows { michael@0: SK_TYPED_ENUM(Value, SK_OT_USHORT, michael@0: ((Afrikaans_SouthAfrica, SkTEndian_SwapBE16(0x0436))) michael@0: ((Albanian_Albania, SkTEndian_SwapBE16(0x041C))) michael@0: ((Alsatian_France, SkTEndian_SwapBE16(0x0484))) michael@0: ((Amharic_Ethiopia, SkTEndian_SwapBE16(0x045E))) michael@0: ((Arabic_Algeria, SkTEndian_SwapBE16(0x1401))) michael@0: ((Arabic_Bahrain, SkTEndian_SwapBE16(0x3C01))) michael@0: ((Arabic_Egypt, SkTEndian_SwapBE16(0x0C01))) michael@0: ((Arabic_Iraq, SkTEndian_SwapBE16(0x0801))) michael@0: ((Arabic_Jordan, SkTEndian_SwapBE16(0x2C01))) michael@0: ((Arabic_Kuwait, SkTEndian_SwapBE16(0x3401))) michael@0: ((Arabic_Lebanon, SkTEndian_SwapBE16(0x3001))) michael@0: ((Arabic_Libya, SkTEndian_SwapBE16(0x1001))) michael@0: ((Arabic_Morocco, SkTEndian_SwapBE16(0x1801))) michael@0: ((Arabic_Oman, SkTEndian_SwapBE16(0x2001))) michael@0: ((Arabic_Qatar, SkTEndian_SwapBE16(0x4001))) michael@0: ((Arabic_SaudiArabia, SkTEndian_SwapBE16(0x0401))) michael@0: ((Arabic_Syria, SkTEndian_SwapBE16(0x2801))) michael@0: ((Arabic_Tunisia, SkTEndian_SwapBE16(0x1C01))) michael@0: ((Arabic_UAE, SkTEndian_SwapBE16(0x3801))) michael@0: ((Arabic_Yemen, SkTEndian_SwapBE16(0x2401))) michael@0: ((Armenian_Armenia, SkTEndian_SwapBE16(0x042B))) michael@0: ((Assamese_India, SkTEndian_SwapBE16(0x044D))) michael@0: ((AzeriCyrillic_Azerbaijan, SkTEndian_SwapBE16(0x082C))) michael@0: ((AzeriLatin_Azerbaijan, SkTEndian_SwapBE16(0x042C))) michael@0: ((Bashkir_Russia, SkTEndian_SwapBE16(0x046D))) michael@0: ((Basque_Basque, SkTEndian_SwapBE16(0x042D))) michael@0: ((Belarusian_Belarus, SkTEndian_SwapBE16(0x0423))) michael@0: ((Bengali_Bangladesh, SkTEndian_SwapBE16(0x0845))) michael@0: ((Bengali_India, SkTEndian_SwapBE16(0x0445))) michael@0: ((BosnianCyrillic_BosniaAndHerzegovina, SkTEndian_SwapBE16(0x201A))) michael@0: ((BosnianLatin_BosniaAndHerzegovina, SkTEndian_SwapBE16(0x141A))) michael@0: ((Breton_France, SkTEndian_SwapBE16(0x047E))) michael@0: ((Bulgarian_Bulgaria, SkTEndian_SwapBE16(0x0402))) michael@0: ((Catalan_Catalan, SkTEndian_SwapBE16(0x0403))) michael@0: ((Chinese_HongKongSAR, SkTEndian_SwapBE16(0x0C04))) michael@0: ((Chinese_MacaoSAR, SkTEndian_SwapBE16(0x1404))) michael@0: ((Chinese_PeoplesRepublicOfChina, SkTEndian_SwapBE16(0x0804))) michael@0: ((Chinese_Singapore, SkTEndian_SwapBE16(0x1004))) michael@0: ((Chinese_Taiwan, SkTEndian_SwapBE16(0x0404))) michael@0: ((Corsican_France, SkTEndian_SwapBE16(0x0483))) michael@0: ((Croatian_Croatia, SkTEndian_SwapBE16(0x041A))) michael@0: ((CroatianLatin_BosniaAndHerzegovina, SkTEndian_SwapBE16(0x101A))) michael@0: ((Czech_CzechRepublic, SkTEndian_SwapBE16(0x0405))) michael@0: ((Danish_Denmark, SkTEndian_SwapBE16(0x0406))) michael@0: ((Dari_Afghanistan, SkTEndian_SwapBE16(0x048C))) michael@0: ((Divehi_Maldives, SkTEndian_SwapBE16(0x0465))) michael@0: ((Dutch_Belgium, SkTEndian_SwapBE16(0x0813))) michael@0: ((Dutch_Netherlands, SkTEndian_SwapBE16(0x0413))) michael@0: ((English_Australia, SkTEndian_SwapBE16(0x0C09))) michael@0: ((English_Belize, SkTEndian_SwapBE16(0x2809))) michael@0: ((English_Canada, SkTEndian_SwapBE16(0x1009))) michael@0: ((English_Caribbean, SkTEndian_SwapBE16(0x2409))) michael@0: ((English_India, SkTEndian_SwapBE16(0x4009))) michael@0: ((English_Ireland, SkTEndian_SwapBE16(0x1809))) michael@0: ((English_Jamaica, SkTEndian_SwapBE16(0x2009))) michael@0: ((English_Malaysia, SkTEndian_SwapBE16(0x4409))) michael@0: ((English_NewZealand, SkTEndian_SwapBE16(0x1409))) michael@0: ((English_RepublicOfThePhilippines, SkTEndian_SwapBE16(0x3409))) michael@0: ((English_Singapore, SkTEndian_SwapBE16(0x4809))) michael@0: ((English_SouthAfrica, SkTEndian_SwapBE16(0x1C09))) michael@0: ((English_TrinidadAndTobago, SkTEndian_SwapBE16(0x2C09))) michael@0: ((English_UnitedKingdom, SkTEndian_SwapBE16(0x0809))) michael@0: ((English_UnitedStates, SkTEndian_SwapBE16(0x0409))) michael@0: ((English_Zimbabwe, SkTEndian_SwapBE16(0x3009))) michael@0: ((Estonian_Estonia, SkTEndian_SwapBE16(0x0425))) michael@0: ((Faroese_FaroeIslands, SkTEndian_SwapBE16(0x0438))) michael@0: ((Filipino_Philippines, SkTEndian_SwapBE16(0x0464))) michael@0: ((Finnish_Finland, SkTEndian_SwapBE16(0x040B))) michael@0: ((French_Belgium, SkTEndian_SwapBE16(0x080C))) michael@0: ((French_Canada, SkTEndian_SwapBE16(0x0C0C))) michael@0: ((French_France, SkTEndian_SwapBE16(0x040C))) michael@0: ((French_Luxembourg, SkTEndian_SwapBE16(0x140c))) michael@0: ((French_PrincipalityOfMonoco, SkTEndian_SwapBE16(0x180C))) michael@0: ((French_Switzerland, SkTEndian_SwapBE16(0x100C))) michael@0: ((Frisian_Netherlands, SkTEndian_SwapBE16(0x0462))) michael@0: ((Galician_Galician, SkTEndian_SwapBE16(0x0456))) michael@0: ((Georgian_Georgia, SkTEndian_SwapBE16(0x0437))) michael@0: ((German_Austria, SkTEndian_SwapBE16(0x0C07))) michael@0: ((German_Germany, SkTEndian_SwapBE16(0x0407))) michael@0: ((German_Liechtenstein, SkTEndian_SwapBE16(0x1407))) michael@0: ((German_Luxembourg, SkTEndian_SwapBE16(0x1007))) michael@0: ((German_Switzerland, SkTEndian_SwapBE16(0x0807))) michael@0: ((Greek_Greece, SkTEndian_SwapBE16(0x0408))) michael@0: ((Greenlandic_Greenland, SkTEndian_SwapBE16(0x046F))) michael@0: ((Gujarati_India, SkTEndian_SwapBE16(0x0447))) michael@0: ((HausaLatin_Nigeria, SkTEndian_SwapBE16(0x0468))) michael@0: ((Hebrew_Israel, SkTEndian_SwapBE16(0x040D))) michael@0: ((Hindi_India, SkTEndian_SwapBE16(0x0439))) michael@0: ((Hungarian_Hungary, SkTEndian_SwapBE16(0x040E))) michael@0: ((Icelandic_Iceland, SkTEndian_SwapBE16(0x040F))) michael@0: ((Igbo_Nigeria, SkTEndian_SwapBE16(0x0470))) michael@0: ((Indonesian_Indonesia, SkTEndian_SwapBE16(0x0421))) michael@0: ((Inuktitut_Canada, SkTEndian_SwapBE16(0x045D))) michael@0: ((InuktitutLatin_Canada, SkTEndian_SwapBE16(0x085D))) michael@0: ((Irish_Ireland, SkTEndian_SwapBE16(0x083C))) michael@0: ((isiXhosa_SouthAfrica, SkTEndian_SwapBE16(0x0434))) michael@0: ((isiZulu_SouthAfrica, SkTEndian_SwapBE16(0x0435))) michael@0: ((Italian_Italy, SkTEndian_SwapBE16(0x0410))) michael@0: ((Italian_Switzerland, SkTEndian_SwapBE16(0x0810))) michael@0: ((Japanese_Japan, SkTEndian_SwapBE16(0x0411))) michael@0: ((Kannada_India, SkTEndian_SwapBE16(0x044B))) michael@0: ((Kazakh_Kazakhstan, SkTEndian_SwapBE16(0x043F))) michael@0: ((Khmer_Cambodia, SkTEndian_SwapBE16(0x0453))) michael@0: ((Kiche_Guatemala, SkTEndian_SwapBE16(0x0486))) michael@0: ((Kinyarwanda_Rwanda, SkTEndian_SwapBE16(0x0487))) michael@0: ((Kiswahili_Kenya, SkTEndian_SwapBE16(0x0441))) michael@0: ((Konkani_India, SkTEndian_SwapBE16(0x0457))) michael@0: ((Korean_Korea, SkTEndian_SwapBE16(0x0412))) michael@0: ((Kyrgyz_Kyrgyzstan, SkTEndian_SwapBE16(0x0440))) michael@0: ((Lao_LaoPDR, SkTEndian_SwapBE16(0x0454))) michael@0: ((Latvian_Latvia, SkTEndian_SwapBE16(0x0426))) michael@0: ((Lithuanian_Lithuania, SkTEndian_SwapBE16(0x0427))) michael@0: ((LowerSorbian_Germany, SkTEndian_SwapBE16(0x082E))) michael@0: ((Luxembourgish_Luxembourg, SkTEndian_SwapBE16(0x046E))) michael@0: ((MacedonianFYROM_FormerYugoslavRepublicOfMacedonia, SkTEndian_SwapBE16(0x042F))) michael@0: ((Malay_BruneiDarussalam, SkTEndian_SwapBE16(0x083E))) michael@0: ((Malay_Malaysia, SkTEndian_SwapBE16(0x043E))) michael@0: ((Malayalam_India, SkTEndian_SwapBE16(0x044C))) michael@0: ((Maltese_Malta, SkTEndian_SwapBE16(0x043A))) michael@0: ((Maori_NewZealand, SkTEndian_SwapBE16(0x0481))) michael@0: ((Mapudungun_Chile, SkTEndian_SwapBE16(0x047A))) michael@0: ((Marathi_India, SkTEndian_SwapBE16(0x044E))) michael@0: ((Mohawk_Mohawk, SkTEndian_SwapBE16(0x047C))) michael@0: ((MongolianCyrillic_Mongolia, SkTEndian_SwapBE16(0x0450))) michael@0: ((MongolianTraditional_PeoplesRepublicOfChina, SkTEndian_SwapBE16(0x0850))) michael@0: ((Nepali_Nepal, SkTEndian_SwapBE16(0x0461))) michael@0: ((NorwegianBokmal_Norway, SkTEndian_SwapBE16(0x0414))) michael@0: ((NorwegianNynorsk_Norway, SkTEndian_SwapBE16(0x0814))) michael@0: ((Occitan_France, SkTEndian_SwapBE16(0x0482))) michael@0: ((Odia_India, SkTEndian_SwapBE16(0x0448))) michael@0: ((Pashto_Afghanistan, SkTEndian_SwapBE16(0x0463))) michael@0: ((Polish_Poland, SkTEndian_SwapBE16(0x0415))) michael@0: ((Portuguese_Brazil, SkTEndian_SwapBE16(0x0416))) michael@0: ((Portuguese_Portugal, SkTEndian_SwapBE16(0x0816))) michael@0: ((Punjabi_India, SkTEndian_SwapBE16(0x0446))) michael@0: ((Quechua_Bolivia, SkTEndian_SwapBE16(0x046B))) michael@0: ((Quechua_Ecuador, SkTEndian_SwapBE16(0x086B))) michael@0: ((Quechua_Peru, SkTEndian_SwapBE16(0x0C6B))) michael@0: ((Romanian_Romania, SkTEndian_SwapBE16(0x0418))) michael@0: ((Romansh_Switzerland, SkTEndian_SwapBE16(0x0417))) michael@0: ((Russian_Russia, SkTEndian_SwapBE16(0x0419))) michael@0: ((SamiInari_Finland, SkTEndian_SwapBE16(0x243B))) michael@0: ((SamiLule_Norway, SkTEndian_SwapBE16(0x103B))) michael@0: ((SamiLule_Sweden, SkTEndian_SwapBE16(0x143B))) michael@0: ((SamiNorthern_Finland, SkTEndian_SwapBE16(0x0C3B))) michael@0: ((SamiNorthern_Norway, SkTEndian_SwapBE16(0x043B))) michael@0: ((SamiNorthern_Sweden, SkTEndian_SwapBE16(0x083B))) michael@0: ((SamiSkolt_Finland, SkTEndian_SwapBE16(0x203B))) michael@0: ((SamiSouthern_Norway, SkTEndian_SwapBE16(0x183B))) michael@0: ((SamiSouthern_Sweden, SkTEndian_SwapBE16(0x1C3B))) michael@0: ((Sanskrit_India, SkTEndian_SwapBE16(0x044F))) michael@0: ((SerbianCyrillic_BosniaAndHerzegovina, SkTEndian_SwapBE16(0x1C1A))) michael@0: ((SerbianCyrillic_Serbia, SkTEndian_SwapBE16(0x0C1A))) michael@0: ((SerbianLatin_BosniaAndHerzegovina, SkTEndian_SwapBE16(0x181A))) michael@0: ((SerbianLatin_Serbia, SkTEndian_SwapBE16(0x081A))) michael@0: ((SesothoSaLeboa_SouthAfrica, SkTEndian_SwapBE16(0x046C))) michael@0: ((Setswana_SouthAfrica, SkTEndian_SwapBE16(0x0432))) michael@0: ((Sinhala_SriLanka, SkTEndian_SwapBE16(0x045B))) michael@0: ((Slovak_Slovakia, SkTEndian_SwapBE16(0x041B))) michael@0: ((Slovenian_Slovenia, SkTEndian_SwapBE16(0x0424))) michael@0: ((Spanish_Argentina, SkTEndian_SwapBE16(0x2C0A))) michael@0: ((Spanish_Bolivia, SkTEndian_SwapBE16(0x400A))) michael@0: ((Spanish_Chile, SkTEndian_SwapBE16(0x340A))) michael@0: ((Spanish_Colombia, SkTEndian_SwapBE16(0x240A))) michael@0: ((Spanish_CostaRica, SkTEndian_SwapBE16(0x140A))) michael@0: ((Spanish_DominicanRepublic, SkTEndian_SwapBE16(0x1C0A))) michael@0: ((Spanish_Ecuador, SkTEndian_SwapBE16(0x300A))) michael@0: ((Spanish_ElSalvador, SkTEndian_SwapBE16(0x440A))) michael@0: ((Spanish_Guatemala, SkTEndian_SwapBE16(0x100A))) michael@0: ((Spanish_Honduras, SkTEndian_SwapBE16(0x480A))) michael@0: ((Spanish_Mexico, SkTEndian_SwapBE16(0x080A))) michael@0: ((Spanish_Nicaragua, SkTEndian_SwapBE16(0x4C0A))) michael@0: ((Spanish_Panama, SkTEndian_SwapBE16(0x180A))) michael@0: ((Spanish_Paraguay, SkTEndian_SwapBE16(0x3C0A))) michael@0: ((Spanish_Peru, SkTEndian_SwapBE16(0x280A))) michael@0: ((Spanish_PuertoRico, SkTEndian_SwapBE16(0x500A))) michael@0: ((SpanishModernSort_Spain, SkTEndian_SwapBE16(0x0C0A))) michael@0: ((SpanishTraditionalSort_Spain, SkTEndian_SwapBE16(0x040A))) michael@0: ((Spanish_UnitedStates, SkTEndian_SwapBE16(0x540A))) michael@0: ((Spanish_Uruguay, SkTEndian_SwapBE16(0x380A))) michael@0: ((Spanish_Venezuela, SkTEndian_SwapBE16(0x200A))) michael@0: ((Sweden_Finland, SkTEndian_SwapBE16(0x081D))) michael@0: ((Swedish_Sweden, SkTEndian_SwapBE16(0x041D))) michael@0: ((Syriac_Syria, SkTEndian_SwapBE16(0x045A))) michael@0: ((TajikCyrillic_Tajikistan, SkTEndian_SwapBE16(0x0428))) michael@0: ((TamazightLatin_Algeria, SkTEndian_SwapBE16(0x085F))) michael@0: ((Tamil_India, SkTEndian_SwapBE16(0x0449))) michael@0: ((Tatar_Russia, SkTEndian_SwapBE16(0x0444))) michael@0: ((Telugu_India, SkTEndian_SwapBE16(0x044A))) michael@0: ((Thai_Thailand, SkTEndian_SwapBE16(0x041E))) michael@0: ((Tibetan_PRC, SkTEndian_SwapBE16(0x0451))) michael@0: ((Turkish_Turkey, SkTEndian_SwapBE16(0x041F))) michael@0: ((Turkmen_Turkmenistan, SkTEndian_SwapBE16(0x0442))) michael@0: ((Uighur_PRC, SkTEndian_SwapBE16(0x0480))) michael@0: ((Ukrainian_Ukraine, SkTEndian_SwapBE16(0x0422))) michael@0: ((UpperSorbian_Germany, SkTEndian_SwapBE16(0x042E))) michael@0: ((Urdu_IslamicRepublicOfPakistan, SkTEndian_SwapBE16(0x0420))) michael@0: ((UzbekCyrillic_Uzbekistan, SkTEndian_SwapBE16(0x0843))) michael@0: ((UzbekLatin_Uzbekistan, SkTEndian_SwapBE16(0x0443))) michael@0: ((Vietnamese_Vietnam, SkTEndian_SwapBE16(0x042A))) michael@0: ((Welsh_UnitedKingdom, SkTEndian_SwapBE16(0x0452))) michael@0: ((Wolof_Senegal, SkTEndian_SwapBE16(0x0488))) michael@0: ((Yakut_Russia, SkTEndian_SwapBE16(0x0485))) michael@0: ((Yi_PRC, SkTEndian_SwapBE16(0x0478))) michael@0: ((Yoruba_Nigeria, SkTEndian_SwapBE16(0x046A))) michael@0: SK_SEQ_END, michael@0: (value)SK_SEQ_END) michael@0: } windows; michael@0: } languageID; michael@0: michael@0: /** NameIDs <= 0xFF are predefined. Those > 0xFF are font specific. */ michael@0: union NameID { michael@0: /** A font specific name id which should be greater than 0xFF. */ michael@0: SK_OT_USHORT fontSpecific; michael@0: struct Predefined { michael@0: SK_TYPED_ENUM(Value, SK_OT_USHORT, michael@0: ((CopyrightNotice, SkTEndian_SwapBE16(0))) michael@0: ((FontFamilyName, SkTEndian_SwapBE16(1))) michael@0: ((FontSubfamilyName, SkTEndian_SwapBE16(2))) michael@0: ((UniqueFontIdentifier, SkTEndian_SwapBE16(3))) michael@0: ((FullFontName, SkTEndian_SwapBE16(4))) michael@0: ((VersionString, SkTEndian_SwapBE16(5))) //Version . michael@0: ((PostscriptName, SkTEndian_SwapBE16(6))) //See spec for constraints. michael@0: ((Trademark, SkTEndian_SwapBE16(7))) michael@0: ((ManufacturerName, SkTEndian_SwapBE16(8))) michael@0: ((Designer, SkTEndian_SwapBE16(9))) michael@0: ((Description, SkTEndian_SwapBE16(10))) michael@0: ((URLVendor, SkTEndian_SwapBE16(11))) michael@0: ((URLDesigner, SkTEndian_SwapBE16(12))) michael@0: ((LicenseDescription, SkTEndian_SwapBE16(13))) michael@0: ((LicenseInfoURL, SkTEndian_SwapBE16(14))) michael@0: ((PreferredFamily, SkTEndian_SwapBE16(16))) michael@0: ((PreferredSubfamily, SkTEndian_SwapBE16(17))) michael@0: ((CompatibleFullName, SkTEndian_SwapBE16(18))) michael@0: ((SampleText, SkTEndian_SwapBE16(19))) michael@0: ((PostscriptCIDFindfontName, SkTEndian_SwapBE16(20))) michael@0: ((WWSFamilyName, SkTEndian_SwapBE16(21))) michael@0: ((WWSSubfamilyName, SkTEndian_SwapBE16(22))) michael@0: SK_SEQ_END, michael@0: (value)SK_SEQ_END) michael@0: } predefined; michael@0: } nameID; michael@0: michael@0: /** The length of the string in SK_OT_BYTEs. */ michael@0: SK_OT_USHORT length; michael@0: michael@0: /** Offset in SK_OT_BYTEs from start of string storage area michael@0: * (see SkOTTableName::stringOffset). michael@0: */ michael@0: SK_OT_USHORT offset; michael@0: }; //nameRecord[count]; michael@0: michael@0: struct Format1Ext { michael@0: /** The number of languageTagRecords which follow. */ michael@0: SK_OT_USHORT langTagCount; michael@0: michael@0: /** The encoding of a langTagRecord string is always UTF-16BE. michael@0: * The content should follow IETF specification BCP 47. michael@0: */ michael@0: struct LangTagRecord { michael@0: /** The length of the string in SK_OT_BYTEs. */ michael@0: SK_OT_USHORT length; michael@0: michael@0: /** Offset in SK_OT_BYTEs from start of string storage area michael@0: * (see SkOTTableName::stringOffset). michael@0: */ michael@0: SK_OT_USHORT offset; michael@0: }; //langTagRecord[langTagCount] michael@0: }; //format1ext (if format == format_1) michael@0: michael@0: class Iterator { michael@0: public: michael@0: Iterator(const SkOTTableName& name) : fName(name), fIndex(0), fType(-1) { } michael@0: Iterator(const SkOTTableName& name, SkOTTableName::Record::NameID::Predefined::Value type) michael@0: : fName(name), fIndex(0), fType(type) michael@0: { } michael@0: michael@0: void reset(SkOTTableName::Record::NameID::Predefined::Value type) { michael@0: fIndex = 0; michael@0: fType = type; michael@0: } michael@0: michael@0: struct Record { michael@0: SK_OT_USHORT type; michael@0: SkString name; michael@0: SkString language; michael@0: }; michael@0: bool next(Record&); michael@0: michael@0: private: michael@0: const SkOTTableName& fName; michael@0: size_t fIndex; michael@0: int fType; michael@0: }; michael@0: }; michael@0: michael@0: #pragma pack(pop) michael@0: michael@0: michael@0: SK_COMPILE_ASSERT(sizeof(SkOTTableName) == 6, sizeof_SkOTTableName_not_6); michael@0: SK_COMPILE_ASSERT(sizeof(SkOTTableName::Format1Ext) == 2, sizeof_SkOTTableNameF1_not_2); michael@0: SK_COMPILE_ASSERT(sizeof(SkOTTableName::Format1Ext::LangTagRecord) == 4, sizeof_SkOTTableNameLangTagRecord_not_4); michael@0: SK_COMPILE_ASSERT(sizeof(SkOTTableName::Record) == 12, sizeof_SkOTTableNameRecord_not_12); michael@0: michael@0: #endif