TLFの最近のブログ記事

サロゲートペア文字を入力した SPRAK と MX の TextArea コンポーネント比較

Flash CS5 の TLF テキストでは、クラシックテキストでは実現できなかったサロゲートペア文字の入力が可能になりました。

Flex 4 に置き換えて表現すると、MX のテキストコンポーネントでは実現できなかったサロゲートペア文字の入力が SPARK のテキストコンポーネントでは可能…ということになります。

さらに TLF には CharacterUtil というクラスが用意されており、任意の文字コードが上位サロゲートか下位サロゲートかを調べることができます。この機能を組み合わせることによって、任意の文字列がサロゲートペア文字かどうかを調べることもできます。

埋め込みフォント サンプル MXML 版

前回のエントリに引き続き、今回は MXML で TLF に埋め込みフォントを適応させるサンプルをアップします。

TLF が使用されている Spark コンポーネントは、RichText と RichEditableText の 2 つで、AS で使用するのと比べてかなり楽に使えます。その代わり、Linked Containers 機能のみ使用できない仕様になっているため、注意が必要です。

埋め込みフォント サンプル

TLF に埋め込みフォントを適応させるための手段について書きます。
FTE の仕様上、TLF の埋め込みフォントフォーマットは DefineFont4(CFF) フォーマットである必要があります。( 従来の TextField に使用されているフォントフォーマットは DefineFont3 フォーマットです )

フォント埋め込み方法

AS, MXML のどちらを使用しても CFF 形式でフォントを埋め込むことは可能ですが、Flash Builder 4 β 2 付属の SDK(4.0.0.10485) で確認したところ、フォント埋め込み時の Embed メタデータタグの引数 cff が、embedAsCFF と名称変更されていたので注意が必要です。

AS での埋め込み例

package {
import flash.display.Sprite;
public class TaigaFont extends Sprite {
    [Embed(
        source               = "asset/font/KozMinPro-Bold.otf",
        fontName             = "testFont",
        mimeType             = "application/x-font",
        embedAsCFF           = "true",
        advancedAntiAliasing = "true",
        unicodeRange         = "U+5927, U+96c5" //大雅
    )]
    public static const FONT:Class;
}
}

上記コードは、フォントを埋め込んだクラスを SWF に書き出して、Loader クラスから外部読み込みして使用することを想定したものですが、この場合、基底クラスは Sprite または MovieClip クラスである必要があります。( Font クラスを基底クラスにしても mxmlc は SWF を書き出せますが、Loader が読み込んでくれません )

読み込み完了後、作成した TextFlow インスタンスの fontLookup プロパティの値を "embeddedCFF" (FontLookup.EMBEDDED_CFF) に定義して、TextLayoutFormat の fontFamily に取得したフォント名を定義します。

Linked Containers サンプル

Linked Containers と呼ばれる機能のサンプルをアップしました。 TextFlow.flowComposer プロパティに、表示オブジェクト情報を持った複数の ContainerController インスタンスを登録することにより、柔軟なレイアウトを作ることができます。

これはなかなか面白いです。

オープンソースになった TLF ですが、FLash Builder 4 Beta 上で「定義へ移動」を実現させるためには、下記手順が必要です。

必要なもの

  1. Flash Builder 4 Beta
    ( Flex Builder 3 では動作しません。Flash Builder 4 Beta のシリアルは、Flex Builder 3 のライセンスを持っている方のみ、こちらから入手できます。 )

  2. Flex SDK
    ( 4.0.0.8702 以降のバージョン )

手順

  1. <Flash Builder 4 Beta のインストールフォルダ>sdks\4.0.0\frameworks\libs\netmon.swc を、<自分で用意した Flex SDK>\frameworks\libs にコピー

  2. 新規 Flex プロジェクトまたは、AcrionScript プロジェクトを作成

  3. 作成したプロジェクトのライブラリパスの設定で、textLayout.swc の参照を削除

  4. <自分で用意した Flex SDK>\frameworks\projects\textLayout 配下にある下記 4 つのフォルダをマージした flashx フォルダを新規に作成
    ( 下記プロジェクトをすべて結合したものが textLayout.swc として利用されています )

    • textLayout_conversion\src\flashx
    • textLayout_core\src\flashx
    • textLayout_edit\src\flashx
    • textLayout_textField\src\flashx
  5. 作成した flashx フォルダを、作成したプロジェクトのデフォルトパッケージにコピー

  6. 設定ファイル (flex-config.xml) を定義
    (TLF のソースに条件付きコンパイル用の定数が記述されているので、下記内容の設定ファイルを作成して、load-config オプションで指定します。個人的にはローカル設定ファイルをお薦めします。 )

    <flex-config>
        <compiler>
            <define>
                <name>CONFIG::debug</name>
                <value>false</value>
            </define>
            <define>
                <name>CONFIG::release</name>
                <value>true</value>
            </define>
        </compiler>
    </flex-config>

これで、TLF を使ったコンテンツを作ってデバッグするとき、内部の動作が確認できます。

Flash Builder Beta が修正されバージョンアップすれば、上記手順はすべて不要になると思うのですが、当面はこれでしのげれば…といったところでしょうか。

TLF のオープンソース化が決定し、さっそく Flex SDK 4.0.0.8702 にソースが同梱されています。 バグに関しても、JIRA に投稿できるようです。

Text Layout Framework Team: The Text Layout Framework is now Open Source!
http://blogs.adobe.com/tlf/2009/07/the_text_layout_framework_is_n.html

面白くなってきましたね。

このエントリでは、日本語の縦書きについて書きます。

サンプル ( 画面とソース : Build 465 でビルド )
http://labs.taiga.jp/flex3/TLFSample05/
http://labs.taiga.jp/flex3/TLFSample05/srcview/

サンプルについて、簡単にまとめます。

  • TextLayoutFormat クラスで、TextFlow のフォーマットを一括で定義しています。
  • textAlign, direction, blockProgression プロパティを変更して縦書きを実現しています。
  • justificationRule プロパティの値を JustificationRule.EAST_ASIAN ("eastAsian") にしないと、「。」などの表示位置がおかしくなる場合があります。
  • justificationStyle プロパティは TLF 専用ではないので、JustificationStyle クラスの説明を確認してください。
  • 縦書きにすると、描画位置が ContainerController.container の矩形領域の外になってしまうことに注意してください。

表示する分には問題なさそうなんですが、テキスト編集やマウス操作をするようなものを作るには、まだ厳しい段階なのかなと思いました。

少し間が空いてしまいましたが続きを書きます。
このエントリを書いている時点で、TLF のビルドのバージョンは 465 なのですが、まだクラス名が変わったりパッケージ構成が変わったりと、色々大変なようです。

サンプル ( 画面とソース : Build 465 でビルド )
http://labs.taiga.jp/flex3/TLFSample04/
http://labs.taiga.jp/flex3/TLFSample04/srcview/

今回アップしたサンプルは、カラムを複数定義したものなので、カラム系のプロパティについて簡単にまとめます。

  • TextFlow.columnCount プロパティで、カラム数を定義します。
  • TextFlow.columnGap プロパティで、カラム間のギャップを定義します。
  • TextFlow.columnWidth プロパティで、単一カラムの幅を定義します。
  • columnCount と columnWidth とは併用可能ですが、columnWidth が優先されます。

ついでにサンプルでは、ContainerController.container プロパティとして使用しているプライベートクラス MySprite の中身も少し更新しました。

入力文字列の描画領域が、ContainerController.container の矩形領域超えると、scrollRect プロパティにもちょっかい出しているようで、再設定しています。

ここら辺の詳細フローには興味があるのですが、ソースが見れないのは残念です。

つい先日知ったばかりなのですが、TLF の Weekly Builds が Adobe Labs で公開されています。( ご丁寧に Feed も配信しています )
http://labs.adobe.com/downloads/textlayout.html

早速ダウンロードして中身を見てみたところ、以前 3 つあった SWC...

  • textLayout_conversion.swc
  • textLayout_core.swc
  • textLayout_edit.swc

  • textLayout.swc

…という一つの SWC に統合されていました。

一部クラス名やメソッド名も変わっています。

サンプル ( 画面とソース : Build 432 でビルド )
http://labs.taiga.jp/flex3/TLFSample03/
http://labs.taiga.jp/flex3/TLFSample03/srcview/

flashx.textLayout.elements 編

Overview of the flashx.textLayout.elements package
http://livedocs.adobe.com/labs/textlayout/flashx/textLayout/elements/package-detail.html

TLF は、主に flashx.textLayout.elements によって定義されます。
モデルはテキストを表すために、下記のような階層的な Tree を使います。[*1]

flashx.textLayout.elements クラスの構造
[*1] : flashx.textLayout.elements クラスの構造

Tree のルートノードは、常に TextFlow クラスのインスタンスです。
div や p など見慣れた HTML 要素のような名前もありますが、これらはすべてクラスとして用意されています。[*2]

TLF で使用できるタグ一覧
[*2] : TLF で使用できるタグ一覧

TextFlow はコンテナとしてテキスト全体を表しています。

文字のみだと分かりづらいので、サンプルを用意しました。
編集とアンドゥ機能をつけたものです。

マークアップを使用したサンプル ( 画面とソース )
http://labs.taiga.jp/flex3/TLFSample01/
http://labs.taiga.jp/flex3/TLFSample01/srcview/

すべてクラスを使用したサンプル ( 画面とソース )
http://labs.taiga.jp/flex3/TLFSample02/
http://labs.taiga.jp/flex3/TLFSample02/srcview/

ちなみに、それぞれのサンプルで MySprite という Sprite のサブクラスを使用していますが、TLF が内部的に addChild() や removeChild() を頻繁に繰り返している様子を確認するためです。trace() の出力を追っていると、テキスト系クラス制御のヒントになり見ていて面白いですね。

なお、今回もでしたが、仕事が忙し目なので、次の更新も少々遅れるかも知れません。

[ 追記 ] : nod せんせいにいわれて気付いたんですが、TLFSample02 のようにマークアップエレメントのクラスをひとつひとつ生成して addChild() して使うケースでは、文字が二重に入力されてしまうようです。これはバグでしょうか?困りますね。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちTLFカテゴリに属しているものが含まれています。

前のカテゴリはFlex 4です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。