目次


Pango の接続

第 1 回

すべての言語でテキスト・レイアウトを可能にするフレームワーク

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: Pango の接続

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:Pango の接続

このシリーズの続きに乞うご期待。

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" (語) に由来しています。

なぜ UTF-8 か

Pango インターフェースのストリングは UTF-8 です。その理由は、既存の 8 ビット・ソフトウェアとの互換性、UNIX プラットフォームでの普及の度合い、0 面以外の文字を処理するための余分の努力が不要であること、およびバイト順の心配がないことにあります。

UTF-8 ストリングのオフセットは、文字単位ではなくバイト単位で数えます。Pango の文書は、UTF-8 が可変長であるためにストリング内の文字を数えるのがより困難になることを認める一方で、Unicode においてはストリング内の場所を占めないマークのために、たとえ固定幅のエンコード方式であっても、文字位置とストリングの対応が断ち切られるとも述べています。

Pango の文書は、CJKV の表意文字の場合、UTF-8 が UTF-16 に比べて 50%のオーバーヘッドを持つことも認めています。

UCS-4 同様の単一文字

単一文字は 32 ビットで表現されます。これは、ISO/IEC 10646 で定義されるあらゆる文字との上位互換性を持たせることを考慮に入れたものです。最近、ISO 作業委員会は、そのうちの 100 万だけ、つまり UTF-16 でまかなえるコード・ポイントを使用することを確約しましたが、その削減された範囲でさえ 21 ビットを要します。32 ビットというのは依然、語のサイズの標準として 2 番目に大きなものです。

BiDi ライブラリー

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 : normaloblique 、または italic のいずれか。スタイル・テキスト属性の許容値に対応。
  • weight : 6 つのキーワード ( ultralightnormal 、または heavy など) か、太さを表す数値。
  • variant : normal または smallcaps
  • stretch : 伸縮テキスト属性の許容値に対応する 9 つのキーワードのうちの 1 つ ( ultracondensednormal 、および ultraexpanded など)。
  • foreground : #00FF00 などの RGB カラー指定か、 red などのカラー名。
  • background : #00FF00 などの RGB カラー指定か、 red などのカラー名。
  • underline : singledoublelownone のいずれか。
  • 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 属性が含まれています。一方の属性は青いテキストのスパンを示し、もう一方の属性は下線が引かれるテキストのスパンを示します。以下の表は、これらのスパンを示しています。

ストリングcarisTHE CARin Arabic
前景色Blue
下線True

項目化

パイプラインの最初のステップは、ストリングを分割して、一貫した属性を持つ部分に分けることです。これには、言語タグが一貫している部分、両方向のカテゴリーが一貫している部分、カラーが一貫している部分などが含まれます。以下の表は、各部に分割された単純なストリングを示しています。表の "Bidi レベル" は、スパンの Unicode 両方向組み込みレベルです。偶数 (0 を含む) は左から右に読み進むテキスト、奇数は右から左に読み進むテキストを表します。

ストリングcarisTHE CARin Arabic
前景色BlueBlue
下線TrueTrue
Bidi レベル0010

並べ替え

次いで、項目が目に見える順序に並べ替えられます。以下の表に示すとおりです。

ストリングcarisRAC EHTin Arabic
前景色BlueBlue
下線TrueTrue
Bidi レベル0010

グリフの選択

次いで、Pango は各項目の文字に適したグリフを選択します。

位置調整

グリフのストリングが位置調整されます。たとえば、以前の で示したように、右から左へと位置調整されます。

レンダリング

グリフが出力装置へレンダリングされます。Pango はレンダリング・システムではありませんが、X フォント用のレンダリング・ルーチンが組み込まれています。他の出力装置の場合は、他の外部レンダリング・ルーチンが必要になります。以下の表は、例がレンダリングされるとどのように見えるかを示しています。

car  RAC EHT  in Arabic

Pango についてさらに

連載の第 2 回では、コード例を示すとともに、Pango がグリフを選択してテキストをレンダリングする方法について説明します。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology, Open source, Linux
ArticleID=239761
ArticleTitle=Pango の接続: 第 1 回
publish-date=03012001