2008年07月24日
埋め込みフォントの情報を swfassist で取得する
先日の Shibuya.js のあとに、BeInteractive! の yossy さんが「swfassist を使ってくれる人が少なくて悲しい」みたいなことを言ってたので、埋め込みフォントのベクタ情報を swfassist を使って取得してみた。
SWF のバイト情報は loaderInfo.bytes に入っている。そこで、フォントを埋め込んだ SWF を swfassist に食わしてやると、フォントのベクタ情報が取れる。このベクタ情報を元に ShapeOutlineDrawer を使って描画してる。
(追記) ただし、loaderInfo.bytes は Flash Player 9.0.115 以降にしか含まれていないので、それ以前のバージョンだとエラーになる。
ShapeOutlineDrawer には graphics.lineStyle(1,0x000000); という行があるのだけど、呼び出し元で線の太さを指定したかったので、この部分をコメントアウトして使っている。1行だけ違う別のクラス作るのもなんだか微妙だったので…。
そのほかは、ほとんど公式のドキュメントそのまんま。やってることは swfassist でフォントのベクタ情報取得 - 8時40分が超えられない - subtech に近い。見た目は PotrAs でチラシ文字 - てっく煮ブログ の焼き直し。
ソースは以下に。
package {
import flash.display.Sprite;
import flash.filters.DropShadowFilter;
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;
import org.libspark.swfassist.flash.display.FlashGraphics;
public class Pop2 extends Sprite {
[Embed(source='アニトM-教漢.TTF',fontName='anito',unicodeRange='U+58F2,U+5927,U+5B89')]
private var font:lass;
public function Pop2(){
stage.align = "TL";
stage.scaleMode = "noScale";
var input:ataInput = new ByteArrayInputStream(loaderInfo.bytes);
var context:eadingContext = new ReadingContext();
var reader:WFReader = new SWFReader();
var swf:WF = reader.readSWF(input,context);
var shapeCollector:hapeCollector = new ShapeCollector();
swf.visit(shapeCollector);
var drawer:hapeOutlineDrawer = new ShapeOutlineDrawer();
var s1:prite = draw(shapeCollector.shapes[2],drawer);
var s2:prite = draw(shapeCollector.shapes[3],drawer);
var s3:prite = draw(shapeCollector.shapes[1],drawer);
addChild(s1); s1.x = 10; s1.y = 50;
addChild(s2); s2.x = 60; s2.y = 50;
addChild(s3); s3.x = 110; s3.y = 50;
scaleX = scaleY = 2;
filters = [new DropShadowFilter(4,45,0x000080,1,0,0)];
}
private function draw(shape:hape,drawer:hapeOutlineDrawer):prite{
var ret:prite = new Sprite();
drawer.graphics = new FlashGraphics(ret.graphics);
ret.graphics.lineStyle(5,0xff0000);
ret.graphics.beginFill(0xff0000);
drawer.draw(shape);
ret.graphics.endFill();
ret.graphics.lineStyle(1,0xffffff);
drawer.draw(shape);
ret.graphics.endFill();
return ret;
}
}
}