<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.events.ItemClickEvent;
import mx.controls.Alert;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.geom.Rectangle;
public static var COMMENT_NONE:String="comment_none";
public static var COMMENT_BLOCK:String="comment_block";
public static var COMMENT_LINE:String="comment_line";
private var _generated_text_field:TextField;
private var _comment_style:String="comment_none";
private function renderText():void{
var scale_multiplier:Number=Math.round(font_size_slider.value);
_generated_text_field=createSampleTextField();
temp_uic.addChild(_generated_text_field);
var bounds:Rectangle=temp_uic.getBounds(_generated_text_field);
if(bounds.width*scale_multiplier>2880 || bounds.height*scale_multiplier>2880){
mx.controls.Alert.show("You ask too much... \npoor flashplayer can only handle images smaller than 2880*2880\n either shorten your comment text, or shrink the size slider, \nor call the flashplayer team and beg them to increase this limitation :)");
temp_uic.removeChild(_generated_text_field);
return;
}
var bmd:BitmapData=new BitmapData(bounds.width*scale_multiplier,bounds.height*scale_multiplier,true,0);
var scale_matrix:Matrix=new Matrix();
scale_matrix.scale(scale_multiplier,scale_multiplier);
bmd.draw(temp_uic,scale_matrix);
var i:uint=0;
var lines:Array=new Array();
var line_ys:Array=new Array();
huge_text.text="";
var output_text:TextField=createRenderTextField(bmd.width+100,bmd.height+100); output_text.text="W";
var mono_char_width:Number=output_text.getCharBoundaries(0).width;
var mono_char_height:Number=output_text.getCharBoundaries(0).height;
output_text.text=String(output_text.getCharBoundaries(0).y);
while(output_text.getCharBoundaries(output_text.text.length-1).y < bmd.height){
lines[i]="";
line_ys[i]=output_text.getCharBoundaries(output_text.text.length-1).y;
output_text.appendText("\nW");
if(i==100)break;
i++;
}
var xindex:uint=0;
var j:uint=0;
var add_char:String;
while(xindex<bmd.width){
for(j=0;j<lines.length;j++){
if(bmd.getPixel32(xindex,line_ys[j])==0x00000000){
bmd.setPixel32(xindex,line_ys[j],0xFFFF0000);
lines[j]+=" "; }else{
add_char=_generated_text_field.text.charAt(_generated_text_field.getCharIndexAtPoint(xindex/scale_multiplier,5)); if(add_char==" ")add_char="*"; lines[j]+=add_char;
}
}
xindex+=mono_char_width;
}
lines=removeWhiteSpaceLines(lines);
lines=addCommentStyle(lines);
huge_text.text=lines.join("\n");
temp_uic.removeChild(_generated_text_field);
}
private function removeWhiteSpaceLines(lines:Array):Array{
var fixed:Array=new Array();
var i:uint,j:uint;
for(i=0;i<lines.length;i++){
inner: for(j=0;j<lines[i].length;j++){
if(String(lines[i]).charAt(j)!=" "){
fixed.push(lines[i]);
break inner;
}
}
}
return fixed;
}
private function createSampleTextField():TextField{
var tf:TextField=new TextField();
tf.autoSize="left";
tf.text=text_to_create.text;
tf.selectable=false;
var tformat:TextFormat=new TextFormat();
tformat.bold=true;
tformat.size=12;
tformat.font=fonts_list.selectedLabel;
tf.setTextFormat(tformat);
return tf;
}
private function createRenderTextField(w:uint,h:uint):TextField{
var tf:TextField=new TextField();
tf.multiline=true;
tf.width=w;
tf.height=h;
var tformat:TextFormat=new TextFormat();
tformat.size=12;
tformat.color=0xBBBBBB;
tformat.font="Courier";
tf.setTextFormat(tformat);
return tf;
}
private function addCommentStyle(lines:Array):Array{
switch(_comment_style){
case COMMENT_NONE:
break;
case COMMENT_LINE:
for(var i:uint=0;i<lines.length;i++){
lines[i]="//"+lines[i];
}
break;
case COMMENT_BLOCK:
lines.unshift("/*");
lines.push("*/");
break;
}
return lines.slice();
}
private function handleCommentStyle(e:ItemClickEvent):void{
switch(e.index){
case 0:
this._comment_style=COMMENT_NONE;
break;
case 1:
this._comment_style=COMMENT_LINE;
break;
case 2:
this._comment_style=COMMENT_BLOCK;
break;
}
}
]]>
</mx:Script>
<mx:Style>
Application {
backgroundColor: #000000;
backgroundGradientColors: #666666, #000000;
themeColor: #cc0000;
}
</mx:Style>
<mx:Panel width="90%" height="90%" horizontalCenter="0" title="the huge text generator" y="50">
<mx:HBox horizontalAlign="center" paddingTop="20">
<mx:ComboBox id="fonts_list" dataProvider="{flash.text.Font.enumerateFonts(true)}" labelField="fontName" />
<mx:Label text="size:" fontSize="14" fontWeight="bold" />
<mx:HSlider id="font_size_slider" minimum="12" maximum="100" value="18" />
<mx:TextInput id="text_to_create" text="ROCK ON!?@#" width="200" fontSize="14" fontWeight="bold" />
<mx:Button label="Render it baby!" click="renderText();" />
<mx:ButtonBar itemClick="handleCommentStyle(event);">
<mx:dataProvider>
<mx:Array>
<mx:String>None</mx:String>
<mx:String>//</mx:String>
<mx:String>/* */</mx:String>
</mx:Array>
</mx:dataProvider>
</mx:ButtonBar>
</mx:HBox>
<mx:Canvas width="100%" height="100%" >
<mx:UIComponent id="temp_uic" />
<mx:TextArea width="100%" height="100%" id="huge_text" fontSize="12" fontFamily="Courier" backgroundAlpha="0" wordWrap="false" />
</mx:Canvas>
</mx:Panel>
</mx:Application>