ファイヤープロジェクト
テキストの表示(Ming/C++)
2006-08-13T03:10+09:00   matsu
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.
matsu(C)
Since 2002
Mail to matsu