« MacintoshでSLビューアを起動するとログイン画面になる前にクラッシュ | トップページ | Pango対応ビューアの12月13日版をアップロードしました »

2008年12月 7日 (日)

MacOSのPangoはイマイチなのかも

うーむ。

やっとMacOSでPango対応ビューアが動くようになりました。今までは動かすことで頭がいっぱいだったのですが、動くバイナリができたので、いろいろと機能のテストをやりました。そうしたら、予想以上に、MacOSとpangoは相性が悪いことを思い知らされました。

いや、日本語は別に問題ありません。日本語ユーザにとってのpango対応の意味は主に禁則処理だと思うのですが、禁則処理はMacOSでも問題なく働きます。問題はいわゆる複雑な文字、つまり、インド系の文字とかアラビア系の文字とかの扱いにあります。

以下、何がどういう風に問題なのか、まとまりなくずらずら書きます。どうやって回避するか、現在考え中です。

pangoというのは主に文字の配置を扱うライブラリです。フォントファイルのデータに基づいて個々の文字を描画 (ラスタライズ) する機能はpango自体は備えていず、別のAPIを呼び出す仕組みになっています。ラスタライズを担当するAPIをpangoではラスタライズバックエンドと呼びますが、これは複数提供されていてアプリケーションが選ぶようになっています。

従来私が作ってきたpango対応ビューアでは、pangoのライスタライズバックエンドはpangoft2という、要はFreeTypeライブラリを使うものを前提にしていました。これを選んだ理由はいくつかあって、

  • どのプラットフォームでも共通に利用できるバックエンドは事実上これだけであること。pangoxftはX11でしか使えず、pangowin32はWindowsでしか使えない。pangocairoは、pangoから見るとプラットフォーム独立だが、内部ではプラットフォーム固有のフォントラスタライザを呼び出しており、動作がプラットフォームごとに異なる。
  • GTKの元祖であるGIMPは、もっぱらpangoft2を使ってテキストを描画しており、実績がある。
  • もともとSLビューアはFreeTypeを使ってテキストを描画するようになっており、そこから改造するのに相性がいいと思った。

ところで、最初に作っていたLinux版が動くようになる前から、並行して、WindowsやMacOSでのpangoの状況を調べていました。Windowsでは特に問題を聞きませんでしたが、実はMacOSでは、アラビア文字がうまく表示できないという報告をウェブでみつけていました。テストプログラムを作って試してみると、確かにアラビア文字のシェイピングがうまくいきません。しかし、pangoft2を使わずにpangocairoを使うときれいに表示されます。それで作戦を変更し、当面はpangoft2とpangocairoの併用にしたのです。(pangocairo対応は、20081031版には間に合いませんでしたが、20081123版に入れました。)

ところが、ここにまた落とし穴がありました。MacOSのpangocairoは、フォントの自動補完が機能しないようなのです。これはどういうことかというと、アラビア文字を表示するためにはアラビア文字フォントを指定しなければならず、アラビア文字フォントを指定すると今度はアラビア文字以外の文字がまったく表示されないのです。

これには、まいりました。

さらにいろいろ調べると、pango/cairo の MacOS (というか、darwinと書いていたが) 対応のメンテナの人が「Linuxのcairoでは、指定されたフォントに含まれないグリフを他のフォントを使って補完してしまうが、darwinではそういう動作をしないように直した」と書いているのを発見しました。どうやら、このメンテナ氏は、補完しないのが正しい動作だと考えていて意図的にそうしているようなのです。なぜだかわかりませんが。困ります。

ところで、そもそもの、pangoft2がどうしてMacOSだとアラビア文字をちゃんとシェイピングできないか、なのですが、

これは、OSの問題というよりはフォントファイルの仕様の問題で、もっというとTrueType仕様をめぐるAppleとMicrosoftの駆け引きの結果であることがわかりました。

TrueTypeというのはもともと,AppleがAdobeの支配力を弱めるために戦略的に設計したファイル形式なわけですが、当時Apple単独でAdobeに対抗するのが厳しかったためMicrosoftとつるんで業界標準として確立させたわけです。これはおおむね1990年代の初めくらいの状況。

その後、Appleの思惑通りに、ハイエンドプリント分野を除いてはAdobeのテクノロジの影響力が弱まると、今度はAppleとMicrosoftの争いの構図になり、両者はTrueTypeの共同開発をやめ、それぞれ独自に発展させることになってしまいました。この断絶は1990年代半ばに起き、Appleが独自にTrueTypeを拡張したフォーマットがQuickDraw GXと同時に投入されたTrueType GX、同時期にMicrosofotが独自にTrueTypeを拡張したフォーマットがTrueType Openでした。さらにその後、AppleがTrueType GXをさらに独自に拡張したものが現在のAAT (ATSUI として知られるライブラリのベース)、Microsoftがなぜかかつての仇敵Adobeと組んでTrueType Openを発展させたのがOpenTypeになっています。

この結果、Windowsの標準フォントは、TrueType Open仕様またはOpenType仕様、MacOSの標準フォントはすべてAAT仕様、ということになっています。両者はもともと共通仕様だったTrueType 1.0を拡張した仕様なので、基本的な部分には互換がありますが、拡張仕様には互換がありません。

困ったことに、アラビア文字のシェイピング情報は、互換がない拡張仕様の一部なんですね。

OpenTypeでは、シェイピングは、ひとまとめにしてOpenType Layout (OTL) と呼ぶ形式でフォントファイル中に格納されています。GDEF、GSUB、GPOSという三つのテーブルが主要な働きをします。AATでは、これに相当する情報はmorxというテーブルに入るのです。

現在のpangoft2は、GDEF/GSUB/GPOSは扱えますが、morxは扱えません。MacOSのアラビア文字フォントにはGDEF/GSUB/GPOSというテーブルが入っていないために、MacOSでpangoft2を動かすと、アラビア文字をうまく処理できないのです。

さて、私はどうしたらいいのでしょうか。

« MacintoshでSLビューアを起動するとログイン画面になる前にクラッシュ | トップページ | Pango対応ビューアの12月13日版をアップロードしました »

コメント

コメントを書く

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

トラックバック

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

この記事へのトラックバック一覧です: MacOSのPangoはイマイチなのかも:

« MacintoshでSLビューアを起動するとログイン画面になる前にクラッシュ | トップページ | Pango対応ビューアの12月13日版をアップロードしました »