日本語表示をちゃんとしたOpenFlashChart2のファイルサイズを小さくする方法

こんにちは、熊谷です。

前回OpenFlashChart2で日本語をちゃんと表示するためのパッチについて書きました。

その時にも触れましたがフォントの文字を全て埋め込むためファイルサイズがそれなりに大きくなるという欠点があります。これをどうにか解決する方法として、すぐ思いつくのは埋め込む文字を限定するという方法です。

埋め込む文字はこれとこれと決まっているのであれば、その文字のUNICODE値を調べてunicodeRangeプロパティで指定すればそれで完了です。しかし、グラフのラベルの文字列が必ずしも固定されているわけではなく、例えばユーザがラベルを選びその結果で動的に変わるという場合は、そうはいきません。

そこで、埋め込む文字をひらがなと第一水準漢字だけに、もしくは日本語全てというぐらいに範囲を指定して埋め込むことにより、ある程度ファイルサイズを小さくすることが可能になります。

ということで、早速やってみましょう。

Flex SDKの中にflash-unicode-table.xmlというXMLファイルがあります。

この中に2バイト文字のそれぞれの文字範囲があらかじめ定義されてあるので、そこから該当する範囲の値をコピーします。
ひらがなと第一水準漢字の漢字だけを埋め込みたい場合は、Japanese KanaとJapanese Kanji - Level 1のrange部分を

面倒なので、日本語全てを埋め込みたい場合はJapanese(All)のrange部分を

使用します。


--- XAxisLabels.as.orig 2010-06-28 17:45:47.000000000 +0900
+++ XAxisLabels.as      2010-07-22 19:10:57.000000000 +0900
@@ -2,6 +2,7 @@
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.text.TextFormat;
+       import flash.text.Font;
        import flash.display.DisplayObject;
        import flash.geom.Rectangle;
        import elements.axis.AxisLabel;
@@ -22,9 +23,14 @@
                // Ugh, ugly code so we can rotate the text:
                //
                // [Embed(systemFont='Arial', fontName='spArial', mimeType='application/x-font', unicodeRange='U+0020-U+007E')]
-               [Embed(systemFont = 'Arial', fontName = 'spArial', mimeType = 'application/x-font')]
-              
-               public static var ArialFont__:Class;
+    [Embed(source='../../ipagui.ttf',
+      fontName = 'ipagui',
+      mimeType = 'application/x-font',
+      unicodeRange = 'ここに埋め込みたい文字のUNICODE値を'
+    )]
+
+               public static var ipagui:Class;
+    Font.registerFont(ipagui);
 
                function XAxisLabels( json:Object ) {
                       
@@ -223,7 +229,7 @@
                        if( label_style.rotate != 0 )
                        {
                                // so we can rotate the text
-                               fmt.font = "spArial";
+                               fmt.font = "ipagui";
                                title.embedFonts = true;
                        }
                        else

こんな感じでunicodeRangeプロパティを使用して埋め込む文字を指定します。これでコンパイルするとその埋め込む文字の範囲にもよりますがそれなりに小さくなります。

ちなみに、全て埋め込んだ場合は3MBぐらいだったswfファイルは、ひらがなと第一水準漢字に限定した場合は850KBぐらいになり、日本語全てにした場合は2MBぐらいになりました。

もちろん、ラベルの文字はこれとこれとこれだけと決まっているのであれば、その文字のUNICODE値だけにすればさらにファイルサイズは小さくなります。

ファイルサイズに悩んでいる方がいましたら試してみてください。