blob: 9999580b523e1d3ee24ca1a64e74dd50b8d5698a [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.DisplayObjectContainer;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.system.Capabilities;
import flash.system.System;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.engine.TextLine;
import flash.utils.ByteArray;
import flash.utils.getTimer;
import flashx.textLayout.TextLayoutVersion;
import flashx.textLayout.compose.TextLineRecycler;
import flashx.textLayout.container.TextContainerManager;
import flashx.textLayout.conversion.TextConverter;
import flashx.textLayout.debug.Debugging;
import flashx.textLayout.elements.Configuration;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.formats.BlockProgression;
import flashx.textLayout.tlf_internal;
use namespace tlf_internal;
public class AliceScroll extends Sprite
{
// 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/AliceID.xml",mimeType="application/octet-stream")]
[Embed(source="../../test/testFiles/markup/tlf/alice.xml",mimeType="application/octet-stream")]
private var AliceClass : Class;
static public const NARROW:String = "narrow";
static public const NORMAL:String = "normal";
private var _blockProgression:String = BlockProgression.TB;
private var _dimension:String = NORMAL;
public var helper:ScrollTestHelper;
public var startButton:TextField;
public var lpsTextField:TextField;
public function AliceScroll()
{
trace("ALICESCROLL BEGIN", getTimer());
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.frameRate = 1000;
// TextLineRecycler.textLineRecyclerEnabled = false;
// Debugging.generateDebugTrace = true;
var b:TextField = startButton = addButton("START",10,10,0,0,startTest);
b = addButton(_blockProgression,b.x+b.width+10,10,0,0,toggleBP);
b = addButton(_dimension,b.x+b.width+10,10,0,0,toggleDimension);
b = addButton("GC",b.x+b.width+10,10,0,0,dogc);
b = addButton("Release",b.x+b.width+10,10,0,0,releaseEverything);
var playerType:String = Capabilities.isDebugger ? " DEBUGGER" : "";
var vellumType:String = Configuration.debugCodeEnabled ? "DEBUG" : "RELEASE"
// controls
b = addButton("AliceScroll " + Capabilities.version + playerType + " TLF: " + TextLayoutVersion.tlf_internal::BUILD_NUMBER + " " + vellumType,b.x+b.width+10,10,0,0,null);
lpsTextField = addButton("",b.x+b.width+10,10,0,0,null);
}
public function startTest(e:Event):void
{
startButton.visible = false;
// cleanup previous run
if (helper)
{
this.removeChild(helper.sprite);
this.removeChild(helper.resultText);
helper = null;
}
var s:Sprite = new Sprite();
s.x = 100;
s.y = 100;
addChild(s);
var alice:ByteArray = new AliceClass();
var aliceData:String = alice.readMultiByte(alice.length,"utf-8");
var beginParseTime:Number = getTimer();
var textFlow:TextFlow = TextConverter.importToFlow(aliceData, TextConverter.TEXT_LAYOUT_FORMAT);
var parseTime:Number = getTimer() - beginParseTime;
textFlow.blockProgression = _blockProgression;
helper = new AliceScrollHelper(this);
// make a thin single column in the NARROW case
var testWidth:Number = 500;
var testHeight:Number = 400;
if (_dimension == NARROW)
{
if (_blockProgression == BlockProgression.TB)
testWidth = 5;
else
testHeight = 5;
}
helper.beginTest("AliceScroll",textFlow,parseTime,s,testWidth,testHeight,this);
trace("TEXTFLOW COMPOSED", getTimer());
}
public function toggleBP(e:Event):void
{
_blockProgression = _blockProgression == BlockProgression.TB ? BlockProgression.RL : BlockProgression.TB;
e.target.text = _blockProgression;
}
public function toggleDimension(e:Event):void
{
_dimension = _dimension == NORMAL ? NARROW: NORMAL;
e.target.text = _dimension;
}
public function dogc(e:Event):void
{
System.gc();
}
public function reportLPS(lps:Number):void
{
// report the LPS
lpsTextField.text = lps.toString();
}
public function testComplete():void
{
// renenable the start button
startButton.visible = true;
}
public function releaseEverything(e:Event):void
{
trace(" public function releaseEveryThing():void");
trace(" {");
helper.textFlow.flowComposer.getControllerAt(0).clearCompositionResults();
helper = null;
recursiveReleaseChildren(this);
TextLineRecycler.emptyReusableLineCache();
trace(" }");
}
static public function recursiveReleaseChildren(obj:DisplayObjectContainer):void
{
while (obj.numChildren)
{
var child:DisplayObject = obj.getChildAt(0);
if (child is DisplayObjectContainer)
recursiveReleaseChildren(child as DisplayObjectContainer);
if (child is TextLine)
(child as TextLine).userData = null;
obj.removeChildAt(0);
}
}
public function addButton(text:String,x:Number,y:Number,width:Number,height:Number,handler:Function):TextField
{
var f1:TextField = new TextField();
f1.text = text;
f1.x = x; f1.y = y;
if (height > 0)
f1.height = height;
if (width > 0)
f1.width = width;
f1.autoSize = TextFieldAutoSize.LEFT;
addChild(f1);
if (handler != null)
{
f1.border = true;
f1.borderColor = 0xff;
f1.addEventListener(MouseEvent.CLICK,handler);
}
f1.selectable = false;
return f1;
}
}
}
class AliceScrollHelper extends ScrollTestHelper
{
public var _owner:AliceScroll;
public function AliceScrollHelper(owner:AliceScroll)
{
_owner = owner;
}
public override function noteLPS(lps:Number):void
{
_owner.reportLPS(lps);
}
public override function noteTestComplete():void
{
_owner.testComplete();
}
}