Hatena::ブログ(Diary)

Webと文字

よければ、はてブしてください。( ´∀`) George.Nagaoka@gmail.com

JavaScript IME:海外からブラウザで日本語を変換 新URL 旧URL:
多言語入力ブックマークレット:ブラウザでロシア語、中国語、アラビア語・・・
【軍曹が】携帯電話開発の現状【語る】をAA化した
AAのデータベース
趣味のページ

2016-10-20

削除しました。

今後このダイアリーが更新される事はありません。

2016-08-22

更新再開

はなくなりました。

2013-05-06

近況報告と今後

近況報告

この一年間、全く関係ない業種で新入社員社畜)をしておりました。


mashabow様のスライドで当ブログを取り上げ戴いたようで、お礼申し上げます。

「TTXによるフォントのぞき基礎」の資料【5/4更新:スライド公開】
http://d.hatena.ne.jp/mashabow/20130502/1367500832

TTXに関して一点、私の方からも気になった点を書かせて戴きます。

随分前になりますが、CFF形式のフォントを変換した際に、グリフパスの表現が固定小数点の場合*1、正常に変換されなかったと記憶しております。


現在は修正されているかも知れませんが、TTXを使われる際には注意したほうがよろしいかと思います。


今後

社畜生活が続くため、記事の更新は一旦停止します。

記事の内容や、サンプルなどは自由に使ってくださって結構です。


以上 ( ´∀`)ノシ

2012-03-22

ギコフォント2

はじめに

以前アスキーアート用のフォント「ギコフォント」を作りました。

ギコフォントを作ろう! - Webと文字


 12ptのビットマップそのままアウトラインにしたフォントを作る。12pt/24pt/36pt…の倍数でそのとおりに表示されるはず!

f:id:project_the_tower2:20111218091406p:image

今回はその続きです。

専用ページを作った

ギコフォント

f:id:project_the_tower2:20120322105417p:image

他のAAフォントもあった

どちらもwebfontに対応しており、特にKuma_Liteは記号のみではありますが、140kbとすごく小さな容量を実現させています。

ギコフォントも配信することにした

一度目は

  1. @font-faceがサーバーにアクセス
  2. サーバーリファラからURLをとってHTMLを解析
  3. 特定のclass内のテキストを抜き出し
  4. テキストのみのgikofontを作成
  5. URL:gikofontをデータベースに保存
  6. クライアントへ返す

二度目以降は

  1. @font-faceがサーバーにアクセス
  2. データベースから読み出し
  3. クライアントへ返す

page=activeだと、毎回HTMLを解析して、文章(md5)に変更があった場合のみフォントを再作成します。

次回

  • 全てのポイント数でスケーリングが可能になったわけではない。よってhdmxテーブルを規定して、特定のピクセルでの文字幅を定義できるか検討する。

2012-02-20

OpenTypeレイアウトは厳しかった

前回の投稿から間が開いてすいません。想像以上にOpenTypeレイアウトに手間取っております。以下その報告ですが間違っている可能性が十分にあります

フォントだけじゃ無理?

 私はグリフ置き換えがフォント内のOpenTypeレイアウトテーブル内で完結すると思っていたのですが、そうではないようです。

f:id:project_the_tower2:20120220093521p:image

上の画像はArabic Typesetting Sample*1を使用して、ワードパットでアラビア文字による「アラビア語(اللغة العربية)」をキャプチャしたものです。実はこの文字列の各文字は最初からこの形ではありません。

f:id:project_the_tower2:20120220093522p:image

上の画像は同じフォントを用いてOpenOffice.drawで作ったものです*2

  • 1行目は文字ごとにバラバラです。文字コードフォントcmap→アウトラインとすると、この孤立型の形で出てきます。
  • 2行目は単語の語尾に当たる部分()が変化しています。アラビア語は右から左に書くので語尾形です。
  • 3行目は単語の頭に当たる部分()が変化しています。
  • 4行目は単語の真ん中に当たる部分()が変化しています。
  • 2〜4を結合して5行目のアラビア文字表現ができます。

この2〜4行目がフォントのGSUB(グリフ置き換えテーブル)を使って置き換わるはずですが、置き換える場所(どこが語尾で語頭なのか)の情報がフォントには存在しません*3


f:id:project_the_tower2:20120220093524p:image


結合による字形入れ替え方法

 色々調べた結果、Unicode仕様書アラビア文字の結合方法が書かれていることがわかりました。参考資料1に解説PDFが有りましたのでキャプチャを示します。

f:id:project_the_tower2:20120220093525p:image

Unicodeの文字データベース…だと!?

Unicodeの文字データベースUnicode Character Database : UCD)

 Unicodeコンソーシアムは文字一つ一つに対して細かくパラメーターを設定しており、データベースを参考資料2で配布しています。最新バージョンは6.0.0?です。このデータベースを手っ取り早く見たい場合はUCDViewer*4が便利です。

f:id:project_the_tower2:20120220093526p:image

アラビア文字の結合プロパティはjoining propertiesのjt属性に当たります。

[python]UCDから結合プロパティを取り出す

 UCDからプロパティを取り出すプログラムを書きます*5

  1. 参考資料3からucd.all.flat.zipダウンロード
  2. 解凍。7MB→130MB
  3. repertoireだけsqlite3に入れる*6。(http://codepad.org/8qUfWyXS
  4. ucd.dbができあがり。600MBだけど…
  5. インデックス付ける(http://codepad.org/vkMsYmtI
  6. 取り出す関数を書く(http://codepad.org/XMw9QOSw

f:id:project_the_tower2:20120220093527p:image

[python]グリフベースのテキストクラス(読み飛ばしてください)

 グリフ処理のためにグリフベースのテキストクラスを作りました(http://codepad.org/9AVUUpBL)。

テキストの頭と尻に番兵ノードをおいた双方向*7連結リストです。各グリフにはscriptGIDといったプロパティの他にfinishedといった処理済みフラグが存在します。GSUB.feature.lookupのレベルでは一度処理されたグリフはスキップされますが、GSUB.featureのレベルでは処理済みのグリフに対しても続けて処理がかけられます。コード93にあるfinishedフラグ初期化は本来ccmp,isol,fina,medi,initの各substituteの後にも必要です。コード95でfinishedフラグを全てOnにしてアラビア文字に対する処理を終了させます。これによって67のイテレーターはその後、アラビア文字を返しません。

 getIterで特定の条件のみを抽出するイテレーターを返します。これはpythonではジェネレーターで表現できます。getGeneは条件を確定したジェネレーターを返すメソッドです。これはクロージャーで表現できます。条件には*,配列,テキストが使用できます。

[python]結合による字形入れ替え方法の実装

 「結合による字形入れ替え方法」を実装します

for e in self.getIter(script='arab',finished=False):
    cclass = UCD.joining(e.unichar);
    e.feature = 'isol'
    if cclass =='R' and \
       (UCD.joining(e.prev.unichar) in ['D','L','C']):
        e.feature = 'fina';
    if cclass =='D':
        if (UCD.joining(e.prev.unichar) in ['D','L','C']):
            if (UCD.joining(e.next.unichar) in ['D','R','C']):
                e.feature = 'medi';
            else:
                e.feature = 'fina';
        else:
            if (UCD.joining(e.next.unichar) in ['D','R','C']):
                e.feature = 'init';

GSUBを適用する

 結合判定が終わったらGSUBを適用します。アラビア文字に関して必要な処理を以下に示します(参考資料4)。

f:id:project_the_tower2:20120220093528p:image

必須の処理はisol(孤立),init(語頭),medi(中間)fina(語尾),rlig(必須合字)です。aから順番に処理していきます。

置き換わったグリフ

結合判定→GSUBとすることで、正しいGIDを取得することができます。

f:id:project_the_tower2:20120220093529p:image

次回

  • アラビア語の送り幅に関して
  • オンライン上に動くサンプルを用意

参考資料

  1. 多言語組版研究会 Unicodeのアラビア文字、アラビア語のXSL-FOによる組版について
  2. Unicode Character Database
  3. Index of /Public/6.0.0/ucdxml
  4. Microsoft Typography - Developing OpenType Fontsfor Arabic Script (2 of 3):Shaping Engine

*1Microsoft VOLT(http://www.microsoft.com/typography/VOLT.mspx)に同梱されているアラビア語フォント

*2孤立形以外の文字をどうやって出したかですが、互換性のためにUnicodeは割り当てられていますのでそれを使用しています。

*3:前回解説しなかったChainingContextを使うとできるように思いますが、フォントにはSingleテーブルしか入っていませんでした。

*4http://vanillasky-room.cocolog-nifty.com/blog/2011/05/ucdviewer.html この人はすごい(;^ω^)

*5pythonにはunicodedata(http://docs.python.org/library/unicodedata.html)というジャストなパッケージが存在していました…が、目的のプロパティは用意されていませんでした

*6:sql_insert=u"""をsql_insert=u""";にするだけで自動コミットモードになり、生成時間が50秒→一日以上になります。半日ハマった(´・ω・`)

*7:前回解説しませんでしたが、逆から置き換えていくReverseChainingContextものがあるため、双方向にしました