「名前」テーブルの操作| C ++

TrueTypeフォントテーブル「名前」は、そのフォントに関連するテキスト文字列のストレージです。これらの文字列は、さまざまな言語で記述でき、フォント名、姓、デザイナー名、ライセンス情報、著作権通知など、さまざまなエンティティを表すことができます。 要するに、テーブル「名前」に保持されている行は、フォントメタデータを説明しています。

「名前」テーブルのスキーマ。

「名前」テーブルの詳細な仕様にアクセスできます Microsoftおよび Appleドキュメント。

それに応じて番号0と1の「名前」テーブルには2つの形式があります。 「名前」テーブルに関しては、これらの形式番号はバージョンとして名前が付けられているため、形式0は *バージョン0 *、形式1- *バージョン1 *として指定されます。

形式1は、言語識別のフォーマット0とは異なります。 「名前」テーブルのエントリには、その文字列の言語を検出するために使用される言語識別子があります。フォーマット0とフォーマット1の違いは、これらの言語識別子の解釈方法です。

フォーマット0の言語識別子にはプラットフォーム固有の解釈がありますが、形式1の言語識別子は言語タグ文字列に関連付けられており、プラットフォームに関係なく言語を識別します。

より正確にするために、フォーマット1を使用すると、両方のタイプの言語識別子を維持できます - プラットフォーム固有の解釈を持つ識別子と、言語タグ文字列に関連する識別子(つまり、プラットフォームから独立しています)。

Aspose.Font Libraryは、「名前」テーブルのフォーマット0をサポートしています。フォーマット1のサポートは、将来のリリースのために計画されています。

「名前」テーブルが持っている形式とは独立して、このテーブルのすべてのエントリは特定のコンポーネント構造 namerecordに基づいています。

この構造の4つの主なパラメーターは次のとおりです。

パラメーターPlatformIdPlatformspecifid、およびLanguageIDは、文字列の言語をプラットフォーム固有の方法で設定するために使用されます。 PlatformIDパラメーターのコンテキストでのみ、パラメーターの値PlatformspecificidLanguageIDは重要です。

たとえば、Platformspecificid equal 0はMACプラットフォームのローマスクリプトを定義し、同時にPlatformspecificidはWindowsプラットフォームのローマスクリプトを定義します。 同様に、LanguageIDの値は、使用されているPlatformIDパラメーターのコンテキストでのみ重要です。

たとえば、LanguageID英語USAを定義するPlatformID = 1(MAC)の場合は0、PlatformId= 3(Windows)が0x0409に等しい。

除外は、プラットフォームに関係なく言語を識別する言語タグ文字列に関連付けられている名前テーブル形式1のLanguageIDです。

パラメーターnameIdは数字であり、フォント名、姓などの論理文字列カテゴリを識別します。名前識別子には 事前定義されたセットがあります。これは、すべてのプラットフォームと言語で同じです。

したがって、条件付きでテーブル「名前」の各エントリは、3つの部分に分けることができます。

  1. 論理文字列カテゴリ、
  2. 文字列言語、
  3. 文字列自体。

パラメーターnameIdは、最初の部分に関連しています。パラメーターPlatformIdPlatformspecifid、およびLanguageIDは2番目の部分に関連しています。

Aspose.Fontを使用して「名前」テーブルレコードを使用する方法は?

「名前」テーブルのサポートは、クラス ttfnametableによって提供されます。さらに、このオブジェクトの機能を検討します。 まず、 ttfnametableクラスの機能を使用して作業するために必要な列挙について説明しましょう。

上記のように、PlatformIDパラメーターのコンテキストでのみ、パラメータープラットフォーム固有のパラメーターの値とLanguageIDは重要です。」したがって、PlatformIDが0であり、これがUnicodeプラットフォームを定義する場合、 UnicodePlatformspecid列挙を使用します。PlatformIDが1(Macintoshプラットフォーム)の場合、 MacPlatformspecid列挙 *(Windows Platform)が3(Windows Platform)の場合、 msplatformspecid eNumerationを使用します。

列挙 mslanguageidおよび maclanguageidは、LanguageIDパラメーターに関連しています。 PlatformIDが3(Windows Platform)の場合、 MSLANGUAGEID列挙を使用し、PlatformIDが1(Macintoshプラットフォーム)の場合は MacLanguageID列挙を使用します。

次に、「名前テーブルから入手してリフレッシュする問題を進めましょう。

「名前」テーブルからレコードを取得する方法は?

メソッド getallnamerecords()から始めましょう。この方法は、その名前から次のように、「名前」テーブルの除外なしにすべてのエントリを返します。実際には、ほとんどの場合、ユーザーはすべてのエントリを必要としないため、ユーザーが呼び出されることはあまりないことが多いため、必要なエントリを取得するには、エントリのリストを徹底的にフィルタリングする必要があります。

問題は、たとえば、1つのロジックカテゴリであっても、このカテゴリの文字列データが異なる言語である可能性があることです。したがって、各言語には、このロジックカテゴリの「名前」テーブルに別のエントリが必要です。 Fontfamilyカテゴリのデータが英語、フランス語、ドイツ語に存在する場合のように、Fontfamilyカテゴリには3つのエントリが含まれます。

さらに、言語エントリは、文字列データ値とLanguageID値に一致するいくつかのエントリに分割することができますが、PlatformIdPlatformspecifidパラメーターの値によって異なります。

「名前」テーブルからのデータサンプリングを簡素化するには、次の方法を提供します。

  1. このレコードは英語で書かれているため、valunedlanguageid.english_united_statesまたはmslanguageid.english_united_kingdomの値があります。
  2. このレコードには、 fontenvironment.current.currentPlatformid(Microsoftプラットフォームを宣言する現在の実装では3)に等しい値を持つPlatformIDがあります。

「名前」テーブルにレコードを追加/更新する方法は?

classTTFNAMETABLEは、 addNameを提供して、「名前」テーブルにレコードを追加または更新します。 このメソッドは、 namerecordの型の構造を作成し、「名前」テーブルに挿入します。レコードがパラメーターPlatformIdPlatformspecifidLanguageID、およびnameIdによって追加されたものと一致する場合、メソッドは新しいレコードを追加しませんが、パラメーター「名前」で定義された値を使用して既存のレコードの文字列データを更新します。

パラメーター nameIdレコードの論理文字列カテゴリを定義します。パラメーターPlatformIdPlatformspecifid、およびLanguageIDは、文字列の言語を設定するために使用されます。最後のパラメーター「名前」は、レコードの文字列データを設定するために使用されます。

ttfnametableオブジェクトの関数を使用する例。

追加の名前空間を追加して使用します。

 1#include <system/text/string_builder.h>
 2#include <system/enum.h>
 3#include <system/console.h>
 4#include <system/collections/list.h>
 5#include <Aspose.Font.Cpp/src/TtfTables/TtfNameTable.h>
 6#include <Aspose.Font.Cpp/src/TtfTables/TtfTableRepository.h>
 7#include <Aspose.Font.Cpp/src/Ttf/TtfFont.h>
 8#include <Aspose.Font.Cpp/src/MultiLanguageString.h>
 9#include <Aspose.Font.Cpp/src/FontType.h>
10#include <Aspose.Font.Cpp/src/Font.h>
11
12using namespace System;
13using namespace Aspose::Font::Ttf;
14using namespace Aspose::Font::TtfTables;

フォント変数の宣言と初期化。

1	System::SharedPtr<Aspose::Font::Ttf::TtfFont> _font;

次の2つのスニペットカテゴリのプリント値 *フルフォント名 *とフォントlora-レギュラーと同じ結果を生成します

1    //1
2	String fullFontName = _font->get_TtfTables()->get_NameTable()->GetNameById(TtfNameTable::NameId::FullName);
3	Console::WriteLine(String::Format(u"Full font name: {0}", fullFontName));
4	//2
5	String fullFontName = _font->get_TtfTables()->get_NameTable()->GetMultiLanguageNameById(TtfNameTable::NameId::FullName)->GetEnglishString();
6	Console::WriteLine(String::Format(u"Full font name: {0}", fullFontName));

「名前」テーブルのコンテンツ全体を印刷します。

下のスニペットは、この操作を果たす方法を示しています。

 1    System :: arrayptr <ttfnametable :: nameId> ids = system :: enum <ttfnametable :: nameId> :: getValues();
 2    
 3    for (TtfNameTable::NameId nameId : ids)
 4    {
 5        System::SharedPtr<MultiLanguageString> mlString = _font->get_TtfTables()->get_NameTable()->GetMultiLanguageNameById(nameId);
 6        if (mlString == nullptr)
 7        {
 8            continue;
 9        }
10        System::Console::WriteLine(System::String::Format(u"{0}: {1}", nameId, GetMultiLanguageStringValue(mlString)));
11    }
12
13    //Using of this method has no sense when strings from 'name' table have only single language, but it can be useful when font
14    //'name' table include multilingual strings
15    System::String MetadataExamples::GetMultiLanguageStringValue(System::SharedPtr<MultiLanguageString> mlString)
16    {
17        System::ArrayPtr<int32_t> languages = mlString->GetAllLanguageIds();
18        if (languages->get_Length() == 1)
19        {
20            return mlString->GetEnglishString();
21        }
22        
23        System::SharedPtr<System::Text::StringBuilder> sb = System::MakeObject<System::Text::StringBuilder>();
24        
25        for (int32_t i = 0; i < languages->get_Length(); i++)
26        {
27            int32_t langId = languages[i];
28            sb->Append(System::String::Format(u"{0}: {1}", System::Enum<TtfNameTable::MSLanguageId>::GetName((TtfNameTable::MSLanguageId)langId), mlString->GetStringForLanguageId(langId)));
29            if (i != (languages->get_Length() - 1))
30            {
31                sb->Append(u", ");
32            }
33        }
34        
35        return sb->ToString();
36    }

カテゴリ「フォントサブファミリー名」と「説明」の値を更新する

テーブル「名前」のエントリを正しく追加または更新するには、「名前」テーブルに既に存在するものと一致するプラットフォーム、プラットフォーム固有、および言語IDパラメーターの値を渡す必要があります。このため、データを更新する前に、名前識別子で定義された更新ロジックカテゴリに関連するNameRecordタイプの既存のレコードを読み取ります。

 1	//更新操作用のstruct
 2	struct updatedata
 3	{
 4	プライベート:
 5		ttfnametable :: nameId _nameid;
 6		システム:: String _Data;
 7
 8	public:
 9		UpdateData(TtfNameTable::NameId nameId, String data)
10		{
11			this->_nameId = nameId;
12			this->_data = data;
13		}
14
15		TtfNameTable::NameId get_NameId() const
16		{
17			return this->_nameId;
18		}
19
20		String get_StringData() const
21		{
22			return this->_data;
23		}
24	};
25
26	UpdateData recordsToUpdate[] = {
27		UpdateData(TtfNameTable::NameId::FontSubfamily, String(u"Italic")),
28		UpdateData(TtfNameTable::NameId::Description, String(u"New description"))};
29
30	SharedPtr<TtfNameTable::NameRecord> firstRecord = nullptr;
31
32	for(UpdateData updateData : recordsToUpdate)
33	{
34		//Declare variable for NameRecord structure to use for update operations
35		SharedPtr<TtfNameTable::NameRecord> record = nullptr;
36
37		System::ArrayPtr<System::SharedPtr<TtfNameTable::NameRecord>> records = _font->get_TtfTables()->get_NameTable()->GetNameRecordsByNameId(updateData.get_NameId());
38
39		//In this example we will use only info from the first NameRecord structure returned to update font metadata.
40		//Many actual fonts require serious analyze of all NameRecords returned to update metadata correctly
41
42		//Initialize just created variables
43		if (records->get_Length() == 0)
44		{
45			//If no any record was found for current name identifer,
46			//we will use first found record for any name identifier
47			if (firstRecord == nullptr)
48			{
49				firstRecord = GetFirstExistingRecord(_font->get_TtfTables()->get_NameTable());
50			}
51			record = firstRecord;
52		}
53		else
54		{
55			record = records[0];
56		}
57
58		//Add or update record in 'name' table
59		_font->get_TtfTables()->get_NameTable()->AddName(updateData.get_NameId(), StaticCast<TtfNameTable::PlatformId>(record->get_PlatformId()), record->get_PlatformSpecificId(), record->get_LanguageId(), updateData.get_StringData());
60	}
61		
62	System::SharedPtr<Aspose::Font::TtfTables::TtfNameTable::NameRecord> MetadataExamples::GetFirstExistingRecord(System::SharedPtr<Aspose::Font::TtfTables::TtfNameTable> table)
63	{
64	    System::ArrayPtr<System::SharedPtr<TtfNameTable::NameRecord>> records;
65	    for (TtfNameTable::NameId nameId : System::Enum<TtfNameTable::NameId>::GetValues())
66	    {
67	        records = table->GetNameRecordsByNameId(nameId);
68	        if (records->get_Length() != 0)
69	        {
70	            return records[0];
71	        }
72	    }
73        
74	    return table->GetAllNameRecords()->idx_get(0);
75	}

テスト solution metadataexamples.cppで見つけることができる「名前」テーブルを更新する他の例。

Have any questions about Aspose.Font?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.