mingにフォントがセット出来ない。

ming で日本語を扱うために、 ttfなフォントをfdbに変換する必要があるらしい。 ming 0.4.0beta2からは ttftofft ってのがデフォルトで入っていて、 コレを使ってttfからfftに、 makefdb を使ってfftからfdbに変換するらしい。

今回は 独立行政法人情報処理推進機構のフォント(IPAフォント)付き を変換してみる。

$ ttftofft ipag.ttf
TAG c28
FWSAx_?
       (
        ?       IPAGothicA?zf

なんか変な出力が出てくる。 それに生成されているはずのfftも生成されてない。

ググってみても殆ど情報が出てこないので、 仕方なく ttf2fft をインストールする事に。 Ming/Ruby いじり さんを参考にインストールしてみた。

書かれていた通りにやっても上手くいかなかったものの、 結果的に freetype-2.1.4ttf2fft-1.0 でインストール出来た。

# freetype-2.1.4のインストール
$ tar jxf freetype-2.1.4.tar.bz2
$ cd freetype-2.1.4
$ ./configure --enable-static
$ make
$ cd ..

# ttf2fftのインストール
$ tar jxf ttf2fft-1.0.tar.bz2
$ cd ttf2fft
$ g++ -o ttf2fft *.cxx -I../freetype-2.1.4/include -I../freetype-2.1.4/include/freetype -L../freetype-2.1.4/objs/.libs -lfreetype -lm

後は手順通りにttfをfdbに変換していく。

一通り上手く変換できたっぽいので、 実際に ming に喰わせてみる。

import os
import ming

# フォントへのパス
F_PATH = os.path.join(os.getcwd(), 'IPAGothic.fdb')

t = ming.SWFTextField()
f = ming.SWFFont(F_PATH)

# フォントのセット
t.setFont(f)

フォントをセットするところで、なぜかエラー吐く。 エラー内容はこんな感じ。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/lib/python2.5/site-packages/ming.py", line 537, in setFont
    self.__fonts[font.this]=font
TypeError: unhashable type: 'PySwigObject'

この後ソースと睨めっこしながら色々試してみるも、 結局上手く日本語を表示出来なかった。 やっぱbeta5ってのがダメだったのかなぁ?

どなたか上手く日本語を表示出来た方の情報をお待ちしております!

Posted at: 
2007/10/20 21:51:14
6 Comments
0 TrackBacks
Tags: 
Flash
ming
Python
Trackback: 
http://humming.via-kitchen.com/2007/10/20/cannot-set-font-to-ming/trackback/

TrackBacks

まだ登録されていません。

Comments

946

まずは英語のフォントからやってみてはいかがでしょう?
私は英語フォントも変換失敗します。

Created at: 
2007/10/21 03:32:57

nobu

色々試してみたのですが、
フォントの生成は上手くいってるみたいで、英語だと書き出せるんですよ。

どうやらming側でのマルチバイトの扱いがダメっぽいのかなぁ。って
勝手に憶測してみたりしてます。

Created at: 
2007/10/21 19:57:40

sakamoto

mingのtrunkはttfを直接扱えますですよ。
ming/test/Font/test02.c
日本語は SWFText_addUTF8String(text, UTF-8文字列, 0) で描けます。

Created at: 
2007/11/02 11:51:33

nobu

>sakamotoさん

貴重な情報をありがとうございます。
trunkをインストールしてみたのですが、
SWFFont_fromFileがpythonバインディングでは生成されていないようなのですが、
これは必要がないものなのでしょうか?

色々試してみたのですが、やっぱりエラー吐きまくります。
SWFTextやSWFTextFieldのsetFontがそもそもエラーを吐きますし。

うーむ、悩ましいです。

Created at: 
2007/11/02 15:48:35

sakamoto

SWIGインターフェースが更新されてないんですね。
以下のパッチをあてたあと
py_extで swig -I.. -python ming.i で作れます。
ming.pyのバグ?も直しました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from ming import *
Ming_setScale(1.0)
f = SWFFont("test.ttf")
t = SWFText()
t.setFont(f)
t.setHeight(640)
t.setColor(0, 0, 0)
t.addUTF8String(u"こんにちわ世界")
m = SWFMovie()
m.setDimension(6400, 4800)
m.setRate(12.0)
m.add(t).move(1000, 1000)
m.nextFrame()
m.save("test.swf")

Index: ming.i
===================================================================
RCS file: /cvsroot/ming/ming/ming.i,v
retrieving revision 1.16
diff -u -r1.16 ming.i
--- ming.i 15 Aug 2007 12:56:56 -0000 1.16
+++ ming.i 2 Nov 2007 12:03:41 -0000
@@ -230,6 +230,7 @@
/***** SWFFont *****/

SWFFont newSWFFont();
+SWFFont newSWFFont_fromFile(const char *filename);
SWFFont loadSWFFontFromFile(FILE *file);
void destroySWFFont(SWFFont font);

Index: py_ext/ming.py
===================================================================
RCS file: /cvsroot/ming/ming/py_ext/ming.py,v
retrieving revision 1.22
diff -u -r1.22 ming.py
--- py_ext/ming.py 27 Sep 2007 17:07:56 -0000 1.22
+++ py_ext/ming.py 2 Nov 2007 12:03:43 -0000
@@ -399,9 +399,9 @@
class SWFFont(SWFBase):

def __init__(self, name):
- if name[-4:] == '.fdb':
+ if name[-4:] == '.fdb' or name[-4:] == '.ttf':
self.browserfont = 0
- self.this = mingc.loadSWFFontFromFile(open(name, "rb"))
+ self.this = mingc.newSWFFont_fromFile(name)
else:
self.browserfont = 1
self.this = mingc.newSWFBrowserFont(name)
@@ -479,7 +479,7 @@
mingc.destroySWFText(self.this)

def setFont(self, font):
- self.__fonts[font.this]=font
+ #self.__fonts[font.this]=font
mingc.SWFText_setFont(self.this, font.this)

def setHeight(self, height):
@@ -495,7 +495,7 @@
mingc.SWFText_addString(self.this, s, advance)

def addUTF8String(self, s, advance=None):
- mingc.SWFText_addUTF8String(self.this, s.encode("uft-8"), advance)
+ mingc.SWFText_addUTF8String(self.this, s.encode("utf-8"), advance)

def setSpacing(self, spacing):
mingc.SWFText_setSpacing(self.this, spacing)

Created at: 
2007/11/02 21:09:59

nobu

詳細なアドバイスありがとうございます!
ちょっとこれで試してみます!

ming.pyのバグ?を見つけて、一気にやる気なくなったのは内緒ですw

Created at: 
2007/11/03 04:10:10

Add Comment

Add Comment