diff --git a/test/index.js b/test/index.js index db8695f..b04704d 100644 --- a/test/index.js +++ b/test/index.js @@ -1,71 +1,73 @@ -import {Element} from '../index' -import arc from './tests/arc' -import arcTo from './tests/arcTo' -import arcTo2 from './tests/arcTo2' -import arcToScaled from './tests/arcToScaled' -import emptyArc from './tests/emptyArc' -import ellipse from './tests/ellipse' -import ellipse2 from './tests/ellipse2' -import fillstyle from './tests/fillstyle' -import globalAlpha from './tests/globalalpha' -import gradient from './tests/gradient' -import linecap from './tests/linecap' -import linewidth from './tests/linewidth' -import scaledLine from './tests/scaledLine' -import rgba from './tests/rgba' -import rotate from './tests/rotate' -import saveandrestore from './tests/saveandrestore' -import setLineDash from './tests/setLineDash' -import text from './tests/text' -import tiger from './tests/tiger' -import transform from './tests/transform' +import { Element } from "../index"; +import arc from "./tests/arc"; +import arcTo from "./tests/arcTo"; +import arcTo2 from "./tests/arcTo2"; +import arcToScaled from "./tests/arcToScaled"; +import emptyArc from "./tests/emptyArc"; +import ellipse from "./tests/ellipse"; +import ellipse2 from "./tests/ellipse2"; +import fillstyle from "./tests/fillstyle"; +import globalAlpha from "./tests/globalalpha"; +import gradient from "./tests/gradient"; +import linecap from "./tests/linecap"; +import linewidth from "./tests/linewidth"; +import scaledLine from "./tests/scaledLine"; +import rgba from "./tests/rgba"; +import rotate from "./tests/rotate"; +import saveandrestore from "./tests/saveandrestore"; +import setLineDash from "./tests/setLineDash"; +import text from "./tests/text"; +import tiger from "./tests/tiger"; +import transform from "./tests/transform"; import pattern from "./tests/pattern"; -import path2D from './tests/path2D'; +import path2D from "./tests/path2D"; +import clip from "./tests/clip"; const tests = [ - tiger, - arc, - arcTo, - arcTo2, - arcToScaled, - emptyArc, - ellipse, - ellipse2, - fillstyle, - globalAlpha, - gradient, - linecap, - linewidth, - scaledLine, - rgba, - rotate, - saveandrestore, - setLineDash, - text, - transform, - pattern, - path2D + tiger, + arc, + arcTo, + arcTo2, + arcToScaled, + clip, + emptyArc, + ellipse, + ellipse2, + fillstyle, + globalAlpha, + gradient, + linecap, + linewidth, + scaledLine, + rgba, + rotate, + saveandrestore, + setLineDash, + text, + transform, + pattern, + path2D, ]; for (let fn of tests) { - let name = fn.name; - // Container - const container = document.createElement('div'); - container.className = 'example'; - container.id = 'example-' + name; - container.innerHTML = `

${name}

` - // Canvas - const canvas = document.createElement('canvas'); - container.querySelector('.canvas').appendChild(canvas); - // SVGCanvas - const svgcanvas = new Element(); - container.querySelector('.svg').appendChild(svgcanvas.getElement()); - document.querySelector('body').appendChild(container); - // Render - for (let c of [canvas, svgcanvas]) { - c.width = 500; - c.height = 500; - const ctx = c.getContext('2d'); - fn(ctx); - } + let name = fn.name; + // Container + const container = document.createElement("div"); + container.className = "example"; + container.id = "example-" + name; + container.innerHTML = `

${name}

`; + // Canvas + const canvas = document.createElement("canvas"); + container.querySelector(".canvas").appendChild(canvas); + // SVGCanvas + const svgcanvas = new Element(); + container.querySelector(".svg").appendChild(svgcanvas.getElement()); + document.querySelector("body").appendChild(container); + // Render + for (let c of [canvas, svgcanvas]) { + c.width = 500; + c.height = 500; + const ctx = c.getContext("2d"); + fn(ctx); + } } diff --git a/test/tests/clip.js b/test/tests/clip.js new file mode 100644 index 0000000..086b38c --- /dev/null +++ b/test/tests/clip.js @@ -0,0 +1,38 @@ +export default function clip(ctx) { + // Draw a line with clipped areas removed. + var scaleX = 1.5, + scaleY = 1.2; + + ctx.rotate(Math.PI / 10); + ctx.scale(scaleX, scaleY); + ctx.translate(200, 25); + + // Draw unclipped line + ctx.beginPath(); + ctx.moveTo(5, 10); + ctx.lineTo(195, 200); + ctx.stroke(); + + ctx.save(); + + // Remove clipped areas + ctx.beginPath(); + ctx.rect(20, 30, 30, 10); + ctx.rect(0, 0, 300, 300); + // ctx.stroke(); // Uncomment for debugging clip. + ctx.clip("evenodd"); + + // Draw line. + ctx.beginPath(); + ctx.moveTo(10, 10); + ctx.lineTo(200, 200); + ctx.stroke(); + + ctx.restore(); + + // Draw unclipped line + ctx.beginPath(); + ctx.moveTo(15, 10); + ctx.lineTo(205, 200); + ctx.stroke(); +} diff --git a/test/tests/path2D.js b/test/tests/path2D.js index 491d726..6a80b59 100644 --- a/test/tests/path2D.js +++ b/test/tests/path2D.js @@ -1,29 +1,48 @@ function makePath(ctx, arg) { - if (ctx.createPath) { - return ctx.createPath(arg); - } else { - return new Path2D(arg); - } + if (ctx.createPath) { + return ctx.createPath(arg); + } else { + return new Path2D(arg); + } } export default function path2D(ctx) { - const path1 = makePath(ctx, `M 230 80 + const path1 = makePath( + ctx, + `M 230 80 A 45 45, 0, 1, 0, 275 125 - L 275 80 Z`); + L 275 80 Z` + ); - ctx.strokeStyle = 'red'; - ctx.stroke(path1); - ctx.fillStyle = 'grey'; - ctx.fill(path1); + ctx.save(); + ctx.strokeStyle = "red"; + ctx.stroke(path1); + ctx.fillStyle = "grey"; + ctx.fill(path1); - ctx.translate(10, 25); - ctx.lineWidth = 10; - ctx.stroke(path1); + ctx.translate(10, 25); + ctx.lineWidth = 10; + ctx.stroke(path1); - ctx.rotate(Math.PI / 4); - ctx.scale(1.5, 1.5); - ctx.translate(10, 25); + ctx.rotate(Math.PI / 4); + ctx.scale(1.5, 1.5); + ctx.translate(10, 25); - ctx.strokeStyle = 'blue'; - ctx.stroke(path1); - }; \ No newline at end of file + ctx.strokeStyle = "blue"; + ctx.stroke(path1); + ctx.restore(); + + ctx.save(); + // Stroke and fill the same path. + ctx.beginPath(); + ctx.rect(10, 10, 40, 20); + ctx.save(); + ctx.strokeStyle = "red"; + ctx.stroke(); + ctx.restore(); + ctx.save(); + ctx.fillStyle = "green"; + ctx.fill(); + ctx.restore(); + ctx.restore(); +}