blob: 7553aa0b99240664d8f2a81edace3fb305b3eb85 [file] [log] [blame]
/*
* Copyright 2011 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// TODO(arthurhsu): IMPLEMENT: not really used and tested, need cleanup
#ifndef TYPOGRAPHY_FONT_SFNTLY_SRC_SFNTLY_NAME_TABLE_H_
#define TYPOGRAPHY_FONT_SFNTLY_SRC_SFNTLY_NAME_TABLE_H_
#include <map>
#include <utility>
#include "sfntly/table.h"
namespace sfntly {
struct UnicodeLanguageId {
static const int32_t kUnknown;
static const int32_t kAll;
};
// Macinstosh Language IDs (platform ID = 1)
struct MacintoshLanguageId {
static const int32_t kUnknown;
static const int32_t kEnglish;
static const int32_t kFrench;
static const int32_t kGerman;
static const int32_t kItalian;
static const int32_t kDutch;
static const int32_t kSwedish;
static const int32_t kSpanish;
static const int32_t kDanish;
static const int32_t kPortuguese;
static const int32_t kNorwegian;
static const int32_t kHebrew;
static const int32_t kJapanese;
static const int32_t kArabic;
static const int32_t kFinnish;
static const int32_t kGreek;
static const int32_t kIcelandic;
static const int32_t kMaltese;
static const int32_t kTurkish;
static const int32_t kCroatian;
static const int32_t kChinese_Traditional;
static const int32_t kUrdu;
static const int32_t kHindi;
static const int32_t kThai;
static const int32_t kKorean;
static const int32_t kLithuanian;
static const int32_t kPolish;
static const int32_t kHungarian;
static const int32_t kEstonian;
static const int32_t kLatvian;
static const int32_t kSami;
static const int32_t kFaroese;
static const int32_t kFarsiPersian;
static const int32_t kRussian;
static const int32_t kChinese_Simplified;
static const int32_t kFlemish;
static const int32_t kIrishGaelic;
static const int32_t kAlbanian;
static const int32_t kRomanian;
static const int32_t kCzech;
static const int32_t kSlovak;
static const int32_t kSlovenian;
static const int32_t kYiddish;
static const int32_t kSerbian;
static const int32_t kMacedonian;
static const int32_t kBulgarian;
static const int32_t kUkrainian;
static const int32_t kByelorussian;
static const int32_t kUzbek;
static const int32_t kKazakh;
static const int32_t kAzerbaijani_Cyrillic;
static const int32_t kAzerbaijani_Arabic;
static const int32_t kArmenian;
static const int32_t kGeorgian;
static const int32_t kMoldavian;
static const int32_t kKirghiz;
static const int32_t kTajiki;
static const int32_t kTurkmen;
static const int32_t kMongolian_Mongolian;
static const int32_t kMongolian_Cyrillic;
static const int32_t kPashto;
static const int32_t kKurdish;
static const int32_t kKashmiri;
static const int32_t kSindhi;
static const int32_t kTibetan;
static const int32_t kNepali;
static const int32_t kSanskrit;
static const int32_t kMarathi;
static const int32_t kBengali;
static const int32_t kAssamese;
static const int32_t kGujarati;
static const int32_t kPunjabi;
static const int32_t kOriya;
static const int32_t kMalayalam;
static const int32_t kKannada;
static const int32_t kTamil;
static const int32_t kTelugu;
static const int32_t kSinhalese;
static const int32_t kBurmese;
static const int32_t kKhmer;
static const int32_t kLao;
static const int32_t kVietnamese;
static const int32_t kIndonesian;
static const int32_t kTagalong;
static const int32_t kMalay_Roman;
static const int32_t kMalay_Arabic;
static const int32_t kAmharic;
static const int32_t kTigrinya;
static const int32_t kGalla;
static const int32_t kSomali;
static const int32_t kSwahili;
static const int32_t kKinyarwandaRuanda;
static const int32_t kRundi;
static const int32_t kNyanjaChewa;
static const int32_t kMalagasy;
static const int32_t kEsperanto;
static const int32_t kWelsh;
static const int32_t kBasque;
static const int32_t kCatalan;
static const int32_t kLatin;
static const int32_t kQuenchua;
static const int32_t kGuarani;
static const int32_t kAymara;
static const int32_t kTatar;
static const int32_t kUighur;
static const int32_t kDzongkha;
static const int32_t kJavanese_Roman;
static const int32_t kSundanese_Roman;
static const int32_t kGalician;
static const int32_t kAfrikaans;
static const int32_t kBreton;
static const int32_t kInuktitut;
static const int32_t kScottishGaelic;
static const int32_t kManxGaelic;
static const int32_t kIrishGaelic_WithDotAbove;
static const int32_t kTongan;
static const int32_t kGreek_Polytonic;
static const int32_t kGreenlandic;
static const int32_t kAzerbaijani_Roman;
};
// Windows Language IDs (platformID = 3)
struct WindowsLanguageId {
static const int32_t kUnknown;
static const int32_t kAfrikaans_SouthAfrica;
static const int32_t kAlbanian_Albania;
static const int32_t kAlsatian_France;
static const int32_t kAmharic_Ethiopia;
static const int32_t kArabic_Algeria;
static const int32_t kArabic_Bahrain;
static const int32_t kArabic_Egypt;
static const int32_t kArabic_Iraq;
static const int32_t kArabic_Jordan;
static const int32_t kArabic_Kuwait;
static const int32_t kArabic_Lebanon;
static const int32_t kArabic_Libya;
static const int32_t kArabic_Morocco;
static const int32_t kArabic_Oman;
static const int32_t kArabic_Qatar;
static const int32_t kArabic_SaudiArabia;
static const int32_t kArabic_Syria;
static const int32_t kArabic_Tunisia;
static const int32_t kArabic_UAE;
static const int32_t kArabic_Yemen;
static const int32_t kArmenian_Armenia;
static const int32_t kAssamese_India;
static const int32_t kAzeri_Cyrillic_Azerbaijan;
static const int32_t kAzeri_Latin_Azerbaijan;
static const int32_t kBashkir_Russia;
static const int32_t kBasque_Basque;
static const int32_t kBelarusian_Belarus;
static const int32_t kBengali_Bangladesh;
static const int32_t kBengali_India;
static const int32_t kBosnian_Cyrillic_BosniaAndHerzegovina;
static const int32_t kBosnian_Latin_BosniaAndHerzegovina;
static const int32_t kBreton_France;
static const int32_t kBulgarian_Bulgaria;
static const int32_t kCatalan_Catalan;
static const int32_t kChinese_HongKongSAR;
static const int32_t kChinese_MacaoSAR;
static const int32_t kChinese_PeoplesRepublicOfChina;
static const int32_t kChinese_Singapore;
static const int32_t kChinese_Taiwan;
static const int32_t kCorsican_France;
static const int32_t kCroatian_Croatia;
static const int32_t kCroatian_Latin_BosniaAndHerzegovina;
static const int32_t kCzech_CzechRepublic;
static const int32_t kDanish_Denmark;
static const int32_t kDari_Afghanistan;
static const int32_t kDivehi_Maldives;
static const int32_t kDutch_Belgium;
static const int32_t kDutch_Netherlands;
static const int32_t kEnglish_Australia;
static const int32_t kEnglish_Belize;
static const int32_t kEnglish_Canada;
static const int32_t kEnglish_Caribbean;
static const int32_t kEnglish_India;
static const int32_t kEnglish_Ireland;
static const int32_t kEnglish_Jamaica;
static const int32_t kEnglish_Malaysia;
static const int32_t kEnglish_NewZealand;
static const int32_t kEnglish_RepublicOfThePhilippines;
static const int32_t kEnglish_Singapore;
static const int32_t kEnglish_SouthAfrica;
static const int32_t kEnglish_TrinidadAndTobago;
static const int32_t kEnglish_UnitedKingdom;
static const int32_t kEnglish_UnitedStates;
static const int32_t kEnglish_Zimbabwe;
static const int32_t kEstonian_Estonia;
static const int32_t kFaroese_FaroeIslands;
static const int32_t kFilipino_Philippines;
static const int32_t kFinnish_Finland;
static const int32_t kFrench_Belgium;
static const int32_t kFrench_Canada;
static const int32_t kFrench_France;
static const int32_t kFrench_Luxembourg;
static const int32_t kFrench_PrincipalityOfMonoco;
static const int32_t kFrench_Switzerland;
static const int32_t kFrisian_Netherlands;
static const int32_t kGalician_Galician;
static const int32_t kGeorgian_Georgia;
static const int32_t kGerman_Austria;
static const int32_t kGerman_Germany;
static const int32_t kGerman_Liechtenstein;
static const int32_t kGerman_Luxembourg;
static const int32_t kGerman_Switzerland;
static const int32_t kGreek_Greece;
static const int32_t kGreenlandic_Greenland;
static const int32_t kGujarati_India;
static const int32_t kHausa_Latin_Nigeria;
static const int32_t kHebrew_Israel;
static const int32_t kHindi_India;
static const int32_t kHungarian_Hungary;
static const int32_t kIcelandic_Iceland;
static const int32_t kIgbo_Nigeria;
static const int32_t kIndonesian_Indonesia;
static const int32_t kInuktitut_Canada;
static const int32_t kInuktitut_Latin_Canada;
static const int32_t kIrish_Ireland;
static const int32_t kisiXhosa_SouthAfrica;
static const int32_t kisiZulu_SouthAfrica;
static const int32_t kItalian_Italy;
static const int32_t kItalian_Switzerland;
static const int32_t kJapanese_Japan;
static const int32_t kKannada_India;
static const int32_t kKazakh_Kazakhstan;
static const int32_t kKhmer_Cambodia;
static const int32_t kKiche_Guatemala;
static const int32_t kKinyarwanda_Rwanda;
static const int32_t kKiswahili_Kenya;
static const int32_t kKonkani_India;
static const int32_t kKorean_Korea;
static const int32_t kKyrgyz_Kyrgyzstan;
static const int32_t kLao_LaoPDR;
static const int32_t kLatvian_Latvia;
static const int32_t kLithuanian_Lithuania;
static const int32_t kLowerSorbian_Germany;
static const int32_t kLuxembourgish_Luxembourg;
static const int32_t kMacedonian_FYROM_FormerYugoslavRepublicOfMacedonia;
static const int32_t kMalay_BruneiDarussalam;
static const int32_t kMalay_Malaysia;
static const int32_t kMalayalam_India;
static const int32_t kMaltese_Malta;
static const int32_t kMaori_NewZealand;
static const int32_t kMapudungun_Chile;
static const int32_t kMarathi_India;
static const int32_t kMohawk_Mohawk;
static const int32_t kMongolian_Cyrillic_Mongolia;
static const int32_t kMongolian_Traditional_PeoplesRepublicOfChina;
static const int32_t kNepali_Nepal;
static const int32_t kNorwegian_Bokmal_Norway;
static const int32_t kNorwegian_Nynorsk_Norway;
static const int32_t kOccitan_France;
static const int32_t kOriya_India;
static const int32_t kPashto_Afghanistan;
static const int32_t kPolish_Poland;
static const int32_t kPortuguese_Brazil;
static const int32_t kPortuguese_Portugal;
static const int32_t kPunjabi_India;
static const int32_t kQuechua_Bolivia;
static const int32_t kQuechua_Ecuador;
static const int32_t kQuechua_Peru;
static const int32_t kRomanian_Romania;
static const int32_t kRomansh_Switzerland;
static const int32_t kRussian_Russia;
static const int32_t kSami_Inari_Finland;
static const int32_t kSami_Lule_Norway;
static const int32_t kSami_Lule_Sweden;
static const int32_t kSami_Northern_Finland;
static const int32_t kSami_Northern_Norway;
static const int32_t kSami_Northern_Sweden;
static const int32_t kSami_Skolt_Finland;
static const int32_t kSami_Southern_Norway;
static const int32_t kSami_Southern_Sweden;
static const int32_t kSanskrit_India;
static const int32_t kSerbian_Cyrillic_BosniaAndHerzegovina;
static const int32_t kSerbian_Cyrillic_Serbia;
static const int32_t kSerbian_Latin_BosniaAndHerzegovina;
static const int32_t kSerbian_Latin_Serbia;
static const int32_t kSesothoSaLeboa_SouthAfrica;
static const int32_t kSetswana_SouthAfrica;
static const int32_t kSinhala_SriLanka;
static const int32_t kSlovak_Slovakia;
static const int32_t kSlovenian_Slovenia;
static const int32_t kSpanish_Argentina;
static const int32_t kSpanish_Bolivia;
static const int32_t kSpanish_Chile;
static const int32_t kSpanish_Colombia;
static const int32_t kSpanish_CostaRica;
static const int32_t kSpanish_DominicanRepublic;
static const int32_t kSpanish_Ecuador;
static const int32_t kSpanish_ElSalvador;
static const int32_t kSpanish_Guatemala;
static const int32_t kSpanish_Honduras;
static const int32_t kSpanish_Mexico;
static const int32_t kSpanish_Nicaragua;
static const int32_t kSpanish_Panama;
static const int32_t kSpanish_Paraguay;
static const int32_t kSpanish_Peru;
static const int32_t kSpanish_PuertoRico;
static const int32_t kSpanish_ModernSort_Spain;
static const int32_t kSpanish_TraditionalSort_Spain;
static const int32_t kSpanish_UnitedStates;
static const int32_t kSpanish_Uruguay;
static const int32_t kSpanish_Venezuela;
static const int32_t kSweden_Finland;
static const int32_t kSwedish_Sweden;
static const int32_t kSyriac_Syria;
static const int32_t kTajik_Cyrillic_Tajikistan;
static const int32_t kTamazight_Latin_Algeria;
static const int32_t kTamil_India;
static const int32_t kTatar_Russia;
static const int32_t kTelugu_India;
static const int32_t kThai_Thailand;
static const int32_t kTibetan_PRC;
static const int32_t kTurkish_Turkey;
static const int32_t kTurkmen_Turkmenistan;
static const int32_t kUighur_PRC;
static const int32_t kUkrainian_Ukraine;
static const int32_t kUpperSorbian_Germany;
static const int32_t kUrdu_IslamicRepublicOfPakistan;
static const int32_t kUzbek_Cyrillic_Uzbekistan;
static const int32_t kUzbek_Latin_Uzbekistan;
static const int32_t kVietnamese_Vietnam;
static const int32_t kWelsh_UnitedKingdom;
static const int32_t kWolof_Senegal;
static const int32_t kYakut_Russia;
static const int32_t kYi_PRC;
static const int32_t kYoruba_Nigeria;
};
class NameTable : public Table, public RefCounted<NameTable> {
private:
struct Offset {
static const int32_t kFormat;
static const int32_t kCount;
static const int32_t kStringOffset;
static const int32_t kNameRecordStart;
// format 1 - offset from the end of the name records
static const int32_t kLangTagCount;
static const int32_t kLangTagRecord;
static const int32_t kNameRecordSize;
// Name Records
static const int32_t kNameRecordPlatformId;
static const int32_t kNameRecordEncodingId;
static const int32_t kNameRecordLanguageId;
static const int32_t kNameRecordNameId;
static const int32_t kNameRecordStringLength;
static const int32_t kNameRecordStringOffset;
};
struct NameId {
static const int32_t kUnknown;
static const int32_t kCopyrightNotice;
static const int32_t kFontFamilyName;
static const int32_t kFontSubfamilyName;
static const int32_t kUniqueFontIdentifier;
static const int32_t kFullFontName;
static const int32_t kVersionString;
static const int32_t kPostscriptName;
static const int32_t kTrademark;
static const int32_t kManufacturerName;
static const int32_t kDesigner;
static const int32_t kDescription;
static const int32_t kVendorURL;
static const int32_t kDesignerURL;
static const int32_t kLicenseDescription;
static const int32_t kLicenseInfoURL;
static const int32_t kReserved15;
static const int32_t kPreferredFamily;
static const int32_t kPreferredSubfamily;
static const int32_t kCompatibleFullName;
static const int32_t kSampleText;
static const int32_t kPostscriptCID;
static const int32_t kWWSFamilyName;
static const int32_t kWWSSubfamilyName;
};
public:
class NameEntryBuilder;
class NameEntry : public RefCounted<NameEntry> {
public:
NameEntry();
NameEntry(int32_t platform_id, int32_t encoding_id, int32_t language_id,
int32_t name_id, const ByteVector& name_bytes);
virtual void init(int32_t platform_id, int32_t encoding_id,
int32_t language_id, int32_t name_id,
const ByteVector* name_bytes);
virtual ~NameEntry();
virtual int32_t platformId();
virtual int32_t encodingId();
virtual int32_t languageId();
virtual int32_t nameId();
virtual bool operator==(const NameEntry& obj);
virtual int hashCode();
virtual int compareTo(const NameEntry& obj);
virtual int32_t nameBytesLength(); // C++ port only
virtual ByteVector* nameBytes();
protected:
int32_t platform_id_;
int32_t encoding_id_;
int32_t language_id_;
int32_t name_id_;
int32_t length_;
ByteVector name_bytes_;
friend class NameEntryBuilder;
};
class NameEntryBuilder : public NameEntry {
public:
NameEntryBuilder();
NameEntryBuilder(int32_t platform_id, int32_t encoding_id,
int32_t language_id, int32_t name_id,
const ByteVector& name_bytes);
NameEntryBuilder(int32_t platform_id, int32_t encoding_id,
int32_t language_id, int32_t name_id);
explicit NameEntryBuilder(NameEntry* entry);
virtual ~NameEntryBuilder();
};
typedef Ptr<NameEntryBuilder> NameEntryBuilderPtr;
typedef std::map<NameEntryBuilderPtr, NameEntryBuilderPtr> NameEntryMap;
typedef std::pair<NameEntryBuilderPtr, NameEntryBuilderPtr> NameEntryMapEntry;
class NameEntryFilter {
public:
virtual bool accept(int32_t platform_id, int32_t encoding_id,
int32_t language_id, int32_t name_id) = 0;
// Make gcc -Wnon-virtual-dtor happy.
virtual ~NameEntryFilter() {}
};
class Builder : public Table::ArrayElementTableBuilder {
public:
// Constructor scope altered to public because C++ does not allow base
// class to instantiate derived class with protected constructors.
Builder(FontDataTableBuilderContainer* font_builder, Header* header,
WritableFontData* data);
Builder(FontDataTableBuilderContainer* font_builder, Header* header,
ReadableFontData* data);
virtual int32_t subSerialize(WritableFontData* new_data);
virtual bool subReadyToSerialize();
virtual int32_t subDataSizeToSerialize();
virtual void subDataSet();
virtual CALLER_ATTACH FontDataTable* subBuildTable(ReadableFontData* data);
private:
void initialize(ReadableFontData* data);
private:
NameEntryMap name_entry_map_;
};
class NameEntryIterator {
public:
// If filter is NULL, filter through all tables.
NameEntryIterator(NameTable* table, NameEntryFilter* filter);
bool hasNext();
NameEntry* next();
private:
NameTable* table_; // use dumb pointer since it's a composition object
int32_t name_index_;
NameEntryFilter* filter_;
};
private:
NameTable(Header* header, ReadableFontData* data);
public:
virtual ~NameTable();
virtual int32_t format();
virtual int32_t nameCount();
virtual int32_t platformId(int32_t index);
virtual int32_t encodingId(int32_t index);
virtual int32_t languageId(int32_t index);
virtual int32_t nameId(int32_t index);
virtual void nameAsBytes(int32_t index, ByteVector* b);
virtual CALLER_ATTACH NameEntry* nameEntry(int32_t index);
private:
int32_t stringOffset();
int32_t offsetForNameRecord(int32_t index);
int32_t nameLength(int32_t index);
int32_t nameOffset(int32_t index);
};
typedef Ptr<NameTable> NameTablePtr;
typedef Ptr<NameTable::NameEntry> NameEntryPtr;
} // namespace sfntly
#endif // TYPOGRAPHY_FONT_SFNTLY_SRC_SFNTLY_NAME_TABLE_H_