あおしまの日記

あおしまさんの日記らしいです。個人的に興味がある事を時々書きます。スマートウォッチPebble日本語パックを作成、公開しています。

言語パックの構成について

  • 解析してツールを作られたxndcnさんのforumスレに書かれているので大体ことが足りる。

http://forums.getpebble.com/discussion/21716/something-about-language-pack-file

  • 言語パックのpblファイルは、1つのメッセージファイルと種々のフォントを格納した18個のpfo(pebble font object?)ファイルから構成される。
  • メッセージファイルはGNU gettextの.moファイルそのもので、.poファイルを編集したうえで変換を行うことで生成する。
  • メッセージファイルはファイル名000とする。
  • 最初は既存のpblファイルを分解して出てきた000ファイルをmsgunfmtコマンドで.poに変換すると、編集可能な.poファイルになる。
    • この為だけにgettextをインストールするのは不毛だと考えて、未翻訳のメッセージカタログ(言語設定ja_JP)を用意しました。ダウンロード(http://yahoo.jp/box/WnFy5J
  • POeditを使って.poファイルを編集保存すると、自動的に.moファイルができるので、それを000に改名する。
  • 主な情報表示に使うフォントは以下の4サイズ8ウェイト。
    • 14ドット(太、細)
    • 18ドット(太、細)
    • 24ドット(太、細)
    • 28ドット(太、細)
  • 上記8フォントはそれぞれ、14ドット細が001、14ドット太が002、18ドット細が003、18ドット太が004、24ドット細が005、24ドット太が006、28ドット細が007、28ドット太が008をファイル名とする。
  • また標準的なwatchfaceの表示で、メッセージファイルの翻訳によっては必要となる文字がある場合は、それぞれのファイルにフォントを格納する。一番影響するのは「?月」という表示。これはファイル名016の中に格納する。(中国語、日本語など)ない場合はwatchfaceの「月」が空白になる。
  • pfoファイルはPebbleSDKのfontgen.pyを使いpfoオプションを指定して生成する。
$ python fontgen.py pfo -h
usage: fontgen.py pfo [-h] [--extended] [--tracking TRACKING]
                      [--filter FILTER] [--list LIST] [--legacy]
                      HEIGHT INPUT_TTF OUTPUT_PFO

positional arguments:
  HEIGHT               Height at which to render the font
  INPUT_TTF            The ttf to process
  OUTPUT_PFO           The pfo output file

optional arguments:
  -h, --help           show this help message and exit
  --extended           Whether or not to store > 256 glyphs
  --tracking TRACKING  Optional tracking adjustment of the font's horizontal
                       advance
  --filter FILTER      Regex to match the characters that should be included
                       in the output
  --list LIST          json list of characters to include
  --legacy             use legacy rasterizer (non-mono) to preserve font
                       dimensions
  • 日本語など255文字以上のフォントを格納する場合は--extendedを付ける。
  • 格納したい文字を制限する場合は必要な文字の文字コードjsonファイルの配列にしたものを食わせてあげると、ttfファイル内の必要な文字だけをピックアップしてpfoファイルに格納する。文字コードunicodeで2バイトで指定できる文字を、コードを10進数にしてjson形式で列記する。
  • fontgen.pyは要求したドット数にビットマップフォントが埋め込まれている場合にはそちらを優先して格納するように見える。ベクターしかない場合はビットマップフォントに変換して格納する模様。
  • コマンド例としてはこんな感じ。

fontgen.py pfo --extended --list charlist.json 14 sazanami-gothic.ttf shino14.pfo

    • legacyオプションはビットマップフォントがない場合にギザギザを滑らかにするように階調をつけるらしいが、サイズは大きくなるものの、どこが階調表示なのか不明。カラーモデルにはこちらのほうがいいと思うのですが、私には効果の程はわかりません。(ビットマップを取り出しても階調があるようなデータになっていない。)
  • 出来栄えをチェックするのはextract_codepoints.pyを使います。これに作ったpfoファイルを食わせると、そのpfoファイルが持つ文字数や文字のドット数、どういう文字が格納されているかの情報が得られ、またビットマップを一枚の画像に展開した物が出てきます。
  • 14ドット、18ドット、24ドット、28ドットのpfoファイル計8つを作成し、それぞれ001〜008に改名する。
  • 000から018まで19個のファイルが揃ったら、pbpack.pyを使ってpblファイルにまとめる。
    • pbpack.pyはPebbleSDKのなかの関数を使うようになっているが、PebbleSDK3.0と組み合わせて使用してもエラーが出るので、それを回避するために私はPebbleSDK-2.9を使用しています。そしてその環境に合わせるために、pbpack.pyの中に書かれたパスを書き換えて使用しています。bugfixされました。現在はSDK3.0との組み合わせでも動作します。
    • 環境変数PEBBLE_SDK_PATHを設定します。OSXであれば.profileなどに

export PEBBLE_SDK_PATH=/path/to/PebbleSDK-3.0/

などと追記して反映させます。Windowsの場合はシステムの環境変数に追加する方法で同様に対応可能です。cmdコマンドプロンプト上でsetコマンドを実行し、この環境変数が設定されているかを確認することができます。

    • pbpack_tools.pyは以下のように使います。
$ python pbpack_tool.py pack -h
usage: pbpack_tool.py pack [-h]
                             PACK_FILE [PACK_FILE_LIST [PACK_FILE_LIST ...]]

positional arguments:
  PACK_FILE       file to write the pbpack to
  PACK_FILE_LIST  a list of <pack_file_path>s
    • コマンド例としてはこんな感じ。

python pbpack_tool.py pack testpack.pbl 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018

  • 以上のステップで言語パックが一応出来てきます。あとは転送して動作確認をします。
  • だめな場合は再起動がかかります。サイズが大きい場合は特に転送に失敗しやすいので、ファクトリーリセットを行ってから転送する方が無難です。

pfoファイルの内部構造

  • pfoファイルは8バイトのヘッダ、255x4バイトのハッシュテーブル?、格納文字数分のコードテーブル、(仕切りのゼロが8バイト)、実際のフォントのビットマップデータの連続、の順で格納されている。
  • コードテーブルは1文字分が6バイトで、文字コード2バイト+ビットマップデータの先頭からのオフセット量4バイトとの組み合わせ
  • フォントのビットマップデータは1文字分が(5バイトのヘッダ+ビットマップデータ)になっている。ヘッダはBDFフォントのBBX相当の情報4バイト(幅、高さ、xy位置調整)と、Pebble独自の文字の位置調整量1バイトで計5バイト。1文字分は32ビット単位でパディングする。