« そしてUniscribe | トップページ | Uniscribeの概要(2) »

2007年6月 5日 (火)

Uniscribeの概要

まず、UniscribeのAPI一覧をMSDNなどで見ると分かると思うが、UniscribeのAPIは主に二つに大別できる。

  • ScriptString系のAPI
  • それ以外の低レベルAPI

まず、ScriptString系のAPIは高レベルのAPIで、プレーンテキストつまり同一スタイル(フォントやサイズや色などが同じ)のテキストを処理する時に使用するAPIである。様々な国や地域で使われるスクリプトを含むテキストはアプリケーション側が任意の位置で勝手に分割して処理すると適切な結果を得られない可能性があり、基本的には、行単位などで処理する必要があるが(ExtTextOutを使う時も同様)、エディタなどで見られるキーワードの色分け表示などをする必要がなく同一スタイルで表示する時に使用するAPIである。次に、ScriptString系以外の低レベルAPIは、色分け表示など複数のスタイルでテキストを処理するときに使用するAPIである。また、以前にGetCharacterPlacementを用いたカーソル位置の決め方のブログを書いたが、UniscribeにはそのためのScriptCPtoXやScriptXtoCP(ScriptString系はScriptStringCPtoX、ScriptStringXtoCP)といった便利なAPIが既に用意されている。

ScriptString系の使い方は引数が多いことを除けば、以外に簡単に使用できるので、ここでは主に低レベルAPIを扱ってみる。

主な描画の流れは以下のようになる。

  1. ScriptItemizeで、テキストを実行単位(ラン)に分割。
  2. 複数のスタイルでテキストを処理する必要があれば、1で得られた実行単位を更に細かい実行単位に分割。
  3. ScriptShapeでシェーピングを行いグリフと表示属性を生成。
  4. ScriptPlaceでポジショニングを行いグリフの有効幅と2次元オフセット情報を生成。
  5. ScriptTextOutで描画。

まず、シェーピングとは、主にテキスト文字列からテキスト文字列を表すグリフインデックスの列を生成する処理を指す。以前紹介したWin32APIのGetGlyphIndicesも与えらたテキスト文字列からグリフインデックスの列を生成するが、GetGlyphIndicesは言語毎に必要な言語処理のグリフ置換(Glyph Substitution)が行われない。通常、フォントファイルには、文字コードからフォントファイル内のグリフを識別するグリフインデックスへの対応を表すマッピングテーブルを持つが、GetGlyphIndicesは単純にこのマッピングテーブルを用いた変換を行う。ちなみに、OpenTypeフォントでは、このテーブルをcmapテーブルと呼ぶ。そして、言語によっては、適切な表示を得るためにこの変換の後に更に変換が必要でこの処理を言語処理という。例えば、アラビア語を例にとると、アラビア語の文字は、文字の位置によって、字形が変化するものがある。これに対応するためには、更にグリフを変換する必要があり、これがグリフ置換である。ちなみに、これを行うときに使用されるテーブルをOpenTypeフォントではGSUBテーブルと呼ぶ。

次にポジショニングであるが、これはその名の通り、生成されたグリフをどう配置するかを決める位置決めの処理である。

とりあえず、ここまで。

« そしてUniscribe | トップページ | Uniscribeの概要(2) »

Windows」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/39651875

この記事へのトラックバック一覧です: Uniscribeの概要:

« そしてUniscribe | トップページ | Uniscribeの概要(2) »

自作ソフトウェア

無料ブログはココログ

メモ