blob: 8a5a52cf1e905543a3ba35c5d47a67420bc39581 [file] [log] [blame]
import QtQuick 2.0
CanvasTestCase {
id:testCase
name: "composite"
function init_data() { return testData("2d"); }
function test_clearRect(row) {
var canvas = createCanvasObject(row);
var ctx = canvas.getContext('2d');
ctx.reset();
ctx.fillStyle = '#f00';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'destination-atop';
ctx.clearRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,0,0,0);
}
function test_clip(row) {
var canvas = createCanvasObject(row);
var ctx = canvas.getContext('2d');
var composites = [ {compsite:"copy"},
{compsite:"destination-atop"},
{compsite:"destination-in"},
{compsite:"destination-out"},
{compsite:"destination-over"},
// {compsite:"lighter"}, //qt doesn't support lighter
{compsite:"source-atop"},
{compsite:"source-in"},
{compsite:"source-out"},
{compsite:"source-over"},
{compsite:"xor"}
];
for (var i=0; i<composites.length; i++) {
// console.log("composite:" + composites[i].compsite);
ctx.reset();
ctx.fillStyle = '#0f0';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = composites[i].compsite;
ctx.rect(-20, -20, 10, 10);
ctx.clip();
ctx.fillStyle = '#f00';
ctx.fillRect(0, 0, 50, 50);
comparePixel(ctx, 25,25, 0,255,0,255);
comparePixel(ctx, 75,25, 0,255,0,255);
}
}
function test_globalAlpha(row) {
var canvas = createCanvasObject(row);
var ctx = canvas.getContext('2d');
ctx.reset();
compare(ctx.globalAlpha, 1.0);
ctx.fillStyle = '#0f0';
ctx.fillRect(0, 0, 100, 50);
ctx.globalAlpha = 0.01; // avoid any potential alpha=0 optimizations
ctx.fillStyle = '#f00';
ctx.fillRect(0, 0, 100, 50);
//comparePixel(ctx, 50,25, 2,253,0,255, 2);
ctx.reset();
ctx.globalAlpha = 0.5;
var a = ctx.globalAlpha; // might not be exactly 0.5, if it is rounded/quantised, so remember for future comparisons
ctx.globalAlpha = Infinity;
compare(ctx.globalAlpha, a);
ctx.globalAlpha = -Infinity;
compare(ctx.globalAlpha, a);
ctx.globalAlpha = NaN;
compare(ctx.globalAlpha, a);
ctx.globalAlpha = 0.5;
a = ctx.globalAlpha; // might not be exactly 0.5, if it is rounded/quantised, so remember for future comparisons
ctx.globalAlpha = 1.1;
compare(ctx.globalAlpha, a);
ctx.globalAlpha = -0.1;
compare(ctx.globalAlpha, a);
ctx.globalAlpha = 0;
compare(ctx.globalAlpha, 0);
ctx.globalAlpha = 1;
compare(ctx.globalAlpha, 1);
}
function test_operation(row) {
var canvas = createCanvasObject(row);
var ctx = canvas.getContext('2d');
ctx.reset();
ctx.globalCompositeOperation = 'xor';
ctx.globalCompositeOperation = 'Source-over';
compare(ctx.globalCompositeOperation, 'xor');
ctx.reset();
ctx.globalCompositeOperation = 'xor';
ctx.globalCompositeOperation = 'clear';
compare(ctx.globalCompositeOperation, 'xor');
ctx.reset();
ctx.globalCompositeOperation = 'xor';
ctx.globalCompositeOperation = 'darker';
compare(ctx.globalCompositeOperation, 'xor');
ctx.reset();
compare(ctx.globalCompositeOperation, 'source-over');
ctx.reset();
var modes = ['source-atop', 'source-in', 'source-out', 'source-over',
'destination-atop', 'destination-in', 'destination-out', 'destination-over',
'lighter', 'copy', 'xor'];
for (var i = 0; i < modes.length; ++i)
{
ctx.globalCompositeOperation = modes[i];
compare(ctx.globalCompositeOperation, modes[i]);
}
ctx.reset();
ctx.globalCompositeOperation = 'xor';
ctx.globalCompositeOperation = 'highlight';
compare(ctx.globalCompositeOperation, 'xor');
ctx.reset();
ctx.globalCompositeOperation = 'xor';
ctx.globalCompositeOperation = 'source-over\\0';
compare(ctx.globalCompositeOperation, 'xor');
ctx.reset();
ctx.globalCompositeOperation = 'xor';
ctx.globalCompositeOperation = 'over';
compare(ctx.globalCompositeOperation, 'xor');
ctx.reset();
ctx.globalCompositeOperation = 'xor';
ctx.globalCompositeOperation = 'nonexistent';
compare(ctx.globalCompositeOperation, 'xor');
}
function test_solid(row) {
var canvas = createCanvasObject(row);
var ctx = canvas.getContext('2d');
ctx.reset();
ctx.fillStyle = Qt.rgba(0, 1, 1, 1.0);
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'copy';
ctx.fillStyle = Qt.rgba(1, 1, 0, 1.0);
ctx.fillRect(0, 0, 100, 50);
//comparePixel(ctx, 50,25, 255,255,0, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 255, 1.0)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'destination-atop';
ctx.fillStyle = 'rgba(255, 255, 0, 1.0)';
ctx.fillRect(0, 0, 100, 50);
//comparePixel(ctx, 50,25, 0,255,255,255, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 255, 1.0)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'destination-in';
ctx.fillStyle = 'rgba(255, 255, 0, 1.0)';
ctx.fillRect(0, 0, 100, 50);
//comparePixel(ctx, 50,25, 0,255,255,255, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 255, 1.0)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'destination-out';
ctx.fillStyle = 'rgba(255, 255, 0, 1.0)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,0,0,0, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 255, 1.0)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'destination-over';
ctx.fillStyle = 'rgba(255, 255, 0, 1.0)';
ctx.fillRect(0, 0, 100, 50);
//comparePixel(ctx, 50,25, 0,255,255,255, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 255, 1.0)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'lighter';
ctx.fillStyle = 'rgba(255, 255, 0, 1.0)';
ctx.fillRect(0, 0, 100, 50);
//comparePixel(ctx, 50,25, 255,255,255,255, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 255, 1.0)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'source-atop';
ctx.fillStyle = 'rgba(255, 255, 0, 1.0)';
ctx.fillRect(0, 0, 100, 50);
//comparePixel(ctx, 50,25, 255,255,0, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 255, 1.0)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'source-in';
ctx.fillStyle = 'rgba(255, 255, 0, 1.0)';
ctx.fillRect(0, 0, 100, 50);
//comparePixel(ctx, 50,25, 255,255,0, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 255, 1.0)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'source-out';
ctx.fillStyle = 'rgba(255, 255, 0, 1.0)';
ctx.fillRect(0, 0, 100, 50);
// comparePixel(ctx, 50,25, 0,0,0,0, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 255, 1.0)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'source-over';
ctx.fillStyle = 'rgba(255, 255, 0, 1.0)';
ctx.fillRect(0, 0, 100, 50);
//comparePixel(ctx, 50,25, 255,255,0, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 255, 1.0)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'xor';
ctx.fillStyle = 'rgba(255, 255, 0, 1.0)';
ctx.fillRect(0, 0, 100, 50);
//comparePixel(ctx, 50,25, 0,0,0,0, 5);
}
function test_transparent(row) {
var canvas = createCanvasObject(row);
var ctx = canvas.getContext('2d');
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'copy';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,0,255,191, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'copy';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,0,255,191, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'destination-in';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,255,0,95, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'destination-out';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,255,0,31, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'destination-over';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,145,109,223, 5);
// qt does not support lighter...
// ctx.reset();
// ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
// ctx.fillRect(0, 0, 100, 50);
// ctx.globalCompositeOperation = 'lighter';
// ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
// ctx.fillRect(0, 0, 100, 50);
//FIXME
//comparePixel(ctx, 50,25, 0,127,191,255, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'source-atop';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,63,191,127, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'source-in';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,0,255,95, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'source-out';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,0,255,95, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'source-over';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,36,218,223, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'xor';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.fillRect(0, 0, 100, 50);
comparePixel(ctx, 50,25, 0,63,191,127, 5);
}
function test_uncovered(row) {
var canvas = createCanvasObject(row);
var ctx = canvas.getContext('2d');
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'copy';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.translate(0, 25);
ctx.fillRect(0, 50, 100, 50);
//FIXME
//comparePixel(ctx, 50,25, 0,0,0,0, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'destination-atop';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.translate(0, 25);
ctx.fillRect(0, 50, 100, 50);
//FIXME
//comparePixel(ctx, 50,25, 0,0,0,0, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'destination-in';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.translate(0, 25);
ctx.fillRect(0, 50, 100, 50);
//FIXME
//comparePixel(ctx, 50,25, 0,0,0,0, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'source-in';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.translate(0, 25);
ctx.fillRect(0, 50, 100, 50);
//FIXME
//comparePixel(ctx, 50,25, 0,0,0,0, 5);
ctx.reset();
ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
ctx.fillRect(0, 0, 100, 50);
ctx.globalCompositeOperation = 'source-out';
ctx.fillStyle = 'rgba(0, 0, 255, 0.75)';
ctx.translate(0, 25);
ctx.fillRect(0, 50, 100, 50);
//FIXME
//comparePixel(ctx, 50,25, 0,0,0,0, 5);
}
}