<!DOCTYPE html>
<html>
  <head>
    <script src="../resources/runner.js"></script>
  </head>
  <body>
    <div id="wrapper">
      <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <defs>
          <g id="unit">
            <polygon points="0,0 10,0 5,8.66025403784439"/>
          </g>

          <g id="q">
            <use id="q0" xlink:href="#unit" x="10" y="0" fill="red"/>
            <use id="q1" xlink:href="#unit" transform="translate(10,0) rotate(60)" fill="green"/>
            <use id="q2" xlink:href="#unit" transform="translate(10,0) rotate(120)" fill="blue"/>
            <use id="q3" xlink:href="#unit" transform="rotate(60) translate(10,0) rotate(-60)" fill="purple"/>
          </g>

          <g id="qq">
              <use id="qq0" xlink:href="#q" x="20" y="0"/>
              <use id="qq1" xlink:href="#q" transform="translate(20,0) rotate(60)"/>
              <use id="qq2" xlink:href="#q" transform="translate(20,0) rotate(120)"/>
              <use id="qq3" xlink:href="#unit" transform="rotate(60) translate(20,0) rotate(-60) scale(2)" fill="purple"/>
          </g>

          <g id="qqq">
              <use xlink:href="#qq" x="40" y="0"/>
              <use xlink:href="#qq" transform="translate(40,0) rotate(60)"/>
              <use xlink:href="#qq" transform="translate(40,0) rotate(120)"/>
              <use xlink:href="#q" transform="rotate(60) translate(40,0) rotate(-60) scale(2)"/>
          </g>
        </defs>

        <use xlink:href="#qqq"/>
        <g transform="translate(300 200)">
          <rect width="70" height="26" stroke-width="1" fill="rgb(255,255,255)" fill-opacity="1.000" stroke="rgb(0,0,0)" stroke-opacity="1.000"/>
          <text id="FPS" y="23" font-family="Verdana" font-size="23">0</text>
        </g>
      </svg>
    </div>

    <script type="text/javascript">
        var frame = 0;
        var times = [PerfTestRunner.now()];
        var unit = document.getElementById("unit");
    
        requestAnimationFrame =
            window['requestAnimationFrame'] ||
            window['webkitRequestAnimationFrame'] ||
            window['mozRequestAnimationFrame'] ||
            window['oRequestAnimationFrame'] ||
            window['msRequestAnimationFrame'] ||
            function(callback) {
                window.setTimeout(callback, 1000 / 60);
            };

        function newFrame() {
            times.push(PerfTestRunner.now());
            var avg = (times[times.length - 1] - times[0]) / (times.length - 1);
            while (times.length > 10)
                times.shift();

            document.getElementById("FPS").textContent = (1000 / avg).toFixed(2);
            unit.setAttribute('transform', 'scale(' + (Math.abs(frame++ % 20 - 10) / 10) + ')');
        };

        function animate() {
            newFrame();
            requestAnimationFrame(animate);
        }

        if (window.testRunner) {
            PerfTestRunner.measureRunsPerSecond({ run: newFrame, done: function() {
                document.getElementById('wrapper').style.display = 'none';
            }});
        } else
            requestAnimationFrame(animate);
    </script>
  </body>
</html>
