Advertisement
xlune

CustomFont3D.as

Apr 11th, 2011
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package {
  2.     import com.nitoyon.potras.*;
  3.     import org.papervision3d.typography.Font3D;
  4.     import flash.display.BitmapData;
  5.     import flash.geom.Point;
  6.     import flash.text.TextField;
  7.     import flash.text.TextFormat;
  8.     public class CustomFont3D extends Font3D
  9.     {
  10.  
  11.         private static var __motifs:Object = {};
  12.         private static var __widths:Object = {};
  13.         private static var __height:Number = 119;
  14.         private var _initialized:Boolean = false;
  15.        
  16.         private var _text:String;
  17.         private var _font:String;
  18.         private var _size:uint;
  19.        
  20.         public function CustomFont3D(text:String, font:String="_ゴシック", size:uint=72)
  21.         {
  22.             _text = text;
  23.             _font = font;
  24.             _size = size;
  25.         }
  26.        
  27.         private function initialize():void {
  28.             if(!_initialized)
  29.             {
  30.                 initializeMotifsAndWidths();
  31.                 _initialized = true;
  32.             }
  33.         }
  34.        
  35.         ////////////////////////////////////////////
  36.         override public function get motifs():Object
  37.         {
  38.             if(!_initialized)initialize();
  39.             return __motifs;
  40.         }
  41.  
  42.         override public function get widths():Object
  43.         {
  44.             if(!_initialized)initialize();
  45.             return __widths;
  46.         }
  47.        
  48.         override public function get height():Number
  49.         {
  50.             if(!_initialized)initialize();
  51.             return __height;
  52.         }
  53.         ////////////////////////////////////////////
  54.  
  55.         private function initializeMotifsAndWidths():void
  56.         {
  57.             var arr:Array = _text.split("");
  58.             var result:Array;
  59.             for(var i:uint=0,max:uint=arr.length; i<max; i++)
  60.             {
  61.                 if(!__motifs[arr[i]])
  62.                 {
  63.                     result = getMotifsAndWidths(arr[i]);
  64.                     __motifs[arr[i]] = result[0];
  65.                     __widths[arr[i]] = result[1];
  66.                 }
  67.             }
  68.         }
  69.        
  70.         private function getMotifsAndWidths(str:String):Array
  71.         {
  72.             var arr:Array = [];
  73.             var pathList:ClosedPathList = CustomFont.traceLetter(str, _size, _font);
  74.             for each(var path:ClosedPath in pathList.$a)
  75.             {
  76.                 arr = arr.concat(getPoints(path.$a));
  77.             }
  78.             var data:Array = [
  79.                 arr,
  80.                 _size
  81.             ];
  82.             return data;
  83.         }
  84.        
  85.         /**
  86.          * PotrAs(traceLetter) edited
  87.          */
  88.         public static function traceLetter(letter:String, fontSize:int, font:String="_ゴシック"):ClosedPathList
  89.         {
  90.             var tf:TextFormat = new TextFormat();
  91.             tf.font = font;
  92.             tf.size = fontSize;
  93.  
  94.             var text:TextField = new TextField();
  95.             text.defaultTextFormat = tf;
  96.             text.autoSize = "left";
  97.             text.text = letter;
  98.  
  99.             // We have to use threshold method to binarize, because Mac OS draws antialiased text.
  100.             var bmdtmp:BitmapData = new BitmapData(fontSize * letter.length, fontSize * 1.2, true);
  101.             var bitmapdata:BitmapData = bmdtmp.clone();
  102.             bmdtmp.draw(text);
  103.             bitmapdata.threshold(bmdtmp, bmdtmp.rect, new Point(), "<", 0xffdddddd, 0xff000000);
  104.  
  105.             var pathList:Array = PathList.create(bitmapdata);
  106.             var c:ClosedPathList = ProcessPath.processPath(pathList);
  107.  
  108.             bmdtmp.dispose();
  109.             bitmapdata.dispose();
  110.             return c;
  111.         }
  112.         /**
  113.          * ClosedPath(draw) edited
  114.          */
  115.         public function getPoints($a:Array):Array
  116.         {
  117.             var arr:Array = [];
  118.             var pt:Point = $a[$a.length - 1].c[2];
  119.             arr.push(['M', [pt.x, pt.y]]);
  120.            
  121.             for(var i:int = 0; i < $a.length; i++)
  122.             {
  123.                 var c:Curve = $a[i];
  124.  
  125.                 if(c.tag == ProcessPath.POTRACE_CORNER)
  126.                 {
  127.                     arr.push(['L', [c.c[1].x, c.c[1].y]]);
  128.                     arr.push(['L', [c.c[2].x, c.c[2].y]]);
  129.                 }
  130.                 else
  131.                 {
  132.                     for(var t:Number = 0; t < 1.0; t += 0.02)
  133.                     {
  134.                         var p:Point = getBezierPoint(pt, c.c[0], c.c[1], c.c[2], t);
  135.                         arr.push(['L', [p.x, p.y]]);
  136.                     }
  137.                     arr.push(['L', [c.c[2].x, c.c[2].y]]);
  138.                 }
  139.                 pt = c.c[2];
  140.             }
  141.             return arr;
  142.         }
  143.         /**
  144.          * ClosedPath(getBezierPoint) edited
  145.          */
  146.         protected function getBezierPoint(p0:Point, p1:Point, p2:Point, p3:Point, t:Number):Point
  147.         {
  148.             return new Point(Math.pow(1 - t, 3)  * p0.x + 3 * t * Math.pow(1 - t, 2) * p1.x
  149.                         + 3 * t * t * (1 - t) * p2.x + t * t * t * p3.x,
  150.                         Math.pow(1 - t, 3)  * p0.y + 3 * t * Math.pow(1 - t, 2) * p1.y
  151.                         + 3 * t * t * (1 - t) * p2.y + t * t * t * p3.y);
  152.         }
  153.     }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement