| <?xml version="1.0" encoding="utf-8"?> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| <mx:Canvas |
| width="1024" height="768" |
| enterFrame="handleEnterFrame()" |
| xmlns:mx="http://www.adobe.com/2006/mxml" |
| xmlns:flow="library://ns.adobe.com/flashx/textLayout"> |
| <mx:Script> |
| <![CDATA[ |
| |
| import flash.geom.Rectangle; |
| import flash.text.engine.ElementFormat; |
| import flash.text.engine.FontDescription; |
| import flash.text.engine.LineJustification; |
| import flash.text.engine.SpaceJustifier; |
| import flash.text.engine.TextBlock; |
| import flash.text.engine.TextElement; |
| import flash.text.engine.TextLine; |
| import flash.text.engine.TextLineValidity; |
| import flash.utils.getQualifiedClassName; |
| |
| import flashx.textLayout.TextLayoutVersion; |
| import flashx.textLayout.container.ContainerController; |
| import flashx.textLayout.container.ScrollPolicy; |
| import flashx.textLayout.conversion.TextConverter; |
| import flashx.textLayout.debug.assert; |
| import flashx.textLayout.elements.Configuration; |
| import flashx.textLayout.elements.ParagraphElement; |
| import flashx.textLayout.elements.SpanElement; |
| import flashx.textLayout.elements.TextFlow; |
| import flashx.textLayout.formats.BlockProgression; |
| import flashx.textLayout.tlf_internal; |
| |
| import mx.collections.ArrayCollection; |
| import mx.controls.Text; |
| |
| use namespace tlf_internal; |
| |
| private var resultText:Text; |
| |
| static private const testTypeArray:ArrayCollection = new ArrayCollection([ |
| {label:"TextField", data:"buildTextField", refreshData:"refreshTextField" }, |
| {label:"FTE", data:"buildFTEField" , refreshData:"refreshFTEField"}, |
| {label:"Rectangles", data:"buildRectangle" , refreshData:"refreshRectangle"} |
| ]); |
| |
| // data for the current run |
| private var sampleText:String=""; |
| private var _func:String; |
| private var _refreshFunc:String; |
| private var numberOfIterations:int = 0; |
| |
| private var dataLengthVal:Number; |
| |
| private var minWidthVal:Number; |
| private var maxWidthVal:Number; |
| private var widthStepVal:Number; |
| |
| private var currIteration:int = -1; |
| private var currWidthVal:Number; |
| |
| private var beginThisRender:int; |
| private var timingRendering:Boolean = false; |
| |
| // timers |
| private var beginTestTime:int; |
| public var totalCreationTime:int; |
| public var totalRenderTime:int; |
| |
| private var cols:int = 15; |
| |
| private var testType:String = ""; |
| |
| private var desiredColSize:Number; |
| |
| public function runCreateTest():void |
| { |
| testType = "create"; |
| cols = 15; |
| sampleText=""; |
| totalCreationTime = 0; |
| totalRenderTime = 0; |
| numberOfIterations = int(iterationsInput.text); |
| |
| initNewTest() |
| |
| createTest.enabled = false; |
| updateTest.enabled = false; |
| |
| currIteration = 0; |
| } |
| |
| public function runUpdateTest():void |
| { |
| testType = "update"; |
| cols = 15; |
| totalCreationTime = 0; |
| totalRenderTime = 0; |
| numberOfIterations = int(iterationsInput.text); |
| |
| initNewTest(); |
| |
| createTest.enabled = false; |
| updateTest.enabled = false; |
| |
| currIteration = 0; |
| createGrid(); |
| } |
| |
| public function sizingDemo():void |
| { |
| cols = 13; |
| initNewTest(); |
| desiredColSize = lineHolder.width / cols; |
| slider.value = Number(desiredColSize); |
| slider.visible = true; |
| sampleText = 'word1 word2'; |
| createGrid(); |
| } |
| |
| private function initNewTest():void |
| { |
| // clear the previous run |
| if (resultText) |
| { |
| lineHolder.removeChild(resultText); |
| resultText = null; |
| } |
| |
| // Zap previous cells. |
| while (lineHolder.rawChildren.numChildren) |
| { |
| lineHolder.rawChildren.removeChildAt(0); |
| } |
| |
| _func = testTypeArray[testTypeCombo.selectedIndex].data; |
| _refreshFunc = testTypeArray[testTypeCombo.selectedIndex].refreshData; |
| |
| slider.visible = false; |
| } |
| |
| private function Step():void |
| { |
| if (testType == "create") |
| { |
| while (lineHolder.rawChildren.numChildren) |
| lineHolder.rawChildren.removeChildAt(0); |
| |
| var t1:Number = getTimer(); |
| createGrid(); |
| totalCreationTime = totalCreationTime + (getTimer() - t1); |
| } |
| else if (testType == "update") |
| { |
| t1 = getTimer(); |
| sampleText = "update_" + currIteration; |
| refreshGrid(); |
| totalCreationTime = totalCreationTime + (getTimer() - t1); |
| } |
| } |
| |
| private function refreshGrid():void |
| { |
| _func = testTypeArray[testTypeCombo.selectedIndex].data; |
| _refreshFunc = testTypeArray[testTypeCombo.selectedIndex].refreshData; |
| updateGrid(); |
| } |
| |
| |
| // FTE factory |
| static private var templateTextElement:TextElement = null; |
| static private var templateTextBlock:TextBlock = null; |
| public function buildFTEField(text:String, width:Number, holder:Sprite=null):DisplayObject |
| { |
| if (!templateTextElement) |
| { |
| var elementFormat:ElementFormat = new ElementFormat(); |
| var fontDescription:FontDescription = new FontDescription(); |
| fontDescription.fontName = "Verdana"; |
| elementFormat.fontSize = 10; |
| elementFormat.fontDescription = fontDescription; |
| templateTextElement = new TextElement(); |
| templateTextElement.elementFormat = elementFormat; |
| templateTextBlock = new TextBlock(templateTextElement); |
| templateTextBlock.textJustifier = new SpaceJustifier("en",LineJustification.UNJUSTIFIED,false); |
| } |
| |
| if (text) |
| templateTextElement.text = text; |
| |
| var rslt:Sprite = holder ? holder : new Sprite(); |
| var textLine:TextLine = null; |
| var y:Number = 10.5; |
| |
| while (textLine = templateTextBlock.createTextLine(textLine,width,0,true)) |
| { |
| textLine.x = 2; |
| textLine.y = y; |
| y += 12.2; |
| rslt.addChild(textLine); |
| } |
| |
| for (var i:int = 0; i < rslt.numChildren; i++) |
| TextLine(rslt.getChildAt(i)).validity = TextLineValidity.STATIC; |
| |
| return rslt; |
| } |
| |
| public function refreshFTEField(a:Sprite, text:String, width:Number):DisplayObject |
| { |
| while (a.numChildren) |
| a.removeChildAt(0); |
| |
| return buildFTEField(text, width, a); |
| } |
| |
| // Rectangle Factory |
| public function buildRectangle(text:String, width:Number):DisplayObject |
| { |
| var s:Shape = new Shape(); |
| s.graphics.beginFill(0xcccccc); |
| s.graphics.lineStyle(1, 0xFFFFFF); |
| s.graphics.drawRect(0,0,width,15); |
| s.graphics.endFill(); |
| return s; |
| } |
| |
| public function refreshRectangle(a:DisplayObject, text:String, width:Number):DisplayObject |
| { |
| var s:Shape = a as Shape; |
| s.graphics.clear(); |
| s.graphics.beginFill(0xcccccc); |
| s.graphics.lineStyle(1, 0xFFFFFF); |
| s.graphics.drawRect(0,0,width,15); |
| s.graphics.endFill(); |
| return s; |
| } |
| |
| // TextField Factory |
| static private var defaultTextFormat:TextFormat; |
| |
| private var lastTextField:TextField; |
| public function buildTextField(text:String, width:Number):DisplayObject |
| { |
| if (!defaultTextFormat) |
| { |
| defaultTextFormat = new TextFormat(); |
| defaultTextFormat.font = "Verdana"; |
| defaultTextFormat.size = 10; |
| } |
| |
| var a:TextField = new TextField(); |
| a.defaultTextFormat = defaultTextFormat; |
| a.text = text; |
| a.width = width; |
| a.autoSize = "left"; |
| a.multiline = true; |
| a.wordWrap = true; |
| |
| lastTextField = a; |
| return a; |
| } |
| |
| public function refreshTextField(a:TextField, text:String, width:Number):DisplayObject |
| { |
| if (text) |
| a.text = text; |
| a.width = width; |
| a.autoSize = "left"; |
| a.multiline = true; |
| a.wordWrap = true; |
| return a; |
| } |
| |
| // count of number of tests run this session |
| private var testCount:int = 0; |
| private var queueResults:Boolean = false; |
| |
| /** generate a report at the next enter frame */ |
| public function handleEnterFrame(): void |
| { |
| if (currIteration == -1) |
| return; |
| |
| if (timingRendering) |
| { |
| totalRenderTime += getTimer() - beginThisRender; |
| timingRendering = false; |
| } |
| |
| // report results if appropriate |
| if (currIteration < numberOfIterations) |
| { |
| Step(); |
| |
| // prepare for the next iteration |
| currIteration++; |
| |
| // begin timing rendering |
| timingRendering = true; |
| beginThisRender = getTimer(); |
| } |
| else |
| { |
| try { |
| new LocalConnection().connect('dummy'); |
| new LocalConnection().connect('dummy'); |
| } catch (e:*) {} |
| |
| |
| queueResults = true; |
| createTest.enabled = true; |
| updateTest.enabled = true; |
| currIteration = -1; |
| } |
| |
| if (queueResults) |
| { |
| reportResults(); |
| queueResults = false; |
| } |
| } |
| |
| public const gridDeltaY:Number = 9.75; |
| // Grid generator. |
| private function createGrid():void |
| { |
| var t1:Number = getTimer(); |
| var cellWidth:Number = lineHolder.width / cols; |
| var curY:int = 0; |
| var cell:DisplayObject; |
| var rowCount:Number = 0; |
| |
| while (curY < lineHolder.height) |
| { |
| var curX:int = 0; |
| for (var c:int = 0; c < cols; c++) |
| { |
| var st:String = sampleText != "" ? sampleText : "Cell " + int(c+1) + "," + int(rowCount+1); |
| cell = this[_func](st, cellWidth); |
| lineHolder.rawChildren.addChild(cell); |
| cell.x = curX; |
| cell.y = curY; |
| curX += cellWidth; |
| } |
| rowCount = rowCount + 1; |
| curY += gridDeltaY; |
| |
| if ((curY + gridDeltaY) >= lineHolder.height) |
| break; |
| } |
| |
| var t2:Number = getTimer() - t1; |
| } |
| |
| // Grid Updater |
| private function updateGrid():void |
| { |
| var count:Number = lineHolder.rawChildren.numChildren; |
| var cellWidth:Number = lineHolder.width / cols; |
| for (var i:int=0; i < count; i++) |
| { |
| var cell:DisplayObject = lineHolder.rawChildren.getChildAt(i); |
| cell = this[_refreshFunc](cell, sampleText, cellWidth); |
| } |
| } |
| |
| // Column Resizer |
| private function resizeColumn():void |
| { |
| var secondaryColSize:int = (lineHolder.width - desiredColSize) / (cols-1); |
| var delta:Number = lineHolder.width - ((secondaryColSize * (cols - 1)) + desiredColSize); |
| var isFTE:Boolean = testTypeCombo.selectedLabel == "FTE"; |
| |
| var count:Number = lineHolder.rawChildren.numChildren; |
| var curColumn:int = 0; |
| var curX:int = 0; |
| var curY:int = 0; |
| var maxHeight:int = 0; |
| for (var i:int=0; i < count; i++) |
| { |
| var cellWidth:Number = (curColumn == 0) ? desiredColSize + delta : secondaryColSize; |
| var cell:DisplayObject = lineHolder.rawChildren.getChildAt(i); |
| cell = this[_refreshFunc](cell, null, cellWidth); |
| curColumn = curColumn + 1; |
| cell.x = curX; |
| cell.y = curY; |
| curX += cellWidth; |
| maxHeight = maxHeight < cell.height ? cell.height : maxHeight; |
| if (curColumn == cols) |
| { |
| curColumn = 0; |
| curX = 0; |
| curY += isFTE ? maxHeight + 7: maxHeight; |
| maxHeight = 0; |
| } |
| } |
| } |
| |
| private function sliderChange():void |
| { |
| desiredColSize = slider.value; |
| resizeColumn(); |
| } |
| |
| private function reportResults():void |
| { |
| var totalTestTime:int = totalRenderTime + totalCreationTime; |
| flash.system.System.gc(); //mark |
| flash.system.System.gc(); //sweep |
| var memoryAllocated:Number = flash.system.System.totalMemory/1024; |
| |
| var vellumType:String = "Vellum Build: " + flashx.textLayout.TextLayoutVersion.BUILD_NUMBER + "\n"; |
| |
| resultText = new Text(); |
| resultText.text = "CreationTime (msecs): " + totalCreationTime.toString() + "\nRenderTime (msec): " + totalRenderTime.toString() + "\nTotalTime (msec): " + totalTestTime.toString() |
| + " \nmem (K): " + memoryAllocated.toString() + "\n" + vellumType; |
| resultText.x = 80; |
| resultText.y = 140; |
| resultText.width = 400; |
| resultText.setStyle("fontFamily", "Verdana"); |
| resultText.setStyle("fontSize", 18); |
| resultText.opaqueBackground = 0xFFFFFFFF; |
| lineHolder.addChild(resultText); |
| this.dispatchEvent(new Event(Event.COMPLETE)); |
| } |
| |
| ]]> |
| </mx:Script> |
| |
| <mx:VBox height="100%" width="100%"> |
| <mx:HBox id="controlBox" paddingLeft="4" paddingTop="4"> |
| <mx:Label text="FTEGridTest" fontWeight="bold"/> |
| <mx:ComboBox id="testTypeCombo" editable="false" closeDuration="0" openDuration="0" selectionDuration="0" |
| paddingLeft="4" paddingTop="4" selectedIndex="0" |
| dataProvider="{testTypeArray}"/> |
| <mx:Label text="Iterations:" fontWeight="bold"/> |
| <mx:TextInput id="iterationsInput" text="100" width="40"/> |
| <mx:Button id="createTest" label="Run Create Test" click="runCreateTest()"/> |
| <mx:Button id="updateTest" label="Run Update Test" click="runUpdateTest()"/> |
| <mx:Button id="sizeTest" label="Live Size" click="sizingDemo();"/> |
| <mx:HSlider id="slider" width="200" maximum="500" minimum="55" liveDragging="true" change="sliderChange();" visible="false"/> |
| </mx:HBox> |
| <mx:Canvas id="lineHolder" width="100%" height="100%" keyDown="trace('ddd');"/> |
| </mx:VBox> |
| |
| </mx:Canvas> |