フォント共有テスト(Dynamic Embedded Fonts)


必要に迫られて動的にフォントを共有しなければならなくなったので、FontEmbedクラスを作ってみました。で、そのテストも兼ねて。
(日本語のフォントを埋め込んでいますのでローディングに相当時間がかかります・・・)

読み込むフォント共有用のSWFは、ライブラリに埋め込むフォントを登録してリンケージの設定とランタイム共有の設定(自身のフルパスを記入)を行い、Security.allowDomainの引数を”*”にしてあります。

フォント共有テスト(Dynamic Embedded Fonts) – wonderfl build flash online

以下のコードはフォント埋め込みクラスです。
使用方法はwonderflのコードを参照してください。

import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.EventDispatcher;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.Font;
import flash.system.LoaderContext;
import flash.system.ApplicationDomain;
import flash.system.SecurityDomain;
import flash.system.Security;

public class FontEmbed extends EventDispatcher {

	private var _fontClassName:String
	private var _loader:Loader = new Loader()
	public var prigress:int
	
	public static const FONT_LOADED:String = "font_loaded";
	
	public function FontEmbed(fontPath:String, fontClassName:String) {
		Security.loadPolicyFile("someDomain/crossdomain.xml");
		Security.allowDomain("someDomain");
		swfLoad(fontPath);
		_fontClassName = fontClassName;
	}
	
	//Load FontSwf
	private function swfLoad(fontPath:String):void{
		var context:LoaderContext = new LoaderContext(); 
		context.checkPolicyFile = true;
		context.securityDomain = SecurityDomain.currentDomain;
		context.applicationDomain = ApplicationDomain.currentDomain;
		var req:URLRequest = new URLRequest(fontPath);
		_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfLoadComplete);
		_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onProgressListener);
		_loader.load(req, context);
	}
	
	//Progress
	private function onProgressListener(e:ProgressEvent):void {
		prigress = e.bytesLoaded/e.bytesTotal*100;
	}
	
	//Load Complete
	private function swfLoadComplete(e:Event):void {
		_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,swfLoadComplete);
		_loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS,onProgressListener);
		//
		var fontClass:Class = _loader.contentLoaderInfo.applicationDomain.getDefinition(_fontClassName) as Class; 
		try{
			Font.registerFont(fontClass);
		}catch(e:Error){
			// Error Msg
		}
		dispatchEvent(new Event(FontEmbed.FONT_LOADED));
	}
	
	//Embeted Font
	public function embetedFont(txt:TextField, fontname:String, size:Number, fmt:TextFormat):void {
		var tfmt:TextFormat = fmt
		tfmt.font = fontname;
		tfmt.size = size;
		txt.embedFonts = true;
		txt.defaultTextFormat = tfmt;
	}
}