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. ~NameEntryId()422 virtual ~NameEntryId() {} 423 platform_id()424 int32_t platform_id() const { return platform_id_; } encoding_id()425 int32_t encoding_id() const { return encoding_id_; } language_id()426 int32_t language_id() const { return language_id_; } name_id()427 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 std::vector<uint8_t>& 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 std::vector<uint8_t>& name_bytes); 455 virtual ~NameEntry(); 456 name_entry_id()457 NameEntryId& name_entry_id() { return name_entry_id_; } platform_id()458 int32_t platform_id() const { return name_entry_id_.platform_id(); } encoding_id()459 int32_t encoding_id() const { return name_entry_id_.encoding_id(); } language_id()460 int32_t language_id() const { return name_entry_id_.language_id(); } name_id()461 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 std::vector<uint8_t>* 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 std::vector<uint8_t>* name_bytes); 481 482 NameEntryId name_entry_id_; 483 std::vector<uint8_t> 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 std::vector<uint8_t>& 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 std::vector<uint8_t>& name_bytes); 502 virtual void SetName(const std::vector<uint8_t>& 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. name_entry()509 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 std::vector<uint8_t>* 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 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. ~NameEntryFilter()529 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. ~NameEntryFilterInPlace()540 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); ~NameEntryIterator()559 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 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, std::vector<uint8_t>* b); 651 virtual void NameAsBytes(int32_t platform_id, int32_t encoding_id, 652 int32_t language_id, int32_t name_id, 653 std::vector<uint8_t>* 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 std::vector<uint8_t>* 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, std::vector<uint8_t>* b); 731 732 // Note: ICU UChar* convention requires caller to delete[] it. 733 static UChar* ConvertFromNameBytes(std::vector<uint8_t>* 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_ 744