<!DOCTYPE html>
<html>
<body>
<script src="../resources/runner.js"></script>
<script>
var sourceCanvas2D = document.createElement("canvas");
var sourceCtx2D = sourceCanvas2D.getContext("2d");
var destCanvas2D = document.createElement("canvas");
var destCtx2D = destCanvas2D.getContext("2d");
var MEASURE_DRAW_TIMES = 1000;
var MAX_COUNT = 60000;
var count = 0;
 
function setSize(sourceWidth, sourceHeight, destWidth, destHeight) {
    sourceCanvas2D.width = sourceWidth;
    sourceCanvas2D.height = sourceHeight;
    destCanvas2D.width = destWidth;
    destCanvas2D.height = destHeight;
}

function rand(range) {
    return Math.floor(Math.random() * range);
}

function fillCanvas(ctx2d, canvas2d) {
    ctx2d.fillStyle = "rgba(" + rand(255) + "," + rand(255) + "," + rand(255)  + "," + rand(255) + ")";
    ctx2d.fillRect(0, 0, canvas2d.width, canvas2d.height);
}

function drawCanvas2DToCanvas2D() {
    var start = PerfTestRunner.now();
    for (var i = 0; i < MEASURE_DRAW_TIMES; i++) {
        fillCanvas(sourceCtx2D, sourceCanvas2D);
        // draw dynamic Canvas
        destCtx2D.drawImage(sourceCanvas2D, 0, 0);
    }
    // Calling getImageData() is just to flush out the content when
    // accelerated 2D canvas is in use. The cost of reading 1x1 pixels is low.
    destCtx2D.getImageData(0, 0, 1, 1);
    count++;

    var elapsedTime = PerfTestRunner.now() - start;
    PerfTestRunner.measureValueAsync(MEASURE_DRAW_TIMES * 1000 / elapsedTime);
    if (count < MAX_COUNT)
        requestAnimationFrame(drawCanvas2DToCanvas2D);
}

function onCompletedRun() {
    count = MAX_COUNT;
}

window.onload = function () {
    PerfTestRunner.prepareToMeasureValuesAsync({done: onCompletedRun, unit: 'runs/s',
        description: "This bench test checks the speed on drawing dynamic 2d Canvas(1024x1024) to HW accelerated Canvas2D(1024x1024)."});
    // It should use setMinimumAccelerated2dCanvasSize() to enable accelerated Canvas for a specified size
    // but this API is not available in JS or WebPage. Assume the threshold size is 256x257
    // and the dest canvas is HW accelerated Canvas when setting its size to 1024x1024.
    setSize(1024, 1024, 1024, 1024);
    fillCanvas(sourceCtx2D, sourceCanvas2D);
    drawCanvas2DToCanvas2D();
}

</script>
</body>
</html>
