テキストの表示(Ming/C++)
Ming(C++版)を使用してテキストを表示するFlashコンテンツを作成してみる.
Mingでテキストを表示するには,フォント情報を格納したfdbファイルが必要である.
fdbファイルは本家から,Ming-fontsをダウンロードし解凍すると,得られる.
また,本家には,ttf2fftというttfファイルからfftファイルを生成するツールがあり,これを使用して作成する方法もある.
本家から取得できるfdbファイルでは,日本語を使用できないので,今回は後者の方法にてfdbファイルを作成する.
まず,ttf2fftのビルド.
$ tar zxf ttf2fft-1.0.tar.gz $ cd ttf2fft $ make $ gcc -o ttf2fft *.cxx `freetype-config --cflags` `freetype-config --libs` -lm -lstdc++ $ ./ttf2fft TrueType to FFT (Macromedia Flash Font format) font converter. Version 1.0 Copyright (c) 2002 by Dmitry Skavish. All right reserved. ...以下省略...次にビルドしたttf2fftを使用して,ttfファイルから,fftファイルを作成する. 私の環境にはSazanamiMincho-Regular.ttfがあったので,これを使用してみる. まず,fftファイル情報を見てみる.
$ ~/usr/local/ming/ttf2fft/ttf2fft -l /var/lib/defoma/fontconfig.d/S/SazanamiMincho-Regular.ttf There is 1 face in this file. ----- Face number: 0 ----- family: Sazanami Mincho style: Mincho-Regular charmaps: 0: platform: Apple Unicode, encoding: Unicode 2.0 1: platform: Macintosh, encoding: Roman 2: platform: Microsoft, encoding: Unicode後で出てくるが,Ming-0.3では,日本語表示にはUTF8が使用できる. で,上記charmapsの0番がUnicodeなので,これを指定しつつfftを作成.
$ ~/usr/local/ming/ttf2fft/ttf2fft -e 0 -o MyFont.fft /var/lib/defoma/fontconfig.d/S/SazanamiMincho-Regular.ttf
Converting font /var/lib/defoma/fontconfig.d/S/SazanamiMincho-Regular.ttf
family: Sazanami Mincho
style: Mincho-Regular
using charmap: 0: platform: Apple Unicode, encoding: Unicode 2.0
retrieving chars from current charmap ... found 14605 chars
using 2-byte char codes
retrieving glyphs outlines ... done.
generating glyph outlines ... done.
using wide glyph offsets
generating layout
writing advance table
writing bbox table
no kerning table found!
さらにMingをインストールすると使用できるmakefdbを使用してfftからfdbを作成する.
$ makefdb MyFont.fft Found DefineFont2 block at offset 23 Block length: 5097661 Writing Sazanami Mincho.fdb, 5097663 bytes出力ファイル名は,フォントファミリー名.fdbなので,使用しやすいようにリネームしておく.
$ mv Sazanami\ Mincho.fdb MyFont.fdb以上でfdbファイルの準備ができた.
テキストを表示するだけのサンプルを以下に示す.
Mingで作成するFlashコンテンツの基本は,Movieの上にテキストや図形,ムービークリップを配置し,それを動かすことでである.
そこでまず,SWFMovieを作成し,その属性(サイズ,背景色,レート)を指定する.
// とにかくSWFMovieがベース. SWFMovie *movie = new SWFMovie(); // サイズ指定. movie->setDimension(movie_size_x, movie_size_y); // 背景色指定. movie->setBackground(0x00, 0xff, 0xff); // 動画のレート(fps)を指定. movie->setRate(0);次に,このSWFMovieに配置するテキストの準備. テキストを作成するには,まず,フォントが必要になる. ここで先に作成してfdbファイルを読み込む.
// フォントの読み込み
errno = 0;
FILE *f = fopen(FDB_FILE, "rb");
if (errno != 0) {
perror("failed to open FDB_FILE(" FDB_FILE ").");
return 1;
}
SWFFont *font = new SWFFont(f);
そして作成したフォントSWFFontを使用してテキストを作成し,テキストの色を設定する.
SWFText *text = new SWFText(); text->setFont(font); text->setColor(0xff, 0xff, 0xff, 0xff); text->setHeight(text_height);SWFTextに対して,表示開始位置を指定し次に,表示文字列を指定する.
for (int i = 0; i < text_line_no; i++) {
const char* display_text = *(display_texts + i);
// テキスト開始位置の算出
int start_x = (movie_size_x / 2)
- (int)(font->getWidth((const unsigned char*)display_text) / 2.0);
int start_y = (movie_size_y / (2 * text_line_no)) * (i + 1)
- (text_height / 2);
// テキストの配置
text->moveTo(start_x, start_y);
text->addUTF8String(display_text);
}
サンプルでは,文字列データが三つあり,それをループでSWFTextに対し指定している.
文字列毎にmoveToで表示開始位置を指定し次に,表示文字列を指定する点に注意.
また,ここでは文字列の指定に
SWFText#addUTF8String(const char *string, int *advance=NULL)を使用している. 日本語表示の場合は,これを使用する必要があるが,ASCII文字のみ使用であれば
SWFText#addString(const char *string, int *advance=NULL)でもよい. なお,表示開始位置の算出のため,SWFFont#getWidthを使用して文字列データ幅を取得しているが,日本語だと正しい値が取得できないようだ. 最後に,作成したSWFTextをSWFMovie上に配置して,swfファイルを出力して終りである.
// テキストをSWFMovieに置く.
SWFDisplayItem *item = movie->add(text);
// 作成した動画をswfとして出力.
movie->save("sample02.swf");
以上で,テキストを表示するswfファイルが作成できる.
定数FDB_FILEの値には,fdbファイルへの絶対パスを設定する.
Makefileは以下.
今回のサンプルでは,表示文字列データがハードコードされている.
SWFText#addUTF8Stringメソッドは引数の文字列データがUTF8であることを要求する.
私は環境がうまいこといかなかったので,EUC-JPで記述したC++ファイルをcpp_eucとして,ビルド時にnkfでユニコードに変換した.
で,ビルドしたサンプルで作成したswf.

