| <?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 |
| creationComplete="handleCreationComplete()" |
| xmlns:mx="http://www.adobe.com/2006/mxml"> |
| |
| <mx:Script> |
| <![CDATA[ |
| import mx.core.ByteArrayAsset; |
| import flash.text.engine.FontDescription; |
| import flashx.textLayout.elements.Configuration; |
| import flashx.textLayout.TextLayoutVersion; |
| import flash.text.engine.ElementFormat; |
| import flash.text.engine.TextElement; |
| import flash.utils.getQualifiedClassName; |
| |
| import mx.core.ByteArrayAsset; |
| import mx.controls.Text; |
| import mx.collections.ArrayCollection; |
| |
| import flash.display.BlendMode; |
| import flashx.textLayout.container.ContainerController; |
| import flashx.textLayout.container.ScrollPolicy; |
| import flashx.textLayout.elements.TextFlow; |
| import flashx.textLayout.factory.TextFlowTextLineFactory; |
| |
| import flashx.textLayout.conversion.TextConverter; |
| |
| import flash.text.engine.TextBlock; |
| import flash.text.engine.TextLine; |
| import flash.text.engine.TextLineValidity; |
| import flash.text.engine.LineJustification; |
| import flash.text.engine.SpaceJustifier; |
| import flashx.textLayout.formats.BlockProgression; |
| import flashx.textLayout.debug.Debugging; |
| import flashx.textLayout.debug.assert; |
| import flashx.textLayout.tlf_internal; |
| |
| use namespace tlf_internal; |
| |
| private static var factory:TextFlowTextLineFactory = new TextFlowTextLineFactory(); |
| |
| private var resultText:Text; |
| |
| // embed alice - this simplifies things - don't need to trust the swf and pass the xml around with it |
| [Embed(source="../../../test/testFiles/markup/tlf/alice.xml",mimeType="application/octet-stream")] |
| private var AliceClass : Class; |
| |
| private var checkMemoryIntervalID:uint = setInterval(checkMemoryUsage,1000); |
| |
| [Bindable] |
| public var reportString:String = ""; |
| |
| public function checkMemoryUsage():void |
| { |
| reportString = currIteration.toString() + " " + Math.round(System.totalMemory/1000000).toString(); |
| } |
| |
| private function setDebugFlag():void |
| { |
| var e:Error = new Error(); |
| var s:String = e.getStackTrace(); |
| // trace(s); |
| var i:int = s.indexOf("setDebugFlag"); |
| if (s.charAt(i + 14) == '[') |
| debugMode = true; |
| } |
| |
| public var debugMode:Boolean = false; |
| |
| public function handleCreationComplete(): void |
| { |
| setDebugFlag(); |
| } |
| |
| // last parse time |
| private var parseTime:Number; |
| |
| private function parseStringIntoFlow(source:String, format:String):TextFlow |
| { |
| var beginParseTime:Number = getTimer(); |
| var tf:TextFlow = TextConverter.importToFlow(source, format); |
| parseTime = getTimer() - beginParseTime; |
| //trace("PARSE TIME:",parseTime.toString()); |
| return tf; |
| } |
| |
| // data for the current run |
| private var textFlow:TextFlow; |
| private var container:Sprite; |
| private var controller:ContainerController; |
| |
| private var numberOfIterations:int = 0; |
| private var deltaLines:Number; |
| private var widthVal:Number; |
| |
| private var currIteration:int = -1; |
| |
| private var beginThisRender:int; |
| private var timingRendering:Boolean = false; |
| |
| // timers |
| private var beginTestTime:int; |
| public var totalScrollTime:int; |
| public var totalRenderTime:int; |
| |
| public function runTheTest():void |
| { |
| // number of iterations to run |
| // numberOfIterations = int(iterationsInput.text); |
| widthVal = Number(widthInput.text); |
| deltaLines = Number(deltaLinesInput.text); |
| |
| // clear the previous run |
| if (resultText) |
| { |
| lineHolder.removeChild(resultText); |
| resultText = null; |
| } |
| if (container) |
| { |
| lineHolder.rawChildren.removeChild(container); |
| container = null; |
| } |
| |
| if (textFlow == null) |
| { |
| var alice:ByteArrayAsset = new AliceClass(); |
| var aliceData:String = alice.readMultiByte(alice.length,"utf-8"); |
| textFlow = parseStringIntoFlow(aliceData, TextConverter.TEXT_LAYOUT_FORMAT); |
| } |
| |
| textFlow.flowComposer.removeAllControllers(); |
| controller = null; |
| |
| |
| // the new run |
| container = new Sprite(); |
| container.x = 100; |
| container.y = 100; |
| lineHolder.rawChildren.addChild(container); |
| controller = new ContainerController(container,widthVal,this.height-controlBox.height); |
| textFlow.flowComposer.addController(controller); |
| textFlow.flowComposer.updateAllControllers(); |
| |
| addEventListener(Event.ENTER_FRAME,handleEnterFrame); |
| runButton.enabled = false; |
| |
| currIteration = 0; |
| testCount++; |
| totalScrollTime = 0; |
| totalRenderTime = 0; |
| beginTestTime = getTimer(); |
| } |
| |
| // count of number of tests run this session |
| private var testCount:int = 0; |
| |
| /** generate a report at the next enter frame */ |
| public function handleEnterFrame(event:Event): void |
| { |
| if (timingRendering) |
| { |
| totalRenderTime += getTimer()-beginThisRender; |
| timingRendering = false; |
| } |
| |
| var delta:Number = controller.getScrollDelta(deltaLines); |
| |
| // report results |
| if (delta == 0) |
| { |
| var totalTestTime:int = getTimer()-this.beginTestTime; |
| flash.system.System.gc(); //mark |
| flash.system.System.gc(); //sweep |
| var memoryAllocated:Number = flash.system.System.totalMemory/1024; |
| |
| trace("VellumAliceScroll scroll time (msecs)",totalScrollTime.toString(), "render time (msec)", totalRenderTime.toString(), "total time (msecs)",totalTestTime.toString(), " mem (K)", memoryAllocated); |
| |
| var testDescription:String = testCount.toString() + ") iters: " + numberOfIterations.toString(); |
| |
| var playerType:String = this.debugMode ? "DEBUGGING PLAYER (not suitable for measuring performance)" : "RELEASE PLAYER "+Capabilities.version; |
| var vellumType:String = "Vellum build: " + flashx.textLayout.TextLayoutVersion.BUILD_NUMBER + "\n" + (Configuration.tlf_internal::debugCodeEnabled ? "DEBUG vellum engine (not suitable for measuring performance)" : "RELEASE vellum engine"); |
| |
| resultText = new Text(); |
| resultText.text = "VellumAliceScroll\n" + testDescription + "\nParseTime (msec): " + parseTime.toString() + "\nScrollTime (msecs): " + totalScrollTime.toString() + "\nRenderTime (msec): " + totalRenderTime.toString() + "\nTotalTestTime (msec): " + totalTestTime.toString() |
| + " \nmem (K): " + memoryAllocated.toString() + "\n" + playerType + "\n" + vellumType; |
| resultText.x = 80; |
| resultText.y = 100; |
| resultText.width = 400; |
| resultText.setStyle("fontFamily", "Minion Pro"); |
| resultText.setStyle("fontSize", 16); |
| resultText.opaqueBackground = 0xFFFFFFFF; |
| lineHolder.addChild(resultText); |
| this.dispatchEvent(new Event(Event.COMPLETE)); |
| |
| runButton.enabled = true; // start another test? |
| removeEventListener(Event.ENTER_FRAME,handleEnterFrame); |
| } |
| else |
| { |
| var beginThisScroll:int = getTimer(); |
| controller.verticalScrollPosition += delta; |
| totalScrollTime += getTimer()-beginThisScroll; |
| |
| // prepare for the next iteration |
| currIteration++; |
| |
| // begin timing rendering |
| timingRendering = true; |
| beginThisRender = getTimer(); |
| } |
| } |
| |
| ]]> |
| </mx:Script> |
| |
| <mx:VBox> |
| <mx:HBox id="controlBox" paddingLeft="4" paddingTop="4"> |
| <mx:Label text="VellumAliceScroll" fontWeight="bold"/> |
| <!-- <mx:Label text="Iterations:" fontWeight="bold"/> |
| <mx:TextInput id="iterationsInput" text="1" width="40"/> --> |
| <mx:Label text="Width:" fontWeight="bold"/> |
| <mx:TextInput id="widthInput" text="500" width="60"/> |
| <mx:Label text="DeltaLines:" fontWeight="bold"/> |
| <mx:TextInput id="deltaLinesInput" text="1" width="60"/> |
| <mx:Button id="runButton" label="Run" click="runTheTest()"/> |
| <mx:Text text="{reportString}" height="20"/> |
| </mx:HBox> |
| <mx:Canvas id="lineHolder"/> |
| </mx:VBox> |
| |
| </mx:Canvas> |