<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<!--
  Copyright (C) 2010 University of Szeged
  Copyright (C) 2010 Zoltan Herczeg
  Copyright (C) 2010 Gabor Loki
  All rights reserved.

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
  are met:
  1. Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in the
     documentation and/or other materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->

<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
<rect x="0%" y="0%" width="100%" height="100%" fill="black" />

<defs>
<filter id="filt" filterUnits="objectBoundingBox" x="0" y="0" width="100%" height="100%">
    <feTurbulence baseFrequency="0.03" numOctaves="4" seed="67" result="turb"/>
    <feGaussianBlur in="SourceGraphic" primitiveUnits="objectBoundingBox" stdDeviation="1" result="blur"/>
    <feComposite in="turb" in2="blur" operator="arithmetic" k2="0.3" k3="1" result="comp"/>
    <feDiffuseLighting in="comp" primitiveUnits="objectBoundingBox" diffuseConstant="1" lighting-color="white" surfaceScale="10" result="light" >
        <feSpotLight id="light" x="0" y="300" z="200" pointsAtX="-200" pointsAtY="100" pointsAtZ="0" limitingConeAngle="90" specularExponent="20" />
    </feDiffuseLighting>
    <feSpecularLighting in="comp" primitiveUnits="objectBoundingBox" diffuseConstant="1" lighting-color="#A66102" surfaceScale="10" result="ambient" >
        <feDistantLight azimuth="0" elevation="90" />
    </feSpecularLighting>
    <feComposite in="light" in2="ambient" operator="arithmetic" k2="1.2" k3=".8"/>
</filter>
</defs>

<g filter="url(#filt)" fill="white" stroke="black" onclick="start()">
    <rect x="0" y="0" width="400" height="5" />
    <rect x="0" y="0" width="5" height="200" />
    <rect x="0" y="195" width="400" height="5" />
    <rect x="395" y="0" width="5" height="200" />
    <text font-size="150" font-weight="bold" x="40" y="150">SVG</text>
</g>

<text id="fps" x="150" y="240" font-size="20" fill="white" stroke="white">afps:</text>
<text x="30" y="265" font-size="20" font-weight="bold" fill="white" stroke="white">click on the image to start the animation</text>

<script>
<![CDATA[
var light_x = document.getElementById('light').x;
var light_y = document.getElementById('light').y;
var light_pointsAtX = document.getElementById('light').pointsAtX;
var light_pointsAtY = document.getElementById('light').pointsAtY;
var fps = document.getElementById('fps');

var round = Math.round

var startDate = 0;
var frameCounter = 0;
var phase = 0;
function anim() {
    switch(phase) {
    case 0:
        light_pointsAtX.baseVal += 10;
        if (light_pointsAtX.baseVal >= 380)
            ++phase;
        break;
    case 1:
        light_x.baseVal += 10;
        light_pointsAtX.baseVal -= 10;
        if (light_x.baseVal >= 450) {
            ++phase;
            waitCounter = 0;
        }
        break;
    case 2:
        light_y.baseVal -= 5;
        if (light_y.baseVal <= -100)
            ++phase;
        break;
    case 3:
        light_pointsAtX.baseVal += 10;
        if (light_pointsAtX.baseVal >= 450) {
            light_x.baseVal = 0;
            light_pointsAtX.baseVal = -200;
            light_y.baseVal = 300;
            light_pointsAtY.baseVal = 100;
            phase = 0;
        }
        break;
    }

    frameCounter++;
    fps.textContent = "afps: " +(round(frameCounter * 100000 / (new Date() - startDate)) / 100);
}

function start() {
    if (!startDate) {
        startDate = new Date();
        setInterval(anim,1);
    }
}

//]]>
</script>

</svg>
