FreeTypeを使う 新しいページはコチラ
提供: yonewiki
(→サンプル1.Qt ConsoleApplicationでテキスト画像表示の解説) |
(→サンプル1.Qt ConsoleApplicationでテキスト画像表示の解説) |
||
412行: | 412行: | ||
改行コードの場合はこのif文の中の処理がおわったら、ほかの処理はもう必要ないので、全部を無視して、for文の最初にもどり、繰り返し処理を再開します。 | 改行コードの場合はこのif文の中の処理がおわったら、ほかの処理はもう必要ないので、全部を無視して、for文の最初にもどり、繰り返し処理を再開します。 | ||
+ | |||
+ | |||
+ | 107行目は、文字コードを含んだ text 配列の for文処理の対象文字について、フォントファイルのCMapと照合して、グリフ番号を返してくれる命令です。 | ||
+ | |||
+ | |||
+ | <Syntaxhighlight2 lang="cpp" line=107> | ||
+ | idces[i] = FT_Get_Char_Index(face, text[i]); | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | |||
+ | 引数にはフォント情報をもっている face を第一引数として設定、第二引数で文字コード番号を含んだ数値を設定。これで戻り値にはグリフ番号が取得でき、結果として、for文の処理が終わった所で文字コードをグリフ番号に変換することを実現している。この部分は、PDFで使った文字コードをグリフ番号で保持するPDFの仕様に対応できる部分だ。 | ||
+ | |||
+ | |||
+ | 次の行ではフォントの情報を保持できるクラスに対して、対象のグリフ番号の情報を保持するという処理を行う。まずは、情報を読み込む処理として | ||
+ | |||
+ | |||
+ | <Syntaxhighlight2 lang="cpp" line=109> | ||
+ | error = FT_Load_Glyph(face, idces[i], FT_LOAD_DEFAULT); | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | |||
+ | 109行目のFT_Load_Glyphを実行する。第一引数は一文字分のグリフ情報を保持するためのFT_Face クラスの変数 face を使う。先のグリフ番号取得でも使った face の役割はいくつかありそう。そうして読み込んだ状態では、そのメンバ関数がグリフに関する情報をさらに保持していけるので、次の命令を実行できる。 | ||
+ | |||
+ | |||
+ | それが115行目だ。 | ||
+ | |||
+ | <Syntaxhighlight2 lang="cpp" line=115> | ||
+ | error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); | ||
+ | </Syntaxhighlight2> | ||
+ | |||
+ | |||
+ | FT_Render_Glyphの第一引数の face->glyph メンバポインタ変数に描画後の情報の標準的なbitmap値を生成する。FT_RENDER_MODE_NORMALという列挙子によってbitmapに生成する仕組みがかわるようだ。これで、使えそうなbitmapが生成されたので、次の命令によって、キャンバスに反映させる。ここではキャンバスに反映させるが、ここはプログラムの用途によっていろいろな方法で情報を受け取ることになると思う。 | ||
+ | |||
+ | |||
+ | このチュートリアルでは逐一、テキスト配列を処理していく毎にキャンバスの色情報保持配列に反映させてしまう。それが121行目から125行目の処理となる。 | ||
+ | |||
+ | |||
+ | ビットマップ値はFT_Face型の変数faceを使って &face->glyph->bitmapのアドレス番号を先頭に保持されているので、この情報をプログラマ側で作ったキャンバスへ反映するdrawという関数の第一引数に指定する。この関数は、描画位置情報のxとyの値も必要としているので、改行したり、文字を描画がしたときに次のpenの位置を移動したりする操作をしていく。 | ||
+ | |||
+ | |||
+ | draw関数では、face->glyph->bitmap_leftに読み込んだビットマップの左側の座標を渡す。topは上側だ。かならずしも端の座標は 0 とは限らない。フォントをはみ出してマイナスの位置からグリフ情報をもっている可能性もあるためだ、その場合、少し戻った位置にたいしてキャンバスへの描画をおこなう必要がある。 | ||
+ | |||
+ | |||
+ | 文字の送り幅自体はface->glyph->advance.xでpen.xに反映させる。125行目 | ||
+ | |||
+ | |||
+ | 字詰めという処理を必要とするプロポーショナルフォントの場合は特に上記のような操作にしておかないと、はみ出た分の文字のデザインが描画されないばかりか、バランスがおかしくなる。 | ||
+ | |||
+ | |||
+ | これがおわるとキャンバスの配列ができあがる。これをビットマップに吐き出したり、標準出力に吐き出したり、テキストとして保存してみたりというのが、この先の処理だ。結果を目にみえるものにするのは楽しい。やってることは、単純だが、ここまで苦労して得られたものは、プログラマにしかわからない優越感を味わえる。フォントをイチカラ活用してやったぜ。っていう感じです。 | ||
+ | |||
+ | |||
+ | |||
+ | |||
− | |||