ローカルテスト用 FontLoader

by o8que
あのハック( http://wonderfl.net/c/d8DH )を使えばローカルでも読み込めることになぜ気が付かなかったのだろう。
wonderflに投稿する時には、importを追加するだけで差し替えられます。悪用厳禁!
♥2 | Line 157 | Modified 2011-03-16 02:25:02 | MIT License | (replaced)
play

ActionScript3 source code

/**
 * Copyright o8que ( http://wonderfl.net/user/o8que )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/8Zh5
 */

package {
    import flash.display.Sprite;
    import flash.events.Event;
    //import net.wonderfl.utils.FontLoader;
    
    [SWF(width = "465", height = "465", frameRate = "30")]
    public class Main extends Sprite {
        
        public function Main() {
            var loader:FontLoader = new FontLoader();
            loader.addEventListener(Event.COMPLETE, initialize);
            loader.load("Aqua");
        }
        
        private function initialize(event:Event):void {
            addChild(
                new TextBuilder().align(TextBuilder.CENTER).autoSize()
                .font("Aqua").fontSize(30).size(465, 465).build("ローカルでも試せる!")
            );
        }
    }
}
/* ------------------------------------------------------------------------------------------------
 * FontLoader
 * ------------------------------------------------------------------------------------------------
 */
//package {
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.net.URLRequest;
    import flash.text.Font;
    
    /** フォントの登録が完了した際に送出されます。 */
    [Event(name = "complete", type = "flash.events.Event")]
    /** ローカルテスト時に net.wonderfl.utils.FontLoader クラスの代わりに使用します。 */
    //public 
    class FontLoader extends EventDispatcher {
        private var _fontName:String;
        
        public function FontLoader() { }
        
        /**
         * フォントを読み込んで登録します。
         * @param    fontName
         * ["Aqua","Azuki","Cinecaption","Mona","Sazanami","YSHandy","VLGothic","IPAGP","IPAM","UmeUgo","UmePms","Bebas"]
         */
        public function load(fontName:String):void {
            _fontName = fontName;
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.INIT, onSWFLoaded);
            loader.load(new URLRequest("http://assets.wonderfl.net/static/fonts/" + _fontName + ".swf"));
        }
        
        private function onSWFLoaded(event:Event):void {
            event.target.removeEventListener(Event.INIT, onSWFLoaded);
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.INIT, registerFont);
            loader.loadBytes(event.target.bytes);
        }
        
        private function registerFont(event:Event):void {
            event.target.removeEventListener(Event.INIT, registerFont);
            Font.registerFont(Class(event.target.applicationDomain.getDefinition("net.wonderfl.fonts." + _fontName + "_font")));
            dispatchEvent(new Event(Event.COMPLETE));
        }
    }
//}
/* ------------------------------------------------------------------------------------------------
 * TextBuilder
 * ------------------------------------------------------------------------------------------------
 */
//package {
    import flash.geom.Point;
    import flash.text.AntiAliasType;
    import flash.text.GridFitType;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    
    /** 複雑な設定の flash.text.TextField クラスの生成を単純化します。 */
    //public 
    class TextBuilder {
        public static const LEFT:String = "left";
        public static const RIGHT:String = "right";
        public static const CENTER:String = "center";
        
        private var _align:String;
        private var _autoSize:Boolean;
        private var _bold:Boolean;
        private var _filters:Array;
        private var _fontName:String;
        private var _sharpness:Number;
        private var _thickness:Number;
        private var _fontColor:uint;
        private var _fontSize:int;
        private var _position:Point;
        private var _size:Point;
        
        public function TextBuilder() {
            _align = TextBuilder.LEFT;
            _autoSize = _bold = false;
            _filters = [];
            _fontName = null;
            _sharpness = _thickness = 0;
            _fontColor = 0x000000;
            _fontSize = 12;
            _position = new Point(0, 0);
            _size = new Point(100, 100);
        }
        
        public function align(value:String):TextBuilder {
            _align = value;
            return this;
        }
        
        public function autoSize(enabled:Boolean = true):TextBuilder {
            _autoSize = enabled;
            return this;
        }
        
        public function bold(enabled:Boolean = true):TextBuilder {
            _bold = enabled;
            return this;
        }
        
        public function filters(value:Array):TextBuilder {
            _filters = value;
            return this;
        }
        
        public function font(name:String, sharpness:Number = 0, thickness:Number = 0):TextBuilder {
            _fontName = name;
            _sharpness = sharpness;
            _thickness = thickness;
            return this;
        }
        
        public function fontColor(value:uint):TextBuilder {
            _fontColor = value;
            return this;
        }
        
        public function fontSize(value:int):TextBuilder {
            _fontSize = value;
            return this;
        }
        
        public function pos(x:Number, y:Number, relative:Boolean = false):TextBuilder {
            _position.x = ((relative) ? _position.x : 0) + x;
            _position.y = ((relative) ? _position.y : 0) + y;
            return this;
        }
        
        public function size(width:Number, height:Number):TextBuilder {
            _size.x = width;
            _size.y = height;
            return this;
        }
        
        public function build(text:String):TextField {
            var tf:TextField = new TextField();
            tf.x = _position.x;
            tf.width = _size.x;
            tf.height = _size.y;
            var format:TextFormat = new TextFormat(_fontName, _fontSize, _fontColor, _bold);
            if (_fontName) {
                tf.embedFonts = true;
                tf.antiAliasType = AntiAliasType.ADVANCED;
                tf.gridFitType = (_align == TextBuilder.LEFT) ? GridFitType.PIXEL : GridFitType.SUBPIXEL;
                tf.sharpness = _sharpness;
                tf.thickness = _thickness;
            }
            if (_autoSize) {
                switch(_align) {
                    case TextBuilder.LEFT: { tf.autoSize = TextFieldAutoSize.LEFT; break; }
                    case TextBuilder.RIGHT: { tf.autoSize = TextFieldAutoSize.RIGHT; break; }
                    case TextBuilder.CENTER: { tf.autoSize = TextFieldAutoSize.CENTER; break; }
                }
            }else {
                switch(_align) {
                    case TextBuilder.LEFT: { format.align = TextFormatAlign.LEFT; break; }
                    case TextBuilder.RIGHT: { format.align = TextFormatAlign.RIGHT; break; }
                    case TextBuilder.CENTER: { format.align = TextFormatAlign.CENTER; break; }
                }
            }
            tf.defaultTextFormat = format;
            tf.text = text;
            tf.y = _position.y + ((_autoSize) ? Math.max(0, int((_size.y - (tf.textHeight + 4)) / 2)) : 0);
            tf.filters = _filters.concat();
            tf.mouseEnabled = tf.selectable = false;
            return tf;
        }
        
        public function clone():TextBuilder {
            return new TextBuilder().align(_align).autoSize(_autoSize).bold(_bold).filters(_filters)
            .font(_fontName, _sharpness, _thickness).fontColor(_fontColor).fontSize(_fontSize)
            .pos(_position.x, _position.y).size(_size.x, _size.y);
        }
    }
//}