DXライブラリでFreeType

2013年04月28日 ― [ 日記/コンピュータ/プログラム ]

DXライブラリは Windows アプリケーションとしての部分を意識せずに DirectX を使ったプログラムを作成できる素晴らしいライブラリである。

しかし、デフォルトの文字描画函数は WindowsAPI を用いたものであり、重い上にアンチエイリアスはあまり綺麗にはかからない。ついでに禁則処理などは用意されていないためもとのテキストを弄るなどしなくてはならない。

よって、Linux や Mac Type で用いられているフォントレンダリングエンジン「FreeType」で組版し、画像として出力するようなエンジンを作ってゆきたい。

FreeType は基本的にフォントファイルから字面(グリフ)の情報を取り出して描画するためのライブラリであり、組版の機能は持っていない。フォントファイルから文字ごとの高さや幅を取り出して並べなければならない。

まあ、それは先の話であり、まずは文字図形を取り出さなくてはならない。しかし、FreeType は汎用性を高めるためか、BMP や PNG の形式では出力してくれない。字面のデータは白黒で各ピクセル8ビット(256段階)で表したビットマップ画像の形として得られる。これをDXライブラリで描画するために変換しなくてはならない。

インターネットを調べると WindowsAPI を用いて BMP 形式で保存している例があったが、それだと Windows プログラミングに手を出さないといけない。そんな技術はないし、ゲーム用と考えると遅くて意味がない。

結局、BMP 形式のファイルをメモリ上に作成し、それをメモリからCreateGraphFromMem函数で直接読み込み描画することにした。BMP 形式についてはプログラミング/BMPファイル仕様 - ルーチェ's Homepageを参考にさせてもらった。はじめは透過32ビット BMP にしていたが、これだとメモリの消費量がひどいことになる。いろいろ試している内に、乗算描画すれば透過と同じ効果があることに気づき、8ビットBMPとした。

一度生成した BMP 画像はおいておき、ポインタを map(「文選箱」)で管理、もう一度同じ文字が呼ばれた際はそれを渡すようにした。

と、ここまでで文字を Unicode で指定すると BMP 画像を取得でき、指定位置に描画できる仕組みはできあがった。

これからはいよいよ文字を組み合わせて組版する部分を作ることになる。そのためには様々なコマンドを決めなくてはならない。そもそもコマンド解釈の方法を調べなくては。それに、Unicode で良いのかという疑問も残る。印刷物の作成には一般に AdobeJapan1-6 が使われているという。「IPAmj明朝」には HanyoDenshi なる文字管理コードが付与されている。欲を言えばこういうものにも対応させたい。

そのあたりの文字コードの話は正直よく分かっていないのだが、最近出た通称「IVS本」は誤りがいろいろひどいらしい。この方々の指摘に従って正誤表作れば十分すぎる気もするけれど……(笑)

参照:IVS本に容赦なく突っ込みまくるNAOIさん - Togetter(ちなみにこのまとめの登場人物のホームページはだいたい調べ物しているときに見たことがある気がする。インターネットの世界は意外と狭い)

まだまだ先は長い。


楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル