/*
 * 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.
 */

#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_NAME_TABLE_H_
#define SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_NAME_TABLE_H_

// Must include this before ICU to avoid stdint redefinition issue.
#include "sfntly/port/type.h"

#include <unicode/ucnv.h>
#include <unicode/ustring.h>

#include <map>
#include <utility>

#include "sfntly/table/table.h"

#if defined U_USING_ICU_NAMESPACE
  U_NAMESPACE_USE
#endif

namespace sfntly {

// The following code implements the name table defined in TTF/OTF spec, which
// can be found at http://www.microsoft.com/typography/otspec/name.htm.

// Name IDs defined in TTF/OTF spec.
struct NameId {
  enum {
    kUnknown = -1,
    kCopyrightNotice = 0,
    kFontFamilyName = 1,
    kFontSubfamilyName = 2,
    kUniqueFontIdentifier = 3,
    kFullFontName = 4,
    kVersionString = 5,
    kPostscriptName = 6,
    kTrademark = 7,
    kManufacturerName = 8,
    kDesigner = 9,
    kDescription = 10,
    kVendorURL = 11,
    kDesignerURL = 12,
    kLicenseDescription = 13,
    kLicenseInfoURL = 14,
    kReserved15 = 15,
    kPreferredFamily = 16,
    kPreferredSubfamily = 17,
    kCompatibleFullName = 18,
    kSampleText = 19,
    kPostscriptCID = 20,
    kWWSFamilyName = 21,
    kWWSSubfamilyName = 22
  };
};

// Unicode language IDs used in Name Records.
struct UnicodeLanguageId {
  enum {
    kUnknown = -1,
    kAll = 0
  };
};

// Macintosh Language IDs (platform ID = 1)
struct MacintoshLanguageId {
  enum {
    kUnknown = -1,
    kEnglish = 0,
    kFrench = 1,
    kGerman = 2,
    kItalian = 3,
    kDutch = 4,
    kSwedish = 5,
    kSpanish = 6,
    kDanish = 7,
    kPortuguese = 8,
    kNorwegian = 9,
    kHebrew = 10,
    kJapanese = 11,
    kArabic = 12,
    kFinnish = 13,
    kGreek = 14,
    kIcelandic = 15,
    kMaltese = 16,
    kTurkish = 17,
    kCroatian = 18,
    kChinese_Traditional = 19,
    kUrdu = 20,
    kHindi = 21,
    kThai = 22,
    kKorean = 23,
    kLithuanian = 24,
    kPolish = 25,
    kHungarian = 26,
    kEstonian = 27,
    kLatvian = 28,
    kSami = 29,
    kFaroese = 30,
    kFarsiPersian = 31,
    kRussian = 32,
    kChinese_Simplified = 33,
    kFlemish = 34,
    kIrishGaelic = 35,
    kAlbanian = 36,
    kRomanian = 37,
    kCzech = 38,
    kSlovak = 39,
    kSlovenian = 40,
    kYiddish = 41,
    kSerbian = 42,
    kMacedonian = 43,
    kBulgarian = 44,
    kUkrainian = 45,
    kByelorussian = 46,
    kUzbek = 47,
    kKazakh = 48,
    kAzerbaijani_Cyrillic = 49,
    kAzerbaijani_Arabic = 50,
    kArmenian = 51,
    kGeorgian = 52,
    kMoldavian = 53,
    kKirghiz = 54,
    kTajiki = 55,
    kTurkmen = 56,
    kMongolian_Mongolian = 57,
    kMongolian_Cyrillic = 58,
    kPashto = 59,
    kKurdish = 60,
    kKashmiri = 61,
    kSindhi = 62,
    kTibetan = 63,
    kNepali = 64,
    kSanskrit = 65,
    kMarathi = 66,
    kBengali = 67,
    kAssamese = 68,
    kGujarati = 69,
    kPunjabi = 70,
    kOriya = 71,
    kMalayalam = 72,
    kKannada = 73,
    kTamil = 74,
    kTelugu = 75,
    kSinhalese = 76,
    kBurmese = 77,
    kKhmer = 78,
    kLao = 79,
    kVietnamese = 80,
    kIndonesian = 81,
    kTagalong = 82,
    kMalay_Roman = 83,
    kMalay_Arabic = 84,
    kAmharic = 85,
    kTigrinya = 86,
    kGalla = 87,
    kSomali = 88,
    kSwahili = 89,
    kKinyarwandaRuanda = 90,
    kRundi = 91,
    kNyanjaChewa = 92,
    kMalagasy = 93,
    kEsperanto = 94,
    kWelsh = 128,
    kBasque = 129,
    kCatalan = 130,
    kLatin = 131,
    kQuenchua = 132,
    kGuarani = 133,
    kAymara = 134,
    kTatar = 135,
    kUighur = 136,
    kDzongkha = 137,
    kJavanese_Roman = 138,
    kSundanese_Roman = 139,
    kGalician = 140,
    kAfrikaans = 141,
    kBreton = 142,
    kInuktitut = 143,
    kScottishGaelic = 144,
    kManxGaelic = 145,
    kIrishGaelic_WithDotAbove = 146,
    kTongan = 147,
    kGreek_Polytonic = 148,
    kGreenlandic = 149,
    kAzerbaijani_Roman = 150
  };
};

// Windows Language IDs (platformID = 3)
struct WindowsLanguageId {
  enum {
    kUnknown = -1,
    kAfrikaans_SouthAfrica = 0x0436,
    kAlbanian_Albania = 0x041C,
    kAlsatian_France = 0x0484,
    kAmharic_Ethiopia = 0x045E,
    kArabic_Algeria = 0x1401,
    kArabic_Bahrain = 0x3C01,
    kArabic_Egypt = 0x0C01,
    kArabic_Iraq = 0x0801,
    kArabic_Jordan = 0x2C01,
    kArabic_Kuwait = 0x3401,
    kArabic_Lebanon = 0x3001,
    kArabic_Libya = 0x1001,
    kArabic_Morocco = 0x1801,
    kArabic_Oman = 0x2001,
    kArabic_Qatar = 0x4001,
    kArabic_SaudiArabia = 0x0401,
    kArabic_Syria = 0x2801,
    kArabic_Tunisia = 0x1C01,
    kArabic_UAE = 0x3801,
    kArabic_Yemen = 0x2401,
    kArmenian_Armenia = 0x042B,
    kAssamese_India = 0x044D,
    kAzeri_Cyrillic_Azerbaijan = 0x082C,
    kAzeri_Latin_Azerbaijan = 0x042C,
    kBashkir_Russia = 0x046D,
    kBasque_Basque = 0x042D,
    kBelarusian_Belarus = 0x0423,
    kBengali_Bangladesh = 0x0845,
    kBengali_India = 0x0445,
    kBosnian_Cyrillic_BosniaAndHerzegovina = 0x201A,
    kBosnian_Latin_BosniaAndHerzegovina = 0x141A,
    kBreton_France = 0x047E,
    kBulgarian_Bulgaria = 0x0402,
    kCatalan_Catalan = 0x0403,
    kChinese_HongKongSAR = 0x0C04,
    kChinese_MacaoSAR = 0x1404,
    kChinese_PeoplesRepublicOfChina = 0x0804,
    kChinese_Singapore = 0x1004,
    kChinese_Taiwan = 0x0404,
    kCorsican_France = 0x0483,
    kCroatian_Croatia = 0x041A,
    kCroatian_Latin_BosniaAndHerzegovina = 0x101A,
    kCzech_CzechRepublic = 0x0405,
    kDanish_Denmark = 0x0406,
    kDari_Afghanistan = 0x048C,
    kDivehi_Maldives = 0x0465,
    kDutch_Belgium = 0x0813,
    kDutch_Netherlands = 0x0413,
    kEnglish_Australia = 0x0C09,
    kEnglish_Belize = 0x2809,
    kEnglish_Canada = 0x1009,
    kEnglish_Caribbean = 0x2409,
    kEnglish_India = 0x4009,
    kEnglish_Ireland = 0x1809,
    kEnglish_Jamaica = 0x2009,
    kEnglish_Malaysia = 0x4409,
    kEnglish_NewZealand = 0x1409,
    kEnglish_RepublicOfThePhilippines = 0x3409,
    kEnglish_Singapore = 0x4809,
    kEnglish_SouthAfrica = 0x1C09,
    kEnglish_TrinidadAndTobago = 0x2C09,
    kEnglish_UnitedKingdom = 0x0809,
    kEnglish_UnitedStates = 0x0409,
    kEnglish_Zimbabwe = 0x3009,
    kEstonian_Estonia = 0x0425,
    kFaroese_FaroeIslands = 0x0438,
    kFilipino_Philippines = 0x0464,
    kFinnish_Finland = 0x040B,
    kFrench_Belgium = 0x080C,
    kFrench_Canada = 0x0C0C,
    kFrench_France = 0x040C,
    kFrench_Luxembourg = 0x140c,
    kFrench_PrincipalityOfMonoco = 0x180C,
    kFrench_Switzerland = 0x100C,
    kFrisian_Netherlands = 0x0462,
    kGalician_Galician = 0x0456,
    kGeorgian_Georgia = 0x0437,
    kGerman_Austria = 0x0C07,
    kGerman_Germany = 0x0407,
    kGerman_Liechtenstein = 0x1407,
    kGerman_Luxembourg = 0x1007,
    kGerman_Switzerland = 0x0807,
    kGreek_Greece = 0x0408,
    kGreenlandic_Greenland = 0x046F,
    kGujarati_India = 0x0447,
    kHausa_Latin_Nigeria = 0x0468,
    kHebrew_Israel = 0x040D,
    kHindi_India = 0x0439,
    kHungarian_Hungary = 0x040E,
    kIcelandic_Iceland = 0x040F,
    kIgbo_Nigeria = 0x0470,
    kIndonesian_Indonesia = 0x0421,
    kInuktitut_Canada = 0x045D,
    kInuktitut_Latin_Canada = 0x085D,
    kIrish_Ireland = 0x083C,
    kisiXhosa_SouthAfrica = 0x0434,
    kisiZulu_SouthAfrica = 0x0435,
    kItalian_Italy = 0x0410,
    kItalian_Switzerland = 0x0810,
    kJapanese_Japan = 0x0411,
    kKannada_India = 0x044B,
    kKazakh_Kazakhstan = 0x043F,
    kKhmer_Cambodia = 0x0453,
    kKiche_Guatemala = 0x0486,
    kKinyarwanda_Rwanda = 0x0487,
    kKiswahili_Kenya = 0x0441,
    kKonkani_India = 0x0457,
    kKorean_Korea = 0x0412,
    kKyrgyz_Kyrgyzstan = 0x0440,
    kLao_LaoPDR = 0x0454,
    kLatvian_Latvia = 0x0426,
    kLithuanian_Lithuania = 0x0427,
    kLowerSorbian_Germany = 0x082E,
    kLuxembourgish_Luxembourg = 0x046E,
    kMacedonian_FYROM_FormerYugoslavRepublicOfMacedonia = 0x042F,
    kMalay_BruneiDarussalam = 0x083E,
    kMalay_Malaysia = 0x043E,
    kMalayalam_India = 0x044C,
    kMaltese_Malta = 0x043A,
    kMaori_NewZealand = 0x0481,
    kMapudungun_Chile = 0x047A,
    kMarathi_India = 0x044E,
    kMohawk_Mohawk = 0x047C,
    kMongolian_Cyrillic_Mongolia = 0x0450,
    kMongolian_Traditional_PeoplesRepublicOfChina = 0x0850,
    kNepali_Nepal = 0x0461,
    kNorwegian_Bokmal_Norway = 0x0414,
    kNorwegian_Nynorsk_Norway = 0x0814,
    kOccitan_France = 0x0482,
    kOriya_India = 0x0448,
    kPashto_Afghanistan = 0x0463,
    kPolish_Poland = 0x0415,
    kPortuguese_Brazil = 0x0416,
    kPortuguese_Portugal = 0x0816,
    kPunjabi_India = 0x0446,
    kQuechua_Bolivia = 0x046B,
    kQuechua_Ecuador = 0x086B,
    kQuechua_Peru = 0x0C6B,
    kRomanian_Romania = 0x0418,
    kRomansh_Switzerland = 0x0417,
    kRussian_Russia = 0x0419,
    kSami_Inari_Finland = 0x243B,
    kSami_Lule_Norway = 0x103B,
    kSami_Lule_Sweden = 0x143B,
    kSami_Northern_Finland = 0x0C3B,
    kSami_Northern_Norway = 0x043B,
    kSami_Northern_Sweden = 0x083B,
    kSami_Skolt_Finland = 0x203B,
    kSami_Southern_Norway = 0x183B,
    kSami_Southern_Sweden = 0x1C3B,
    kSanskrit_India = 0x044F,
    kSerbian_Cyrillic_BosniaAndHerzegovina = 0x1C1A,
    kSerbian_Cyrillic_Serbia = 0x0C1A,
    kSerbian_Latin_BosniaAndHerzegovina = 0x181A,
    kSerbian_Latin_Serbia = 0x081A,
    kSesothoSaLeboa_SouthAfrica = 0x046C,
    kSetswana_SouthAfrica = 0x0432,
    kSinhala_SriLanka = 0x045B,
    kSlovak_Slovakia = 0x041B,
    kSlovenian_Slovenia = 0x0424,
    kSpanish_Argentina = 0x2C0A,
    kSpanish_Bolivia = 0x400A,
    kSpanish_Chile = 0x340A,
    kSpanish_Colombia = 0x240A,
    kSpanish_CostaRica = 0x140A,
    kSpanish_DominicanRepublic = 0x1C0A,
    kSpanish_Ecuador = 0x300A,
    kSpanish_ElSalvador = 0x440A,
    kSpanish_Guatemala = 0x100A,
    kSpanish_Honduras = 0x480A,
    kSpanish_Mexico = 0x080A,
    kSpanish_Nicaragua = 0x4C0A,
    kSpanish_Panama = 0x180A,
    kSpanish_Paraguay = 0x3C0A,
    kSpanish_Peru = 0x280A,
    kSpanish_PuertoRico = 0x500A,
    kSpanish_ModernSort_Spain = 0x0C0A,
    kSpanish_TraditionalSort_Spain = 0x040A,
    kSpanish_UnitedStates = 0x540A,
    kSpanish_Uruguay = 0x380A,
    kSpanish_Venezuela = 0x200A,
    kSweden_Finland = 0x081D,
    kSwedish_Sweden = 0x041D,
    kSyriac_Syria = 0x045A,
    kTajik_Cyrillic_Tajikistan = 0x0428,
    kTamazight_Latin_Algeria = 0x085F,
    kTamil_India = 0x0449,
    kTatar_Russia = 0x0444,
    kTelugu_India = 0x044A,
    kThai_Thailand = 0x041E,
    kTibetan_PRC = 0x0451,
    kTurkish_Turkey = 0x041F,
    kTurkmen_Turkmenistan = 0x0442,
    kUighur_PRC = 0x0480,
    kUkrainian_Ukraine = 0x0422,
    kUpperSorbian_Germany = 0x042E,
    kUrdu_IslamicRepublicOfPakistan = 0x0420,
    kUzbek_Cyrillic_Uzbekistan = 0x0843,
    kUzbek_Latin_Uzbekistan = 0x0443,
    kVietnamese_Vietnam = 0x042A,
    kWelsh_UnitedKingdom = 0x0452,
    kWolof_Senegal = 0x0448,
    kYakut_Russia = 0x0485,
    kYi_PRC = 0x0478,
    kYoruba_Nigeria = 0x046A
  };
};

class NameTable : public Table, public RefCounted<NameTable> {
 public:
  // Unique identifier for a given name record.
  class NameEntryId {
   public:
    NameEntryId();  // C++ port only, must provide default constructor.
    NameEntryId(int32_t platform_id, int32_t encoding_id, int32_t language_id,
                int32_t name_id);
    NameEntryId(const NameEntryId&);
    // Make gcc -Wnon-virtual-dtor happy.
    virtual ~NameEntryId() {}

    int32_t platform_id() const { return platform_id_; }
    int32_t encoding_id() const { return encoding_id_; }
    int32_t language_id() const { return language_id_; }
    int32_t name_id() const { return name_id_; }

    const NameEntryId& operator=(const NameEntryId& rhs) const;
    bool operator==(const NameEntryId& rhs) const;
    bool operator<(const NameEntryId& rhs) const;

   private:
    mutable int32_t platform_id_;
    mutable int32_t encoding_id_;
    mutable int32_t language_id_;
    mutable int32_t name_id_;
  };

  class NameEntryBuilder;

  // Class to represent a name entry in the name table.
  class NameEntry : public RefCounted<NameEntry> {
   public:
    NameEntry();
    NameEntry(const NameEntryId& name_entry_id, const ByteVector& name_bytes);
    NameEntry(int32_t platform_id, int32_t encoding_id, int32_t language_id,
              int32_t name_id, const ByteVector& name_bytes);
    virtual ~NameEntry();

    NameEntryId& name_entry_id() { return name_entry_id_; }
    int32_t platform_id() const { return name_entry_id_.platform_id(); }
    int32_t encoding_id() const { return name_entry_id_.encoding_id(); }
    int32_t language_id() const { return name_entry_id_.language_id(); }
    int32_t name_id() const { return name_entry_id_.name_id(); }

    // Get the bytes for name.  Returned pointer is the address of private
    // member of this class, do not attempt to delete.
    ByteVector* NameAsBytes();

    // C++ port only: get the length of NameAsBytes.
    int32_t NameBytesLength();

    // Returns the name in Unicode as UChar array.
    // Note: ICU UChar* convention requires caller to delete[] it.
    UChar* Name();
    bool operator==(const NameEntry& rhs) const;

   private:
    void Init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
              int32_t name_id, const ByteVector* name_bytes);

    NameEntryId name_entry_id_;
    int32_t length_;
    ByteVector name_bytes_;

    friend class NameEntryBuilder;
  };

  // Builder of a name entry.
  // C++ port: original Java hierarchy inherits from NameEntry.  In C++ port, we
  // opted not doing so to avoid ref count issues and nasty protected members.
  class NameEntryBuilder : public RefCounted<NameEntryBuilder> {
   public:
    NameEntryBuilder();
    NameEntryBuilder(const NameEntryId& name_entry_id,
                     const ByteVector& name_bytes);
    explicit NameEntryBuilder(const NameEntryId& name_entry_id);
    explicit NameEntryBuilder(NameEntry* entry);
    virtual ~NameEntryBuilder();

    virtual void SetName(const UChar* name);
    virtual void SetName(const ByteVector& name_bytes);
    virtual void SetName(const ByteVector& name_bytes, int32_t offset,
                         int32_t length);

    // C++ port only. CALLER_ATTACH is not added because the lifetime shall be
    // controlled by this class, therefore the caller shall not increase the ref
    // count.
    NameEntry* name_entry() { return name_entry_; }

   private:
    void Init(int32_t platform_id, int32_t encoding_id, int32_t language_id,
              int32_t name_id, const ByteVector* name_bytes);

    Ptr<NameEntry> name_entry_;
  };
  typedef std::map<NameEntryId, Ptr<NameEntryBuilder> > NameEntryBuilderMap;

  // An interface for a filter to use with the name entry iterator. This allows
  // name entries to be iterated and only those acceptable to the filter will be
  // returned.
  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() {}
  };

  // C++ port only: an in-place filter to mimic Java Iterator's filtering.
  class NameEntryFilterInPlace : public NameEntryFilter {
   public:
    NameEntryFilterInPlace(int32_t platform_id, int32_t encoding_id,
                           int32_t language_id, int32_t name_id);
    // Make gcc -Wnon-virtual-dtor happy.
    virtual ~NameEntryFilterInPlace() {}

    virtual bool Accept(int32_t platform_id, int32_t encoding_id,
                        int32_t language_id, int32_t name_id);

   private:
    int32_t platform_id_;
    int32_t encoding_id_;
    int32_t language_id_;
    int32_t name_id_;
  };

  // Mimic Java's iterator to iterate through the entries within the name table.
  class NameEntryIterator {
   public:
    // If filter is NULL, filter through all tables.
    explicit NameEntryIterator(NameTable* table);
    NameEntryIterator(NameTable* table, NameEntryFilter* filter);
    // Make gcc -Wnon-virtual-dtor happy.
    virtual ~NameEntryIterator() {}

    virtual bool HasNext();
    virtual CALLER_ATTACH NameEntry* Next();
    virtual void Remove();

   private:
    void Init(NameTable* table, NameEntryFilter* filter);

    NameTable* table_;  // Use dumb pointer since it's a composition object.
    int32_t name_index_;
    NameEntryFilter* filter_;
  };

  // The builder to construct name table for outputting.
  class Builder : public Table::ArrayElementTableBuilder,
                  public RefCounted<Builder> {
   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);

    // Revert the name builders for the name table to the last version that came
    // from data.
    void RevertNames();

    // Number of name entry builders contained.
    int32_t BuilderCount();

    // Note: For C++ port, clear() is not implemented.  The clear() function
    //       implies completely remove name entry builders, which is easy in
    //       Java but will take a lot of efforts in C++ to release the builders
    //       nicely and correctly.
    // TODO(arthurhsu): IMPLEMENT
    // Clear the name builders for the name table.
    // void clear();

    // Check the existance of a name entry builder by key.
    bool Has(int32_t platform_id, int32_t encoding_id, int32_t language_id,
             int32_t name_id);

    // Get name entry builder by key.
    CALLER_ATTACH NameEntryBuilder* NameBuilder(int32_t platform_id,
        int32_t encoding_id, int32_t language_id, int32_t name_id);

    // Remove name entry builder by key.
    bool Remove(int32_t platform_id, int32_t encoding_id, int32_t language_id,
                int32_t name_id);

    // FontDataTable::Builder API implementation
    virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
    virtual void SubDataSet();
    virtual int32_t SubDataSizeToSerialize();
    virtual bool SubReadyToSerialize();
    virtual int32_t SubSerialize(WritableFontData* new_data);

   private:
    void Initialize(ReadableFontData* data);
    NameEntryBuilderMap* GetNameBuilders();

    // Note: callers should use the getter funtion provided above to ensure that
    // this is lazily initialized instead of accessing directly.
    NameEntryBuilderMap name_entry_map_;
  };

  /****************************************************************************
   * public methods of NameTable class
   ****************************************************************************/
  virtual ~NameTable();

  // Get the format used in the name table.
  virtual int32_t Format();

  // Get the number of names in the name table.
  virtual int32_t NameCount();

  // Get the platform id for the given name record.
  virtual int32_t PlatformId(int32_t index);

  // Get the encoding id for the given name record.
  // see MacintoshEncodingId, WindowsEncodingId, UnicodeEncodingId
  virtual int32_t EncodingId(int32_t index);

  // Get the language id for the given name record.
  virtual int32_t LanguageId(int32_t index);

  // Get the name id for given name record.
  virtual int32_t NameId(int32_t index);

  // Get the name as bytes for the specified name. If there is no entry for the
  // requested name, then empty vector is returned.
  virtual void NameAsBytes(int32_t index, ByteVector* b);
  virtual void NameAsBytes(int32_t platform_id, int32_t encoding_id,
                           int32_t language_id, int32_t name_id,
                           ByteVector* b);

  // Get the name as a UChar* for the given name record. If there is no
  // encoding conversion available for the name record then a best attempt
  // UChar* will be returned.
  // Note: ICU UChar* convention requires caller to delete[] it.
  virtual UChar* Name(int32_t index);

  // Get the name as a UChar* for the specified name. If there is no entry for
  // the requested name then NULL is returned. If there is no encoding
  // conversion available for the name then a best attempt UChar* will be
  // returned.
  // Note: ICU UChar* convention requires caller to delete[] it.
  virtual UChar* Name(int32_t platform_id, int32_t encoding_id,
                      int32_t language_id, int32_t name_id);

  // Note: These functions are renamed in C++ port.  Their original Java name is
  // nameEntry().
  virtual CALLER_ATTACH NameEntry* GetNameEntry(int32_t index);
  virtual CALLER_ATTACH NameEntry* GetNameEntry(int32_t platform_id,
      int32_t encoding_id, int32_t language_id, int32_t name_id);

  // Note: Not implemented in C++ port due to complexity and low usage.
  // virtual void names(std::set<NameEntryPtr>*);

  // Get the iterator to iterate through all name entries.
  // Note: Caller delete the returned object.
  virtual NameEntryIterator* Iterator();
  virtual NameEntryIterator* Iterator(NameEntryFilter* filter);

 private:
  struct Offset {
    enum {
      kFormat = 0,
      kCount = 2,
      kStringOffset = 4,
      kNameRecordStart = 6,

      // Format 1 - offset from the end of the name records
      kLangTagCount = 0,
      kLangTagRecord = 2,

      kNameRecordSize = 12,
      // Name Records
      kNameRecordPlatformId = 0,
      kNameRecordEncodingId = 2,
      kNameRecordLanguageId = 4,
      kNameRecordNameId = 6,
      kNameRecordStringLength = 8,
      kNameRecordStringOffset = 10
    };
  };

  // The table shall be constructed using Builder, no direct instantiation.
  NameTable(Header* header, ReadableFontData* data);

  // Get the offset to the string data in the name table.
  int32_t StringOffset();

  // Get the offset for the given name record.
  int32_t OffsetForNameRecord(int32_t index);

  // Get the length of the string data for the given name record.
  int32_t NameLength(int32_t index);

  // Get the offset of the string data for the given name record.
  int32_t NameOffset(int32_t index);

  // Note: string literals are returned.  Caller shall not attempt to manipulate
  // the returned pointer.
  static const char* GetEncodingName(int32_t platform_id, int32_t encoding_id);

  // Note: ICU UConverter* convention requires caller to ucnv_close() it.
  static UConverter* GetCharset(int32_t platform_id, int32_t encoding_id);

  // Note: Output will be stored in ByteVector* b.  Original data in b will be
  // erased and replaced with converted name bytes.
  static void ConvertToNameBytes(const UChar* name, int32_t platform_id,
                                 int32_t encoding_id, ByteVector* b);

  // Note: ICU UChar* convention requires caller to delete[] it.
  static UChar* ConvertFromNameBytes(ByteVector* name_bytes,
                                     int32_t platform_id, int32_t encoding_id);
};  // class NameTable
typedef Ptr<NameTable> NameTablePtr;
typedef Ptr<NameTable::NameEntry> NameEntryPtr;
typedef Ptr<NameTable::Builder> NameTableBuilderPtr;
typedef Ptr<NameTable::NameEntryBuilder> NameEntryBuilderPtr;

}  // namespace sfntly

#endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_NAME_TABLE_H_
