chumby と日本語
未整理なメモメモ。Flash の知識は貧弱なので間違ってるかも。
フォントについて
Flash には下記の2種類のフォントがある。
- デバイスフォント
- システム(OS 等)の持っているフォントを使う
- クロスプラットフォームで使えるように,いくつか predefined な名前がある(
_sans,_serif,_typewriter,_ゴシック,_明朝,_等幅) - 指定されたフォントがない場合,適当なシステムのフォントに fallback する
- chumby にどのようなシステムフォントが存在するのかは未調査
- chumby に今後マルチリンガルなフォントを入れる予定,らしい
- 埋め込みフォント
- SWF ファイルに埋め込まれたフォント
- 埋め込むグリフ(文字)は限定できる
- たとえば「Hello World」という(スタティック)テキストを表示したいのなら「HWdelor」という7文字分のフォントだけ埋め込むことができる
埋め込みフォントは,埋め込まれたフォントの SWF ファイルの MovieClip でしか使えない。たとえば,
- フォントを埋め込んである font.swf
- メインの main.swf
があるときに main.swf から font.swf を loadMovie() しても,main.swf「上」の MovieClip の text field は font.swf に埋め込まれたフォントを利用することはできない(ようだ)
(もちろん,loadMovie() した時点で font.swf という MovieClip を main.swf 上に配置できるため,font.swf の MovieClip 上に TextField を作成すると,埋め込みフォントを表示することはできる)
何がいいたかったかというと,たとえば preload.swf に日本語フォントを「_ゴシック」などの名称で埋め込んでおいても利用できないだろうということ。
ちなみにデバイスフォントを使うと普通ギザギザになるけれど,ActionScript を書くことでアンチエイリアスのかかったレンダリングを行うこともできる,らしい。
chumby の諸元
- FlashLite 3(Flash Player 8 相当の VM)
- chumby のサイトに置ける SWF の最大サイズは約100KB
- SWF は内的に ZLIB compression で圧縮可(CWF)で圧縮後のサイズ 100KB まで,ということ
chumby の flash player は Gnash などのオープンソースプロダクトを利用したわけではなく,Adobe とライセンス契約(Adobe Flash runtimes | Adobe.com)を結んで開発したと思われる。ソースとか公開されてないしね。
chumbyflashplayer.x のコマンドラインパラメータは以下。
chumby:~# chumbyflashplayer.x -h
Adobe FlashLite 3.0.4 Release (Version 8,1,55,0)- Chumby Industries
(version 7 build 6-565 [GCC 4.1.2 Microcross GNU X-Tools(tm)])
Features: Video ALSA DMA ARM-optimizations
Build time: Thu 06Mar2008 1339
2008-06-18 22:45:45 cfgFile /psp/flashplayer.cfg not found
usage: chumbyflashplayer.x -i <filename> [
-m <32K memory blocks (384 = 12mb)>
-x [X] <pixels (240)>
-y [X] <pixels (320)>
-s [X] <stride (x*2)>
-n [X] <sound buffers {4..32} (16)>
-b <samples/buffer for master instance (512)>
-p [X] <sample rate {5000|11025|22050|44100|8000|16000} (44100)>
-e [X] <channels {1|2} (2)>
-k [X] <bytes/channel {1|2} (2)>
-r [X] (rotate)
-q [X] <quality {0|1|2} (2)>
-d name[=value]
-o <network open debug level {0|1|2} (2)>
-D [X] (disable screen updates)
-A [X] (disable audio)
-u <1K url cache blocks (4096)>
-a <cache aggression level (5)>
-S <cache stats write file>
-I <cache stats write interval (60)>
-L <message options (3)>
message options may be a combination of
1 write to stderr
2 add timestamp prefix to stderr
4 write to syslog
-l <log mask (383)>
bitmap of values allowed to be displayed
1=errors, 2=warnings, 4=info, 8=trace, 16=debug,
32=AS trace, 64=AS debug, 128=realtime debug, 256=video stats
-M [X] <master_widget>
-E <cert_list_file>
-f <frame buffer options {0|1|2} (2)>
-H <http and malloc options (9)>
bitmap of options for http:
1 use curl, 2 report memory usage, 4 verbose memory reporting,
8 throttle http connection for large transfers,
16 use localhost as alias for filesystem root (unsafe!)
64 use verbose mode in libcurl
additional bits for malloc debugging:
32 report failed malloc() attempts,
128 report all chunk allocations, 256 report chunk frees
-P <preload widget (may repeat)>
-U (do not load /usr/widgets/preload.swf)
-T <timing stats file>
-K <ts quadrant key mapping {0|1} (0)>
-Y <minimum pump delay in ms (42)>
-Z <maximum pump delay in ms (83)>
-z (disregard existing instance)
-X (turn on mcheck for heap debugging)
-t <update timing collection run in seconds (0)>
-R (backtick result display diagnostics)
-N <asnative & ts debug flags (0)>
-w <backtick long timeout (10)>
-W <action when backtick long timeout reached (0=continue, 1=abort backtick, 2=exit flashplayer)>
-F <signal to send running instance {SIGTERM=15, SIGHUP=1, SIGUSR1=10, SIGUSR2=12)>
SIGHUP (-F1) triggers processing of events read from /tmp/flashplayer.event
-g <global heap in mb (0)>
-G <alternate cfg file or none>
-j <cache manager options[:cache data dir] (0)>
bitmap of options:
1 write cache contents on -S stats file write
-2 <enable sound hwsync for master instance>
-3 <do not attempt btplayd start>
-v (display version information)
-h (print this message)
] ([X] marks development-only options)
where swf file specified by -i is the main movie to play (master instance)ldd の結果は下記の通り。
chumby:/usr/bin# ld-2.4.so --list /usr/bin/chumbyflashplayer.x
librt.so.1 => /lib/librt.so.1 (0x40001000)
libcurl.so.4 => /lib/libcurl.so.4 (0x40010000)
libdl.so.2 => /lib/libdl.so.2 (0x4013f000)
libpng12.so.0 => /lib/libpng12.so.0 (0x4014a000)
libungif.so.4 => /lib/libungif.so.4 (0x40180000)
libpthread.so.0 => /lib/libpthread.so.0 (0x4018f000)
libasound.so.2 => /lib/libasound.so.2 (0x401aa000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0x40261000)
libm.so.6 => /lib/libm.so.6 (0x40358000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x403ce000)
libc.so.6 => /lib/libc.so.6 (0x403e0000)
/lib/ld-linux.so.2 => ld-2.4.so (0x2a000000)
現状と展望
- ドイツ人のおっさん(失礼)が Latin なフォントを埋め込んだ RSS リーダー widget を作ったとしても,日本語で表示することはできない(現在も今後も*1)
- フランス人のおっさん(失礼)がデバイスフォントを利用した RSS リーダー widget を作ったとすると,将来的に日本語で表示することができるようになる,と思われる
- 多彩なグリフをサポートする日本語フォントを埋め込んだ widget を chumby のサイトに直接登録するのは事実上無理(100KB 制限なので)
- 巨大な SWF を USB に入れてチャンネル登録すれば widget を使える,らしい(see 橋本商会 » chumbyで自作widgetをUSBメモリから起動する)
現状で日本語を表示できる widget を開発するには
- 巨大 SWF を USB 経由で登録(上記参照)
- chumby.com にあげる SWF は bootstrap loader として使い,外部に日本語フォントを埋め込んだ SWF を置いておく(see http://www.sabamiso.net/yoggy/tdiary/?date=20080608#p01)
- 画像化する gateway を立てる(see Twitter の日本語メッセージを画像化して chumby で読む)
- コンテンツごとに埋め込みグリフを限定した SWF を吐く gateway を立てる(全部埋め込んでもいいけど遅くなりそうだし)
- 小さい日本語ビットマップフォントを常用漢字あたりに限定してビットマップ化し SWF に埋め込み自力レンダリング(常用漢字あたりに限定しないと無理そうだと試算)
全然関係ないけど,たとえば日本の天気を表示する widget を作るとして,Yahoo! JAPAN 等から情報をもってくるのは権利関係が微妙だったりするんでしょうか。それは無理としても,きっと,livedoor の中の人が,……(期待)