2008年07月25日
フォント情報を元に歪めて描画:ユメのカタチ
埋め込みフォントの情報を swfassist で取得するから先へ進んで、フォントのベクタ情報を加工して遊んでみよう。
(追記) 手元の Firefox だと「bytes が読み取れない」と例外が出る。ブラウザや Player のバージョンによっては動かない!? bytes は Flash Player 9.0.115.0 以降にしかないので、それ以前のバージョンでは動かない…ということだ。
swfassist には描画の仕方を定義する FlashGraphics クラスがある。これを拡張して、FuzzyFlashGraphics というクラスを作成してみた。与えられた座標から、ずらして描画するためのクラスだ。
さっそく例。ランダムにずらしつつ、ずらす幅を時間ごとに変化させてみた。
FlashGraphics オブジェクトのコールバック関数 f で歪め方を定義する。そこそこ汎用的に遊べるんじゃないかと思う。
フォントの座標情報が手中にあるんだから、なんかしら面白いことができそうなんだけど、これぐらいしか思いつかないなぁ…。
ソースは以下に。
package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; import org.libspark.swfassist.io.*; import org.libspark.swfassist.swf.io.*; import org.libspark.swfassist.swf.structures.SWF; import org.libspark.swfassist.swf.structures.Shape; import org.libspark.swfassist.swf.structures.ShapeRecord; import org.libspark.swfassist.swf.structures.ShapeRecordTypeConstants; import org.libspark.swfassist.inprogress.swf.ShapeCollector; import org.libspark.swfassist.flash.display.ShapeDrawer; import org.libspark.swfassist.flash.display.ShapeOutlineDrawer; [SWF(backgroundColor="#000000", frameRate="6")] public class FuzzyFontDemo extends Sprite { [Embed(source='アニトM-教漢.TTF', fontName='anito', unicodeRange='U+5922')] private var font:Class; public function FuzzyFontDemo(){ stage.align = "TL"; stage.scaleMode = "noScale"; var input:DataInput = new ByteArrayInputStream(loaderInfo.bytes); var context:ReadingContext = new ReadingContext(); var reader:SWFReader = new SWFReader(); var swf:SWF = reader.readSWF(input, context); var shapeCollector:ShapeCollector = new ShapeCollector(); swf.visit(shapeCollector); var shape:Shape = shapeCollector.shapes[1]; var sprite:Sprite = new Sprite(); addChild(sprite); var rad:Number = 0; addEventListener("enterFrame", function(event:Event):void{ sprite.graphics.clear(); var fuzzy:FuzzyFlashGraphics = new FuzzyFlashGraphics(sprite.graphics); var a:Number = Math.sin(rad / 180 * Math.PI) * 4; rad = (rad + 4) % 360; fuzzy.f = function(pt:Point):Point{ pt.x += (Math.random() - .5) * a; pt.y += (Math.random() - .5) * a; return pt; } var drawer:ShapeOutlineDrawer = new ShapeOutlineDrawer(); drawer.graphics = fuzzy; sprite.graphics.lineStyle(0, 0xffffff); sprite.graphics.beginFill(0xffffff); drawer.draw(shape); sprite.graphics.endFill(); }); sprite.y = 50; scaleX = scaleY = 5; } } } import flash.display.Graphics; import flash.geom.Point; import org.libspark.swfassist.flash.display.FlashGraphics; class FuzzyFlashGraphics extends FlashGraphics{ public function FuzzyFlashGraphics(graphics:Graphics = null){ super(graphics); _f = function(pt:Point):Point{return pt;} } private var _f:Function = null; public function get f():Function{return _f;} public function set f(value:Function):void{_f = value;} public override function curveTo(controlX:Number, controlY:Number, anchorX:Number, anchorY:Number):void{ var p1:Point = _f(new Point(controlX, controlY)); var p2:Point = _f(new Point(anchorX, anchorY)); super.curveTo(p1.x, p1.y, p2.x, p2.y); } public override function lineTo(x:Number, y:Number):void{ var p:Point = _f(new Point(x, y)); super.lineTo(p.x, p.y); } public override function moveTo(x:Number, y:Number):void{ var p:Point = _f(new Point(x, y)); super.moveTo(p.x, p.y); } }