blob: 3690b7fcf2ae93d84e6c5541c3fad3cf2d91ab37 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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.
//
////////////////////////////////////////////////////////////////////////////////
package {
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
import flash.net.LocalConnection;
import flash.system.Capabilities;
import flash.system.System;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
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 flash.utils.getTimer;
import flashx.textLayout.TextLayoutVersion;
import flashx.textLayout.compose.StandardFlowComposer;
import flashx.textLayout.container.ContainerController;
import flashx.textLayout.container.ScrollPolicy;
import flashx.textLayout.conversion.TextConverter;
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;
use namespace tlf_internal;
public class TextFlow4000 extends Sprite
{
// sizes for item placement
public var textWidth:Number = 30;
public var textHeight:Number = 12;
// data for the current run
private var numberOfFields:int = 0;
private var numberOfIterations:int = 0;
private var testDataText:String;
private var _bounds:Rectangle = new Rectangle(0,0,300,100);
private var beginCreationTime:int;
private var endCreationTime:int;
private var beginRenderTime:int;
// state for running tests
private var currIteration:int = -1;
private var queueResults:Boolean;
private var beginThisRender:int;
private var timingRendering:Boolean = false;
// timers
private var beginTestTime:int;
private var totalCreationTime:int;
private var totalRenderTime:int;
private var resultText:TextField;
private var _func:String;
public function TextFlow4000()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
runTheTest();
}
private function getDebugMode():Boolean
{
var e:Error = new Error();
var s:String = e.getStackTrace();
// seems to work
return s ? true : false;
}
public function runTheTest():void
{
// clear the previous run
/* if (resultText)
{
lineHolder.removeChild(resultText);
resultText = null;
} */
//TextFlow.defaultConfiguration.textFlowInitialFormat = null;
numberOfFields = 4000; // int(numberFieldsInput.text);
numberOfIterations = 1; // int(numberIterationsInput.text);
_func = "buildVellumExampleTextFlow"; // testTypeArray[testTypeCombo.selectedIndex].data;
testDataText = "Hello World";
currIteration = 0;
queueResults = false;
addEventListener(Event.ENTER_FRAME,handleEnterFrame);
totalCreationTime = 0;
totalRenderTime = 0;
beginTestTime = getTimer();
}
private var totalTestTime:int;
/** generate a report at the next enter frame */
public function handleEnterFrame(e:Event): void
{
if (currIteration == -1)
return;
if (timingRendering)
{
totalRenderTime += getTimer()-beginThisRender;
timingRendering = false;
}
if (currIteration == numberOfIterations)
{
if (queueResults)
{
var memoryAllocated:Number = flash.system.System.totalMemory/1024;
trace(_func,"creation time (msecs)",totalCreationTime.toString(), "render time (msecs)",totalRenderTime.toString(), "total time (msecs)",totalTestTime.toString(), " mem (K)", memoryAllocated);
var testDescription:String = "fields: " + numberOfFields.toString() + " iters: " + numberOfIterations.toString() + " data: " + testDataText;
var playerType:String = this.getDebugMode() ? "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");
var caching:String = "";
//CONFIG::debug { caching = "\nSeeks: " + TextFlow._dictionarySeeks + " Hits: " + TextFlow._dictionaryHits + " Collisions: " + TextFlow._dictionaryCollisions; }
resultText = new TextField();
resultText.text = _func + "\n" + testDescription + "\nCreationTime (msecs): " + totalCreationTime.toString() + "\nRenderTime (msec): " + totalRenderTime.toString() + "\nTotalTime (msec): " + totalTestTime.toString()
+ " \nmem (K): " + memoryAllocated.toString() + "\n" + playerType + "\n" + vellumType + caching;
resultText.x = 100;
resultText.y = 140;
resultText.autoSize = TextFieldAutoSize.LEFT;
//resultText.setStyle("fontFamily", "Minion Pro");
//resultText.setStyle("fontSize", 24);
resultText.opaqueBackground = 0xf0ffff;
this.addChild(resultText);
currIteration = -1;
removeEventListener(Event.ENTER_FRAME,handleEnterFrame);
}
else if (!queueResults)
{
totalTestTime = getTimer()-beginTestTime;
flash.system.System.gc(); //mark
flash.system.System.gc(); //sweep
// forces gc???
try {
new LocalConnection().connect('dummy');
new LocalConnection().connect('dummy');
} catch (e:*) {}
queueResults = true;
}
}
else
{
createOneStep();
currIteration++;
timingRendering = true;
beginThisRender = getTimer();
}
}
public function createOneStep():void
{
while (this.numChildren)
this.removeChildAt(0);
var begTime:int = getTimer();
var funcCall:Function = this[_func];
/* for (var testNum:int = 0; testNum < numberOfFields; testNum++)
{
var example:DisplayObject = funcCall();
if (example)
{
example.x = 10 + (this.stage.stageWidth - 90) * Math.random();
example.y = 40 + (this.stage.stageHeight-80) * Math.random();
this.addChild(example);
}
} */
const xInit:Number = 10;
const yInit:Number = 10;
const xDelta:Number = 90;
const yDelta:Number = 15;
var xpos:Number = xInit;
var ypos:Number = yInit;
for (var testNum:int = 0; testNum < numberOfFields; testNum++)
{
var example:DisplayObject = funcCall();
if (example)
{
example.x = xpos;
example.y = ypos;
this.addChild(example);
xpos += xDelta;
if (xpos + xDelta > this.stage.stageWidth)
{
xpos = xInit;
ypos += yDelta;
if (ypos + 2*yDelta > this.stage.stageHeight)
ypos = yInit;
}
}
}
totalCreationTime += getTimer()-begTime;
}
public function buildVellumExampleTextFlow():DisplayObject
{
var tf:TextFlow = new TextFlow();
var p:ParagraphElement = new ParagraphElement();
tf.addChild(p);
var s:SpanElement = new SpanElement();
p.addChild(s);
s.text = testDataText;
var rslt:Sprite = new Sprite();
tf.flowComposer.addController(new ContainerController(rslt,_bounds.width,_bounds.height));
tf.flowComposer.updateAllControllers();
return rslt;
}
}
}