2008年10月アーカイブ



みんなありがとー!


Twittererの人とか、メッセで話した人とか学校の連中とかにはもう伝わってると思うけど、筑波大AC入試に無事通ることができました。情報科学類です。来年からは(たぶん)つくば市内に住むことになると思います。


このことに関してお世話になったみなさん、ありがとうございました。とりわけ2次の結果待ちでgkbrしてたおれにメールで「id:Tnzkが落ちたという速報が!」などと追い打ちをかけたid:yaakaitoには感謝しています;-)


励ましはもちろんのこと、表面は辛辣でも中身は暖かい言葉をいただいたおかげで、少なくとも受験(というのは少しおこがましいのだけど)のことが不安で活動が手につかないということはなかったです。1次試験のための資料作成も含めて、楽しい受験活動でした。


筑波クラスタのみなさん、来年はよろしくお願いします!高専からの進学ということもあり、勝手がわからず戸惑うこともあるかもしれないので、お世話になると思います。どうかよろしくです。


鳥羽商船クラスタのみんなは、あんまり日常的に関わることはできなくなって残念だけど、特にid:Waroeは来年のSCTの運営・扇動をがんばって>< おれもリモートで手伝えることは手伝うよ。当たり前かもしれないけど、そこは後にも先にも一番思い入れのある学校だ。


会社のみなさん、まだまだ未熟なぼくを信じてくれてありがとうございます!これからが重要な時期になる思っていますので、今後ともよろしくお願いします。来年からはぼくも首都圏なので色々効率よくなるといいと思ってます。


地元の知り合いのみんな(読んでるかどうか微妙だけどw)はほとんど会う機会がなくなると思うので寂しいですけど、2月くらいまでは確実に伊勢にいるので、年賀状は現住所に頼みます(笑


関東圏の大学に進学する人はお知らせしてねー。そのうちお会いしましょう。


お礼はもう、言っても言ってもきりがないのであとはお話しする機会があったときに伝えたいと思います。ありがとうございました!


なんか長くなりすぎました。高専から進路変更で進学する場合は卒業式とかがないので、その代償行為を無意識に行っていたのかもしれません(笑


本題:筑波大AC入試一次試験について


知ってる人は知ってると思うのだけど、筑波のAC入試は一次試験と二次試験がある。その一次試験について、色々思ったことがあるのでまとめておく。


自己推薦書の提出


いわゆる書類審査。9月の頭くらいに提出する。


自己推薦書の中には何を書いてもいい。書式にも分量にも規定はない。情報科学のACだったら、どんなソフトを作ったとかどんなWebサービスを作ったとかどんなコンテストに出たとか書くのが一般的みたい。


ぼくもご多分に漏れず、Webサービス開発・ゲーム開発の経験やロボコン、プロコンへの参加や、所属しているベンチャーでの活動についてをまとめた。


枚数は70枚強。というと多いかのように聞こえるけど、このうち30ページと少しはアセンブリのコード(性質上、20文字ほどで改行するので異様に行数が増える)だし、ぼくは式を書くとき上下にやたら余白をとるので、文章の記述量としては40枚を越えてないと思う。


副作用の原因:自己推薦書


この自己推薦書、マ・クベみたいな言い方になるけど、とても良いもの。


というのが、早い話が自分の活動の壮大な中間報告になるわけだ。


特にこの分野の若い人たちは、そのときそのときの活動に熱中するあまり2ヶ月前に完了したプロジェクトことをすっかり忘れていたりする。それはそれでとても良いことなのだけど、筑波情報科学ACを受けるに際して自己推薦書を書くことで:



  • 今まで自分がどういう動きをとってきたか

  • 全体的に自分の意識はどうしたいのか

  • 自分の無意識はどうしたいのか

  • それら踏まえた上でこれからどうすべきなのか


ということをはっきりと認識することができる。枯れた言い回しをするなら、自分自身と向き合うことができる。


一番重要なのは、それを通しての考えの変化や成長が、試験の合否がどうであろうと自分のものになることだ。


からくも合格とならなかった友人がいるのだけど、彼も試験前と試験後では別人かと思うくらいに成長していた。


具体的には、あやふやだった「プログラマになりたい」という目標から「人工知能技術の研究者」まで固まり、そのために「まずは機械学習」と自身でステップを組み立てるまでに至っていた。たった2ヶ月あまりの成長としてはとても大きな歩幅だと思う。


自分を推薦するということの苦しさ


自己推薦書を書くためには、一度今いる場所で足を止めて、これまで歩いてきた道筋をなぞってみる必要がある。


そこにはたぶん、苦しかったりつらかったりした記憶がたくさん堆積していると思う。その中には意識的に、あるいは無意識のうちに押し隠そうとしていたこともあるだろう。


そういったものとも向き合わなければならないという意味では、このAC入試一次試験における自己推薦書の作成は、人生の中でもなかなかないくらい深く、自分のトラウマをえぐらなければならないタイミングだともいえる。


ぼくも当然、わかりやすい言葉でいえば「黒歴史」と化した過去さえも動員しなければならないと判断して、自分の胸の奥を掘り返すことがあった。やっと掴んだ自分なりの答えの下に積み重ねられいる、数えきれないくらい多くの失敗をひとつひとつ選別しなければならなかった。


ただそういった苦しみ、自分の過去の多くの失敗を見据えなければならないということは、場合によってはとても良い効果を産み出すことがある。


ひとつの失敗に深く深く切り込んで、その原因を究明しようとするのはあまりオススメできない試みだと思う。どれほど深く掘り下げてみても、失敗の中心にあるのは結局失敗だし、しかも概ねの場合その失敗という星は無限の半径を持っている。だからいつまでも悲しい気持ちのままになる。


ひとつひとつの失敗はその表面を軽く眺めたまま、たくさんの失敗を一度に並べてみることが重要だ、とぼくは思う。そうするとちょうど星々が星座を形づくるように、失敗たち全体の構成するぼんやりとした形があることに気づく。


つまり、多くの失敗の原因となる自分自身の根本的な欠陥が存在することに気づくわけだ。個々の失敗を粉砕するより、こちらを直したほうが手っ取り早い。


自分を推薦するという快感


そして当然、自己推薦書の作成には楽しさだってある。正確には作成中にというより、できあがった書類を見たときに感じることになるけど。


おそらく、そこに記述されたことがらは自分で思っていたよりも量が多いし、迫力が出ている。


これに関してはもう説明不要かもしれない。あなたの作ったプラモデルのカッコよさを一番よく知っているのはあなただ。それがいつの間にか、自己推薦書というジオラマに最高のシチュエーションで配置されている。それを見て感動を覚えるなというほうがおかしい。


さいごに


なんかびっくりするくらい長くなりましたが、特にキューイチ世代の高校二年生の人たちはぜひACを受けてほしいと思います。向いていると思うので。


あと、今期AC入学予定者の人は、向こうに行ってから寂しがりそうなぼくとお知り合いになっておいてくださるととてもうれしいです。連絡先は以下:



  • Gmail: tnzk.marge@gmail.com

  • Windows Live (MSN)Messenger: kyou80@hotmail.com

  • twitter: @tnzk


ホントにホームシックにかからないか今から心配です。たぶん大丈夫ですけど。ハムスターでも飼おうかしら。


参加表明

| コメント(0) | トラックバック(0)



OpenCVがらみのエントリに対してのトラックバックがあったことに今しがた気づいて、それを読むとMISTというライブラリがあるそうな。今のところOpenCVしか使ったことがないので、視野を広げるためにこいつも使ってみようと思う。


MIST 1.3.6のソースコードの入手


とりあえず本家TracMISTのダウンロードと環境設定を参考に、MISTのソースコードを入手。安定版の最新らしいMIST-1.3.6を使う。



% cd ~/
% mkdir -p src/mist-1.3.6
% cd src
% svn checkout http://mist.suenaga.m.is.nagoya-u.ac.jp/svn/mist/tags/version1.3.6 mist-1.3.6

mist-1.3.6の中を見てみるとbuildというディレクトリがあったので、この中でmakeしてみる。するとしばらくコンパイルが進んだあとに、以下のような文句を言われてコケる。



/usr/bin/ld: cannot find -llapack
collect2: ld はステータス 1 で終了しました
make[1]: *** [region_growing_test] エラー 1

llapackってなんだ?と思ってググるとこのようなページが。内部で行列演算を高速に行うために利用しているライブラリらしい。なので、こいつをビルドしてやる。


CLAPACKの入手・コンパイル


先ほどのページに従って作業を進める。進めようとする。まずはソースコードの入手と解凍。



% cd ~/src
% wget http://www.netlib.org/clapack/clapack.tgz
% tar xvfx clapack.tgz
% cd CLAPACK-3.1.1.1


次に,UNIX系の場合は clapack.tgz を解凍して,INSTALLフォルダの中にある各OSにあった make.inc.[OS名] (CYGWINの場合は make.inc.LINUX を利用する)を解凍後の一番上のフォルダにコピーします.あとはビルドすればOK.



とのことだが、INSTALLにはmake.inc.LINUXなんてない。だめもとでmake.inc.exampleをリネームして使ってみるけど当然だめ。


調べてみると、このバージョン(3.1.1.1)にはmake.inc.LINUXが欠けているらしい。



3.0のmake.inc.LINUXを参考に3.1.1のmake.inc.sampleを次のように書き換え、それをmake.incとします。


1.「SHELL = /bin/sh」を追加


2.「CC = gcc -ffloat-store」に変更。-ffloat-storeオプションをつけないとclapackのテストに通りません。


(詳細 ttp://icl.cs.utk.edu/lapack-forum/archives/lapack/msg00429.html)


3.「CFLAGS = -funroll-all-loops -O3」に変更


4.「LOADOPTS = $(CFLAGS)」に変更


5.「NOOPT = 」に変更(NOOPTは空にする)


cygwinのgccのデフォルトの出力ファイル名はa.exeになっているため、


F2CLIBS\libf2c\Makefileの186行目と187行目のa.outをa.exeに変更します。


以上でコンパイル、テストともに通るはずです。本当にありがとうございました。


BLAS 質問・相談スレッド1

多謝。このとおり変更する。F2CLIBS/libf2c/Makefileも書き換えようとしかけたけど、これはCygwinの場合の話だということにぎりぎりで気がつく。


これがおわればmakeするだけ。f2clibとblaslibはすぐに終わるが、lapacklibについては10分近く時間がかかるので注意。別に注意したところで短くなるわけではないのだけど...



% make f2clib
% make blaslib
% make lapacklib

で、できあがったファイルを見るとlibF77.a、libI77.aがない。調べていると先ほどのMIST Tracに HowToUseLapack 窶? MIST Project としてバイナリが配布されていたので、とりあえずこれを使うことに。/usr/local/libにコピー。


MISTのビルド


さあこれで問題なかろう、と再度make。


すると今度はやたら多量のエラーが出た。内容はどうもTIFF関連っぽいので調べてみると、libtiffのインストール漏れ。aptでインストールして再開。


今度はfltk-configがないと言われてる様子。fltkについては公式tracでは一切言及されていないので戸惑う。とりあえずaptでlibfltk1.1とlibfltl1.1-devをインストール。エラーは減る。


再度makeすると、またなにやら関数がないとのこと。で、関数名を見てみると、



% make
=== making ../test ===
volumerender_test.obj: In function `volr_draw_area::draw()':
volumerender_test.cpp:(.text+0xd36): undefined reference to `gluOrtho2D'
volumerender_test.cpp:(.text+0xdb8): undefined reference to `gluLookAt'
collect2: ld はステータス 1 で終了しました
make[1]: *** [volumerender_test] エラー 1

なんでGLU...('・ω・`)


ご存知の人はご存知でしょうが、GLUはOpenGL UtilityでOpenGLを使用する際に便利な関数を提供してくれるライブラリ。さすがにOpenGLをインストールしなきゃMISTが動かないなら、それは公式Tracに書くはず。


まさか、と思ってmake clean && makeすると、案の定コンパイルされてるソースのファイル名はすべて*_test.cpp……


結局むちゃくちゃ躍起になっていたのはテストコード用のライブラリ集めにしかならなかったようです。うーん、ものすごい時間を無駄にしたなー。明日は実際にmist使って何か書いてみる




カメラでキャプチャした画像にテキストをオーバレイしようと思ったんだけど、OpenCVのテキスト描画機能が貧弱(どのくらい貧弱かは『opencv.jp - OpenCV: テキスト(Text)サンプルコード -』のページ最下部のサンプルを参照)で、加えてASCIIな文字列しか扱えないそうだったので別の方法を考えることにした。


TrueTypeとかOpenTypeなフォントを扱うライブラリとしてはFreeTypeが有名。ベクタデータで表現されているフォントデータを、扱いやすいビットマップデータにしてくれる。


ビットマップにさえ持ち込んでしまえばあとはこちらで勝手に合成すればいいので、そこまでをいい感じに自動化してくれるラッパーを作りたい。そのためにとりあえず何らかのテキストを適当にビットマップに書き出してみた。


開発環境


高専プロコンに向けての調整の合間に作ったので、学校で使用している環境での作業となった。開発環境は以下のとおり。



  • Windows XP Pro

  • Visual C++ Express Edition

  • Core 2 Quad(2.66GHz)

  • 2GB


ちなみにid:Tnzkの自宅のPCはCeleron D, 516MB\(^0^)/


FreeTypeのインストール


Win用のバイナリはGnuWin32 projectにより提供されている。ダウンロードページのDownload節にある表の、Binariesの項目がWin用のバイナリ。"Zip"のリンクから落とせる。現時点での最新版は2.3.5らしい。


落としたzipは展開して適当な場所へ。ぼくはC:\freetypeに配置しました。


VC++プロジェクト作成


VCにて、空のプロジェクトを新規作成する。コンソールアプリケーション。


作成したらプロジェクトのプロパティを開き、構成プロパティを開き、以下の設定をする。



  • C/C++→全般→追加のインクルードディレクトリに、C:\freetype\include\freetype2;C:\freetype\includeのふたつを追加。

  • リンカ→追加のライブラリディレクトリにC:\freetype\libを追加。

  • リンカ→入力→追加の依存ファイルにfreetype.libを追加。


サンプルのビルド


FreeType Projectのページにはチュートリアルがある(FreeType 2 Tutorial)ので、まずはこれをビルドしてみる。コードを少しずつ書きながら完成に近づいていく形式なのでコピペしづらい。というかマークアップが特殊なのかコピペすると改行が残らない。エディタにコピペしてs/\;/\n\;/gすると幾分か楽になります。


7. Simple Text Rendering(見出しにくらいアンカーしてくれてもいいのに...)という項目があるが、これはレンダリングまで記述してあるわけではなく、my_draw_bitmapとかいう関数を呼んでお茶を濁してある。まあとりあえずは表示せずに、ビットマップにまで持ち込むことができれば良いので、my_draw_bitmapのくだりを省いてビルド→実行。動いたもののとてもむなしい。


ビットマップファイルに保存


ちゃんとラスタライズされてるかわかんないので、ビットマップに保存することに。かといってWin32APIにはなるべく関わりたくない(多くの開発者にはこの気持ちが理解していただけると思う)ので、なるべく出来合いのもので済ませようとしたところ、SaveBitmapFile( HDC, HBITMAP, LPCSTR)な使いやすそうな関数を公開している人がいたのでこれを利用することにした。「かなり使えるんで使いたいかたはどうぞ」とのこと。本当にありがとうございました。


SaveBitmapFileはデバイスコンテキストとビットマップのハンドルを準備する必要があるようなので、この辺りは仕方ないので自分で準備することにした。


一文字ごとに保存

チュートリアルを見ると各文字ごとにビットマップを生成しているようなので、まずは各文字ごとにそれぞれファイルを作成することにした。



#include <string.h>
#include <windows.h>
#include <ft2build.h>
#include FT_FREETYPE_H

#include "SaveBitmap.h"

int _main(){
FT_Library library;
FT_Face face;

FT_GlyphSlot slot;
FT_UInt glyph_index;

BYTE* m_pbits;
HBITMAP hBitmap;
BITMAPINFO *info;
info = (BITMAPINFO*)malloc( sizeof(BITMAPINFOHEADER));
ZeroMemory( info, sizeof(BITMAPINFOHEADER));
info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

char text[] = "Hello, world!";
TCHAR filename[] = L"testA.bmp";
int pen_x, pen_y, n;
int num_chars = (int)strlen( text);

// FreeTypeの初期化とTrueTypeフォントの読み込み
FT_Init_FreeType( &library );
FT_New_Face( library, "C:\\WINDOWS\\Fonts\\trebuc.TTF", 0, &face );
slot = face->glyph;

FT_Set_Char_Size( face, 0, 16 * 64, 300, 300);

pen_x = 300;
pen_y = 200;
for ( n = 0;n < num_chars; n++ ){
int i;
DWORD writeSize;
FT_Bitmap bitmap;
HDC memDC;
HDC hBuffer;
HANDLE fh;
BITMAPFILEHEADER head={0};
RECT rect;

// n文字目の文字をビットマップ化
FT_Load_Char( face, text[n], FT_LOAD_RENDER);
bitmap = slot->bitmap;

// ビットマップヘッダの設定
head.bfType = 'MB';
head.bfSize = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER) + bitmap.rows * bitmap.width * 4;
head.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
info->bmiHeader.biWidth = bitmap.width;
info->bmiHeader.biHeight = bitmap.rows;
info->bmiHeader.biPlanes = 1;
info->bmiHeader.biBitCount = 32;
info->bmiHeader.biCompression = BI_RGB;
info->bmiHeader.biSizeImage = bitmap.rows * bitmap.width * 4;
info->bmiHeader.biXPelsPerMeter = 0;
info->bmiHeader.biYPelsPerMeter = 0;

// DIBを作成
hBitmap = CreateDIBSection( NULL, info, DIB_RGB_COLORS, (VOID**)&m_pbits, NULL, 0);

// デバイスコンテキストを作成
memDC = CreateCompatibleDC( NULL);
hBuffer = CreateCompatibleDC( memDC);
SelectObject( memDC, hBitmap);
rect.left = 0;
rect.top = 0;
rect.bottom = bitmap.rows;
rect.right = bitmap.width;

for( i = 0; i < bitmap.rows * bitmap.width; i++){
SetPixel( memDC, i % bitmap.width, i / bitmap.width, RGB( bitmap.buffer[i], bitmap.buffer[i] >> 1, bitmap.buffer[i] >> 2));
}
// ビットマップを保存
SaveBitmapFile( memDC, hBitmap, filename);
filename[4]++;
pen_x += slot->advance.x >> 6;

}

return 0;

}

実行すると、文字列ごとにtestA.bmp, testB.bmpといったように連番で保存する。以下のような感じ。


f:id:Tnzk:20081005205452p:image


チュートリアルどおりに適当に動かしたところ8bitのグレースケール画像が作成されたので、SetPixelでオレンジ色になるように描画してみた。あくまでFreeTypeはフォントの形状を扱うだけなのでグレースケールを主に使うっぽい。まあそれさえあればグラデーションでも何でもできるので問題ないはず。


文字列を1枚の画像として保存


各文字ごとに保存できれば簡単な話だろなー、と思って次のように書いた。



#include <string.h>
#include <windows.h>
#include <ft2build.h>
#include FT_FREETYPE_H

#include "SaveBitmap.h"

int main(){
FT_Library library;
FT_Face face;
FT_GlyphSlot slot;
FT_UInt glyph_index;
FT_Error error;

char text[] = "Hello, world!";
TCHAR filename[] = L"test.bmp";
int pen_x, pen_y, n;

FT_Init_FreeType( &library );
FT_New_Face( library, "C:\\WINDOWS\\Fonts\\trebuc.TTF", 0, &face );
slot = face->glyph;
FT_Set_Char_Size( face, 0, 16 * 64, 300, 300);

BYTE* m_pbits;
HBITMAP hBitmap;
BITMAPINFO *info;
BITMAPFILEHEADER head={0};
HDC memDC;
HDC hBuffer;

head.bfType = 'MB';
head.bfSize = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER) + 640 * 480 * 4;
head.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);

info = (BITMAPINFO*)malloc( sizeof(BITMAPINFOHEADER));
ZeroMemory( info, sizeof(BITMAPINFOHEADER));
info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
int num_chars = (int)strlen( text);

info->bmiHeader.biWidth = 640;
info->bmiHeader.biHeight = 480;
info->bmiHeader.biPlanes = 1;
info->bmiHeader.biBitCount = 32;
info->bmiHeader.biCompression = BI_RGB;
info->bmiHeader.biSizeImage = 640 * 480 * 4;
info->bmiHeader.biXPelsPerMeter = 0;
info->bmiHeader.biYPelsPerMeter = 0;

hBitmap = CreateDIBSection( NULL, info, DIB_RGB_COLORS, (VOID**)&m_pbits, NULL, 0);

memDC = CreateCompatibleDC( NULL);
hBuffer = CreateCompatibleDC( memDC);

SelectObject( memDC, hBitmap);

int cpos_x = 50;

pen_x = 300;
pen_y = 200;
for ( n = 0;n < num_chars; n++ ){
int i;
DWORD writeSize;
FT_Bitmap bitmap;
RECT rect;

FT_Load_Char( face, text[n], FT_LOAD_RENDER);
bitmap = slot->bitmap;

rect.left = 0;
rect.top = 0;
rect.right = 640;
rect.bottom = 480;
for( i = 0; i < bitmap.rows * bitmap.width; i++){
SetPixel( memDC, ( i % bitmap.width) + cpos_x, ( i / bitmap.width), RGB( bitmap.buffer[i], bitmap.buffer[i] >> 1, bitmap.buffer[i] >> 2));
}
cpos_x += bitmap.width + 5;
pen_x += slot->advance.x >> 6;
}

SaveBitmapFile( memDC, hBitmap, filename);
}

書いたところ、次のようなことになった。繰り返しになるがFreeTypeはフォントの形状だけを扱い、レイアウトやカラーリングなどには関与しない。


f:id:Tnzk:20081005205453p:image


というわけで、まず描画領域(左上の座標と幅、高さ)を設定し、描画を開始するy座標と高さの和から文字の高さを引いたものをオフセットとし、このオフセットを加えて描画するようにした。次のようなコード。



#include <string.h>
#include <windows.h>
#include <ft2build.h>
#include FT_FREETYPE_H

#include "SaveBitmap.h"

int main(){
FT_Library library;
FT_Face face;
FT_GlyphSlot slot;
FT_UInt glyph_index;
FT_Error error;

char text[] = "Hello, world!";
TCHAR filename[] = L"test.bmp";
int pen_x, pen_y, n;

FT_Init_FreeType( &library );
FT_New_Face( library, "C:\\WINDOWS\\Fonts\\trebuc.TTF", 0, &face );
slot = face->glyph;
FT_Set_Char_Size( face, 0, 16 * 64, 300, 300);

BYTE* m_pbits;
HBITMAP hBitmap;
BITMAPINFO *info;
BITMAPFILEHEADER head={0};
HDC memDC;
HDC hBuffer;

head.bfType = 'MB';
head.bfSize = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER) + 640 * 480 * 4;
head.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);

info = (BITMAPINFO*)malloc( sizeof(BITMAPINFOHEADER));
ZeroMemory( info, sizeof(BITMAPINFOHEADER));
info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
int num_chars = (int)strlen( text);

info->bmiHeader.biWidth = 640;
info->bmiHeader.biHeight = 480;
info->bmiHeader.biPlanes = 1;
info->bmiHeader.biBitCount = 32;
info->bmiHeader.biCompression = BI_RGB;
info->bmiHeader.biSizeImage = 640 * 480 * 4;
info->bmiHeader.biXPelsPerMeter = 0;
info->bmiHeader.biYPelsPerMeter = 0;

hBitmap = CreateDIBSection( NULL, info, DIB_RGB_COLORS, (VOID**)&m_pbits, NULL, 0);

memDC = CreateCompatibleDC( NULL);
hBuffer = CreateCompatibleDC( memDC);

SelectObject( memDC, hBitmap);

int cpos_x = 50;
int cpos_y = 60;
int cpos_w = 640;
int cpos_h = 50;

pen_x = 300;
pen_y = 200;
for ( n = 0;n < num_chars; n++ ){
int i;
DWORD writeSize;
FT_Bitmap bitmap;
RECT rect;

FT_Load_Char( face, text[n], FT_LOAD_RENDER);
bitmap = slot->bitmap;

rect.left = 0;
rect.top = 0;
rect.right = 640;
rect.bottom = 480;
int offset_y = cpos_h - bitmap.rows + cpos_y;
for( i = 0; i < bitmap.rows * bitmap.width; i++){
SetPixel( memDC, ( i % bitmap.width) + cpos_x, offset_y + ( i / bitmap.width), RGB( bitmap.buffer[i], bitmap.buffer[i] >> 1, bitmap.buffer[i] >> 2));
}
cpos_x += bitmap.width + 5;
pen_x += slot->advance.x >> 6;
}

SaveBitmapFile( memDC, hBitmap, filename);
}

結果は次のとおり。いい感じになった気がする。


f:id:Tnzk:20081005205454p:image


課題点


神経質な人にはわかると思うのだけど、コンマの位置がやけに高い(ぼくは言われるまでまったく気がつかなかった)。これはビットマップデータの高さを基準に座標を決定しているから起きる問題で、文字にはそれとは別に「ベースライン」という考え方があるらしい。これもやはりFreeTypeによって取得できるようなので、次はベースラインでの配置を行おうと思う。


このアーカイブについて

このページには、2008年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年8月です。

次のアーカイブは2008年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.32-ja