Pangoは、国際化されたテキスト
(右から左に読み進むスクリプトや、タミール語などのようにグリフがコンテキストに依存するスクリプトを含む)
をレイアウトおよびレンダリングするためのオープン・ソースのフレームワークです。驚くべきことではありませんが、Pangoは内部的にUnicode文字を使用します
(UTF-8で表現)。さらに、PangoのインターフェースもUTF-8を使用します。処理前に、GNUの
iconv
などの変換ライブラリーを使用してテキストをUTF-8に変換しておけば、他のエンコード方式もサポートできます。
Pangoは、モジュラー式の、複数のプラットフォームや複数のツールキットにまたがる低レベルのライブラリーとして設計されており、複数のコンテキストで使用できます。PangoはGTK+ およびGNOMEプロジェクトと密接に関係しています。Pangoプロジェクトが始まったのは、GTK+ およびGNOMEで高品質の国際化テキストを使用する必要があったためです。Pangoは単独でも使用できますが、現行のPango (0.13) は、現在鋭意開発中のGTK+ の開発ブランチ1.3.xバージョンに組み込まれることになっています。Pangoは最終的にGTK+ 2.0に統合されることになっています。
"Pango" という名前は、"すべて" を意味するギリシャ語の "Pan" (Παν) と、"言語" を意味する日本語の "Go" (語) に由来しています。
PangoインターフェースのストリングはUTF-8です。その理由は、既存の8ビット・ソフトウェアとの互換性、UNIXプラットフォームでの普及の度合い、0面以外の文字を処理するための余分の努力が不要であること、およびバイト順の心配がないことにあります。
UTF-8ストリングのオフセットは、文字単位ではなくバイト単位で数えます。Pangoの文書は、UTF-8が可変長であるためにストリング内の文字を数えるのがより困難になることを認める一方で、Unicodeにおいてはストリング内の場所を占めないマークのために、たとえ固定幅のエンコード方式であっても、文字位置とストリングの対応が断ち切られるとも述べています。
Pangoの文書は、CJKVの表意文字の場合、UTF-8がUTF-16に比べて50%のオーバーヘッドを持つことも認めています。
単一文字は32ビットで表現されます。これは、ISO/IEC 10646で定義されるあらゆる文字との上位互換性を持たせることを考慮に入れたものです。最近、ISO作業委員会は、そのうちの100万だけ、つまりUTF-16でまかなえるコード・ポイントを使用することを確約しましたが、その削減された範囲でさえ21ビットを要します。32ビットというのは依然、語のサイズの標準として2番目に大きなものです。
Pangoは、Dov
GrobgeldによるFriBidiインプリメンテーションによるUnicodeの両方向アルゴリズムを使用します
(
参考文献
を参照)。本稿執筆時点で、ライブラリーの現行バージョンはUnicode
2.1.8文字データベースを基にしているため、Unicode
3.0で追加されたThaanaなどをサポートしていません。
--with-fribidi
オプションを指定してPangoをコンパイルすると、Pangoのソースのコピーが使用されます。このオプションを指定しない場合は、GrobgeldのWebサイトから最新版を入手して、代わりに使用することができます。
右から左へ読み進むテキストの処理に加えて、Pangoは言語タグの指定をサポートしています。したがって、たとえば日本語としてマークされたテキストには、日本語のフォントを使用しようとします。言語タグの指定は、すべてのPangoのテキスト属性タグの指定と同様、Pango特有の体系に従います。言語タグの指定にあたっては、Unicodeの14面言語タグも使用しませんし、W3Cの定義した
xml:lang
属性も
html:lang
属性も関係ありません。ただし、他の言語マークアップ体系からPangoの言語属性への変換は容易に行えるかもしれません。
以下のリストに、Pangoのテキスト属性の一覧を示します。
- 言語
- フォント・ファミリー: フォント・ファミリーの名前、または複数のファミリーをコンマで区切ったリスト
- スタイル: 標準、斜字体、またはイタリック
- 太さ: 極細から極太まで6つの値を指定可能
- 異体: 標準または小型大文字
- 伸縮: 超圧縮から超拡張まで9つの値を指定可能
- サイズ: フォント・サイズ (1000分の1ポイント単位)
- フォントの説明: 特定のフォント・ファミリー、スタイル、異体、太さ、伸縮、およびサイズを表す簡単なラベル
- 前景色
- 背景色
- 下線: テキストに単一、二重、または低い線で下線を付けるかどうか
- 取り消し線: テキストに取り消し線を付けるかどうか
- 上昇: 垂直方向の変位
- 形状: グリフに課す形状
- スケール
以下の2つの図は、Pangoの実行例を示しています。最初の図ではドイツ語、ギリシャ語、ヘブライ語、日本語、およびアラビア語テキストが使用されており、2番目の図では、それに加えてフランス語、韓国語、およびロシア語が使用されていることに注目してください。当然のことながら、ドイツ語とフランス語のラベルとテキスト・ボックスは、英語またはヨーロッパのコンピューター・システムの大部分で容易に実現可能です。しかし、これらの言語に加えて、図に示されている言語を組み合わせて処理できるようなコンピューター・システムは、ずっとまれです。
スタイル設定された、複数言語による両方向テキスト
ウィジェット・ラベル内の複数言語
文字のシーケンスのさまざまな属性 (言語を含む) は、テキストとは別個に、構造体のリストとして保守されます。属性タイプが異なる各スパンごとに1つの構造体が用いられます。各構造体は、単一の属性クラス、およびそのクラスが適用される文字範囲の開始地点と終了地点を示します。特定の属性タイプの場合、追加情報によってこれが拡張されています。たとえば、カラー属性の場合、スパンに適用される赤、緑、および青のカラー・コンポーネントも記録されます。
テキスト (ウィジェット・ラベルなど) のために別個の属性リストを作成することができますが、属性の変更が多数ある場合、これは骨の折れる作業となることがあります。さらに、Pangoの文書が述べるとおり、属性の付いたオリジナルのテキストを後から翻訳する場合、各属性の構造体の文字範囲は確実に無効になります。
特に翻訳者の便宜を図って、Pangoはテキストに属性の変更を組み込むための単純なHTML風のマークアップ言語をサポートしています。それとともに、マークアップ・テキストを、プレーンなストリングと別個の属性リストに変換するための
pango_parse_markup()
関数を備えています。ルート・エレメントは
<markup>
ですが、これは省略可能です。(開始タグと終了タグを両方とも省略できますが、一方だけ省略するとエラーになります。)
最も用途が広く、最も一般的に使用されるエレメントは
<span>
です。同名のHTMLエレメントと同様、これはテキストのスパンをマークします。この開始タグには以下の属性を含めることができます。その値はPangoのテキスト属性値に変換されます。
-
font_desc: フォントの簡単な記述。"Sans Italic 12" など (他のスパン属性がある場合、これは変更されます) -
font_family: フォント・ファミリー名。 -
face:font_family属性と同義。 -
size: フォント・サイズ (1000分の1ポイント単位)。xx-smallまたはxx-largeなどの事前定義されている絶対サイズを表すキーワードか、相対サイズを表すsmallerまたはlargerのどちらか。 -
style:normal、oblique、またはitalicのいずれか。スタイル・テキスト属性の許容値に対応。 -
weight: 6つのキーワード (ultralight、normal、またはheavyなど) か、太さを表す数値。 -
variant:normalまたはsmallcaps。 -
stretch: 伸縮テキスト属性の許容値に対応する9つのキーワードのうちの1つ (ultracondensed、normal、およびultraexpandedなど)。 -
foreground:#00FF00などのRGBカラー指定か、redなどのカラー名。 -
background:#00FF00などのRGBカラー指定か、redなどのカラー名。 -
underline:single、double、low、noneのいずれか。 -
rise: 垂直方向の変位 (Mの字の10000分の1単位)。添え字の場合は負の値、肩文字の場合は正の値とすることができる。 -
strikethrough: テキストに取り消し線を付けるかどうかに応じて、trueまたはfalse。 -
lang: 言語コード (frなど)
マークアップ言語には、属性を持たない便利なエレメントも少数含まれています。
-
<b>: 太字 -
<big>:<span size="larger">と等価 -
<i>: イタリック -
<s>: 取り消し線 -
<sub>: 添え字 -
<sup>: 肩文字 -
<small>:<span size="smaller>と等価 -
<tt>: モノスペース・フォント -
<u>: 下線
size
属性による絶対サイズと相対サイズの連続的な増減、および
<bigger>
または
<smaller>
の各エレメントによるサイズの増減の割合は、1:1.2 (または1.2:1)
です。これはCSSの文字サイズのスケール因数と同じです。
HTMLとは異なり、マークアップ言語には大文字小文字の区別があります
(この点ではXMLに似ています)。省略可能なタグは、
<markup>
の開始タグと終了タグの対だけです。
Pangoはフォーマット設定とレンダリングを段階的なパイプラインによってインプリメントします。
以下の例はThe Unicode Standard, Version 3.0 の第3章とUAX #9の両方で使用されていたものを基にしたものですが、ここで、大文字は、アラビア語やヘブライ語のように、右から左に読み進むテキストを表しています。この例のマークアップにより、テキストのある部分には下線が引かれ、別の部分は青色になり、また別の部分は下線が引かれると同時に青色になります。
<u>car </u><span foreground="blue"><u>is </u>THE CAR</span> in Arabic |
属性のマークアップは単なる便宜上の機能に過ぎず、パイプラインはテキストとPango属性のリストがないと始まりません。したがって、上記の例を入力として
pango_parse_markup()
を呼び出すことが、言うなればステップ0にあたります。その結果として、単一のストリングが戻されます。このストリングには、テキストと2つのPango属性が含まれています。一方の属性は青いテキストのスパンを示し、もう一方の属性は下線が引かれるテキストのスパンを示します。以下の表は、これらのスパンを示しています。
| ストリング |
car
|
is
|
THE CAR
|
in Arabic
|
| 前景色 | Blue | |||
| 下線 | True | |||
パイプラインの最初のステップは、ストリングを分割して、一貫した属性を持つ部分に分けることです。これには、言語タグが一貫している部分、両方向のカテゴリーが一貫している部分、カラーが一貫している部分などが含まれます。以下の表は、各部に分割された単純なストリングを示しています。表の "Bidiレベル" は、スパンのUnicode両方向組み込みレベルです。偶数 (0を含む) は左から右に読み進むテキスト、奇数は右から左に読み進むテキストを表します。
| ストリング |
car
|
is
|
THE CAR
|
in Arabic
|
| 前景色 | Blue | Blue | ||
| 下線 | True | True | ||
| Bidiレベル | 0 | 0 | 1 | 0 |
次いで、項目が目に見える順序に並べ替えられます。以下の表に示すとおりです。
| ストリング |
car
|
is
|
RAC EHT
|
in Arabic
|
| 前景色 | Blue | Blue | ||
| 下線 | True | True | ||
| Bidiレベル | 0 | 0 | 1 | 0 |
次いで、Pangoは各項目の文字に適したグリフを選択します。
グリフのストリングが位置調整されます。たとえば、以前の 図 で示したように、右から左へと位置調整されます。
グリフが出力装置へレンダリングされます。Pangoはレンダリング・システムではありませんが、Xフォント用のレンダリング・ルーチンが組み込まれています。他の出力装置の場合は、他の外部レンダリング・ルーチンが必要になります。以下の表は、例がレンダリングされるとどのように見えるかを示しています。
| car is RAC EHT in Arabic |
連載の第2回では、コード例を示すとともに、Pangoがグリフを選択してテキストをレンダリングする方法について説明します。
-
Pangoの情報入手とダウンロードは
http://www.pango.org/
で可能です。
-
Dov GrobgeldのFriBidiライブラリーは、
http://imagic.weizmann.ac.il/~dov/freesw/FriBidi/
で入手可能です。
-
GNOMEは大部分のLinux配布版に含まれていますし、いくつかの商用UNIXベンダーもこれを採用しています。GNOMEの情報は
http://www.gnome.org
で入手可能です。
Tony Graham氏はUnicode: A Primer (IDG Books Worldwide社、2000年3月出版、ISBN: 0764546252) の著者です。この本は、Unicode規格とその使用法について現在のところ唯一の著書です。日本では「Unicode標準入門」という邦題で、翔泳社の翻訳版が入手可能です。同氏は、オーストラリア人で、Unicode Consortiumの専門家メンバーです。メール・アドレスはtkg@menteith.com です。