« 2008年6月 | トップページ | 2008年8月 »

2008年7月

2008年7月30日 (水)

V1.1.11リリース

DBXInspector V1.1.11をリリースしました。

主な変更点は「ファイルエクスプローラ」ウィンドウに「お気に入り」機能を追加しました。以前にも「お気に入り」機能について言及したことがあったのですが、技術的な問題から放置していましたsad。で、久しぶりに取り掛かって見たところ、解決するメドが立ったので実装してみました。こんな感じです。

V1111_1

お気に入りとして登録したフォルダ等に一発で移動できるようになります。合わせて「オプション」ウィンドウも変更しました。

V1111_2

後は、例えば、データベース管理の「表領域情報」ウィンドウなどのタブの位置を下から上に変更しました。というのも、自分で使っていてタブの位置が下にあると、マウスを動かす量つまり動線が長くなり、結構、イライラしたからですbearing。ははは。

最新版で上書きする場合は、MenuLayout.iniを一旦削除して下さい。削除しないと追加した「お気に入り」機能のメニューが表示されないと思います。

2008年7月23日 (水)

OpenTypeレイアウトへの道(4)・・・LookupList

ということで、今回は残りのLookupList。前々回のScriptList前回のFeatureList同様、退屈なお話になるが・・・

LookupListはフォント内のフィーチャーで使われるすべてのLookupテーブルを定義し、その構造は次のようになる。

LookupList
名前 説明
USHORT LookupCount Lookupテーブルの数
Offset(USHORT) Lookups[LookupCount] LookupテーブルへのLookupListの先頭からのオフセットの配列

LookupCountはLookupテーブルの数つまりフォント内のフィーチャーで使われるすべてのルックアップの数を表し、LookupsはLookupテーブルへのオフセットの配列である。

Lookupテーブルは、グリフの置換やポジショニングを適用するグリフ、適用する操作の種類や適用された結果を定義し、1つ以上のLookupサブテーブルから構成され、その構造は次のようになる。

Lookupテーブル
名前 説明
USHORT LookupType ルックアップタイプ
USHORT LookupFlag ルックアップフラグ
USHORT SubTableCount Lookupサブテーブルの数
Offset(USHORT) SubTables[SubTableCount] LookupサブテーブルのLookupテーブルの先頭からのオフセットの配列

LookupTypeはルックアップタイプつまり適用する操作の種類、SubTableCountはLookupサブテーブルの数を表し、SubTablesはLookupサブテーブルへのオフセットへの配列である。Lookupサブテーブルの構造は、ルックアップタイプによって異なるので、実際のGSUB、GPOSテーブルのところで説明しようと思う。

また、先ほどLookupテーブルの説明で、Lookupテーブルは「グリフの置換やポジショニングを適用するグリフ、適用する操作の種類や適用された結果を定義する」と書いたが、「グリフの置換やポジショニングを適用するグリフ」、「適用された結果」は、実際にはこのLookupサブテーブル内で定義される。特に前者の「グリフの置換やポジショニングを適用するグリフ」を定義するLookupサブテーブル内のテーブルをCoverageテーブルと呼ぶ。Coverageテーブルは、グリフ置換やポジショニングを行うグリフをグリフインデックスで指定するが、主に2つの指定の方法がある。

  1. 個々のグリフのグリフインデックスのリストとして指定する(フォーマット1)。
  2. 連続したグリフインデックスのレンジ(範囲)として指定する。つまり、開始グリフインデックス(StartIndex)と終了グリフインデックス(EndIndex)のペアとして指定する(フォーマット2)。

それぞれの構造は次のようになる。

フォーマット1 Coverageテーブル
名前 説明
USHORT CoverageFormat フォーマット識別子=1
USHORT GlyphCount グリフインデックスの配列内のグリフの数
GlyphID(USHORT) GlyphArray[GlyphCount] グリフインデックスの配列(グリフインデックスの昇順)

暑いよdespair

フォーマット2 Coverageテーブル
名前 説明
USHORT CoverageFormat フォーマット識別子=2
USHORT RangeCount Rangeレコードの数
RangeRecord RangeRecords[RangeCount] Rangeレコードの配列(レンジの開始グリフインデックスの昇順)

Rangeレコードの構造は次のようになる。

Rangeレコード
名前 説明
GlyphID(USHORT) StartIndex レンジの開始グリフインデックス
GlyphID(USHORT) EndIndex レンジの終了グリフインデックス
USHORT StartCoverageIndex レンジの開始グリフインデックスのCoverageインデックス

以上を踏まえて実際にフォントを解析してみる。

まずは、MSゴシックフォント(MSGOTHIC.TTC)のGSUBテーブルのLookupListから。

Lookupmsgothic

上の画像より計1つのルックアップが定義されていることがわかる。また、そのルックアップのルックアップタイプが1、そのルックアップ内に1つのLookupサブテーブルが定義されていることもわかる。ルックアップタイプやLookupサブテーブルの説明がまだなので一体何のことやらと思うと思うが、これらは次回と言う事で・・

ちなみに、前回の結果から分かるように、kana->JAN言語システムで定義されているvertフィーチャーはルックアップインデックス0のこのルックアップを使って定義されている。

次はTahomaフォント(tahoma.ttf)のGSUBテーブルのLookupList。

Lookuptahoma

上の画像より計6つのルックアップが定義されている。

以上。

というか、OpenTypeレイアウトへの道は予想通り険しかったdespair。上の説明で出てきた例えば、Lookupサブテーブルの構造はルックアップタイプに応じて異なるのだが、グリフ置換とグリフポジションニング用合わせると、20以上あるし・・・・・絶対無理。ははは。プログラムの方も追い付かないぜbearing。まぁ、とりあえず、主なルックアップタイプだけやろうかなと。

2008年7月22日 (火)

OpenTypeレイアウトへの道(3)・・・FeatureList

ということで、今回は前回の予告通りFeatureListである。

FeatureListはフォント内のすべてのフィーチャーを定義するが、その構造はScriptListのそれと似ている。

FeatureListの構造は次のようになる。

FeatureList
名前 説明
USHORT FeatureCount Featureレコードの数
FeatureRecord FeatureRecords[FeatureCount] Featureレコードの配列(タグのアルファベット順)

FeatureCountはFeatureレコードの数つまりフォント内のすべてのフィーチャーの数を表し、FeatureRecordsはFeatureレコードの配列である。

Featureレコードの構造は次のようになる。

Featureレコード
名前 説明
Tag FeatureTag フィーチャータグ
Offset(USHORT) Feature FeatureテーブルへのFeatureListの先頭からのオフセット

FeatureTagは、フィーチャーを識別するタグ、Featureは、Featureテーブルへのオフセットを表す。

Featureテーブルは1つ以上のルックアップを使ってフィーチャーを定義し、その構造は次のようになる。

Featureテーブル
名前 説明
Offset(USHORT) FeatureParams NULL
USHORT LookupCount ルックアップの数
USHORT LookupIndices[LookupCount] ルックアップのルックアップインデックスの配列

LookupCountはフィーチャーで使用するルックアップの数を表し、LookupIndicesは使用するルックアップのルックアップインデックスの配列である。それぞれのルックアップは、まだ説明していないLookupListで定義されるが、上記のルックアップインデックスを使って、そのフィーチャーのルックアップにアクセスされる。

前回と今回の上記を踏まえると、スクリプト、言語システム、フィーチャーそして今回出てきたルックアップの概念的な図は次のようになる。

Script_langsys_feat_lookup

以上を踏まえて、実際のフォントのFeatureListを解析してみた。

まずは、前回と同様に、MSゴシック(MSGOTHIC.TTC)のGSUBテーブルのFeatureListから。

Featuremsgothic

上の画像より計1つのフィーチャーvertが定義されていることが分かる。また、前回のScriptListの解析結果より、kana->JAN言語システム内にフィーチャーインデックスが0のフィーチャーが定義されていたが、そのフィーチャーがvertフィーチャーであった事も分かる。また、vertフィーチャーはルックアップインデックス0のルックアップを使って定義されていることも分かる。ルックアップはLookupListに定義されているので、ルックアップインデックス0のルックアップがどのように定義されているかはLookupListを解析しないと分からない。

vertフィーチャーは縦書きのためのフィーチャーであるが、何やらMSゴシックフォントは縦書き表示に対応しているようである。ははは・・(意味不明)。くどいようであるが、このvertフィーチャーによってどの横書き用のグリフがどの縦書き用のグリフに置換されるかはルックアップに定義されている。

同じように、Tahomaフォント(tahoma.ttf)のGSUBテーブルのFeatureListについて。

Featuretahoma

上の画像より計5つのフィーチャーが定義されていることが分かる。また、上の画像で選択されているligaフィーチャーはルックアップインデックス4、5の2つのルックアップを使って定義されていることが分かる。

2008年7月21日 (月)

OpenTypeレイアウトへの道(2)・・・ScriptList

前回の続きであるが、OpenTypeレイアウトテーブルは複雑でどういう順番で書いていけばいいのか悩むsad

で、今回は前回を踏まえて、GSUB、GPOSテーブルで使われる共通のテーブル構成について。ちなみに、GSUBテーブルはグリフ置換のためのテーブル、GPOSテーブルはグリフの位置を正しく決定(ポジショニング)するためのテーブルである。GSUB、GPOSテーブルは、それぞれそのヘッダーにScriptListFeatureListLookupListへのオフセットを持っているのだが、まずは、これら3つの構造から。

まずは、ScriptListについて。

OpenTypeフォントは、様々なスクリプトのグリフをレンダリングするために使われる1つ以上のグリフのグループを持てるのだが、それらはScriptListで定義される。

ScriptListの構造は次のようになる。

ScriptList
名前 説明
USHORT ScriptCount Scriptレコードの数
ScriptRecord ScriptRecords[ScriptCount] Scriptレコードの配列(タグのアルファベット順)

ScriptCountはScriptレコードの数を表し、ScriptRecordsはScriptレコードの配列である。

Scriptレコードの構造は次のようになる。

Scriptレコード
名前 説明
Tag ScriptTag スクリプトタグ
Offset(USHORT) Script ScriptテーブルへのScriptListの先頭からのオフセット

ScriptTagは前回説明した通り4バイトの印字可能なASCII文字で構成されるスクリプトを表す識別子である。ScriptはScriptテーブルへのオフセットである。

Scriptテーブルは、スクリプト内の言語システムを定義し、その構造は次のようになる。

Scriptテーブル
名前 説明
Offset(USHORT) DefaultLangSys デフォルトのLangSysテーブルへのScriptテーブルの先頭からのオフセットまたはNULL
USHORT LangSysCount LangSysレコードの数
LangSysRecord LangSysRecords[LangSysCount] LangSysレコードの配列(タグのアルファベット順)

DefaultLangSysは、スクリプト内のデフォルトの振る舞いを調整するLangSysテーブルへのオフセットを表す。LangSysCount、LangSysRecordsはそれぞれLangSysレコードの数とその配列である。

LangSysレコードの構造は次のようになる。

LangSysレコード
名前 説明
Tag LangSysTag 言語システムタグ
Offset(USHORT) LangSys LangSysテーブルへのScriptテーブルの先頭からのオフセット

LangSysレコードはScriptレコードと似た構成になっており、LangSysTagは言語システムタグ、LangSysはLangSysテーブルへのオフセットを表す。

LangSysテーブルは、前回の言語システムの説明の通り、言語システムで使用するフィーチャーを定義し、その構造は次のようになる。

LangSysテーブル
名前 説明
Offset(USHORT) LookupOrder NULL
USHORT ReqFeatureIndex 必須フィーチャーのフィーチャーインデックス、または、0xFFFF(必須フィーチャーがない場合)
USHORT FeatureCount フィーチャーの数(必須フィーチャーは除く)
USHORT FeatureIndices[FeatureCount] フィーチャーのフィーチャーインデックスの配列

ReqFeatureIndexは、言語システムの必須フィーチャーのインデックスを表し、FeatureCountは言語システムのフィーチャーの数を表し、FeatureIndicesはフィーチャーインデックスの配列である。ちなみに、それぞれのフィーチャーはまだ、説明していないFeatureListで定義されるが、上記のフィーチャーインデックスを使って言語システムのそれぞれのフィーチャーにアクセスされる。

以上を踏まえるとスクリプト、言語システム、フィーチャーの概念的な関係は次の図のようになる。

Script_langsys_feat

次回以降、残りのFeatureList、LookupListを順に見ていこうと思うが、ここらへんは具体的に実際のフォントでの解析結果も示したほうが分かりやすいのであるが、何せT2Analayzerの開発の方が追い付かないbearing。というより、解析するプログラムはだいたい出来てるのだが、GUIをどうするかで悩んでいる。

追記:一応、GUIをこしらえたので、実際にScriptListを解析してみる。まずは、お馴染みのMS ゴシック(MSGOTHIC.TTF)のGSUBテーブルのScriptListから。

Scriptmsgothic

上の画像より、kanaスクリプトが定義され、その中に、JAN言語システムが定義されているのが分かる。また、JAN言語システム内にフィーチャーインデックス0のフィーチャーが定義されている。フィーチャーはFeatureListで定義されているので、フィーチャーインデックス0のフィーチャーがどんなフィーチャーであるかは、FeatureListを解析してみないと分からない。

次は、Tahomaフォント(tahoma.TTF)のGSUBテーブルのScriptList。

Scripttahoma

上の画像よりarabスクリプトが定義されている。その中に言語システムは明示的に定義されていないので、テキスト処理クライアントで利用する場合は、デフォルトの言語システムを利用することになる。そして、そのタグなしのデフォルトの言語システム内に、フィーチャーインデックスがそれぞれ0、1、2、3、4の5つのフィーチャーが定義されているのが分かる。

2008年7月20日 (日)

OpenTypeレイアウトへの道

前回のOpenTypeフォント の投稿から随分、日が過ぎたが別件(この投稿のコメント欄)で久しぶりにやる気が沸いたので続きをやってみる。タイトルも「OpenTypeレイアウトへの道」となんだかカッコつけた名前にしてみたhappy02

今回からフォントがOpenTypeであるがためのテーブル、つまり、従来のTrueTypeフォントに追加された新しいOpenTypeレイアウトテーブルと呼ばれるGSUB、GPOS、GDEF、BASE、JSTFの5つのテーブルを見ていこうと思う(といっても、これらのテーブルは複雑だから、すべて説明するまでモチベーションが続かないと思うが・・・むしろ、1つのテーブルだけで終わるかもbearing)。で、いきなり、上記のテーブルの中を見ても混乱すると思うし、まずは、概要や用語について。

まず、OpenTypeレイアウトテーブルはグリフを置換(Substitution)、ポジショニング(Positioning)するための情報を提供するが、それらのデータはスクリプト(Script)、言語システム(Language System)、フィーチャー(Feature)、ルックアップ(Lookup)によって構成される。

スクリプトというのは、1つ以上の言語を表現するために使われる関連のあるグリフの集合のことでトップレベルに定義される。例えば、ラテン文字を表すラテンスクリプトは英語、フランス語、ドイツ語など多くの言語を表記するために使われる。対照的に、ひらがなやカタカナを表すスクリプトは日本語だけを表記するために使われる(漢字を表すスクリプトは日本語だけでなく中国語などでも使われる)。OpenTypeレイアウトでは単一のフォントで複数のスクリプトをサポートすることができる。また、スクリプト内に言語システムを定義する。

言語システムというのは、文字通り、言語のことである。また、言語システム内に言語を表すためのグリフの使用方法のルールであるフィーチャーを定義する。

フィーチャーというのは、言語を表すためのグリフの使用方法のルールのことである。例えば、日本語の縦書きの為に、横書き用のグリフを縦書き用のグリフに置換するためのvertフィーチャ、また、アラビア語では文字の字形が単語内での位置によって、語頭形(initial form)、語中形(medial form)、語末形(final form)などに変わるがそのための、init、medi、finaフィーチャーというのがある。フィーチャーはルックアップを使って定義される。

ルックアップというのは、グリフの置換やポジショニングを適用するグリフ、グリフに適用する操作の種類や適用された結果などを定義する。例えば、グリフ置換では、通常、どのグリフがどのグリフに置換されるか、つまり、置換元のグリフのとそれらの置換先のグリフなどを定義する。

ちなみに、これらスクリプト、言語システム、フィーチャーはOpenTypeフォント内の各テーブルを識別するのと同じように、タグと呼ばれる4バイトの印字可能なASCII文字(0x20-0x7E)で識別され、MicrosoftやAdobeによって既に登録済みタグがある。それらの登録済みのタグの一部を掲載してみる。

スクリプトタグ
スクリプト スクリプトタグ
Arabic arab
Armenian armn
Balinese bali
Bangali beng
Bangali v.2 bng2
・・・省略・・・
CJK Ideographic hani
Coptic copt
・・・省略・・・
Hebrew hebr
Hiragana kana
・・・省略・・・

漢字?を表すhaniタグ、ひらがな・カタカナ?を表すkanaタグがあることがわかるが、Microsoftの資料によると、スクリプトタグはMicrosoft Typographyによって定義され、各タグはUnicodeにおけるそれぞれの文字コードレンジに対応するそうである。

言語システムタグ
言語システム 言語システムタグ
Abaza ABA
Abkhazian ABK
・・・省略・・・
Greek ELL
English ENG
Erzya ERZ
Spanish ESP
・・・省略・・・
Italian ITA
Hebrew IWR
Javanese JAV
Yiddish JII
Japanse JAN
・・・省略・・・

英語を表すENGタグ、日本語を表すJANタグがあるのがわかる。

フィーチャータグ
フレンドリ名 フィーチャータグ
Access All Alternates aalt
Above-base Forms abvt
・・・省略・・・
JIS78 Forms jp78
JIS83 Forms jp83
JIS90 Forms jp90
JIS2004 Forms jp04
・・・省略・・・
Ruby Notation Forms ruby
・・・省略・・・
Vertical Writing vert
・・・省略・・・

vertタグは先ほど述べたように縦書きのためのタグ、rubyタグは振り仮名のためのタグである。

すべてのタグとその詳細は、Microsoftのタイポグラフィのサイトを参照ということで。

て、ここまでだと何のことだかというこだと思うが、次回に続く・・・

« 2008年6月 | トップページ | 2008年8月 »

自作ソフトウェア

無料ブログはココログ

メモ