<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>benchmarks/Biotyp.svg</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -4,7 +4,7 @@
 &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=windows-1250&quot;&gt;
 &lt;meta name=&quot;generator&quot; content=&quot;PSPad editor, www.pspad.com&quot;&gt;
 &lt;title&gt;Processing.js Benchmarks&lt;/title&gt;
-&lt;script type=&quot;text/javascript&quot; src=&quot;../processing.js&quot;&gt;&lt;/script&gt;
+&lt;script type=&quot;text/javascript&quot; src=&quot;../processing.min.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot;&gt;
 /*
  * This code searches for all the &lt;script type=&quot;application/processing&quot; target=&quot;canvasid&quot;&gt;
@@ -45,18 +45,27 @@ if ( document.addEventListener ) {
 &lt;body&gt;
 &lt;h1&gt;Processing.js Benchmarks&lt;/h1&gt;
 &lt;h2&gt;All Canvas elements should render green&lt;/h2&gt;
+
+  &lt;div&gt;&lt;p&gt;text()&lt;p&gt;
+  &lt;script type=&quot;application/processing&quot;&gt;
+    size(50,50);    
+    noStroke();
+    PFont fontA = loadFont(&quot;Biotyp.svg&quot;);
+    textFont(fontA, 12); 
+    fill(0);
+    text(&quot;Working!&quot;, 0, 0);        
+  &lt;/script&gt;&lt;canvas style=&quot;background:#0f0;&quot;&gt;&lt;/canvas&gt;    
+  &lt;/div&gt;
   
   &lt;div&gt;&lt;p&gt;println()&lt;p&gt;
   &lt;script type=&quot;application/processing&quot;&gt;
     size(50,50);    
     noStroke();
-    void lnPrinted(){      
-      if(ln==&quot;fillGreen&quot;){         
-        fill(0,255,0);
-        rect(0,0,50,50);
-      }
+    void lnPrinted(){
+      fill(ln[0],ln[1],ln[2]);
+      rect(0,0,50,50);
     }
-    println(&quot;fillGreen&quot;);    
+    println(0,255,0);    
   &lt;/script&gt;&lt;canvas style=&quot;background:red;&quot;&gt;&lt;/canvas&gt;    
   &lt;/div&gt;
   </diff>
      <filename>benchmarks/index.html</filename>
    </modified>
    <modified>
      <diff>@@ -310,7 +310,10 @@ function buildProcessing( curElement ){
   var start = (new Date).getTime();
   
   // println(), print()
-  p.ln = &quot;&quot;;    
+  p.ln = &quot;&quot;;
+  
+  // Glyph path storage for quick rendering  
+  p.glyphTable = {};
   
   // Global vars for tracking mouse position
   p.pmouseX = 0;
@@ -664,17 +667,38 @@ function buildProcessing( curElement ){
   };
 
   p.loadFont = function loadFont( name ) {
-    return {
+    if(name.indexOf(&quot;.svg&quot;)==-1){
+      return {
+        name: name,
+        width: function( str ) {
+          if ( curContext.mozMeasureText )
+            return curContext.mozMeasureText( typeof str == &quot;number&quot; ?
+              String.fromCharCode( str ) :
+              str) / curTextSize;
+          else
+            return 0;
+        }
+      };
+    }else{// If the font is a glyph, calculate by SVG table 
+      var font=p.loadGlyphs(name);
+      return {
       name: name,
+      glyph: true,
+      units_per_em: font.units_per_em,
+      horiz_adv_x: font.horiz_adv_x,
+      ascent: font.ascent,
+      descent: font.descent,
       width: function( str ) {
-        if ( curContext.mozMeasureText )
-          return curContext.mozMeasureText( typeof str == &quot;number&quot; ?
-            String.fromCharCode( str ) :
-            str) / curTextSize;
-        else
-          return 0;
+        var width=0;
+        var len = str.length;
+        for(var i=0;i &lt; len;i++){                          
+          try{width+=parseFloat(p.glyphLook(p.glyphTable[name],str[i]).horiz_adv_x);}
+          catch(e){;}
+        }
+        return width/p.glyphTable[name].units_per_em;
+        }
       }
-    };
+    }
   };
 
   p.textFont = function textFont( name, size ) {
@@ -690,18 +714,227 @@ function buildProcessing( curElement ){
 
   p.textAlign = function textAlign(){};
 
+  p.glyphLook = function glyphLook(font,chr){
+    try{
+      switch(chr){
+        case &quot;1&quot;:return font[&quot;one&quot;];break;
+        case &quot;2&quot;:return font[&quot;two&quot;];break;
+        case &quot;3&quot;:return font[&quot;three&quot;];break;
+        case &quot;4&quot;:return font[&quot;four&quot;];break;
+        case &quot;5&quot;:return font[&quot;five&quot;];break;
+        case &quot;6&quot;:return font[&quot;six&quot;];break;
+        case &quot;7&quot;:return font[&quot;seven&quot;];break;
+        case &quot;8&quot;:return font[&quot;eight&quot;];break;
+        case &quot;9&quot;:return font[&quot;nine&quot;];break;
+        case &quot;0&quot;:return font[&quot;zero&quot;];break;
+        case &quot; &quot;:return font[&quot;space&quot;];break;
+        case &quot;$&quot;:return font[&quot;dollar&quot;];break;
+        case &quot;!&quot;:return font[&quot;exclam&quot;];break;
+        case '&quot;':return font[&quot;quotedbl&quot;];break;
+        case &quot;#&quot;:return font[&quot;numbersign&quot;];break;
+        case &quot;%&quot;:return font[&quot;percent&quot;];break;
+        case &quot;&amp;&quot;:return font[&quot;ampersand&quot;];break;
+        case &quot;'&quot;:return font[&quot;quotesingle&quot;];break;
+        case &quot;(&quot;:return font[&quot;parenleft&quot;];break;
+        case &quot;)&quot;:return font[&quot;parenright&quot;];break;
+        case &quot;*&quot;:return font[&quot;asterisk&quot;];break;
+        case &quot;+&quot;:return font[&quot;plus&quot;];break;
+        case &quot;,&quot;:return font[&quot;comma&quot;];break;
+        case &quot;-&quot;:return font[&quot;hyphen&quot;];break;
+        case &quot;.&quot;:return font[&quot;period&quot;];break;
+        case &quot;/&quot;:return font[&quot;slash&quot;];break;
+        case &quot;_&quot;:return font[&quot;underscore&quot;];break;
+        case &quot;:&quot;:return font[&quot;colon&quot;];break;
+        case &quot;;&quot;:return font[&quot;semicolon&quot;];break;
+        case &quot;&lt;&quot;:return font[&quot;less&quot;];break;
+        case &quot;=&quot;:return font[&quot;equal&quot;];break;
+        case &quot;&gt;&quot;:return font[&quot;greater&quot;];break;
+        case &quot;?&quot;:return font[&quot;question&quot;];break;
+        case &quot;@&quot;:return font[&quot;at&quot;];break;
+        case &quot;[&quot;:return font[&quot;bracketleft&quot;];break;
+        case &quot;\\&quot;:return font[&quot;backslash&quot;];break;
+        case &quot;]&quot;:return font[&quot;bracketright&quot;];break;
+        case &quot;^&quot;:return font[&quot;asciicircum&quot;];break;
+        case &quot;`&quot;:return font[&quot;grave&quot;];break;
+        case &quot;{&quot;:return font[&quot;braceleft&quot;];break;
+        case &quot;|&quot;:return font[&quot;bar&quot;];break;
+        case &quot;}&quot;:return font[&quot;braceright&quot;];break;
+        case &quot;~&quot;:return font[&quot;asciitilde&quot;];break;
+        default:return font[chr]; break;
+      }
+    }catch(e){;}
+  }
+  
   p.text = function text( str, x, y ) {
-    if ( str &amp;&amp; curContext.mozDrawText ) {
-      curContext.save();
-      curContext.mozTextStyle = curTextSize + &quot;px &quot; + curTextFont.name;
-      curContext.translate(x, y);
-      curContext.mozDrawText( typeof str == &quot;number&quot; ?
-        String.fromCharCode( str ) :
-        str );
+    if(!curTextFont.glyph){
+      if ( str &amp;&amp; curContext.mozDrawText ) {
+        curContext.save();
+        curContext.mozTextStyle = curTextSize + &quot;px &quot; + curTextFont.name;
+        curContext.translate(x, y);
+        curContext.mozDrawText( typeof str == &quot;number&quot; ?
+          String.fromCharCode( str ) :
+          str );
+        curContext.restore();
+      }
+    }else{
+      var font=p.glyphTable[curTextFont.name];
+        curContext.save();
+        curContext.translate(x,y+curTextSize);
+        var upem = font[&quot;units_per_em&quot;];
+        var newScale=1/upem*curTextSize;
+        curContext.scale(newScale,newScale);
+        var len = str.length;
+        for(var i=0;i &lt; len;i++){
+          try{p.glyphLook(font,str[i]).draw();}
+          catch(e){;}
+        }
       curContext.restore();
     }
   };
   
+  
+  // Load Batik SVG Fonts and parse to pre-def objects for quick rendering - F1LT3R 
+  p.loadGlyphs=function loadGlyph(url){
+      // SJAX SVG as XML D.O.
+      var loadXML=function loadXML(){
+        try{var xmlDoc=new ActiveXObject(&quot;Microsoft.XMLDOM&quot;);}
+        catch(e){try{xmlDoc=document.implementation.createDocument(&quot;&quot;,&quot;&quot;,null);}
+        catch(e){p.println(e.message);return;}}
+          try{// Firefox, Mozilla, Opera, etc.
+            xmlDoc.async=false;
+            xmlDoc.load(url);
+            parse(xmlDoc.getElementsByTagName(&quot;svg&quot;)[0]);
+            }
+          catch(e){try{// Google Chrome, Safari etc.
+             try{console.log(e)}catch(e){alert(e);}
+             var xmlhttp = new window.XMLHttpRequest();
+             xmlhttp.open(&quot;GET&quot;,url,false);
+             xmlhttp.send(null);
+             parse(xmlhttp.responseXML.documentElement);
+            }catch(e){}
+          }
+      }
+      
+      // Return arrays of SVG commands and coords
+      var regex=function regex(needle,hay){
+        var regexp=new RegExp(needle,&quot;g&quot;);
+        var i=0;
+        var results=[];
+        while(results[i]=regexp.exec(hay)){i++;}
+        return results;
+      }        
+      
+      // Parse SVG font-file
+      var parse=function parse(svg){
+        
+        // Store font attributes
+        var font=svg.getElementsByTagName(&quot;font&quot;);
+        p.glyphTable[url][&quot;horiz_adv_x&quot;]=font[0].getAttribute(&quot;horiz-adv-x&quot;);      
+        var font_face=svg.getElementsByTagName(&quot;font-face&quot;)[0];                  
+        p.glyphTable[url][&quot;units_per_em&quot;]=parseFloat(font_face.getAttribute(&quot;units-per-em&quot;));
+        p.glyphTable[url][&quot;ascent&quot;]=parseFloat(font_face.getAttribute(&quot;ascent&quot;));
+        p.glyphTable[url][&quot;descent&quot;]=parseFloat(font_face.getAttribute(&quot;descent&quot;));          
+        
+        var getXY = &quot;[0-9\-]+&quot;;
+        var glyph = svg.getElementsByTagName(&quot;glyph&quot;);
+        
+        // Loop through each glyph in the SVG
+        var len = glyph.length;
+        for(var i=0;i &lt; len;i++){
+          
+          // Store attributes for this glyph
+          var unicode = glyph[i].getAttribute(&quot;unicode&quot;);
+          var name = glyph[i].getAttribute(&quot;glyph-name&quot;);
+          var horiz_adv_x = glyph[i].getAttribute(&quot;horiz-adv-x&quot;);
+          if(horiz_adv_x==null){var horiz_adv_x=p.glyphTable[url]['horiz_adv_x'];}
+          
+          var buildPath = function buildPath(d){ 
+            var c = regex(&quot;[A-Za-z][0-9\- ]+|Z&quot;,d);                                                    
+            // Begin storing path object 
+            var path=&quot;var path={draw:function(){curContext.beginPath();&quot;;//curContext.beginPath();
+            // Loop through SVG commands translating to canvas eqivs functions in path object
+            var x=0,y=0,cx=0,cy=0,nx=0,ny=0,d=0,a=0,lastCom=&quot;&quot;;
+            var lenC = c.length-1;
+            for(var j=0;j &lt; lenC;j++){
+              var com=c[j][0];
+              var xy=regex(getXY,com);
+              switch(com[0]){            
+                case &quot;M&quot;://curContext.moveTo(x,-y);
+                  x=parseFloat( xy[0][0] );
+                  y=parseFloat( xy[1][0] );              
+                  path+=&quot;curContext.moveTo(&quot;+(x)+&quot;,&quot;+(-y)+&quot;);&quot;;
+                  break;
+                case &quot;L&quot;://curContext.lineTo(x,-y);
+                  x=parseFloat( xy[0][0] );
+                  y=parseFloat( xy[1][0] );
+                  path+=&quot;curContext.lineTo(&quot;+(x)+&quot;,&quot;+(-y)+&quot;);&quot;;
+                  break;
+                case &quot;H&quot;://curContext.lineTo(x,-y)
+                  x=parseFloat( xy[0][0] );
+                  path+=&quot;curContext.lineTo(&quot;+(x)+&quot;,&quot;+(-y)+&quot;);&quot;;
+                  break;
+                case &quot;V&quot;://curContext.lineTo(x,-y);
+                  y=parseFloat( xy[0][0] );              
+                  path+=&quot;curContext.lineTo(&quot;+(x)+&quot;,&quot;+(-y)+&quot;);&quot;;
+                  break;
+                case &quot;T&quot;://curContext.quadraticCurveTo(cx,-cy,nx,-ny);
+                  nx=parseFloat( xy[0][0] );
+                  ny=parseFloat( xy[1][0] );
+                  if(lastCom==&quot;Q&quot;||lastCom==&quot;T&quot;){
+                    d=Math.sqrt(Math.pow(x-cx,2)+Math.pow(cy-y,2));
+                    a=Math.PI+Math.atan2(cx-x,cy-y);
+                    cx=x+(Math.sin(a)*(d));
+                    cy=y+(Math.cos(a)*(d));
+                  }else{cx=x;cy=y;}       
+                  path+=&quot;curContext.quadraticCurveTo(&quot;+(cx)+&quot;,&quot;+(-cy)+&quot;,&quot;+(nx)+&quot;,&quot;+(-ny)+&quot;);&quot;;
+                  x=nx;y=ny;
+                  break; 
+                case &quot;Q&quot;://curContext.quadraticCurveTo(cx,-cy,nx,-ny);
+                  cx=parseFloat( xy[0][0] );
+                  cy=parseFloat( xy[1][0] );
+                  nx=parseFloat( xy[2][0] );
+                  ny=parseFloat( xy[3][0] );  
+                  path+=&quot;curContext.quadraticCurveTo(&quot;+(cx)+&quot;,&quot;+(-cy)+&quot;,&quot;+(nx)+&quot;,&quot;+(-ny)+&quot;);&quot;;              
+                  x=nx;y=ny;
+                  break;
+                case &quot;Z&quot;://curContext.closePath();
+                  path+=&quot;curContext.closePath();&quot;;
+                  break;
+              }
+              lastCom=com[0];
+            }
+            path+=&quot;curContext.translate(&quot;+(horiz_adv_x)+&quot;,0);&quot;;
+            path+=&quot;curContext.stroke();curContext.fill();}}&quot;;//curContext.stroke();//curContext.fill();
+            return path;
+          }
+          
+          // Split path commands in glpyh          
+          var d=glyph[i].getAttribute(&quot;d&quot;);
+          if(d!==undefined){
+            var path=buildPath(d);
+            eval(path);
+            // Store glyph data to table object
+            p.glyphTable[url][name]={
+              name:name,
+              unicode:unicode,
+              horiz_adv_x:horiz_adv_x,
+              draw:path.draw
+            }
+          }                  
+        } // finished adding glyphs to table
+      }
+      
+      // Create a new object in glyphTable to store this font
+      p.glyphTable[url]={};
+      
+      // Begin loading the Batik SVG font... 
+      loadXML(url);
+      
+      // Return the loaded font for attribute grabbing
+      return p.glyphTable[url];
+  }
+  
+  
   // Returns a line to lnPrinted() for user handling 
   p.lnPrinted = function lnPrinted(){};
   p.printed = function printed(){};  </diff>
      <filename>processing.js</filename>
    </modified>
    <modified>
      <diff>@@ -16,7 +16,7 @@ rest=methods+rest;aCode=left+rest+&quot;\n}}&quot;+staticVars+allRest;}
 aCode=aCode.replace(/Processing.\w+ = function addMethod/g,&quot;addMethod&quot;);function nextBrace(right){var rest=right;var position=0;var leftCount=1,rightCount=0;while(leftCount!=rightCount){var nextLeft=rest.indexOf(&quot;{&quot;);var nextRight=rest.indexOf(&quot;}&quot;);if(nextLeft&lt;nextRight&amp;&amp;nextLeft!=-1){leftCount++;rest=rest.slice(nextLeft+1);position+=nextLeft+1;}else{rightCount++;rest=rest.slice(nextRight+1);position+=nextRight+1;}}
 return right.slice(0,position-1);}
 aCode=aCode.replace(/\(int\)/g,&quot;0|&quot;);aCode=aCode.replace(new RegExp(&quot;\\((&quot;+classes.join(&quot;|&quot;)+&quot;)(\\[\\])?\\)&quot;,&quot;g&quot;),&quot;&quot;);aCode=aCode.replace(/(\d+)f[^a-zA-Z0-9]/g,&quot;$1&quot;);aCode=aCode.replace(/('[a-zA-Z0-9]')/g,&quot;$1.charCodeAt(0)&quot;);aCode=aCode.replace(/#([a-f0-9]{6})/ig,function(m,hex){var num=toNumbers(hex);return&quot;DefaultColor(&quot;+num[0]+&quot;,&quot;+num[1]+&quot;,&quot;+num[2]+&quot;)&quot;;});function toNumbers(str){var ret=[];str.replace(/(..)/g,function(str){ret.push(parseInt(str,16));});return ret;}
-return aCode;};function buildProcessing(curElement){var p={};p.PI=Math.PI;p.TWO_PI=2*p.PI;p.HALF_PI=p.PI/2;p.P3D=3;p.CORNER=0;p.RADIUS=1;p.CENTER_RADIUS=1;p.CENTER=2;p.POLYGON=2;p.QUADS=5;p.TRIANGLES=6;p.POINTS=7;p.LINES=8;p.TRIANGLE_STRIP=9;p.TRIANGLE_FAN=4;p.QUAD_STRIP=3;p.CORNERS=10;p.CLOSE=true;p.RGB=1;p.HSB=2;p.CENTER=88888880;p.CODED=88888888;p.UP=88888870;p.RIGHT=88888871;p.DOWN=88888872;p.LEFT=88888869;p.codedKeys=[69,70,71,72];var curContext=curElement.getContext(&quot;2d&quot;);var doFill=true;var doStroke=true;var loopStarted=false;var hasBackground=false;var doLoop=true;var looping=0;var curRectMode=p.CORNER;var curEllipseMode=p.CENTER;var inSetup=false;var inDraw=false;var curBackground=&quot;rgba(204,204,204,1)&quot;;var curFrameRate=1000;var curShape=p.POLYGON;var curShapeCount=0;var curvePoints=[];var curTightness=0;var opacityRange=255;var redRange=255;var greenRange=255;var blueRange=255;var pathOpen=false;var mousePressed=false;var keyPressed=false;var firstX,firstY,secondX,secondY,prevX,prevY;var curColorMode=p.RGB;var curTint=-1;var curTextSize=12;var curTextFont=&quot;Arial&quot;;var getLoaded=false;var start=(new Date).getTime();p.ln=&quot;&quot;;p.pmouseX=0;p.pmouseY=0;p.mouseX=0;p.mouseY=0;p.mouseButton=0;p.mouseDragged=undefined;p.mouseMoved=undefined;p.mousePressed=undefined;p.mouseReleased=undefined;p.keyPressed=undefined;p.keyReleased=undefined;p.draw=undefined;p.setup=undefined;p.width=curElement.width-0;p.height=curElement.height-0;p.frameCount=0;p.DefaultColor=function(aValue1,aValue2,aValue3){var tmpColorMode=curColorMode;curColorMode=p.RGB;var c=p.color(((aValue1/255)*redRange),((aValue2/255)*greenRange),((aValue3/255)*blueRange));curColorMode=tmpColorMode;return c;}
+return aCode;};function buildProcessing(curElement){var p={};p.PI=Math.PI;p.TWO_PI=2*p.PI;p.HALF_PI=p.PI/2;p.P3D=3;p.CORNER=0;p.RADIUS=1;p.CENTER_RADIUS=1;p.CENTER=2;p.POLYGON=2;p.QUADS=5;p.TRIANGLES=6;p.POINTS=7;p.LINES=8;p.TRIANGLE_STRIP=9;p.TRIANGLE_FAN=4;p.QUAD_STRIP=3;p.CORNERS=10;p.CLOSE=true;p.RGB=1;p.HSB=2;p.CENTER=88888880;p.CODED=88888888;p.UP=88888870;p.RIGHT=88888871;p.DOWN=88888872;p.LEFT=88888869;p.codedKeys=[69,70,71,72];var curContext=curElement.getContext(&quot;2d&quot;);var doFill=true;var doStroke=true;var loopStarted=false;var hasBackground=false;var doLoop=true;var looping=0;var curRectMode=p.CORNER;var curEllipseMode=p.CENTER;var inSetup=false;var inDraw=false;var curBackground=&quot;rgba(204,204,204,1)&quot;;var curFrameRate=1000;var curShape=p.POLYGON;var curShapeCount=0;var curvePoints=[];var curTightness=0;var opacityRange=255;var redRange=255;var greenRange=255;var blueRange=255;var pathOpen=false;var mousePressed=false;var keyPressed=false;var firstX,firstY,secondX,secondY,prevX,prevY;var curColorMode=p.RGB;var curTint=-1;var curTextSize=12;var curTextFont=&quot;Arial&quot;;var getLoaded=false;var start=(new Date).getTime();p.ln=&quot;&quot;;p.glyphTable={};p.pmouseX=0;p.pmouseY=0;p.mouseX=0;p.mouseY=0;p.mouseButton=0;p.mouseDragged=undefined;p.mouseMoved=undefined;p.mousePressed=undefined;p.mouseReleased=undefined;p.keyPressed=undefined;p.keyReleased=undefined;p.draw=undefined;p.setup=undefined;p.width=curElement.width-0;p.height=curElement.height-0;p.frameCount=0;p.DefaultColor=function(aValue1,aValue2,aValue3){var tmpColorMode=curColorMode;curColorMode=p.RGB;var c=p.color(((aValue1/255)*redRange),((aValue2/255)*greenRange),((aValue3/255)*blueRange));curColorMode=tmpColorMode;return c;}
 p.ajax=function(url){if(window.XMLHttpRequest){AJAX=new XMLHttpRequest();}
 else{AJAX=new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);}
 if(AJAX){AJAX.open(&quot;GET&quot;,url,false);AJAX.send(null);return AJAX.responseText;}else{return false;}}
@@ -44,9 +44,29 @@ p.image=function image(img,x,y,w,h){x=x||0;y=y||0;var obj=getImage(img);if(curTi
 if(arguments.length==3){curContext.drawImage(obj,x,y);}else{curContext.drawImage(obj,x,y,w,h);}
 if(curTint&gt;=0){curContext.globalAlpha=oldAlpha;}
 if(img._mask){var oldComposite=curContext.globalCompositeOperation;curContext.globalCompositeOperation=&quot;darker&quot;;p.image(img._mask,x,y);curContext.globalCompositeOperation=oldComposite;}};p.exit=function exit(){clearInterval(looping);};p.save=function save(file){};p.loadImage=function loadImage(file){var img=document.getElementById(file);if(!img)
-return;var h=img.height,w=img.width;var canvas=document.createElement(&quot;canvas&quot;);canvas.width=w;canvas.height=h;var context=canvas.getContext(&quot;2d&quot;);context.drawImage(img,0,0);var data=buildImageObject(context.getImageData(0,0,w,h));data.img=img;return data;};p.loadFont=function loadFont(name){return{name:name,width:function(str){if(curContext.mozMeasureText)
+return;var h=img.height,w=img.width;var canvas=document.createElement(&quot;canvas&quot;);canvas.width=w;canvas.height=h;var context=canvas.getContext(&quot;2d&quot;);context.drawImage(img,0,0);var data=buildImageObject(context.getImageData(0,0,w,h));data.img=img;return data;};p.loadFont=function loadFont(name){if(name.indexOf(&quot;.svg&quot;)==-1){return{name:name,width:function(str){if(curContext.mozMeasureText)
 return curContext.mozMeasureText(typeof str==&quot;number&quot;?String.fromCharCode(str):str)/curTextSize;else
-return 0;}};};p.textFont=function textFont(name,size){curTextFont=name;p.textSize(size);};p.textSize=function textSize(size){if(size){curTextSize=size;}};p.textAlign=function textAlign(){};p.text=function text(str,x,y){if(str&amp;&amp;curContext.mozDrawText){curContext.save();curContext.mozTextStyle=curTextSize+&quot;px &quot;+curTextFont.name;curContext.translate(x,y);curContext.mozDrawText(typeof str==&quot;number&quot;?String.fromCharCode(str):str);curContext.restore();}};p.lnPrinted=function lnPrinted(){};p.printed=function printed(){};p.println=function println(){var Caller=arguments.callee.caller.name.toString();if(arguments.length&gt;1){Caller!=&quot;print&quot;?p.ln=arguments:p.ln=arguments[0];}else{p.ln=arguments[0];}
+return 0;}};}else{var font=p.loadGlyphs(name);return{name:name,glyph:true,units_per_em:font.units_per_em,horiz_adv_x:font.horiz_adv_x,ascent:font.ascent,descent:font.descent,width:function(str){var width=0;var len=str.length;for(var i=0;i&lt;len;i++){try{width+=parseFloat(p.glyphLook(p.glyphTable[name],str[i]).horiz_adv_x);}
+catch(e){;}}
+return width/p.glyphTable[name].units_per_em;}}}};p.textFont=function textFont(name,size){curTextFont=name;p.textSize(size);};p.textSize=function textSize(size){if(size){curTextSize=size;}};p.textAlign=function textAlign(){};p.glyphLook=function glyphLook(font,chr){try{switch(chr){case&quot;1&quot;:return font[&quot;one&quot;];break;case&quot;2&quot;:return font[&quot;two&quot;];break;case&quot;3&quot;:return font[&quot;three&quot;];break;case&quot;4&quot;:return font[&quot;four&quot;];break;case&quot;5&quot;:return font[&quot;five&quot;];break;case&quot;6&quot;:return font[&quot;six&quot;];break;case&quot;7&quot;:return font[&quot;seven&quot;];break;case&quot;8&quot;:return font[&quot;eight&quot;];break;case&quot;9&quot;:return font[&quot;nine&quot;];break;case&quot;0&quot;:return font[&quot;zero&quot;];break;case&quot; &quot;:return font[&quot;space&quot;];break;case&quot;$&quot;:return font[&quot;dollar&quot;];break;case&quot;!&quot;:return font[&quot;exclam&quot;];break;case'&quot;':return font[&quot;quotedbl&quot;];break;case&quot;#&quot;:return font[&quot;numbersign&quot;];break;case&quot;%&quot;:return font[&quot;percent&quot;];break;case&quot;&amp;&quot;:return font[&quot;ampersand&quot;];break;case&quot;'&quot;:return font[&quot;quotesingle&quot;];break;case&quot;(&quot;:return font[&quot;parenleft&quot;];break;case&quot;)&quot;:return font[&quot;parenright&quot;];break;case&quot;*&quot;:return font[&quot;asterisk&quot;];break;case&quot;+&quot;:return font[&quot;plus&quot;];break;case&quot;,&quot;:return font[&quot;comma&quot;];break;case&quot;-&quot;:return font[&quot;hyphen&quot;];break;case&quot;.&quot;:return font[&quot;period&quot;];break;case&quot;/&quot;:return font[&quot;slash&quot;];break;case&quot;_&quot;:return font[&quot;underscore&quot;];break;case&quot;:&quot;:return font[&quot;colon&quot;];break;case&quot;;&quot;:return font[&quot;semicolon&quot;];break;case&quot;&lt;&quot;:return font[&quot;less&quot;];break;case&quot;=&quot;:return font[&quot;equal&quot;];break;case&quot;&gt;&quot;:return font[&quot;greater&quot;];break;case&quot;?&quot;:return font[&quot;question&quot;];break;case&quot;@&quot;:return font[&quot;at&quot;];break;case&quot;[&quot;:return font[&quot;bracketleft&quot;];break;case&quot;\\&quot;:return font[&quot;backslash&quot;];break;case&quot;]&quot;:return font[&quot;bracketright&quot;];break;case&quot;^&quot;:return font[&quot;asciicircum&quot;];break;case&quot;`&quot;:return font[&quot;grave&quot;];break;case&quot;{&quot;:return font[&quot;braceleft&quot;];break;case&quot;|&quot;:return font[&quot;bar&quot;];break;case&quot;}&quot;:return font[&quot;braceright&quot;];break;case&quot;~&quot;:return font[&quot;asciitilde&quot;];break;default:return font[chr];break;}}catch(e){;}}
+p.text=function text(str,x,y){if(!curTextFont.glyph){if(str&amp;&amp;curContext.mozDrawText){curContext.save();curContext.mozTextStyle=curTextSize+&quot;px &quot;+curTextFont.name;curContext.translate(x,y);curContext.mozDrawText(typeof str==&quot;number&quot;?String.fromCharCode(str):str);curContext.restore();}}else{var font=p.glyphTable[curTextFont.name];curContext.save();curContext.translate(x,y+curTextSize);var upem=font[&quot;units_per_em&quot;];var newScale=1/upem*curTextSize;curContext.scale(newScale,newScale);var len=str.length;for(var i=0;i&lt;len;i++){try{p.glyphLook(font,str[i]).draw();}
+catch(e){;}}
+curContext.restore();}};p.loadGlyphs=function loadGlyph(url){var loadXML=function loadXML(){try{var xmlDoc=new ActiveXObject(&quot;Microsoft.XMLDOM&quot;);}
+catch(e){try{xmlDoc=document.implementation.createDocument(&quot;&quot;,&quot;&quot;,null);}
+catch(e){p.println(e.message);return;}}
+try{xmlDoc.async=false;xmlDoc.load(url);parse(xmlDoc.getElementsByTagName(&quot;svg&quot;)[0]);}
+catch(e){try{try{console.log(e)}catch(e){alert(e);}
+var xmlhttp=new window.XMLHttpRequest();xmlhttp.open(&quot;GET&quot;,url,false);xmlhttp.send(null);parse(xmlhttp.responseXML.documentElement);}catch(e){}}}
+var regex=function regex(needle,hay){var regexp=new RegExp(needle,&quot;g&quot;);var i=0;var results=[];while(results[i]=regexp.exec(hay)){i++;}
+return results;}
+var parse=function parse(svg){var font=svg.getElementsByTagName(&quot;font&quot;);p.glyphTable[url][&quot;horiz_adv_x&quot;]=font[0].getAttribute(&quot;horiz-adv-x&quot;);var font_face=svg.getElementsByTagName(&quot;font-face&quot;)[0];p.glyphTable[url][&quot;units_per_em&quot;]=parseFloat(font_face.getAttribute(&quot;units-per-em&quot;));p.glyphTable[url][&quot;ascent&quot;]=parseFloat(font_face.getAttribute(&quot;ascent&quot;));p.glyphTable[url][&quot;descent&quot;]=parseFloat(font_face.getAttribute(&quot;descent&quot;));var getXY=&quot;[0-9\-]+&quot;;var glyph=svg.getElementsByTagName(&quot;glyph&quot;);var len=glyph.length;for(var i=0;i&lt;len;i++){var unicode=glyph[i].getAttribute(&quot;unicode&quot;);var name=glyph[i].getAttribute(&quot;glyph-name&quot;);var horiz_adv_x=glyph[i].getAttribute(&quot;horiz-adv-x&quot;);if(horiz_adv_x==null){var horiz_adv_x=p.glyphTable[url]['horiz_adv_x'];}
+var buildPath=function buildPath(d){var c=regex(&quot;[A-Za-z][0-9\- ]+|Z&quot;,d);var path=&quot;var path={draw:function(){curContext.beginPath();&quot;;var x=0,y=0,cx=0,cy=0,nx=0,ny=0,d=0,a=0,lastCom=&quot;&quot;;var lenC=c.length-1;for(var j=0;j&lt;lenC;j++){var com=c[j][0];var xy=regex(getXY,com);switch(com[0]){case&quot;M&quot;:x=parseFloat(xy[0][0]);y=parseFloat(xy[1][0]);path+=&quot;curContext.moveTo(&quot;+(x)+&quot;,&quot;+(-y)+&quot;);&quot;;break;case&quot;L&quot;:x=parseFloat(xy[0][0]);y=parseFloat(xy[1][0]);path+=&quot;curContext.lineTo(&quot;+(x)+&quot;,&quot;+(-y)+&quot;);&quot;;break;case&quot;H&quot;:x=parseFloat(xy[0][0]);path+=&quot;curContext.lineTo(&quot;+(x)+&quot;,&quot;+(-y)+&quot;);&quot;;break;case&quot;V&quot;:y=parseFloat(xy[0][0]);path+=&quot;curContext.lineTo(&quot;+(x)+&quot;,&quot;+(-y)+&quot;);&quot;;break;case&quot;T&quot;:nx=parseFloat(xy[0][0]);ny=parseFloat(xy[1][0]);if(lastCom==&quot;Q&quot;||lastCom==&quot;T&quot;){d=Math.sqrt(Math.pow(x-cx,2)+Math.pow(cy-y,2));a=Math.PI+Math.atan2(cx-x,cy-y);cx=x+(Math.sin(a)*(d));cy=y+(Math.cos(a)*(d));}else{cx=x;cy=y;}
+path+=&quot;curContext.quadraticCurveTo(&quot;+(cx)+&quot;,&quot;+(-cy)+&quot;,&quot;+(nx)+&quot;,&quot;+(-ny)+&quot;);&quot;;x=nx;y=ny;break;case&quot;Q&quot;:cx=parseFloat(xy[0][0]);cy=parseFloat(xy[1][0]);nx=parseFloat(xy[2][0]);ny=parseFloat(xy[3][0]);path+=&quot;curContext.quadraticCurveTo(&quot;+(cx)+&quot;,&quot;+(-cy)+&quot;,&quot;+(nx)+&quot;,&quot;+(-ny)+&quot;);&quot;;x=nx;y=ny;break;case&quot;Z&quot;:path+=&quot;curContext.closePath();&quot;;break;}
+lastCom=com[0];}
+path+=&quot;curContext.translate(&quot;+(horiz_adv_x)+&quot;,0);&quot;;path+=&quot;curContext.stroke();curContext.fill();}}&quot;;return path;}
+var d=glyph[i].getAttribute(&quot;d&quot;);if(d!==undefined){var path=buildPath(d);eval(path);p.glyphTable[url][name]={name:name,unicode:unicode,horiz_adv_x:horiz_adv_x,draw:path.draw}}}}
+p.glyphTable[url]={};loadXML(url);return p.glyphTable[url];}
+p.lnPrinted=function lnPrinted(){};p.printed=function printed(){};p.println=function println(){var Caller=arguments.callee.caller.name.toString();if(arguments.length&gt;1){Caller!=&quot;print&quot;?p.ln=arguments:p.ln=arguments[0];}else{p.ln=arguments[0];}
 Caller==&quot;print&quot;?p.printed(arguments):p.lnPrinted();};p.print=function print(){p.println(arguments[0])};p.char=function char(key){return key;};p.map=function map(value,istart,istop,ostart,ostop){return ostart+(ostop-ostart)*((value-istart)/(istop-istart));};String.prototype.replaceAll=function(re,replace){return this.replace(new RegExp(re,&quot;g&quot;),replace);};p.Point=function Point(x,y){this.x=x;this.y=y;this.copy=function(){return new Point(x,y);}};p.Random=function(){var haveNextNextGaussian=false;var nextNextGaussian;this.nextGaussian=function(){if(haveNextNextGaussian){haveNextNextGaussian=false;return nextNextGaussian;}else{var v1,v2,s;do{v1=2*p.random(1)-1;v2=2*p.random(1)-1;s=v1*v1+v2*v2;}while(s&gt;=1||s==0);var multiplier=Math.sqrt(-2*Math.log(s)/s);nextNextGaussian=v2*multiplier;haveNextNextGaussian=true;return v1*multiplier;}};};p.ArrayList=function ArrayList(size,size2,size3){var array=new Array(0|size);if(size2){for(var i=0;i&lt;size;i++){array[i]=[];for(var j=0;j&lt;size2;j++){var a=array[i][j]=size3?new Array(size3):0;for(var k=0;k&lt;size3;k++){a[k]=0;}}}}else{for(var i=0;i&lt;size;i++){array[i]=0;}}
 array.size=function(){return this.length;};array.get=function(i){return this[i];};array.remove=function(i){return this.splice(i,1);};array.add=function(item){return this.push(item);};array.clone=function(){var a=new ArrayList(size);for(var i=0;i&lt;size;i++){a[i]=this[i];}
 return a;};array.isEmpty=function(){return!this.length;};array.clear=function(){this.length=0;};return array;};p.colorMode=function colorMode(mode,range1,range2,range3,range4){curColorMode=mode;if(arguments.length&gt;=4){redRange=range1;greenRange=range2;blueRange=range3;}</diff>
      <filename>processing.min.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b490640bea1e03a0f100aa8c61fc55fce61d8489</id>
    </parent>
  </parents>
  <author>
    <name>F1LT3R</name>
    <email>director@hyper-metrix.com</email>
  </author>
  <url>http://github.com/jeresig/processing-js/commit/295c51ccc9afcc179dc0a0a78087d47935bc0761</url>
  <id>295c51ccc9afcc179dc0a0a78087d47935bc0761</id>
  <committed-date>2009-05-08T08:37:00-07:00</committed-date>
  <authored-date>2009-05-08T08:37:00-07:00</authored-date>
  <message>Happy B'day Processingjs! TTF Support Added</message>
  <tree>c295f1e5a37691d0b0b36e3fc797d8f2367936ef</tree>
  <committer>
    <name>F1LT3R</name>
    <email>director@hyper-metrix.com</email>
  </committer>
</commit>
