Skip to content

Commit

Permalink
bug: stringify CanvasPattern, ImageData, CanvasGradient like browsers
Browse files Browse the repository at this point in the history
Fixes #1646
Fixes #1639
  • Loading branch information
zbjornson committed Dec 31, 2021
1 parent d603479 commit 5fc80e7
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 30 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ project adheres to [Semantic Versioning](http://semver.org/).
### Changed
### Added
### Fixed
* Stringify CanvasGradient, CanvasPattern and ImageData like browsers do. (#1639, #1646)

2.9.0
==================
Expand Down
12 changes: 11 additions & 1 deletion lib/bindings.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
'use strict'

module.exports = require('../build/Release/canvas.node')
const bindings = require('../build/Release/canvas.node')

module.exports = bindings

bindings.ImageData.prototype.toString = function () {
return '[object ImageData]'
}

bindings.CanvasGradient.prototype.toString = function () {
return '[object CanvasGradient]'
}
4 changes: 4 additions & 0 deletions lib/pattern.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,7 @@ const { DOMMatrix } = require('./DOMMatrix')

bindings.CanvasPatternInit(DOMMatrix)
module.exports = bindings.CanvasPattern

bindings.CanvasPattern.prototype.toString = function () {
return '[object CanvasPattern]'
}
72 changes: 43 additions & 29 deletions test/canvas.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1317,37 +1317,44 @@ describe('Canvas', function () {
})
});

it('Context2d#createPattern(Image)', function () {
return loadImage(path.join(__dirname, '/fixtures/checkers.png')).then((img) => {
const canvas = createCanvas(20, 20)
const ctx = canvas.getContext('2d')
const pattern = ctx.createPattern(img)
it('Context2d#createPattern(Image)', async function () {
const img = await loadImage(path.join(__dirname, '/fixtures/checkers.png'));
const canvas = createCanvas(20, 20)
const ctx = canvas.getContext('2d')
const pattern = ctx.createPattern(img)

ctx.fillStyle = pattern
ctx.fillRect(0, 0, 20, 20)

const imageData = ctx.getImageData(0, 0, 20, 20)
assert.equal(20, imageData.width)
assert.equal(20, imageData.height)
assert.equal(1600, imageData.data.length)

let i = 0; let b = true
while (i < imageData.data.length) {
if (b) {
assert.equal(0, imageData.data[i++])
assert.equal(0, imageData.data[i++])
assert.equal(0, imageData.data[i++])
assert.equal(255, imageData.data[i++])
} else {
assert.equal(255, imageData.data[i++])
assert.equal(255, imageData.data[i++])
assert.equal(255, imageData.data[i++])
assert.equal(255, imageData.data[i++])
}
// alternate b, except when moving to a new row
b = i % (imageData.width * 4) === 0 ? b : !b
ctx.fillStyle = pattern
ctx.fillRect(0, 0, 20, 20)

const imageData = ctx.getImageData(0, 0, 20, 20)
assert.equal(20, imageData.width)
assert.equal(20, imageData.height)
assert.equal(1600, imageData.data.length)

let i = 0; let b = true
while (i < imageData.data.length) {
if (b) {
assert.equal(0, imageData.data[i++])
assert.equal(0, imageData.data[i++])
assert.equal(0, imageData.data[i++])
assert.equal(255, imageData.data[i++])
} else {
assert.equal(255, imageData.data[i++])
assert.equal(255, imageData.data[i++])
assert.equal(255, imageData.data[i++])
assert.equal(255, imageData.data[i++])
}
})
// alternate b, except when moving to a new row
b = i % (imageData.width * 4) === 0 ? b : !b
}
})

it('CanvasPattern stringifies as [object CanvasPattern]', async function () {
const img = await loadImage(path.join(__dirname, '/fixtures/checkers.png'));
const canvas = createCanvas(20, 20)
const ctx = canvas.getContext('2d')
const pattern = ctx.createPattern(img)
assert.strictEqual(pattern.toString(), '[object CanvasPattern]')
})

it('Context2d#createLinearGradient()', function () {
Expand Down Expand Up @@ -1380,6 +1387,13 @@ describe('Canvas', function () {
assert.equal(255, imageData.data[i + 3])
})

it('CanvasGradient stringifies as [object CanvasGradient]', function () {
const canvas = createCanvas(20, 1)
const ctx = canvas.getContext('2d')
const gradient = ctx.createLinearGradient(1, 1, 19, 1)
assert.strictEqual(gradient.toString(), '[object CanvasGradient]')
})

describe('Context2d#putImageData()', function () {
it('throws for invalid arguments', function () {
const canvas = createCanvas(2, 1)
Expand Down
5 changes: 5 additions & 0 deletions test/imageData.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ describe('ImageData', function () {
assert.throws(function () { ImageData.prototype.width }, /incompatible receiver/)
})

it('stringifies as [object ImageData]', function () {
const imageData = createImageData(2, 3)
assert.strictEqual(imageData.toString(), '[object ImageData]')
})

it('should throw with invalid numeric arguments', function () {
assert.throws(() => { createImageData(0, 0) }, /width is zero/)
assert.throws(() => { createImageData(1, 0) }, /height is zero/)
Expand Down

0 comments on commit 5fc80e7

Please sign in to comment.