9,045 Lines
02/08/2008
9,045行
今日までに書いたコードの行数。
ここまでに次のようなコードを書きました。
- 基本的なストレージの実装
- Unicodeからグリフへの変換
- リガチャ(合字)への対応
- フォントのアセンダ、ディセンダ、レディングの取得
- グリフの幅(Advance)の取得
- テスト用アプリケーションの作成
まだまだ基礎工事の段階です。
僕はCocoa のText System をほとんど使わないで実装します。
使うのは文字列と文字属性を管理するNSTextStorage というクラスだけ。
それも内部の実装は全部オリジナルのコードで上書きしています。
そうしないとパフォーマンスをかせげないからです。
Leopard からCoreText という縦書きにも対応した新しいテキストレイアウトエンジンが組み込まれましたが、Mac OS 9 時代からあったATSUI(Apple Type Services for Unicode Imaging)で懲りているので使いません。どうしてもマイナーなバグに悩まされるのと、レイアウトのカスタマイズに柔軟性がないためです。
単純な文字のレイアウトであれば、Mac OS X のサービスで主に使うのは、フォントデータを取得するためのATS(Apple Type Services)と描画のためのCoreGraphics(Quartz)だけです。
文字をレイアウトして描画するだけなら次のAPI を使うだけです。Mac OS X が提供するこれらのAPIの性能が抜群に良いために高速にレイアウトと描画が行えるのです。
ATS
ATSFontFindFromPostScriptName
ATSFontGetTable
CoreGraphics
CGFontCreateWithPlatformFont
CGContextSetFont
CGContextSetFontSize
CGContextSetTextMatrix
CGContextSetTextPosition
CGContextShowGlyphsWithAdvances
これら以外の部分は全部自分で実装します。
フォントにはOpenType、TrueType、Type1、など何種類もありますが、それぞれのフォントファイルに含まれた生のフォントデータをATS を使って取り出して文字をレイアウトしていきます。幸いな事にほとんどの情報をWeb から得ることができるので、あとはコツコツと実装していくだけなのです。
OpenType は、“OpenType Specification v.1.4”
TrueType は、“TrueType Reference Manual”
から情報が得られます。TrueType Reference Manual の古くさいページは歴史を感じさせますね。
例えば、文字をグリフに変換するときはフォントのcmap という情報を使います。cmap はOpenType でもTrueType でも同じで、こんなドキュメントを見ながら実装します。フォントファイルはビッグエンディアンなのでインテルの場合にはフィールド一つ一つをひっくり返して読んでいきます。一つでも間違えると絶対に動きませんから慎重にコードを書いて何度も何度も走らせてデバッグする必要があります。
グリフの合成にはフォントフィーチャと呼ばれるしくみを使います。これはTrueType とOpenType で全く違う構造になっています。TrueType は68k の時代に設計されたためコンパクトで高速ですがとても複雑です。OpenType はTrueType よりもすっきりしていますが、工夫しないとTrueType よりかなり遅くなります。TrueType はドキュメントを読んだだけではなかなか理解できません。相当頭のいい人が設計したのだと思います。でもこれをクリアしないとリガチャやカーニングに対応できないのです。
次はカーニング情報の取得を実装します。カーニングがしっかりできると欧文がきれいに組めるようになります。
そろそろiPhone SDK が出てくるのに、僕はひたすら地味な作業です。。。