LCOV - code coverage report
Current view: top level - gfx/sfntly/cpp/src/sfntly/table/core - name_table.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 16 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 21 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright 2011 Google Inc. All Rights Reserved.
       3             :  *
       4             :  * Licensed under the Apache License, Version 2.0 (the "License");
       5             :  * you may not use this file except in compliance with the License.
       6             :  * You may obtain a copy of the License at
       7             :  *
       8             :  *      http://www.apache.org/licenses/LICENSE-2.0
       9             :  *
      10             :  * Unless required by applicable law or agreed to in writing, software
      11             :  * distributed under the License is distributed on an "AS IS" BASIS,
      12             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      13             :  * See the License for the specific language governing permissions and
      14             :  * limitations under the License.
      15             :  */
      16             : 
      17             : #ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_NAME_TABLE_H_
      18             : #define SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_NAME_TABLE_H_
      19             : 
      20             : // Must include this before ICU to avoid stdint redefinition issue.
      21             : #include "sfntly/port/type.h"
      22             : 
      23             : #include <unicode/ucnv.h>
      24             : #include <unicode/ustring.h>
      25             : 
      26             : #include <map>
      27             : #include <utility>
      28             : 
      29             : #include "sfntly/port/java_iterator.h"
      30             : #include "sfntly/table/subtable_container_table.h"
      31             : 
      32             : namespace sfntly {
      33             : 
      34             : // The following code implements the name table defined in TTF/OTF spec, which
      35             : // can be found at http://www.microsoft.com/typography/otspec/name.htm.
      36             : 
      37             : // Name IDs defined in TTF/OTF spec.
      38             : struct NameId {
      39             :   enum {
      40             :     kUnknown = -1,
      41             :     kCopyrightNotice = 0,
      42             :     kFontFamilyName = 1,
      43             :     kFontSubfamilyName = 2,
      44             :     kUniqueFontIdentifier = 3,
      45             :     kFullFontName = 4,
      46             :     kVersionString = 5,
      47             :     kPostscriptName = 6,
      48             :     kTrademark = 7,
      49             :     kManufacturerName = 8,
      50             :     kDesigner = 9,
      51             :     kDescription = 10,
      52             :     kVendorURL = 11,
      53             :     kDesignerURL = 12,
      54             :     kLicenseDescription = 13,
      55             :     kLicenseInfoURL = 14,
      56             :     kReserved15 = 15,
      57             :     kPreferredFamily = 16,
      58             :     kPreferredSubfamily = 17,
      59             :     kCompatibleFullName = 18,
      60             :     kSampleText = 19,
      61             :     kPostscriptCID = 20,
      62             :     kWWSFamilyName = 21,
      63             :     kWWSSubfamilyName = 22
      64             :   };
      65             : };
      66             : 
      67             : // Unicode language IDs used in Name Records.
      68             : struct UnicodeLanguageId {
      69             :   enum {
      70             :     kUnknown = -1,
      71             :     kAll = 0
      72             :   };
      73             : };
      74             : 
      75             : // Macintosh Language IDs (platform ID = 1)
      76             : struct MacintoshLanguageId {
      77             :   enum {
      78             :     kUnknown = -1,
      79             :     kEnglish = 0,
      80             :     kFrench = 1,
      81             :     kGerman = 2,
      82             :     kItalian = 3,
      83             :     kDutch = 4,
      84             :     kSwedish = 5,
      85             :     kSpanish = 6,
      86             :     kDanish = 7,
      87             :     kPortuguese = 8,
      88             :     kNorwegian = 9,
      89             :     kHebrew = 10,
      90             :     kJapanese = 11,
      91             :     kArabic = 12,
      92             :     kFinnish = 13,
      93             :     kGreek = 14,
      94             :     kIcelandic = 15,
      95             :     kMaltese = 16,
      96             :     kTurkish = 17,
      97             :     kCroatian = 18,
      98             :     kChinese_Traditional = 19,
      99             :     kUrdu = 20,
     100             :     kHindi = 21,
     101             :     kThai = 22,
     102             :     kKorean = 23,
     103             :     kLithuanian = 24,
     104             :     kPolish = 25,
     105             :     kHungarian = 26,
     106             :     kEstonian = 27,
     107             :     kLatvian = 28,
     108             :     kSami = 29,
     109             :     kFaroese = 30,
     110             :     kFarsiPersian = 31,
     111             :     kRussian = 32,
     112             :     kChinese_Simplified = 33,
     113             :     kFlemish = 34,
     114             :     kIrishGaelic = 35,
     115             :     kAlbanian = 36,
     116             :     kRomanian = 37,
     117             :     kCzech = 38,
     118             :     kSlovak = 39,
     119             :     kSlovenian = 40,
     120             :     kYiddish = 41,
     121             :     kSerbian = 42,
     122             :     kMacedonian = 43,
     123             :     kBulgarian = 44,
     124             :     kUkrainian = 45,
     125             :     kByelorussian = 46,
     126             :     kUzbek = 47,
     127             :     kKazakh = 48,
     128             :     kAzerbaijani_Cyrillic = 49,
     129             :     kAzerbaijani_Arabic = 50,
     130             :     kArmenian = 51,
     131             :     kGeorgian = 52,
     132             :     kMoldavian = 53,
     133             :     kKirghiz = 54,
     134             :     kTajiki = 55,
     135             :     kTurkmen = 56,
     136             :     kMongolian_Mongolian = 57,
     137             :     kMongolian_Cyrillic = 58,
     138             :     kPashto = 59,
     139             :     kKurdish = 60,
     140             :     kKashmiri = 61,
     141             :     kSindhi = 62,
     142             :     kTibetan = 63,
     143             :     kNepali = 64,
     144             :     kSanskrit = 65,
     145             :     kMarathi = 66,
     146             :     kBengali = 67,
     147             :     kAssamese = 68,
     148             :     kGujarati = 69,
     149             :     kPunjabi = 70,
     150             :     kOriya = 71,
     151             :     kMalayalam = 72,
     152             :     kKannada = 73,
     153             :     kTamil = 74,
     154             :     kTelugu = 75,
     155             :     kSinhalese = 76,
     156             :     kBurmese = 77,
     157             :     kKhmer = 78,
     158             :     kLao = 79,
     159             :     kVietnamese = 80,
     160             :     kIndonesian = 81,
     161             :     kTagalong = 82,
     162             :     kMalay_Roman = 83,
     163             :     kMalay_Arabic = 84,
     164             :     kAmharic = 85,
     165             :     kTigrinya = 86,
     166             :     kGalla = 87,
     167             :     kSomali = 88,
     168             :     kSwahili = 89,
     169             :     kKinyarwandaRuanda = 90,
     170             :     kRundi = 91,
     171             :     kNyanjaChewa = 92,
     172             :     kMalagasy = 93,
     173             :     kEsperanto = 94,
     174             :     kWelsh = 128,
     175             :     kBasque = 129,
     176             :     kCatalan = 130,
     177             :     kLatin = 131,
     178             :     kQuenchua = 132,
     179             :     kGuarani = 133,
     180             :     kAymara = 134,
     181             :     kTatar = 135,
     182             :     kUighur = 136,
     183             :     kDzongkha = 137,
     184             :     kJavanese_Roman = 138,
     185             :     kSundanese_Roman = 139,
     186             :     kGalician = 140,
     187             :     kAfrikaans = 141,
     188             :     kBreton = 142,
     189             :     kInuktitut = 143,
     190             :     kScottishGaelic = 144,
     191             :     kManxGaelic = 145,
     192             :     kIrishGaelic_WithDotAbove = 146,
     193             :     kTongan = 147,
     194             :     kGreek_Polytonic = 148,
     195             :     kGreenlandic = 149,
     196             :     kAzerbaijani_Roman = 150
     197             :   };
     198             : };
     199             : 
     200             : // Windows Language IDs (platformID = 3)
     201             : struct WindowsLanguageId {
     202             :   enum {
     203             :     kUnknown = -1,
     204             :     kAfrikaans_SouthAfrica = 0x0436,
     205             :     kAlbanian_Albania = 0x041C,
     206             :     kAlsatian_France = 0x0484,
     207             :     kAmharic_Ethiopia = 0x045E,
     208             :     kArabic_Algeria = 0x1401,
     209             :     kArabic_Bahrain = 0x3C01,
     210             :     kArabic_Egypt = 0x0C01,
     211             :     kArabic_Iraq = 0x0801,
     212             :     kArabic_Jordan = 0x2C01,
     213             :     kArabic_Kuwait = 0x3401,
     214             :     kArabic_Lebanon = 0x3001,
     215             :     kArabic_Libya = 0x1001,
     216             :     kArabic_Morocco = 0x1801,
     217             :     kArabic_Oman = 0x2001,
     218             :     kArabic_Qatar = 0x4001,
     219             :     kArabic_SaudiArabia = 0x0401,
     220             :     kArabic_Syria = 0x2801,
     221             :     kArabic_Tunisia = 0x1C01,
     222             :     kArabic_UAE = 0x3801,
     223             :     kArabic_Yemen = 0x2401,
     224             :     kArmenian_Armenia = 0x042B,
     225             :     kAssamese_India = 0x044D,
     226             :     kAzeri_Cyrillic_Azerbaijan = 0x082C,
     227             :     kAzeri_Latin_Azerbaijan = 0x042C,
     228             :     kBashkir_Russia = 0x046D,
     229             :     kBasque_Basque = 0x042D,
     230             :     kBelarusian_Belarus = 0x0423,
     231             :     kBengali_Bangladesh = 0x0845,
     232             :     kBengali_India = 0x0445,
     233             :     kBosnian_Cyrillic_BosniaAndHerzegovina = 0x201A,
     234             :     kBosnian_Latin_BosniaAndHerzegovina = 0x141A,
     235             :     kBreton_France = 0x047E,
     236             :     kBulgarian_Bulgaria = 0x0402,
     237             :     kCatalan_Catalan = 0x0403,
     238             :     kChinese_HongKongSAR = 0x0C04,
     239             :     kChinese_MacaoSAR = 0x1404,
     240             :     kChinese_PeoplesRepublicOfChina = 0x0804,
     241             :     kChinese_Singapore = 0x1004,
     242             :     kChinese_Taiwan = 0x0404,
     243             :     kCorsican_France = 0x0483,
     244             :     kCroatian_Croatia = 0x041A,
     245             :     kCroatian_Latin_BosniaAndHerzegovina = 0x101A,
     246             :     kCzech_CzechRepublic = 0x0405,
     247             :     kDanish_Denmark = 0x0406,
     248             :     kDari_Afghanistan = 0x048C,
     249             :     kDivehi_Maldives = 0x0465,
     250             :     kDutch_Belgium = 0x0813,
     251             :     kDutch_Netherlands = 0x0413,
     252             :     kEnglish_Australia = 0x0C09,
     253             :     kEnglish_Belize = 0x2809,
     254             :     kEnglish_Canada = 0x1009,
     255             :     kEnglish_Caribbean = 0x2409,
     256             :     kEnglish_India = 0x4009,
     257             :     kEnglish_Ireland = 0x1809,
     258             :     kEnglish_Jamaica = 0x2009,
     259             :     kEnglish_Malaysia = 0x4409,
     260             :     kEnglish_NewZealand = 0x1409,
     261             :     kEnglish_RepublicOfThePhilippines = 0x3409,
     262             :     kEnglish_Singapore = 0x4809,
     263             :     kEnglish_SouthAfrica = 0x1C09,
     264             :     kEnglish_TrinidadAndTobago = 0x2C09,
     265             :     kEnglish_UnitedKingdom = 0x0809,
     266             :     kEnglish_UnitedStates = 0x0409,
     267             :     kEnglish_Zimbabwe = 0x3009,
     268             :     kEstonian_Estonia = 0x0425,
     269             :     kFaroese_FaroeIslands = 0x0438,
     270             :     kFilipino_Philippines = 0x0464,
     271             :     kFinnish_Finland = 0x040B,
     272             :     kFrench_Belgium = 0x080C,
     273             :     kFrench_Canada = 0x0C0C,
     274             :     kFrench_France = 0x040C,
     275             :     kFrench_Luxembourg = 0x140c,
     276             :     kFrench_PrincipalityOfMonoco = 0x180C,
     277             :     kFrench_Switzerland = 0x100C,
     278             :     kFrisian_Netherlands = 0x0462,
     279             :     kGalician_Galician = 0x0456,
     280             :     kGeorgian_Georgia = 0x0437,
     281             :     kGerman_Austria = 0x0C07,
     282             :     kGerman_Germany = 0x0407,
     283             :     kGerman_Liechtenstein = 0x1407,
     284             :     kGerman_Luxembourg = 0x1007,
     285             :     kGerman_Switzerland = 0x0807,
     286             :     kGreek_Greece = 0x0408,
     287             :     kGreenlandic_Greenland = 0x046F,
     288             :     kGujarati_India = 0x0447,
     289             :     kHausa_Latin_Nigeria = 0x0468,
     290             :     kHebrew_Israel = 0x040D,
     291             :     kHindi_India = 0x0439,
     292             :     kHungarian_Hungary = 0x040E,
     293             :     kIcelandic_Iceland = 0x040F,
     294             :     kIgbo_Nigeria = 0x0470,
     295             :     kIndonesian_Indonesia = 0x0421,
     296             :     kInuktitut_Canada = 0x045D,
     297             :     kInuktitut_Latin_Canada = 0x085D,
     298             :     kIrish_Ireland = 0x083C,
     299             :     kisiXhosa_SouthAfrica = 0x0434,
     300             :     kisiZulu_SouthAfrica = 0x0435,
     301             :     kItalian_Italy = 0x0410,
     302             :     kItalian_Switzerland = 0x0810,
     303             :     kJapanese_Japan = 0x0411,
     304             :     kKannada_India = 0x044B,
     305             :     kKazakh_Kazakhstan = 0x043F,
     306             :     kKhmer_Cambodia = 0x0453,
     307             :     kKiche_Guatemala = 0x0486,
     308             :     kKinyarwanda_Rwanda = 0x0487,
     309             :     kKiswahili_Kenya = 0x0441,
     310             :     kKonkani_India = 0x0457,
     311             :     kKorean_Korea = 0x0412,
     312             :     kKyrgyz_Kyrgyzstan = 0x0440,
     313             :     kLao_LaoPDR = 0x0454,
     314             :     kLatvian_Latvia = 0x0426,
     315             :     kLithuanian_Lithuania = 0x0427,
     316             :     kLowerSorbian_Germany = 0x082E,
     317             :     kLuxembourgish_Luxembourg = 0x046E,
     318             :     kMacedonian_FYROM_FormerYugoslavRepublicOfMacedonia = 0x042F,
     319             :     kMalay_BruneiDarussalam = 0x083E,
     320             :     kMalay_Malaysia = 0x043E,
     321             :     kMalayalam_India = 0x044C,
     322             :     kMaltese_Malta = 0x043A,
     323             :     kMaori_NewZealand = 0x0481,
     324             :     kMapudungun_Chile = 0x047A,
     325             :     kMarathi_India = 0x044E,
     326             :     kMohawk_Mohawk = 0x047C,
     327             :     kMongolian_Cyrillic_Mongolia = 0x0450,
     328             :     kMongolian_Traditional_PeoplesRepublicOfChina = 0x0850,
     329             :     kNepali_Nepal = 0x0461,
     330             :     kNorwegian_Bokmal_Norway = 0x0414,
     331             :     kNorwegian_Nynorsk_Norway = 0x0814,
     332             :     kOccitan_France = 0x0482,
     333             :     kOriya_India = 0x0448,
     334             :     kPashto_Afghanistan = 0x0463,
     335             :     kPolish_Poland = 0x0415,
     336             :     kPortuguese_Brazil = 0x0416,
     337             :     kPortuguese_Portugal = 0x0816,
     338             :     kPunjabi_India = 0x0446,
     339             :     kQuechua_Bolivia = 0x046B,
     340             :     kQuechua_Ecuador = 0x086B,
     341             :     kQuechua_Peru = 0x0C6B,
     342             :     kRomanian_Romania = 0x0418,
     343             :     kRomansh_Switzerland = 0x0417,
     344             :     kRussian_Russia = 0x0419,
     345             :     kSami_Inari_Finland = 0x243B,
     346             :     kSami_Lule_Norway = 0x103B,
     347             :     kSami_Lule_Sweden = 0x143B,
     348             :     kSami_Northern_Finland = 0x0C3B,
     349             :     kSami_Northern_Norway = 0x043B,
     350             :     kSami_Northern_Sweden = 0x083B,
     351             :     kSami_Skolt_Finland = 0x203B,
     352             :     kSami_Southern_Norway = 0x183B,
     353             :     kSami_Southern_Sweden = 0x1C3B,
     354             :     kSanskrit_India = 0x044F,
     355             :     kSerbian_Cyrillic_BosniaAndHerzegovina = 0x1C1A,
     356             :     kSerbian_Cyrillic_Serbia = 0x0C1A,
     357             :     kSerbian_Latin_BosniaAndHerzegovina = 0x181A,
     358             :     kSerbian_Latin_Serbia = 0x081A,
     359             :     kSesothoSaLeboa_SouthAfrica = 0x046C,
     360             :     kSetswana_SouthAfrica = 0x0432,
     361             :     kSinhala_SriLanka = 0x045B,
     362             :     kSlovak_Slovakia = 0x041B,
     363             :     kSlovenian_Slovenia = 0x0424,
     364             :     kSpanish_Argentina = 0x2C0A,
     365             :     kSpanish_Bolivia = 0x400A,
     366             :     kSpanish_Chile = 0x340A,
     367             :     kSpanish_Colombia = 0x240A,
     368             :     kSpanish_CostaRica = 0x140A,
     369             :     kSpanish_DominicanRepublic = 0x1C0A,
     370             :     kSpanish_Ecuador = 0x300A,
     371             :     kSpanish_ElSalvador = 0x440A,
     372             :     kSpanish_Guatemala = 0x100A,
     373             :     kSpanish_Honduras = 0x480A,
     374             :     kSpanish_Mexico = 0x080A,
     375             :     kSpanish_Nicaragua = 0x4C0A,
     376             :     kSpanish_Panama = 0x180A,
     377             :     kSpanish_Paraguay = 0x3C0A,
     378             :     kSpanish_Peru = 0x280A,
     379             :     kSpanish_PuertoRico = 0x500A,
     380             :     kSpanish_ModernSort_Spain = 0x0C0A,
     381             :     kSpanish_TraditionalSort_Spain = 0x040A,
     382             :     kSpanish_UnitedStates = 0x540A,
     383             :     kSpanish_Uruguay = 0x380A,
     384             :     kSpanish_Venezuela = 0x200A,
     385             :     kSweden_Finland = 0x081D,
     386             :     kSwedish_Sweden = 0x041D,
     387             :     kSyriac_Syria = 0x045A,
     388             :     kTajik_Cyrillic_Tajikistan = 0x0428,
     389             :     kTamazight_Latin_Algeria = 0x085F,
     390             :     kTamil_India = 0x0449,
     391             :     kTatar_Russia = 0x0444,
     392             :     kTelugu_India = 0x044A,
     393             :     kThai_Thailand = 0x041E,
     394             :     kTibetan_PRC = 0x0451,
     395             :     kTurkish_Turkey = 0x041F,
     396             :     kTurkmen_Turkmenistan = 0x0442,
     397             :     kUighur_PRC = 0x0480,
     398             :     kUkrainian_Ukraine = 0x0422,
     399             :     kUpperSorbian_Germany = 0x042E,
     400             :     kUrdu_IslamicRepublicOfPakistan = 0x0420,
     401             :     kUzbek_Cyrillic_Uzbekistan = 0x0843,
     402             :     kUzbek_Latin_Uzbekistan = 0x0443,
     403             :     kVietnamese_Vietnam = 0x042A,
     404             :     kWelsh_UnitedKingdom = 0x0452,
     405             :     kWolof_Senegal = 0x0448,
     406             :     kYakut_Russia = 0x0485,
     407             :     kYi_PRC = 0x0478,
     408             :     kYoruba_Nigeria = 0x046A
     409             :   };
     410             : };
     411             : 
     412             : class NameTable : public SubTableContainerTable, public RefCounted<NameTable> {
     413             :  public:
     414             :   // Unique identifier for a given name record.
     415             :   class NameEntryId {
     416             :    public:
     417             :     NameEntryId();  // C++ port only, must provide default constructor.
     418             :     NameEntryId(int32_t platform_id, int32_t encoding_id, int32_t language_id,
     419             :                 int32_t name_id);
     420             :     NameEntryId(const NameEntryId&);
     421             :     // Make gcc -Wnon-virtual-dtor happy.
     422           0 :     virtual ~NameEntryId() {}
     423             : 
     424           0 :     int32_t platform_id() const { return platform_id_; }
     425           0 :     int32_t encoding_id() const { return encoding_id_; }
     426           0 :     int32_t language_id() const { return language_id_; }
     427           0 :     int32_t name_id() const { return name_id_; }
     428             : 
     429             :     const NameEntryId& operator=(const NameEntryId& rhs) const;
     430             :     bool operator==(const NameEntryId& rhs) const;
     431             :     bool operator<(const NameEntryId& rhs) const;
     432             : 
     433             :     // UNIMPLEMENTED: int hashCode()
     434             :     //                String toString()
     435             : 
     436             :    private:
     437             :     mutable int32_t platform_id_;
     438             :     mutable int32_t encoding_id_;
     439             :     mutable int32_t language_id_;
     440             :     mutable int32_t name_id_;
     441             :   };
     442             : 
     443             :   class NameEntryBuilder;
     444             : 
     445             :   // Class to represent a name entry in the name table.
     446             :   class NameEntry : public RefCounted<NameEntry> {
     447             :    public:
     448             :     NameEntry();
     449             :     NameEntry(const NameEntryId& name_entry_id, const ByteVector& name_bytes);
     450             :     NameEntry(int32_t platform_id,
     451             :               int32_t encoding_id,
     452             :               int32_t language_id,
     453             :               int32_t name_id,
     454             :               const ByteVector& name_bytes);
     455             :     virtual ~NameEntry();
     456             : 
     457           0 :     NameEntryId& name_entry_id() { return name_entry_id_; }
     458           0 :     int32_t platform_id() const { return name_entry_id_.platform_id(); }
     459           0 :     int32_t encoding_id() const { return name_entry_id_.encoding_id(); }
     460           0 :     int32_t language_id() const { return name_entry_id_.language_id(); }
     461           0 :     int32_t name_id() const { return name_entry_id_.name_id(); }
     462             : 
     463             :     // Get the bytes for name.  Returned pointer is the address of private
     464             :     // member of this class, do not attempt to delete.
     465             :     ByteVector* NameAsBytes();
     466             : 
     467             :     // C++ port only: get the length of NameAsBytes.
     468             :     int32_t NameBytesLength();
     469             : 
     470             :     // Returns the name in Unicode as UChar array.
     471             :     // Note: ICU UChar* convention requires caller to delete[] it.
     472             :     UChar* Name();
     473             :     bool operator==(const NameEntry& rhs) const;
     474             : 
     475             :     // UNIMPLEMENTED: String toString()
     476             :     //                int hashCode()
     477             : 
     478             :    private:
     479             :     void Init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
     480             :               int32_t name_id, const ByteVector* name_bytes);
     481             : 
     482             :     NameEntryId name_entry_id_;
     483             :     ByteVector name_bytes_;
     484             : 
     485             :     friend class NameEntryBuilder;
     486             :   };
     487             : 
     488             :   // Builder of a name entry.
     489             :   // C++ port: original Java hierarchy inherits from NameEntry.  In C++ port, we
     490             :   // opted not doing so to avoid ref count issues and nasty protected members.
     491             :   class NameEntryBuilder : public RefCounted<NameEntryBuilder> {
     492             :    public:
     493             :     NameEntryBuilder();
     494             :     NameEntryBuilder(const NameEntryId& name_entry_id,
     495             :                      const ByteVector& name_bytes);
     496             :     explicit NameEntryBuilder(const NameEntryId& name_entry_id);
     497             :     explicit NameEntryBuilder(NameEntry* entry);
     498             :     virtual ~NameEntryBuilder();
     499             : 
     500             :     virtual void SetName(const UChar* name);
     501             :     virtual void SetName(const ByteVector& name_bytes);
     502             :     virtual void SetName(const ByteVector& name_bytes,
     503             :                          int32_t offset,
     504             :                          int32_t length);
     505             : 
     506             :     // C++ port only. CALLER_ATTACH is not added because the lifetime shall be
     507             :     // controlled by this class, therefore the caller shall not increase the ref
     508             :     // count.
     509           0 :     NameEntry* name_entry() { return name_entry_; }
     510             : 
     511             :    private:
     512             :     void Init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
     513             :               int32_t name_id, const ByteVector* name_bytes);
     514             : 
     515             :     Ptr<NameEntry> name_entry_;
     516             :   };
     517             :   typedef std::map<NameEntryId, Ptr<NameEntryBuilder> > NameEntryBuilderMap;
     518             : 
     519             :   // An interface for a filter to use with the name entry iterator. This allows
     520             :   // name entries to be iterated and only those acceptable to the filter will be
     521             :   // returned.
     522           0 :   class NameEntryFilter {
     523             :    public:
     524             :     virtual bool Accept(int32_t platform_id,
     525             :                         int32_t encoding_id,
     526             :                         int32_t language_id,
     527             :                         int32_t name_id) = 0;
     528             :     // Make gcc -Wnon-virtual-dtor happy.
     529           0 :     virtual ~NameEntryFilter() {}
     530             :   };
     531             : 
     532             :   // C++ port only: an in-place filter to mimic Java Iterator's filtering.
     533             :   class NameEntryFilterInPlace : public NameEntryFilter {
     534             :    public:
     535             :     NameEntryFilterInPlace(int32_t platform_id,
     536             :                            int32_t encoding_id,
     537             :                            int32_t language_id,
     538             :                            int32_t name_id);
     539             :     // Make gcc -Wnon-virtual-dtor happy.
     540           0 :     virtual ~NameEntryFilterInPlace() {}
     541             : 
     542             :     virtual bool Accept(int32_t platform_id,
     543             :                         int32_t encoding_id,
     544             :                         int32_t language_id,
     545             :                         int32_t name_id);
     546             : 
     547             :    private:
     548             :     int32_t platform_id_;
     549             :     int32_t encoding_id_;
     550             :     int32_t language_id_;
     551             :     int32_t name_id_;
     552             :   };
     553             : 
     554             :   class NameEntryIterator : public RefIterator<NameEntry, NameTable> {
     555             :    public:
     556             :     // If filter is NULL, filter through all tables.
     557             :     explicit NameEntryIterator(NameTable* table);
     558             :     NameEntryIterator(NameTable* table, NameEntryFilter* filter);
     559           0 :     virtual ~NameEntryIterator() {}
     560             : 
     561             :     virtual bool HasNext();
     562             :     virtual CALLER_ATTACH NameEntry* Next();
     563             : 
     564             :    private:
     565             :     int32_t name_index_;
     566             :     NameEntryFilter* filter_;
     567             :   };
     568             : 
     569             :   // The builder to construct name table for outputting.
     570           0 :   class Builder : public SubTableContainerTable::Builder,
     571             :                   public RefCounted<Builder> {
     572             :    public:
     573             :     // Constructor scope altered to public because C++ does not allow base
     574             :     // class to instantiate derived class with protected constructors.
     575             :     Builder(Header* header, WritableFontData* data);
     576             :     Builder(Header* header, ReadableFontData* data);
     577             : 
     578             :     static CALLER_ATTACH Builder* CreateBuilder(Header* header,
     579             :                                                 WritableFontData* data);
     580             : 
     581             :     // Revert the name builders for the name table to the last version that came
     582             :     // from data.
     583             :     void RevertNames();
     584             : 
     585             :     // Number of name entry builders contained.
     586             :     int32_t BuilderCount();
     587             : 
     588             :     // Note: For C++ port, clear() is not implemented.  The clear() function
     589             :     //       implies completely remove name entry builders, which is easy in
     590             :     //       Java but will take a lot of efforts in C++ to release the builders
     591             :     //       nicely and correctly.
     592             :     // TODO(arthurhsu): IMPLEMENT
     593             :     // Clear the name builders for the name table.
     594             :     // void clear();
     595             : 
     596             :     // Check the existance of a name entry builder by key.
     597             :     bool Has(int32_t platform_id, int32_t encoding_id, int32_t language_id,
     598             :              int32_t name_id);
     599             : 
     600             :     // Get name entry builder by key.
     601             :     CALLER_ATTACH NameEntryBuilder* NameBuilder(int32_t platform_id,
     602             :         int32_t encoding_id, int32_t language_id, int32_t name_id);
     603             : 
     604             :     // Remove name entry builder by key.
     605             :     bool Remove(int32_t platform_id, int32_t encoding_id, int32_t language_id,
     606             :                 int32_t name_id);
     607             : 
     608             :     // FontDataTable::Builder API implementation
     609             :     virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
     610             :     virtual void SubDataSet();
     611             :     virtual int32_t SubDataSizeToSerialize();
     612             :     virtual bool SubReadyToSerialize();
     613             :     virtual int32_t SubSerialize(WritableFontData* new_data);
     614             : 
     615             :    private:
     616             :     void Initialize(ReadableFontData* data);
     617             :     NameEntryBuilderMap* GetNameBuilders();
     618             : 
     619             :     // Note: callers should use the getter funtion provided above to ensure that
     620             :     // this is lazily initialized instead of accessing directly.
     621             :     NameEntryBuilderMap name_entry_map_;
     622             :   };
     623             : 
     624             :   /****************************************************************************
     625             :    * public methods of NameTable class
     626             :    ****************************************************************************/
     627             :   virtual ~NameTable();
     628             : 
     629             :   // Get the format used in the name table.
     630             :   virtual int32_t Format();
     631             : 
     632             :   // Get the number of names in the name table.
     633             :   virtual int32_t NameCount();
     634             : 
     635             :   // Get the platform id for the given name record.
     636             :   virtual int32_t PlatformId(int32_t index);
     637             : 
     638             :   // Get the encoding id for the given name record.
     639             :   // see MacintoshEncodingId, WindowsEncodingId, UnicodeEncodingId
     640             :   virtual int32_t EncodingId(int32_t index);
     641             : 
     642             :   // Get the language id for the given name record.
     643             :   virtual int32_t LanguageId(int32_t index);
     644             : 
     645             :   // Get the name id for given name record.
     646             :   virtual int32_t NameId(int32_t index);
     647             : 
     648             :   // Get the name as bytes for the specified name. If there is no entry for the
     649             :   // requested name, then empty vector is returned.
     650             :   virtual void NameAsBytes(int32_t index, ByteVector* b);
     651             :   virtual void NameAsBytes(int32_t platform_id, int32_t encoding_id,
     652             :                            int32_t language_id, int32_t name_id,
     653             :                            ByteVector* b);
     654             : 
     655             :   // Get the name as a UChar* for the given name record. If there is no
     656             :   // encoding conversion available for the name record then a best attempt
     657             :   // UChar* will be returned.
     658             :   // Note: ICU UChar* convention requires caller to delete[] it.
     659             :   virtual UChar* Name(int32_t index);
     660             : 
     661             :   // Get the name as a UChar* for the specified name. If there is no entry for
     662             :   // the requested name then NULL is returned. If there is no encoding
     663             :   // conversion available for the name then a best attempt UChar* will be
     664             :   // returned.
     665             :   // Note: ICU UChar* convention requires caller to delete[] it.
     666             :   virtual UChar* Name(int32_t platform_id, int32_t encoding_id,
     667             :                       int32_t language_id, int32_t name_id);
     668             : 
     669             :   // Note: These functions are renamed in C++ port.  Their original Java name is
     670             :   // nameEntry().
     671             :   virtual CALLER_ATTACH NameEntry* GetNameEntry(int32_t index);
     672             :   virtual CALLER_ATTACH NameEntry* GetNameEntry(int32_t platform_id,
     673             :       int32_t encoding_id, int32_t language_id, int32_t name_id);
     674             : 
     675             :   // Note: Not implemented in C++ port due to complexity and low usage.
     676             :   // virtual void names(std::set<NameEntryPtr>*);
     677             : 
     678             :   // Get the iterator to iterate through all name entries.
     679             :   virtual CALLER_ATTACH NameEntryIterator* Iterator();
     680             :   virtual CALLER_ATTACH NameEntryIterator* Iterator(NameEntryFilter* filter);
     681             : 
     682             :  private:
     683             :   struct Offset {
     684             :     enum {
     685             :       kFormat = 0,
     686             :       kCount = 2,
     687             :       kStringOffset = 4,
     688             :       kNameRecordStart = 6,
     689             : 
     690             :       // Format 1 - offset from the end of the name records
     691             :       kLangTagCount = 0,
     692             :       kLangTagRecord = 2,
     693             : 
     694             :       kNameRecordSize = 12,
     695             :       // Name Records
     696             :       kNameRecordPlatformId = 0,
     697             :       kNameRecordEncodingId = 2,
     698             :       kNameRecordLanguageId = 4,
     699             :       kNameRecordNameId = 6,
     700             :       kNameRecordStringLength = 8,
     701             :       kNameRecordStringOffset = 10
     702             :     };
     703             :   };
     704             : 
     705             :   // The table shall be constructed using Builder, no direct instantiation.
     706             :   NameTable(Header* header, ReadableFontData* data);
     707             : 
     708             :   // Get the offset to the string data in the name table.
     709             :   int32_t StringOffset();
     710             : 
     711             :   // Get the offset for the given name record.
     712             :   int32_t OffsetForNameRecord(int32_t index);
     713             : 
     714             :   // Get the length of the string data for the given name record.
     715             :   int32_t NameLength(int32_t index);
     716             : 
     717             :   // Get the offset of the string data for the given name record.
     718             :   int32_t NameOffset(int32_t index);
     719             : 
     720             :   // Note: string literals are returned.  Caller shall not attempt to manipulate
     721             :   // the returned pointer.
     722             :   static const char* GetEncodingName(int32_t platform_id, int32_t encoding_id);
     723             : 
     724             :   // Note: ICU UConverter* convention requires caller to ucnv_close() it.
     725             :   static UConverter* GetCharset(int32_t platform_id, int32_t encoding_id);
     726             : 
     727             :   // Note: Output will be stored in ByteVector* b.  Original data in b will be
     728             :   // erased and replaced with converted name bytes.
     729             :   static void ConvertToNameBytes(const UChar* name, int32_t platform_id,
     730             :                                  int32_t encoding_id, ByteVector* b);
     731             : 
     732             :   // Note: ICU UChar* convention requires caller to delete[] it.
     733             :   static UChar* ConvertFromNameBytes(ByteVector* name_bytes,
     734             :                                      int32_t platform_id, int32_t encoding_id);
     735             : };  // class NameTable
     736             : typedef Ptr<NameTable> NameTablePtr;
     737             : typedef Ptr<NameTable::NameEntry> NameEntryPtr;
     738             : typedef Ptr<NameTable::Builder> NameTableBuilderPtr;
     739             : typedef Ptr<NameTable::NameEntryBuilder> NameEntryBuilderPtr;
     740             : 
     741             : }  // namespace sfntly
     742             : 
     743             : #endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_NAME_TABLE_H_

Generated by: LCOV version 1.13