summaryrefslogtreecommitdiffstats
path: root/third_party/WebKit/LayoutTests/fast/canvas/script-tests/canvas-path-context-clip.js
blob: 9135da34307db990c6c572537a0b9243cb5fb9da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
description("Series of tests to ensure clip() works with path and winding rule parameters.");

var ctx = document.getElementById('canvas').getContext('2d');

function pixelDataAtPoint() {
  return ctx.getImageData(50, 50, 1, 1).data;
}

function checkResult(expectedColors, sigma) {
    for (var i = 0; i < 4; i++)
      shouldBeCloseTo("pixelDataAtPoint()[" + i + "]", expectedColors[i], sigma);
}

function drawRectanglesOn(contextOrPath) {
  contextOrPath.rect(0, 0, 100, 100);
  contextOrPath.rect(25, 25, 50, 50);
}

function formatName(fillRule, path) {
  return 'clip(' + (path ? 'path' : '') + (fillRule && path ? ', ' : '') +
          (fillRule ? '"' + fillRule + '"' : '') + ')';
}

function testClipWith(fillRule, path) {
    debug('Testing ' + formatName(fillRule, path));
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.beginPath();
    ctx.fillRect(0, 0, 100, 100);
    ctx.fillStyle = 'rgb(0,255,0)';
    if (path) {
      if (fillRule) {
        ctx.clip(path, fillRule);
      } else {
        ctx.clip(path);
      }
    } else {
      ctx.beginPath();
      drawRectanglesOn(ctx);
      if (fillRule) {
        ctx.clip(fillRule);
      } else {
        ctx.clip();
      }
    }
    ctx.beginPath();
    ctx.fillRect(0, 0, 100, 100);
    if (fillRule == 'evenodd') {
      checkResult([255, 0, 0, 255], 5);
    } else {
      checkResult([0, 255, 0, 255], 5);
    }
    debug('');
}

// Execute test.
function prepareTestScenario() {
    fillRules = [undefined, 'nonzero', 'evenodd'];
    path = new Path2D();
    drawRectanglesOn(path);

    for (var i = 0; i < fillRules.length; i++) {
       testClipWith(fillRules[i]);
       testClipWith(fillRules[i], path);
    }

    // Test exception cases.
    shouldThrow("ctx.clip(null)");
    shouldThrow("ctx.clip(null, null)");
    shouldThrow("ctx.clip(null, 'nonzero')");
    shouldThrow("ctx.clip(path, null)");
    shouldThrow("ctx.clip([], 'nonzero')");
    shouldThrow("ctx.clip({}, 'nonzero')");
    shouldThrow("ctx.clip(null, 'evenodd')");
    shouldThrow("ctx.clip([], 'evenodd')");
    shouldThrow("ctx.clip({}, 'evenodd')");
    shouldThrow("ctx.clip('gazonk')");
    shouldThrow("ctx.clip(path, 'gazonk')");
    shouldThrow("ctx.clip(undefined, undefined)");
    shouldThrow("ctx.clip(undefined, 'nonzero')");
}

// Run test and allow variation of results.
prepareTestScenario();