chumby と日本語

未整理なメモメモ。Flash の知識は貧弱なので間違ってるかも。

フォントについて

Flash には下記の2種類のフォントがある。

  • バイスフォント
    • システム(OS 等)の持っているフォントを使う
    • クロスプラットフォームで使えるように,いくつか predefined な名前がある(_sans, _serif, _typewriter, _ゴシック, _明朝, _等幅
    • 指定されたフォントがない場合,適当なシステムのフォントに fallback する
    • chumby にどのようなシステムフォントが存在するのかは未調査
    • chumby に今後マルチリンガルなフォントを入れる予定,らしい
  • 埋め込みフォント
    • SWF ファイルに埋め込まれたフォント
    • 埋め込むグリフ(文字)は限定できる
      • たとえば「Hello World」という(スタティック)テキストを表示したいのなら「HWdelor」という7文字分のフォントだけ埋め込むことができる
  • 埋め込みフォントでグリフが見つからなかった場合にデバイスフォントに fallback するしくみは純正 flash player にはない(ようだ;グリフの存在しない文字の部分は飛ばされる)

埋め込みフォントは,埋め込まれたフォントの 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 まで,ということ

chumbyflash 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 を開発するには


全然関係ないけど,たとえば日本の天気を表示する widget を作るとして,Yahoo! JAPAN 等から情報をもってくるのは権利関係が微妙だったりするんでしょうか。それは無理としても,きっと,livedoor の中の人が,……(期待)

*1:Chumby Industries, Inc. が flash player を改造して埋め込みフォントでグリフが見つからない場合にシステムフォントに fallback するようにしてくれたらできるかも…… Adobe が認めないかな