<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" width="800" height="600"
                creationComplete="init()" backgroundColor="0x000000" viewSourceURL="srcview/index.html">
    <mx:Script>
        <![CDATA[
            import com.derschmale.pixelBender.PBBenchmarker;
            
            private static const SHADERJOB_MODE : String = "shaderJobMode";
            private static const APPLY_FILTER_MODE : String = "applyFilterMode";
            
            private static const WIDTH : int = 500;
            private static const HEIGHT : int = 500;
            private static const LEN : int = WIDTH*HEIGHT*4;
            
            // some lazy coding in here
            
            private var _lookUp : Array;
            
            [Embed(source="/../pbj/RandomKernel.pbj", mimeType="application/octet-stream")]
            private var RandomKernel : Class;
            
            [Embed(source="/../pbj/AlphaTestKernel.pbj", mimeType="application/octet-stream")]
            private var AlphaTestKernel : Class;
            
            private var _bitmapData1 : BitmapData;
            private var _bitmapData2 : BitmapData;
            private var _vector1 : Vector.<Number>;
            private var _vector2 : Vector.<Number>;
            private var _byteArray1 : ByteArray;
            private var _byteArray2 : ByteArray;
            
            private function init() : void
            {
                initData();
                
                _lookUp = [];
                _lookUp["randomBMP4"] = new PBBenchmarker(RandomKernel, _bitmapData1, _bitmapData2);
                _lookUp["randomVec4"] = new PBBenchmarker(RandomKernel, _vector1, _vector2, WIDTH, HEIGHT);
                _lookUp["randomBA4"] = new PBBenchmarker(RandomKernel, _byteArray1, _byteArray2, WIDTH, HEIGHT);
                _lookUp["alphaBMP4"] = new PBBenchmarker(AlphaTestKernel, _bitmapData1, _bitmapData2);
                _lookUp["alphaVec4"] = new PBBenchmarker(AlphaTestKernel, _vector1, _vector2, WIDTH, HEIGHT);
                _lookUp["alphaBA4"] = new PBBenchmarker(AlphaTestKernel, _byteArray1, _byteArray2, WIDTH, HEIGHT);
                _lookUp["randomBMPself"] = new PBBenchmarker(AlphaTestKernel, _bitmapData1, _bitmapData1);
                _lookUp["randomVecself"] = new PBBenchmarker(AlphaTestKernel, _vector1, _vector1, WIDTH, HEIGHT);
                _lookUp["randomBAself"] = new PBBenchmarker(AlphaTestKernel, _byteArray1, _byteArray1, WIDTH, HEIGHT);
            }
            
            private function initData() : void
            {
                var b : int = 0;
                
                _bitmapData1 = new BitmapData(WIDTH, HEIGHT, true, 0x00000000);
                _bitmapData2 = new BitmapData(WIDTH, HEIGHT, true, 0x00000000);
                _vector1 = new Vector.<Number>(LEN);
                _vector2 = new Vector.<Number>(LEN);
                _byteArray1 = new ByteArray();
                _byteArray2 = new ByteArray();
                _byteArray1.endian = _byteArray2.endian = Endian.LITTLE_ENDIAN;
                
                for (var i : int = 0; i < LEN; ++i) {
                    if (i % 3 == 0) {
                        ++b;
                        _bitmapData1.setPixel32(b % WIDTH, Math.floor(b / WIDTH), (int(genRnd()*0xff) << 24) + 0xffffff);
                    } 
                    _vector1[i] = genRnd();
                    _byteArray1.writeFloat(genRnd());
                }
            }
            
            // generates some random numbers, with +/- half of them 0
            private function genRnd() : Number
            {
                var r : Number = Math.random();
                return r < 0.5? 0.0 : r;
            }
            
            private function run(event : Event, id : String, mode : String = SHADERJOB_MODE) : void
            {
                var benchmark : PBBenchmarker = _lookUp[id];
                var result : int = (mode == SHADERJOB_MODE)? benchmark.testShaderJob() : benchmark.testFilter();
                traceBox.text += event.target.label + ": "+result+"ms\n";
            }
        ]]>
    </mx:Script>
    <mx:VBox width="300" height="100%">
        <mx:Button width="100%" label="ShaderJob on BitmapData" click="run(event, 'randomBMP4')" />
        <mx:Button width="100%" label="ApplyFilter on BitmapData" click="run(event, 'randomBMP4', APPLY_FILTER_MODE)" />
        <mx:Button width="100%" label="ShaderJob on Vector" click="run(event, 'randomVec4')" />
        <mx:Button width="100%" label="ShaderJob on ByteArray" click="run(event, 'randomBA4')" />
        <mx:Button width="100%" label="SJ on BitmapData with alpha test" click="run(event, 'alphaBMP4')" />
        <mx:Button width="100%" label="AF on BitmapData with alpha test" click="run(event, 'alphaBMP4', APPLY_FILTER_MODE)" />
        <mx:Button width="100%" label="SJ on Vector with alpha test" click="run(event, 'alphaVec4')" />
        <mx:Button width="100%" label="SJ on ByteArray with alpha test" click="run(event, 'alphaBA4')" />
        <mx:Button width="100%" label="SJ BitmapData to self" click="run(event, 'randomBMPself', APPLY_FILTER_MODE)" />
        <mx:Button width="100%" label="SJ Vector to self" click="run(event, 'randomVecself')" />
        <mx:Button width="100%" label="SJ ByteArray to self" click="run(event, 'randomBAself')" />
    </mx:VBox>
    <mx:TextArea id="traceBox" width="100%" height="100%" />
</mx:Application>