package { //import mx.core.Application; import mx.controls.Label; import flash.display.DisplayObject; import flash.events.Event; import flash.events.EventDispatcher; import flash.net.URLLoader; import flash.net.URLRequest; //import com.example.programmingas3.asciiArt.BitmapToAsciiConverter; //import com.example.programmingas3.asciiArt.Image; //import com.example.programmingas3.asciiArt.ImageInfo; /** * Provides appication-level functionality for the AsciiArt sample. */ public class actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_AsciiArtBuilder extends EventDispatcher { // ------- Private vars ------- private const DATA_TARGET:String = "actionscript-book-ASCIIArt-txt-ImageData.txt"; private var _imageInfoLoader:URLLoader; private var _imageStack:Array; private var _currentImageIndex:uint; // ------- Constructor ------- public function actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_AsciiArtBuilder(x:DisplayObject) { status = x as Label; trace("construct"); _imageStack = new Array(); var request:URLRequest = new URLRequest(DATA_TARGET); _imageInfoLoader = new URLLoader(); _imageInfoLoader.addEventListener(Event.COMPLETE, imageInfoCompleteHandler); _imageInfoLoader.load(request); } // ------- Public Properties ------- public static const IMAGE_PATH:String = "actionscript-book-ASCIIArt-img-"; public var asciiArtText:String = ""; public function get currentImage():actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_Image { return _imageStack[_currentImageIndex]; } // -- my trace public var status:Label; private function trace( txt:String ):void { status.text += txt + " "; } // ------- Event Handlers ------- /** * Called when the image info text file is loaded. */ private function imageInfoCompleteHandler(event:Event):void { var allImageInfo:Array = parseImageInfo(); trace("building"); buildImageStack(allImageInfo); } /** * Called when the first image is loaded. */ private function imageCompleteHandler(event:Event):void { // move to the first image in the stack next(); // notify any listeners that the application has finished its initial loading var readyEvent:Event = new Event("ready"); dispatchEvent(readyEvent); } // ------- Public Methods ------- /** * Advances the image stack to the next image, and populates the asciiArtText property * with that image's ASCII Art representation. */ public function next():void { // Advance the "current image" index (or set it back to 0 if we're on the last one) _currentImageIndex++; if (_currentImageIndex == _imageStack.length) { _currentImageIndex = 0; } // generate the ASCII version of the new "current" image var imageConverter:actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_BitmapToAsciiConverter = new actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_BitmapToAsciiConverter(this.currentImage); this.asciiArtText = imageConverter.parseBitmapData(); } // ------- Private Methods ------- /** * Parses the contents of the loaded text file which contains information about the images * to load, and creates an Array of ImageInfo instances from that data. * * @return An Array of ImageInfo instances. */ private function parseImageInfo():Array { var result:Array = new Array(); /* Parse the contents of the text file, and put its contents into an Array of ImageInfo * instances. * Each line of text contains info about one image, separated by tab (\t) characters, * in this order: * - file name * - title * - white threshold * - black threshold * * Loop through the individual lines in the text file. * Note that we skip the first line, since it only contains column headers. */ var lines:Array = _imageInfoLoader.data.split("\n"); var numLines:uint = lines.length; for (var i:uint = 1; i < numLines; i++) { var imageInfoRaw:String = lines[i]; // trim leading or trailing white space from the current line imageInfoRaw = imageInfoRaw.replace(/^ *(.*) *$/, "$1"); if (imageInfoRaw.length > 0) { // create a new image info record and add it to the array of image info var imageInfo:actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_ImageInfo = new actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_ImageInfo(); // split the current line into values (separated by tab (\t) characters) // and extract the individual properties var imageProperties:Array = imageInfoRaw.split("\t"); imageInfo.fileName = imageProperties[0]; imageInfo.title = normalizeTitle(imageProperties[1]); imageInfo.whiteThreshold = parseInt(imageProperties[2], 16); imageInfo.blackThreshold = parseInt(imageProperties[3], 16); result.push(imageInfo); } } return result; } /** * Capitalizes the first letter of each word in a String, unless the word * is one of the English words which are not commonly capitalized * * @param str The String to "normalize" * @return The String with the words capitalized */ private function normalizeTitle(title:String):String { var words:Array = title.split(" "); var len:uint = words.length; for(var i:uint; i < len; i++) { words[i] = capitalizeFirstLetter(words[i]); } return words.join(" "); } /** * Capitalizes the first letter of a single word, unless it's one of * a set of words which are normally not capitalized in English. * * @param word The word to capitalize * @return The capitalized word */ private function capitalizeFirstLetter(word:String):String { switch (word) { case "and": case "the": case "in": case "an": case "or": case "at": case "of": case "a": // don't do anything to these words break; default: // for any other word, capitalize the first character var firstLetter:String = word.substr(0, 1); firstLetter = firstLetter.toUpperCase(); var otherLetters:String = word.substring(1); word = firstLetter + otherLetters; } return word; } /** * Using an Array of ImageInfo instances, populates the image stack with Image instances. * * @param imageInfo An array of ImageInfo instances, containing the data about the * image files to be loaded into the image stack. */ private function buildImageStack(imageInfo:Array):void { var image:actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_Image; var oneImageInfo:actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_ImageInfo; var listenerAdded:Boolean = false; var numImages:uint = imageInfo.length; for (var i:uint = 0; i < numImages; i++) { _currentImageIndex = 0; oneImageInfo = imageInfo[i]; image = new actionscript_book_ASCIIArt_com_example_programmingas3_asciiArt_Image(oneImageInfo); _imageStack.push(image); if(!listenerAdded) { image.addEventListener(Event.COMPLETE, imageCompleteHandler); listenerAdded = true; } image.load(); } } } }