diff options
author | commit-queue@webkit.org <commit-queue@webkit.org@bbb929c8-8fbe-4397-9dbb-9b2b20218538> | 2013-01-21 21:05:00 +0000 |
---|---|---|
committer | commit-queue@webkit.org <commit-queue@webkit.org@bbb929c8-8fbe-4397-9dbb-9b2b20218538> | 2013-01-21 21:05:00 +0000 |
commit | c2ec340903d0feca67dcf4773689ab4512c7b778 (patch) | |
tree | 3b587fd8f042dd108ee4dbbabd152c761a4d8dc4 /third_party/WebKit/LayoutTests/fast/canvas/script-tests | |
parent | 9a20b94d5ae022165c2885c475612f01c47fb910 (diff) | |
download | chromium_src-c2ec340903d0feca67dcf4773689ab4512c7b778.zip chromium_src-c2ec340903d0feca67dcf4773689ab4512c7b778.tar.gz chromium_src-c2ec340903d0feca67dcf4773689ab4512c7b778.tar.bz2 |
Proposal: Add support for even-odd fill and clip to Canvas
https://bugs.webkit.org/show_bug.cgi?id=106188
Patch by Rik Cabanier <cabanier@adobe.com> on 2013-01-21
Reviewed by Dirk Schulze.
Source/WebCore:
This patch adds support for an optional winding rule to fill, clip
and isPointInPath in canvas 2d. By default, the fill is non-zero but
you can now pass in an optional winding rule string ("nonzero" or "evenodd")
to make an explicit choice.
Tests: fast/canvas/canvas-clip-rule.html
fast/canvas/canvas-fill-rule.html
fast/canvas/canvas-isPointInPath-winding.html
* html/canvas/CanvasRenderingContext2D.cpp: Change implementation so it sets the windig rule in the context.
(WebCore::parseWinding):
(WebCore):
(WebCore::CanvasRenderingContext2D::fill):
(WebCore::CanvasRenderingContext2D::clip):
(WebCore::CanvasRenderingContext2D::isPointInPath):
* html/canvas/CanvasRenderingContext2D.h:
(CanvasRenderingContext2D):
* html/canvas/CanvasRenderingContext2D.idl: Change the idl so the new API is exposed to JavaScript.
* platform/graphics/cg/GraphicsContextCG.cpp: Fixes a bug where the wrong winding rule was set for clipping in Core Graphics.
(WebCore::GraphicsContext::clip):
LayoutTests:
Add tests to verify that the winding rule work as expected with clip, fill and isPointInPath
* fast/canvas/canvas-clip-rule-expected.txt: Added.
* fast/canvas/canvas-clip-rule.html: Added.
* fast/canvas/canvas-fill-rule-expected.txt: Added.
* fast/canvas/canvas-fill-rule.html: Added.
* fast/canvas/canvas-isPointInPath-winding-expected.txt: Added.
* fast/canvas/canvas-isPointInPath-winding.html: Added.
* fast/canvas/script-tests/canvas-clip-rule.js: Added.
(pixelDataAtPoint):
(checkResult):
(prepareTestScenario):
* fast/canvas/script-tests/canvas-fill-rule.js: Added.
(pixelDataAtPoint):
(checkResult):
(prepareTestScenario):
* fast/canvas/script-tests/canvas-isPointInPath-winding.js: Added.
(prepareTestScenario):
git-svn-id: svn://svn.chromium.org/blink/trunk@140352 bbb929c8-8fbe-4397-9dbb-9b2b20218538
Diffstat (limited to 'third_party/WebKit/LayoutTests/fast/canvas/script-tests')
3 files changed, 175 insertions, 0 deletions
diff --git a/third_party/WebKit/LayoutTests/fast/canvas/script-tests/canvas-clip-rule.js b/third_party/WebKit/LayoutTests/fast/canvas/script-tests/canvas-clip-rule.js new file mode 100644 index 0000000..e6a45ed --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/canvas/script-tests/canvas-clip-rule.js @@ -0,0 +1,69 @@ +description("Series of tests to ensure correct results of the winding rule."); + + +var tmpimg = document.createElement('canvas'); +tmpimg.width = 200; +tmpimg.height = 200; +ctx = tmpimg.getContext('2d'); + +// Create the image for blending test with images. +var img = document.createElement('canvas'); +img.width = 100; +img.height = 100; +var imgCtx = img.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); +} + +// Execute test. +function prepareTestScenario() { + debug('Testing default clip'); + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(0, 0, 100, 100); + ctx.fillStyle = 'rgb(0,255,0)'; + ctx.beginPath(); + ctx.rect(0, 0, 100, 100); + ctx.rect(25, 25, 50, 50); + ctx.clip(); + ctx.beginPath(); + ctx.fillRect(0, 0, 100, 100); + checkResult([0, 255, 0, 255], 5); + debug(''); + + debug('Testing nonzero clip'); + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(0, 0, 100, 100); + ctx.fillStyle = 'rgb(0,255,0)'; + ctx.beginPath(); + ctx.rect(0, 0, 100, 100); + ctx.rect(25, 25, 50, 50); + ctx.clip('nonzero'); + ctx.beginPath(); + ctx.fillRect(0, 0, 100, 100); + checkResult([0, 255, 0, 255], 5); + debug(''); + + debug('Testing evenodd clip'); + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.fillRect(0, 0, 100, 100); + ctx.fillStyle = 'rgb(0,255,0)'; + ctx.beginPath(); + ctx.rect(0, 0, 100, 100); + ctx.rect(25, 25, 50, 50); + ctx.clip('evenodd'); + ctx.beginPath(); + ctx.fillRect(0, 0, 100, 100); + checkResult([255, 0, 0, 255], 5); + debug(''); + +} + +// Run test and allow variation of results. +prepareTestScenario(); diff --git a/third_party/WebKit/LayoutTests/fast/canvas/script-tests/canvas-fill-rule.js b/third_party/WebKit/LayoutTests/fast/canvas/script-tests/canvas-fill-rule.js new file mode 100644 index 0000000..482e03a --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/canvas/script-tests/canvas-fill-rule.js @@ -0,0 +1,66 @@ +description("Series of tests to ensure correct results of the winding rule."); + + +var tmpimg = document.createElement('canvas'); +tmpimg.width = 200; +tmpimg.height = 200; +ctx = tmpimg.getContext('2d'); + +// Create the image for blending test with images. +var img = document.createElement('canvas'); +img.width = 100; +img.height = 100; +var imgCtx = img.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); +} + +// Execute test. +function prepareTestScenario() { + debug('Testing default fill'); + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.beginPath(); + ctx.fillRect(0, 0, 100, 100); + ctx.fillStyle = 'rgb(0,255,0)'; + ctx.beginPath(); + ctx.rect(0, 0, 100, 100); + ctx.rect(25, 25, 50, 50); + ctx.fill(); + checkResult([0, 255, 0, 255], 5); + debug(''); + + debug('Testing nonzero fill'); + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.beginPath(); + ctx.fillRect(0, 0, 100, 100); + ctx.fillStyle = 'rgb(0,255,0)'; + ctx.beginPath(); + ctx.rect(0, 0, 100, 100); + ctx.rect(25, 25, 50, 50); + ctx.fill('nonzero'); + checkResult([0, 255, 0, 255], 5); + debug(''); + + debug('Testing evenodd fill'); + ctx.fillStyle = 'rgb(255,0,0)'; + ctx.beginPath(); + ctx.fillRect(0, 0, 100, 100); + ctx.fillStyle = 'rgb(0,255,0)'; + ctx.beginPath(); + ctx.rect(0, 0, 100, 100); + ctx.rect(25, 25, 50, 50); + ctx.fill('evenodd'); + checkResult([255, 0, 0, 255], 5); + debug(''); + +} + +// Run test and allow variation of results. +prepareTestScenario(); diff --git a/third_party/WebKit/LayoutTests/fast/canvas/script-tests/canvas-isPointInPath-winding.js b/third_party/WebKit/LayoutTests/fast/canvas/script-tests/canvas-isPointInPath-winding.js new file mode 100644 index 0000000..30d0a46 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/canvas/script-tests/canvas-isPointInPath-winding.js @@ -0,0 +1,40 @@ +description("Series of tests to ensure correct results of the winding rule in isPointInPath."); + + +var tmpimg = document.createElement('canvas'); +tmpimg.width = 200; +tmpimg.height = 200; +ctx = tmpimg.getContext('2d'); + +// Create the image for blending test with images. +var img = document.createElement('canvas'); +img.width = 100; +img.height = 100; +var imgCtx = img.getContext('2d'); + +// Execute test. +function prepareTestScenario() { + debug('Testing default isPointInPath'); + ctx.beginPath(); + ctx.rect(0, 0, 100, 100); + ctx.rect(25, 25, 50, 50); + shouldBeTrue("ctx.isPointInPath(50, 50)"); + debug(''); + + debug('Testing nonzero isPointInPath'); + ctx.beginPath(); + ctx.rect(0, 0, 100, 100); + ctx.rect(25, 25, 50, 50); + shouldBeTrue("ctx.isPointInPath(50, 50, 'nonzero')"); + debug(''); + + debug('Testing evenodd isPointInPath'); + ctx.beginPath(); + ctx.rect(0, 0, 100, 100); + ctx.rect(25, 25, 50, 50); + shouldBeFalse("ctx.isPointInPath(50, 50, 'evenodd')"); + debug(''); +} + +// Run test and allow variation of results. +prepareTestScenario(); |