Guimark FlashChartingTest

by Zahurdias.Calimero
[SWF(width="1200", height="630", frameRate="60", backgroundColor="#FFFFFF")]
♥0 | Line 220 | Modified 2012-12-01 10:50:09 | MIT License
play

ActionScript3 source code

/**
 * Copyright Zahurdias.Calimero ( http://wonderfl.net/user/Zahurdias.Calimero )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/qMu2
 */

package
{
    import flash.display.DisplayObject;
    import flash.display.CapsStyle;
    import flash.display.GradientType;
    import flash.display.Graphics;
    import flash.display.JointStyle;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.utils.*;
    
    [SWF(width="1200", height="630", frameRate="60", backgroundColor="#FFFFFF")]
    public class FlashChartingTest extends Sprite
    {
        public function FlashChartingTest(){
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            this.mouseEnabled = false;

            createChildren();
            init();
        }
        
        private var meter:FPSMeter;
        private var fps:TextField;
        private var results:TextField;
        private var draw:Graphics;
        
        private var chartWidth:Number = 1200;
        private var chartHeight:Number = 600;
        private var highestStock:Number = 200;
        private var totalMinutes:Number = 480;
        private var chartXSpread:Number;
        private var chartYSpread:Number;
        private var a:Array = new Array();
        private var b:Array = new Array();
        private var c:Array = new Array();
        private var d:Array = new Array();
        private var e:Array = new Array();
        
        protected function init():void{
            chartXSpread = chartWidth/totalMinutes;
            chartYSpread = chartHeight/highestStock;
            meter = new FPSMeter();
            addEventListener(Event.ENTER_FRAME, processFrame);
        }
        protected function processFrame(evt:Event):void{
            //create background
            draw.clear();
            draw.lineStyle(0, 0x666666);
            //draw.lineStyle(0, 0.6);
            var xCoord:Number;
            var yCoord:Number;
            for(var x:Number=0; x<=totalMinutes; x+=40){
                xCoord = x*chartXSpread;
                draw.moveTo(xCoord, 0);
                draw.lineTo(xCoord, chartHeight);
            }
            for(var y:Number=0; y<=highestStock; y+=20){
                yCoord = y*chartYSpread;
                draw.moveTo(0, yCoord);
                draw.lineTo(chartWidth, yCoord);
            }
            //add data
            fillStockData(a, 180);
            fillStockData(b, 140);
            fillStockData(c, 100);
            fillStockData(d, 60);
            fillStockData(e, 20);
            graphStockData(a, b, 0xFF00FF, 0xFFAAFF);
            graphStockData(b, c, 0xFF0000, 0xFFAAAA);
            graphStockData(c, d, 0xFF6600, 0xFFCCAA);
            graphStockData(d, e, 0x0000FF, 0xAAAAFF);
            graphStockData(e, null, 0x00FF00, 0xAAFFAA);
            
            updatePerformance();
        }
        
        protected function fillStockData(data:Array, region:Number):void {
            var diff:Number = 15;
            var low:Number = region-(diff/2);
            var i:int = 0;
            var stock:StockVO;
            
            if(data.length == 0){
                while(i <= totalMinutes){
                    stock = new StockVO(i, Math.random()*diff+low);
                    data.push(stock);
                    i++;
                }
            }else{
                while(i <= totalMinutes){
                    stock = data[i];
                    stock.minute--;
                    i++;
                }
                stock = data.shift();
                stock.minute = totalMinutes;
                stock.value = Math.random()*diff+low;
                data.push(stock);
            }
        }
        
        protected function graphStockData(topData:Array, bottomData:Array, line:uint, fill:uint):void{
            var stock:StockVO;
            var xCoord:Number;
            var yCoord:Number;
            var i:int = 0;
            
            //draw.lineStyle(2, line, 1.0, false, "normal", CapsStyle.ROUND, JointStyle.ROUND);
            draw.lineStyle(0, line, 1.0, false, "none", CapsStyle.NONE, JointStyle.ROUND);
            //draw.lineStyle();
            //draw.lineStyle(0,line);
            draw.beginFill(fill, 0.6);
            //draw.beginFill(fill);
            
            //plot begin point
            stock = topData[i];
            xCoord = stock.minute*chartXSpread;
            yCoord = chartHeight-stock.value*chartYSpread;
            draw.moveTo(xCoord, yCoord);
            
            //plot data points
            while(++i < topData.length){
                stock = topData[i];
                xCoord = stock.minute*chartXSpread;
                yCoord = chartHeight-stock.value*chartYSpread;
                draw.lineTo(xCoord, yCoord);
            }
            draw.lineStyle();
            //draw.lineStyle(2, line, 0, false, "none", CapsStyle.NONE, JointStyle.ROUND);
            
            if(bottomData != null){
                //clamp fill to chart lines below
                i = bottomData.length;
                while(--i > -1){
                    stock = bottomData[i];
                    xCoord = stock.minute*chartXSpread;
                    yCoord = chartHeight-stock.value*chartYSpread;
                    draw.lineTo(xCoord, yCoord);
                }
            }else{
                //clamp fill to bottom of chart
                draw.lineTo(chartWidth, chartHeight);
                draw.lineTo(0, chartHeight);
            }
            //draw.endFill();
        }
        
        protected function updatePerformance():void {
            meter.increment();
            fps.text = meter.getFramerate()+" fps";
            if(testRunning){
                continueTest();
            }
        }
        
        private var testBegin:int = 0;
        private var testData:Array = [];
        private var testRunning:Boolean = false;
        private function startTest(evt:MouseEvent):void{
            testBegin = getTimer();
            testRunning = true;
            testData = [];
            results.text = "Running..."
        }
        private function continueTest():void{
            var time:uint = getTimer();
            testData.push(time);
            if(time-testBegin > 10000){
                testRunning = false;
                var output:Number = testData.length/(time-testBegin)*1000;
                results.text = "Test Average: "+FPSMeter.formatNumber(output)+" fps";
            }
        }
        
        private function createChildren():void {
            var header:Sprite = new Sprite(); header.graphics.beginFill(0xC0C4DF); header.graphics.drawRect(0,0,1200,30); addChild(header);
            var title:TextField = createTextField("GUIMark"); title.width = 300; title.x = 4; header.addChild(title);
            var button:Sprite = createButton(); button.x = 320; button.y = 7; button.addEventListener(MouseEvent.CLICK, startTest); header.addChild(button);
            fps = createTextField(""); fps.width = 140; fps.x = 150; header.addChild(fps);
            results = createTextField(""); results.width = 300; results.x = 555; header.addChild(results);
            var canvas:Sprite = new Sprite(); canvas.x = 0; canvas.y = 30; addChild(canvas);
            canvas.mouseEnabled=false;
            draw = canvas.graphics;
        }
        private function createTextField(val:String):TextField {
            var txt:TextField = new TextField();
            txt.y = 6;
            txt.defaultTextFormat = new TextFormat("Arial", 15, 0x000000, true);
            txt.text = val;
            return txt;
        }
        private function createButton():Sprite {
            var buttonText:TextField = new TextField();
            buttonText.x = 7;
            buttonText.y = 1;
            buttonText.width = 63;
            buttonText.height = 18;
            buttonText.defaultTextFormat = new TextFormat("Arial", 12, 0x000000);
            buttonText.text = "Start Test";
            buttonText.mouseEnabled = false;
            var button:Sprite = new Sprite();
            button.graphics.beginFill(0xDDDDDD);
            button.graphics.lineStyle(2, 0x999999);
            button.graphics.drawRoundRect(0,0,70,18,15);
            button.buttonMode = true;
            button.addChild(buttonText);
            return button;
        }
    }
}

import flash.utils.getTimer;

class StockVO {
    public var minute:uint;
    public var value:Number;
    public function StockVO(minute:uint, value:Number){
        this.minute = minute;
        this.value = value;
    }
}
class FPSMeter {
    private var sampleFPS:Number = 0;
    private var lastSampledTime:uint = 0;
    private var sampleFrames:Number = 0;
    
    public var sampleDuration:uint = 500;
    public function increment():void {
        sampleFrames++;
    }
    public function getFramerate():Number {
        var diff:uint = getTimer()-lastSampledTime;
        if(diff >= sampleDuration){
            var rawFPS:int = sampleFrames/(diff/1000);
            //sampleFPS = FPSMeter.formatNumber(rawFPS);
            sampleFPS = rawFPS;
            sampleFrames = 0;
            lastSampledTime = getTimer();
        }
        return sampleFPS;
    }
    public static function formatNumber(val:Number):Number{
        //format as XX.XX
        return Math.floor(val*100)/100;
    }
}