You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

2042 lines
48 KiB

var Image
var imageSrc
var tests = {}
if (typeof module !== 'undefined' && module.exports) {
module.exports = tests
Image = require('../../').Image
imageSrc = function (filename) { return require('path').join(__dirname, '..', 'fixtures', filename) }
} else {
window.tests = tests
Image = window.Image
imageSrc = function (filename) { return filename }
}
tests['clearRect()'] = function (ctx) {
ctx.fillRect(25, 25, 100, 100)
ctx.clearRect(45, 45, 60, 60)
ctx.fillRect(50, 50, 50, 50)
}
tests['strokeRect()'] = function (ctx) {
ctx.fillRect(25, 25, 100, 100)
ctx.clearRect(45, 45, 60, 60)
ctx.strokeRect(50, 50, 50, 50)
}
tests['fillRect()'] = function (ctx) {
function render (level) {
ctx.fillStyle = getPointColour(122, 122)
ctx.fillRect(0, 0, 240, 240)
renderLevel(level, 81, 0)
}
function renderLevel (minimumLevel, level, y) {
var x
for (x = 0; x < 243 / level; ++x) {
drawBlock(x, y, level)
}
for (x = 0; x < 243 / level; x += 3) {
drawBlock(x, y + 1, level)
drawBlock(x + 2, y + 1, level)
}
for (x = 0; x < 243 / level; ++x) {
drawBlock(x, y + 2, level)
}
if ((y += 3) >= 243 / level) {
y = 0
level /= 3
}
if (level >= minimumLevel) {
renderLevel(minimumLevel, level, y)
}
}
function drawBlock (x, y, level) {
ctx.fillStyle = getPointColour(
x * level + (level - 1) / 2,
y * level + (level - 1) / 2
)
ctx.fillRect(
x * level,
y * level,
level,
level
)
}
function getPointColour (x, y) {
x = x / 121.5 - 1
y = -y / 121.5 + 1
var x2y2 = x * x + y * y
if (x2y2 > 1) {
return '#000'
}
var root = Math.sqrt(1 - x2y2)
var x3d = x * 0.7071067812 + root / 2 - y / 2
var y3d = x * 0.7071067812 - root / 2 + y / 2
var z3d = 0.7071067812 * root + 0.7071067812 * y
var brightness = -x / 2 + root * 0.7071067812 + y / 2
if (brightness < 0) brightness = 0
return (
'rgb(' + Math.round(brightness * 127.5 * (1 - y3d)) +
',' + Math.round(brightness * 127.5 * (x3d + 1)) +
',' + Math.round(brightness * 127.5 * (z3d + 1)) +
')'
)
}
render(1)
}
tests['lineTo()'] = function (ctx) {
// Filled triangle
ctx.beginPath()
ctx.moveTo(25.5, 25)
ctx.lineTo(105, 25)
ctx.lineTo(25, 105)
ctx.fill()
// Stroked triangle
ctx.beginPath()
ctx.moveTo(125, 125)
ctx.lineTo(125, 45)
ctx.lineTo(45, 125)
ctx.closePath()
ctx.stroke()
}
tests['arc()'] = function (ctx) {
ctx.beginPath()
ctx.arc(75, 75, 50, 0, Math.PI * 2, true) // Outer circle
ctx.moveTo(110, 75)
ctx.arc(75, 75, 35, 0, Math.PI, false) // Mouth
ctx.moveTo(65, 65)
ctx.arc(60, 65, 5, 0, Math.PI * 2, true) // Left eye
ctx.moveTo(95, 65)
ctx.arc(90, 65, 5, 0, Math.PI * 2, true) // Right eye
ctx.stroke()
}
tests['arc() 2'] = function (ctx) {
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 3; j++) {
ctx.beginPath()
var x = 25 + j * 50 // x coordinate
var y = 25 + i * 50 // y coordinate
var radius = 20 // Arc radius
var startAngle = 0 // Starting point on circle
var endAngle = Math.PI + (Math.PI * j) / 2 // End point on circle
var anticlockwise = (i % 2) === 1 // clockwise or anticlockwise
ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise)
if (i > 1) {
ctx.fill()
} else {
ctx.stroke()
}
}
}
}
tests['arcTo()'] = function (ctx) {
ctx.fillStyle = '#08C8EE'
ctx.translate(-50, -50)
ctx.moveTo(120, 100)
ctx.lineTo(180, 100)
ctx.arcTo(200, 100, 200, 120, 5)
ctx.lineTo(200, 180)
ctx.arcTo(200, 200, 180, 200, 20)
ctx.lineTo(120, 200)
ctx.arcTo(100, 200, 100, 180, 20)
ctx.lineTo(100, 120)
ctx.arcTo(100, 100, 120, 100, 20)
ctx.fill()
ctx.font = 'bold 25px Arial'
ctx.fillStyle = '#fff'
ctx.fillText('node', 120, 155)
}
tests['bezierCurveTo()'] = function (ctx) {
ctx.beginPath()
ctx.moveTo(75, 40)
ctx.bezierCurveTo(75, 37, 70, 25, 50, 25)
ctx.bezierCurveTo(20, 25, 20, 62.5, 20, 62.5)
ctx.bezierCurveTo(20, 80, 40, 102, 75, 120)
ctx.bezierCurveTo(110, 102, 130, 80, 130, 62.5)
ctx.bezierCurveTo(130, 62.5, 130, 25, 100, 25)
ctx.bezierCurveTo(85, 25, 75, 37, 75, 40)
ctx.fill()
}
tests['quadraticCurveTo()'] = function (ctx) {
ctx.beginPath()
ctx.moveTo(75, 25)
ctx.quadraticCurveTo(25, 25, 25, 62.5)
ctx.quadraticCurveTo(25, 100, 50, 100)
ctx.quadraticCurveTo(50, 120, 30, 125)
ctx.quadraticCurveTo(60, 120, 65, 100)
ctx.quadraticCurveTo(125, 100, 125, 62.5)
ctx.quadraticCurveTo(125, 25, 75, 25)
ctx.stroke()
}
tests['transform()'] = function (ctx) {
var sin = Math.sin(Math.PI / 6)
var cos = Math.cos(Math.PI / 6)
ctx.translate(100, 100)
ctx.scale(0.5, 0.5)
var c = 0
for (var i = 0; i <= 12; i++) {
c = Math.floor(255 / 12 * i)
ctx.fillStyle = 'rgb(' + c + ',' + c + ',' + c + ')'
ctx.fillRect(0, 0, 100, 10)
ctx.transform(cos, sin, -sin, cos, 0, 0)
}
}
tests['rotate()'] = function (ctx) {
ctx.rotate(0.4)
ctx.translate(30, 0)
ctx.rect(0, 0, 50, 50)
ctx.stroke()
}
tests['rotate() 2'] = function (ctx) {
ctx.translate(75, 75)
for (var i = 1; i < 6; i++) { // Loop through rings (from inside to out)
ctx.save()
ctx.fillStyle = 'rgb(' + (51 * i) + ',' + (255 - 51 * i) + ',255)'
for (var j = 0; j < i * 6; j++) { // draw individual dots
ctx.rotate(Math.PI * 2 / (i * 6))
ctx.beginPath()
ctx.arc(0, i * 12.5, 5, 0, Math.PI * 2, true)
ctx.fill()
}
ctx.restore()
}
}
tests['translate()'] = function (ctx) {
ctx.fillRect(0, 0, 300, 300)
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
ctx.save()
ctx.strokeStyle = '#9CFF00'
ctx.translate(50 + j * 100, 50 + i * 100)
drawSpirograph(ctx, 20 * (j + 2) / (j + 1), -8 * (i + 3) / (i + 1), 10)
ctx.restore()
}
}
function drawSpirograph (ctx, R, r, O) {
var x1 = R - O
var y1 = 0
var i = 1
ctx.beginPath()
ctx.moveTo(x1, y1)
do {
if (i > 20000) break
var x2 = (R + r) * Math.cos(i * Math.PI / 72) - (r + O) * Math.cos(((R + r) / r) * (i * Math.PI / 72))
var y2 = (R + r) * Math.sin(i * Math.PI / 72) - (r + O) * Math.sin(((R + r) / r) * (i * Math.PI / 72))
ctx.lineTo(x2, y2)
x1 = x2
y1 = y2
i++
} while (x2 !== R - O && y2 !== 0)
ctx.stroke()
}
}
tests['scale()'] = function (ctx) {
ctx.strokeStyle = '#fc0'
ctx.lineWidth = 1.5
ctx.fillRect(0, 0, 300, 300)
// Uniform scaling
ctx.save()
ctx.translate(50, 50)
drawSpirograph(ctx, 22, 6, 5) // no scaling
ctx.translate(100, 0)
ctx.scale(0.75, 0.75)
drawSpirograph(ctx, 22, 6, 5)
ctx.translate(133.333, 0)
ctx.scale(0.75, 0.75)
drawSpirograph(ctx, 22, 6, 5)
ctx.restore()
// Non-uniform scaling (y direction)
ctx.strokeStyle = '#0cf'
ctx.save()
ctx.translate(50, 150)
ctx.scale(1, 0.75)
drawSpirograph(ctx, 22, 6, 5)
ctx.translate(100, 0)
ctx.scale(1, 0.75)
drawSpirograph(ctx, 22, 6, 5)
ctx.translate(100, 0)
ctx.scale(1, 0.75)
drawSpirograph(ctx, 22, 6, 5)
ctx.restore()
// Non-uniform scaling (x direction)
ctx.strokeStyle = '#cf0'
ctx.save()
ctx.translate(50, 250)
ctx.scale(0.75, 1)
drawSpirograph(ctx, 22, 6, 5)
ctx.translate(133.333, 0)
ctx.scale(0.75, 1)
drawSpirograph(ctx, 22, 6, 5)
ctx.translate(177.777, 0)
ctx.scale(0.75, 1)
drawSpirograph(ctx, 22, 6, 5)
ctx.restore()
function drawSpirograph (ctx, R, r, O) {
var x1 = R - O
var y1 = 0
var i = 1
ctx.beginPath()
ctx.moveTo(x1, y1)
do {
if (i > 20000) break
var x2 = (R + r) * Math.cos(i * Math.PI / 72) - (r + O) * Math.cos(((R + r) / r) * (i * Math.PI / 72))
var y2 = (R + r) * Math.sin(i * Math.PI / 72) - (r + O) * Math.sin(((R + r) / r) * (i * Math.PI / 72))
ctx.lineTo(x2, y2)
x1 = x2
y1 = y2
i++
} while (x2 !== R - O && y2 !== 0)
ctx.stroke()
}
}
tests['rect()'] = function (ctx) {
ctx.rect(5, 5, 50, 50)
ctx.strokeStyle = 'yellow'
ctx.fill()
ctx.stroke()
}
tests['clip()'] = function (ctx) {
ctx.arc(50, 50, 50, 0, Math.PI * 2, false)
ctx.stroke()
ctx.clip()
ctx.fillStyle = 'rgba(0,0,0,.5)'
ctx.fillRect(0, 0, 100, 100)
}
tests['clip() 2'] = function (ctx) {
ctx.fillRect(0, 0, 150, 150)
ctx.translate(75, 75)
// Create a circular clipping path
ctx.beginPath()
ctx.arc(0, 0, 60, 0, Math.PI * 2, true)
ctx.clip()
// draw background
var lingrad = ctx.createLinearGradient(0, -75, 0, 75)
lingrad.addColorStop(0, '#232256')
lingrad.addColorStop(1, '#143778')
ctx.fillStyle = lingrad
ctx.fillRect(-75, -75, 150, 150)
// draw stars
for (var j = 1; j < 50; j++) {
ctx.save()
ctx.fillStyle = '#fff'
ctx.translate(75 - Math.floor(Math.random() * 150),
75 - Math.floor(Math.random() * 150))
drawStar(ctx, Math.floor(Math.random() * 4) + 2)
ctx.restore()
}
function drawStar (ctx, r) {
ctx.save()
ctx.beginPath()
ctx.moveTo(r, 0)
for (var i = 0; i < 9; i++) {
ctx.rotate(Math.PI / 5)
if ((i % 2) === 0) {
ctx.lineTo((r / 0.525731) * 0.200811, 0)
} else {
ctx.lineTo(r, 0)
}
}
ctx.closePath()
ctx.fill()
ctx.restore()
}
}
tests['createLinearGradient()'] = function (ctx) {
var lingrad = ctx.createLinearGradient(0, 0, 0, 150)
lingrad.addColorStop(0, '#00ABEB')
lingrad.addColorStop(0.5, '#fff')
lingrad.addColorStop(0.5, '#26C000')
lingrad.addColorStop(1, '#fff')
var lingrad2 = ctx.createLinearGradient(0, 50, 0, 95)
lingrad2.addColorStop(0.5, '#000')
lingrad2.addColorStop(1, 'rgba(0,0,0,0)')
ctx.fillStyle = lingrad
ctx.strokeStyle = lingrad2
ctx.fillRect(10, 10, 130, 130)
ctx.strokeRect(50, 50, 50, 50)
}
tests['createRadialGradient()'] = function (ctx) {
// Create gradients
var radgrad = ctx.createRadialGradient(45, 45, 10, 52, 50, 30)
radgrad.addColorStop(0, '#A7D30C')
radgrad.addColorStop(0.9, '#019F62')
radgrad.addColorStop(1, 'rgba(1,159,98,0)')
var radgrad2 = ctx.createRadialGradient(105, 105, 20, 112, 120, 50)
radgrad2.addColorStop(0, '#FF5F98')
radgrad2.addColorStop(0.75, '#FF0188')
radgrad2.addColorStop(1, 'rgba(255,1,136,0)')
var radgrad3 = ctx.createRadialGradient(95, 15, 15, 102, 20, 40)
radgrad3.addColorStop(0, '#00C9FF')
radgrad3.addColorStop(0.8, '#00B5E2')
radgrad3.addColorStop(1, 'rgba(0,201,255,0)')
var radgrad4 = ctx.createRadialGradient(0, 150, 50, 0, 140, 90)
radgrad4.addColorStop(0, '#F4F201')
radgrad4.addColorStop(0.8, '#E4C700')
radgrad4.addColorStop(1, 'rgba(228,199,0,0)')
// draw shapes
ctx.fillStyle = radgrad4
ctx.fillRect(0, 0, 150, 150)
ctx.fillStyle = radgrad3
ctx.fillRect(0, 0, 150, 150)
ctx.fillStyle = radgrad2
ctx.fillRect(0, 0, 150, 150)
ctx.fillStyle = radgrad
ctx.fillRect(0, 0, 150, 150)
}
tests['globalAlpha'] = function (ctx) {
ctx.globalAlpha = 0.5
ctx.fillStyle = 'rgba(0,0,0,0.5)'
ctx.strokeRect(0, 0, 50, 50)
ctx.globalAlpha = 0.8
ctx.fillRect(20, 20, 20, 20)
ctx.fillStyle = 'black'
ctx.globalAlpha = 1
ctx.fillRect(25, 25, 10, 10)
}
tests['globalAlpha 2'] = function (ctx) {
ctx.fillStyle = '#FD0'
ctx.fillRect(0, 0, 75, 75)
ctx.fillStyle = '#6C0'
ctx.fillRect(75, 0, 75, 75)
ctx.fillStyle = '#09F'
ctx.fillRect(0, 75, 75, 75)
ctx.fillStyle = '#F30'
ctx.fillRect(75, 75, 150, 150)
ctx.fillStyle = '#FFF'
ctx.globalAlpha = 0.2
for (var i = 0; i < 7; i++) {
ctx.beginPath()
ctx.arc(75, 75, 10 + 10 * i, 0, Math.PI * 2, true)
ctx.fill()
}
}
tests['fillStyle'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'rgb(' + Math.floor(255 - 42.5 * i) + ',' + Math.floor(255 - 42.5 * j) + ',0)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
}
tests['strokeStyle'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.strokeStyle = 'rgb(0,' + Math.floor(255 - 42.5 * i) + ',' +
Math.floor(255 - 42.5 * j) + ')'
ctx.beginPath()
ctx.arc(12.5 + j * 25, 12.5 + i * 25, 10, 0, Math.PI * 2, true)
ctx.stroke()
}
}
}
tests['fill with stroke'] = function (ctx) {
ctx.beginPath()
ctx.arc(75, 75, 50, 0, Math.PI * 2, true)
ctx.fill()
ctx.closePath()
ctx.beginPath()
ctx.fillStyle = 'red'
ctx.strokeStyle = 'yellow'
ctx.arc(75, 75, 30, 0, Math.PI * 2, true)
ctx.fill()
ctx.stroke()
}
tests['floating point coordinates'] = function (ctx) {
ctx.lineCap = 'square'
for (var i = 0; i < 70; i += 3.05) {
ctx.rect(i + 3, 10.5, 0, 130)
ctx.moveTo(i + 77, 10.5)
ctx.lineTo(i + 77, 140.5)
}
ctx.stroke()
}
tests['lineWidth'] = function (ctx) {
for (var i = 0; i < 10; i++) {
ctx.lineWidth = 1 + i
ctx.beginPath()
ctx.moveTo(5 + i * 14, 5)
ctx.lineTo(5 + i * 14, 140)
ctx.stroke()
}
}
tests['line caps'] = function (ctx) {
var lineCap = ['butt', 'round', 'square']
ctx.strokeStyle = '#09f'
ctx.beginPath()
ctx.moveTo(10, 10)
ctx.lineTo(140, 10)
ctx.moveTo(10, 140)
ctx.lineTo(140, 140)
ctx.stroke()
ctx.strokeStyle = 'black'
for (var i = 0; i < lineCap.length; i++) {
ctx.lineWidth = 15
ctx.lineCap = lineCap[i]
ctx.beginPath()
ctx.moveTo(25 + i * 50, 10)
ctx.lineTo(25 + i * 50, 140)
ctx.stroke()
}
}
tests['line join'] = function (ctx) {
var lineJoin = ['round', 'bevel', 'miter']
ctx.lineWidth = 10
for (var i = 0; i < lineJoin.length; i++) {
ctx.lineJoin = lineJoin[i]
ctx.beginPath()
ctx.moveTo(-5, 5 + i * 40)
ctx.lineTo(35, 45 + i * 40)
ctx.lineTo(75, 5 + i * 40)
ctx.lineTo(115, 45 + i * 40)
ctx.lineTo(155, 5 + i * 40)
ctx.stroke()
}
}
tests['lineCap default'] = function (ctx) {
ctx.beginPath()
ctx.lineWidth = 10.0
ctx.moveTo(50, 50)
ctx.lineTo(50, 100)
ctx.lineTo(80, 120)
ctx.stroke()
}
tests['lineCap'] = function (ctx) {
ctx.beginPath()
ctx.lineWidth = 10.0
ctx.lineCap = 'round'
ctx.moveTo(50, 50)
ctx.lineTo(50, 100)
ctx.lineTo(80, 120)
ctx.stroke()
}
tests['lineJoin'] = function (ctx) {
ctx.beginPath()
ctx.lineWidth = 10.0
ctx.lineJoin = 'round'
ctx.moveTo(50, 50)
ctx.lineTo(50, 100)
ctx.lineTo(80, 120)
ctx.stroke()
}
tests['states'] = function (ctx) {
ctx.save()
ctx.rect(50, 50, 100, 100)
ctx.stroke()
ctx.restore()
ctx.save()
ctx.translate(50, 50)
ctx.scale(0.5, 0.5)
ctx.strokeRect(51, 51, 100, 100)
ctx.restore()
ctx.translate(95, 95)
ctx.fillRect(0, 0, 10, 10)
}
tests['states with stroke/fill/globalAlpha'] = function (ctx) {
ctx.fillRect(0, 0, 150, 150)
ctx.save()
ctx.fillStyle = '#09F'
ctx.fillRect(15, 15, 120, 120)
ctx.save()
ctx.fillStyle = '#FFF'
ctx.globalAlpha = 0.5
ctx.fillRect(30, 30, 90, 90)
ctx.restore()
ctx.fillRect(45, 45, 60, 60)
ctx.restore()
ctx.fillRect(60, 60, 30, 30)
}
tests['path through fillRect/strokeRect/clearRect'] = function (ctx) {
// left: fillRect()
ctx.beginPath()
ctx.rect(0, 50, 50, 50)
ctx.fillStyle = '#F00'
ctx.fillRect(10, 60, 30, 30)
ctx.fillStyle = '#0F0'
ctx.fill()
// center: strokeRect()
ctx.beginPath()
ctx.rect(50, 50, 50, 50)
ctx.strokeStyle = '#F00'
ctx.lineWidth = 5
ctx.strokeRect(60, 60, 30, 30)
ctx.fillStyle = '#0F0'
ctx.fill()
// right: clearRect()
ctx.beginPath()
ctx.rect(100, 50, 50, 50)
ctx.fillStyle = '#0F0'
ctx.fill()
ctx.clearRect(110, 60, 30, 30)
ctx.fill()
}
tests['invalid stroke/fill styles'] = function (ctx) {
ctx.fillStyle = 'red'
ctx.strokeStyle = 'yellow'
ctx.rect(50, 50, 50, 50)
ctx.fill()
ctx.stroke()
ctx.beginPath()
ctx.fillStyle = 'asdf'
ctx.strokeStyle = 'asdf'
ctx.rect(100, 80, 15, 15)
ctx.fill()
ctx.stroke()
}
tests['fillText()'] = function (ctx) {
ctx.font = '30px Arial'
ctx.rotate(0.1)
ctx.lineTo(10, 10)
ctx.fillText('Awesome!', 50, 100)
var te = ctx.measureText('Awesome!')
ctx.strokeStyle = 'rgba(0,0,0,0.5)'
ctx.lineTo(50, 102)
ctx.lineTo(50 + te.width, 102)
ctx.stroke()
}
tests['fillText() transformations'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.font = 'bold 12px Helvetica'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.beginPath()
ctx.lineTo(100, 0)
ctx.lineTo(100, 200)
ctx.stroke()
ctx.rotate(0.2)
ctx.fillText('foo', 150, 100)
ctx.font = 'normal 30px Arial'
ctx.fillText('bar', 50, 100)
}
tests['strokeText()'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.beginPath()
ctx.lineTo(100, 0)
ctx.lineTo(100, 200)
ctx.stroke()
ctx.strokeStyle = 'red'
ctx.font = 'normal 50px Arial'
ctx.strokeText('bar', 100, 100)
}
tests['textAlign right'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.beginPath()
ctx.lineTo(100, 0)
ctx.lineTo(100, 200)
ctx.stroke()
ctx.font = 'normal 20px Arial'
ctx.textAlign = 'right'
ctx.fillText('right', 100, 100)
}
tests['textAlign left'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.beginPath()
ctx.lineTo(100, 0)
ctx.lineTo(100, 200)
ctx.stroke()
ctx.font = 'normal 20px Arial'
ctx.textAlign = 'left'
ctx.fillText('left', 100, 100)
}
tests['textAlign center'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.beginPath()
ctx.lineTo(100, 0)
ctx.lineTo(100, 200)
ctx.stroke()
ctx.font = 'normal 20px Arial'
ctx.textAlign = 'center'
ctx.fillText('center', 100, 100)
}
tests['textBaseline alphabetic'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'normal 20px Arial'
ctx.textBaseline = 'alphabetic'
ctx.textAlign = 'center'
ctx.fillText('alphabetic', 100, 100)
}
tests['textBaseline top'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'normal 20px Arial'
ctx.textBaseline = 'top'
ctx.textAlign = 'center'
ctx.fillText('top', 100, 100)
}
tests['textBaseline hanging'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'normal 20px Arial'
ctx.textBaseline = 'hanging'
ctx.textAlign = 'center'
ctx.fillText('hanging', 100, 100)
}
tests['textBaseline middle'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'normal 20px Arial'
ctx.textBaseline = 'middle'
ctx.textAlign = 'center'
ctx.fillText('middle', 100, 100)
}
tests['textBaseline ideographic'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'normal 20px Arial'
ctx.textBaseline = 'ideographic'
ctx.textAlign = 'center'
ctx.fillText('ideographic', 100, 100)
}
tests['textBaseline bottom'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'normal 20px Arial'
ctx.textBaseline = 'bottom'
ctx.textAlign = 'center'
ctx.fillText('bottom', 100, 100)
}
tests['font size px'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'normal 14px Arial'
ctx.textAlign = 'center'
ctx.fillText('normal 14px Arial', 100, 100)
}
tests['font size pt'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'normal 14pt Arial'
ctx.textAlign = 'center'
ctx.fillText('normal 14pt Arial', 100, 100)
}
tests['font size mm'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'normal 3mm Arial'
ctx.textAlign = 'center'
ctx.fillText('normal 3mm Arial', 100, 100)
}
tests['font size cm'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'normal 0.6cm Arial'
ctx.textAlign = 'center'
ctx.fillText('normal 0.6cm Arial', 100, 100)
}
tests['font weight bold'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'bold 14px Arial'
ctx.textAlign = 'center'
ctx.fillText('bold 14px Arial', 100, 100)
}
tests['font weight lighter'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'lighter 14px Arial'
ctx.textAlign = 'center'
ctx.fillText('lighter 14px Arial', 100, 100)
}
tests['font weight lighter italic'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = 'lighter italic 14px Arial'
ctx.textAlign = 'center'
ctx.fillText('lighter italic 14px Arial', 100, 100)
}
tests['font weight 200'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = '200 14px Arial'
ctx.textAlign = 'center'
ctx.fillText('200 14px Arial', 100, 100)
}
tests['font weight 800'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = '800 14px Arial'
ctx.textAlign = 'center'
ctx.fillText('800 14px Arial', 100, 100)
}
tests['font family serif'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = '14px serif'
ctx.textAlign = 'center'
ctx.fillText('14px serif', 100, 100)
}
tests['font family sans-serif'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = '14px sans-serif'
ctx.textAlign = 'center'
ctx.fillText('14px sans-serif', 100, 100)
}
tests['font family Impact'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = '18px Impact'
ctx.textAlign = 'center'
ctx.fillText('18px Impact', 100, 100)
}
tests['font family invalid'] = function (ctx) {
ctx.strokeStyle = '#666'
ctx.strokeRect(0, 0, 200, 200)
ctx.lineTo(0, 100)
ctx.lineTo(200, 100)
ctx.stroke()
ctx.font = '14px Foo, Invalid, Impact, sans-serif'
ctx.textAlign = 'center'
ctx.fillText('14px Invalid, Impact', 100, 100)
}
tests['globalCompositeOperation source-over'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'source-over'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation source-in'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'source-in'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation source-out'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'source-out'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation destination-in'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'destination-in'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation source-atop'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'source-atop'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation destination-out'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'destination-out'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation destination-atop'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'destination-atop'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation xor'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'xor'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation copy'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'copy'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation lighter'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'lighter'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation darker'] = function (ctx) {
ctx.fillStyle = 'blue'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'darker'
ctx.fillStyle = 'red'
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation multiply'] = function (ctx) {
ctx.fillStyle = 'rgba(0,0,255,0.6)'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'multiply'
var grad = ctx.createRadialGradient(80, 80, 5, 60, 60, 60)
grad.addColorStop(0, 'yellow')
grad.addColorStop(0.2, 'red')
grad.addColorStop(1, 'black')
ctx.fillStyle = grad
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation screen'] = function (ctx) {
ctx.fillStyle = 'rgba(0,0,255,0.6)'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'screen'
var grad = ctx.createRadialGradient(80, 80, 5, 60, 60, 60)
grad.addColorStop(0, 'yellow')
grad.addColorStop(0.2, 'red')
grad.addColorStop(1, 'black')
ctx.fillStyle = grad
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation overlay'] = function (ctx) {
ctx.fillStyle = 'rgba(0,0,255,0.6)'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'overlay'
var grad = ctx.createRadialGradient(80, 80, 5, 60, 60, 60)
grad.addColorStop(0, 'yellow')
grad.addColorStop(0.2, 'red')
grad.addColorStop(1, 'black')
ctx.fillStyle = grad
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation hard-light'] = function (ctx) {
ctx.fillStyle = 'rgba(0,0,255,0.6)'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'hard-light'
var grad = ctx.createRadialGradient(80, 80, 5, 60, 60, 60)
grad.addColorStop(0, 'yellow')
grad.addColorStop(0.2, 'red')
grad.addColorStop(1, 'black')
ctx.fillStyle = grad
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation hsl-hue'] = function (ctx) {
ctx.fillStyle = 'rgba(0,0,255,0.6)'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'hsl-hue'
var grad = ctx.createRadialGradient(80, 80, 5, 60, 60, 60)
grad.addColorStop(0, 'yellow')
grad.addColorStop(0.2, 'red')
grad.addColorStop(1, 'black')
ctx.fillStyle = grad
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation hsl-saturation'] = function (ctx) {
ctx.fillStyle = 'rgba(0,0,255,0.6)'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'hsl-saturation'
var grad = ctx.createRadialGradient(80, 80, 5, 60, 60, 60)
grad.addColorStop(0, 'yellow')
grad.addColorStop(0.2, 'red')
grad.addColorStop(1, 'black')
ctx.fillStyle = grad
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation hsl-color'] = function (ctx) {
ctx.fillStyle = 'rgba(0,0,255,0.6)'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'hsl-color'
var grad = ctx.createRadialGradient(80, 80, 5, 60, 60, 60)
grad.addColorStop(0, 'yellow')
grad.addColorStop(0.2, 'red')
grad.addColorStop(1, 'black')
ctx.fillStyle = grad
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['globalCompositeOperation hsl-luminosity'] = function (ctx) {
ctx.fillStyle = 'rgba(0,0,255,0.6)'
ctx.fillRect(0, 0, 100, 100)
ctx.globalCompositeOperation = 'hsl-luminosity'
var grad = ctx.createRadialGradient(80, 80, 5, 60, 60, 60)
grad.addColorStop(0, 'yellow')
grad.addColorStop(0.2, 'red')
grad.addColorStop(1, 'black')
ctx.fillStyle = grad
ctx.arc(80, 80, 50, 0, Math.PI * 2, false)
ctx.fill()
}
tests['shadowBlur'] = function (ctx) {
ctx.fillRect(150, 10, 20, 20)
ctx.lineTo(20, 5)
ctx.lineTo(100, 5)
ctx.stroke()
ctx.shadowColor = '#000'
ctx.shadowBlur = 5
ctx.fillRect(20, 20, 100, 100)
ctx.beginPath()
ctx.lineTo(20, 150)
ctx.lineTo(100, 150)
ctx.stroke()
ctx.shadowBlur = 0
ctx.beginPath()
ctx.lineTo(20, 180)
ctx.lineTo(100, 180)
ctx.stroke()
ctx.fillRect(150, 150, 20, 20)
}
tests['shadowColor'] = function (ctx) {
ctx.fillRect(150, 10, 20, 20)
ctx.lineTo(20, 5)
ctx.lineTo(100, 5)
ctx.stroke()
ctx.shadowColor = '#c00'
ctx.shadowBlur = 5
ctx.fillRect(20, 20, 100, 100)
ctx.beginPath()
ctx.lineTo(20, 150)
ctx.lineTo(100, 150)
ctx.stroke()
ctx.shadowBlur = 0
ctx.beginPath()
ctx.lineTo(20, 180)
ctx.lineTo(100, 180)
ctx.stroke()
ctx.fillRect(150, 150, 20, 20)
}
tests['shadowOffset{X,Y}'] = function (ctx) {
ctx.fillRect(150, 10, 20, 20)
ctx.lineTo(20, 5)
ctx.lineTo(100, 5)
ctx.stroke()
ctx.shadowColor = '#c00'
ctx.shadowBlur = 5
ctx.shadowOffsetX = 2
ctx.shadowOffsetY = 2
ctx.fillRect(20, 20, 100, 100)
ctx.beginPath()
ctx.lineTo(20, 150)
ctx.lineTo(100, 150)
ctx.stroke()
ctx.shadowBlur = 0
ctx.beginPath()
ctx.lineTo(20, 180)
ctx.lineTo(100, 180)
ctx.stroke()
ctx.fillRect(150, 150, 20, 20)
}
tests['shadowOffset{X,Y} large'] = function (ctx) {
ctx.fillRect(150, 10, 20, 20)
ctx.lineTo(20, 5)
ctx.lineTo(100, 5)
ctx.stroke()
ctx.shadowColor = '#c00'
ctx.shadowBlur = 5
ctx.shadowOffsetX = 10
ctx.shadowOffsetY = 10
ctx.fillRect(20, 20, 100, 100)
ctx.beginPath()
ctx.lineTo(20, 150)
ctx.lineTo(100, 150)
ctx.stroke()
ctx.shadowBlur = 0
ctx.beginPath()
ctx.lineTo(20, 180)
ctx.lineTo(100, 180)
ctx.stroke()
ctx.fillRect(150, 150, 20, 20)
}
tests['shadowOffset{X,Y} negative'] = function (ctx) {
ctx.fillRect(150, 10, 20, 20)
ctx.lineTo(20, 5)
ctx.lineTo(100, 5)
ctx.stroke()
ctx.shadowColor = '#c00'
ctx.shadowBlur = 5
ctx.shadowOffsetX = -10
ctx.shadowOffsetY = -10
ctx.fillRect(20, 20, 100, 100)
ctx.beginPath()
ctx.lineTo(20, 150)
ctx.lineTo(100, 150)
ctx.stroke()
ctx.shadowBlur = 0
ctx.beginPath()
ctx.lineTo(20, 180)
ctx.lineTo(100, 180)
ctx.stroke()
ctx.fillRect(150, 150, 20, 20)
}
tests['shadowOffset{X,Y} transform'] = function (ctx) {
ctx.translate(100, 0)
ctx.scale(0.75, 0.75)
ctx.rotate(Math.PI / 4)
ctx.fillRect(150, 10, 20, 20)
ctx.lineTo(20, 5)
ctx.lineTo(100, 5)
ctx.stroke()
ctx.shadowColor = '#c00'
ctx.shadowBlur = 5
ctx.shadowOffsetX = 10
ctx.shadowOffsetY = 10
ctx.fillRect(20, 20, 100, 100)
ctx.beginPath()
ctx.lineTo(20, 150)
ctx.lineTo(100, 150)
ctx.stroke()
ctx.shadowBlur = 0
ctx.beginPath()
ctx.lineTo(20, 180)
ctx.lineTo(100, 180)
ctx.stroke()
ctx.fillRect(150, 150, 20, 20)
}
tests['shadowBlur values'] = function (ctx) {
ctx.fillRect(150, 10, 20, 20)
ctx.lineTo(20, 5)
ctx.lineTo(100, 5)
ctx.stroke()
ctx.shadowColor = '#c00'
ctx.shadowBlur = 25
ctx.shadowOffsetX = 2
ctx.shadowOffsetY = 2
ctx.fillRect(20, 20, 100, 100)
ctx.beginPath()
ctx.lineTo(20, 150)
ctx.lineTo(100, 150)
ctx.stroke()
ctx.shadowColor = 'rgba(0,0,0,0)'
ctx.beginPath()
ctx.lineTo(20, 180)
ctx.lineTo(100, 180)
ctx.stroke()
ctx.fillRect(150, 150, 20, 20)
}
tests['shadow strokeRect()'] = function (ctx) {
ctx.strokeRect(150, 10, 20, 20)
ctx.lineTo(20, 5)
ctx.lineTo(100, 5)
ctx.stroke()
ctx.shadowColor = '#000'
ctx.shadowBlur = 5
ctx.shadowOffsetX = 2
ctx.shadowOffsetY = 2
ctx.strokeRect(20, 20, 100, 100)
ctx.beginPath()
ctx.lineTo(20, 150)
ctx.lineTo(100, 150)
ctx.stroke()
ctx.shadowColor = 'rgba(0,0,0,0)'
ctx.beginPath()
ctx.lineTo(20, 180)
ctx.lineTo(100, 180)
ctx.stroke()
ctx.strokeRect(150, 150, 20, 20)
}
tests['shadow fill()'] = function (ctx) {
ctx.strokeRect(150, 10, 20, 20)
ctx.lineTo(20, 5)
ctx.lineTo(100, 5)
ctx.stroke()
ctx.shadowColor = '#000'
ctx.shadowBlur = 5
ctx.shadowOffsetX = 2
ctx.shadowOffsetY = 2
ctx.rect(20, 20, 100, 100)
ctx.fill()
ctx.beginPath()
ctx.lineTo(20, 150)
ctx.lineTo(100, 150)
ctx.stroke()
ctx.shadowColor = 'rgba(0,0,0,0)'
ctx.beginPath()
ctx.lineTo(20, 180)
ctx.lineTo(100, 180)
ctx.stroke()
ctx.strokeRect(150, 150, 20, 20)
}
tests['shadow stroke()'] = function (ctx) {
ctx.strokeRect(150, 10, 20, 20)
ctx.lineTo(20, 5)
ctx.lineTo(100, 5)
ctx.stroke()
ctx.shadowColor = '#000'
ctx.shadowBlur = 5
ctx.shadowOffsetX = 2
ctx.shadowOffsetY = 2
ctx.rect(20, 20, 100, 100)
ctx.stroke()
ctx.beginPath()
ctx.lineTo(20, 150)
ctx.lineTo(100, 150)
ctx.stroke()
ctx.shadowColor = 'rgba(0,0,0,0)'
ctx.beginPath()
ctx.lineTo(20, 180)
ctx.lineTo(100, 180)
ctx.stroke()
ctx.strokeRect(150, 150, 20, 20)
}
tests['shadow globalAlpha'] = function (ctx) {
ctx.lineTo(0, 0)
ctx.lineTo(50, 0)
ctx.lineTo(50, 150)
ctx.stroke()
ctx.lineWidth = 5
ctx.globalAlpha = 0.3
ctx.shadowColor = '#00c'
ctx.shadowBlur = 2
ctx.shadowOffsetX = 8
ctx.shadowOffsetY = 8
ctx.lineTo(0, 150)
ctx.stroke()
}
tests['shadow fillText()'] = function (ctx) {
ctx.shadowColor = '#00c'
ctx.shadowBlur = 2
ctx.shadowOffsetX = 8
ctx.shadowOffsetY = 8
ctx.textAlign = 'center'
ctx.font = '35px Arial'
ctx.fillText('Shadow', 100, 100)
}
tests['shadow strokeText()'] = function (ctx) {
ctx.shadowColor = '#00c'
ctx.shadowBlur = 2
ctx.shadowOffsetX = 8
ctx.shadowOffsetY = 8
ctx.textAlign = 'center'
ctx.font = '35px Arial'
ctx.strokeText('Shadow', 100, 100)
}
tests['shadow transform text'] = function (ctx) {
ctx.shadowColor = '#c0c'
ctx.shadowBlur = 4
ctx.shadowOffsetX = 6
ctx.shadowOffsetY = 10
ctx.textAlign = 'center'
ctx.font = '35px Arial'
ctx.scale(2, 2)
ctx.strokeText('Sha', 33, 40)
ctx.rotate(Math.PI / 2)
ctx.fillText('dow', 50, -72)
}
tests['shadow image'] = function (ctx, done) {
var img = new Image()
img.onload = function () {
ctx.shadowColor = '#f3ac22'
ctx.shadowBlur = 2
ctx.shadowOffsetX = 8
ctx.shadowOffsetY = 8
ctx.drawImage(img, 0, 0)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('star.png')
}
tests['scaled shadow image'] = function (ctx, done) {
var img = new Image()
img.onload = function () {
ctx.shadowColor = '#f3ac22'
ctx.shadowBlur = 2
ctx.shadowOffsetX = 8
ctx.shadowOffsetY = 8
ctx.drawImage(img, 10, 10, 80, 80)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('star.png')
}
tests['shadow integration'] = function (ctx) {
ctx.shadowBlur = 5
ctx.shadowOffsetX = 10
ctx.shadowOffsetY = 10
ctx.shadowColor = '#eee'
ctx.lineWidth = 3
var grad1 = ctx.createLinearGradient(105, 0, 200, 100)
grad1.addColorStop(0, 'yellow')
grad1.addColorStop(0.25, 'red')
grad1.addColorStop(0.75, 'blue')
grad1.addColorStop(1, 'limegreen')
var grad2 = ctx.createRadialGradient(50, 50, 10, 50, 50, 50)
grad2.addColorStop(0, 'yellow')
grad2.addColorStop(0.25, 'red')
grad2.addColorStop(0.75, 'blue')
grad2.addColorStop(1, 'limegreen')
// linear grad box
ctx.fillStyle = grad1
ctx.fillRect(105, 0, 100, 100)
// skyblue box
ctx.fillStyle = 'skyblue'
ctx.fillRect(105, 101, 100, 100)
// radial grad oval
ctx.beginPath()
ctx.arc(50, 50, 50, 0, Math.PI * 2, false)
ctx.fillStyle = grad2
ctx.fill()
// gold oval
ctx.beginPath()
ctx.arc(50, 151, 50, 0, Math.PI * 2, false)
ctx.fillStyle = 'gold'
ctx.fill()
}
tests['font state'] = function (ctx) {
ctx.save()
ctx.font = '20px Impact'
ctx.fillText('Bam!', 50, 80)
ctx.save()
ctx.font = '10px Arial'
ctx.fillText('Boom!', 50, 100)
ctx.restore()
ctx.fillText('Bam again!', 50, 120)
ctx.restore()
ctx.fillText('Boom again!', 50, 140)
}
tests['drawImage(img,0,0)'] = function (ctx, done) {
var img = new Image()
img.onload = function () {
ctx.drawImage(img, 0, 0)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['drawImage(img) jpeg'] = function (ctx, done) {
var img = new Image()
img.onload = function () {
ctx.drawImage(img, 0, 0, 100, 100)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('face.jpeg')
}
tests['drawImage(img,x,y)'] = function (ctx, done) {
var img = new Image()
img.onload = function () {
ctx.drawImage(img, 5, 25)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['drawImage(img,x,y,w,h) scale down'] = function (ctx, done) {
var img = new Image()
img.onload = function () {
ctx.drawImage(img, 25, 25, 10, 10)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['drawImage(img,x,y,w,h) scale up'] = function (ctx, done) {
var img = new Image()
img.onload = function () {
ctx.drawImage(img, 0, 0, 200, 200)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['drawImage(img,x,y,w,h) scale vertical'] = function (ctx, done) {
var img = new Image()
img.onload = function () {
ctx.drawImage(img, 0, 0, img.width, 200)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['drawImage(img,sx,sy,sw,sh,x,y,w,h)'] = function (ctx, done) {
var img = new Image()
img.onload = function () {
ctx.drawImage(img, 13, 13, 45, 45, 25, 25, img.width / 2, img.height / 2)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['drawImage(img,0,0) globalAlpha'] = function (ctx, done) {
var img = new Image()
ctx.fillRect(50, 50, 30, 30)
ctx.globalAlpha = 0.5
img.onload = function () {
ctx.drawImage(img, 0, 0)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['drawImage(img,0,0) clip'] = function (ctx, done) {
ctx.arc(50, 50, 50, 0, Math.PI * 2, false)
ctx.stroke()
ctx.clip()
var img = new Image()
ctx.fillRect(50, 50, 30, 30)
ctx.globalAlpha = 0.5
img.onload = function () {
ctx.drawImage(img, 0, 0)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['putImageData()'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'rgb(' + Math.floor(255 - 42.5 * i) + ',' + Math.floor(255 - 42.5 * j) + ',0)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
var data = ctx.getImageData(0, 0, 50, 50)
ctx.putImageData(data, 10, 10)
}
tests['putImageData() 2'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'rgb(' + Math.floor(255 - 42.5 * i) + ',' + Math.floor(255 - 42.5 * j) + ',0)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
var data = ctx.getImageData(25, 25, 50, 50)
ctx.putImageData(data, 10, 10)
}
tests['putImageData() 3'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'rgb(' + Math.floor(255 - 42.5 * i) + ',' + Math.floor(255 - 42.5 * j) + ',0)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
var data = ctx.getImageData(10, 25, 10, 50)
ctx.putImageData(data, 50, 10)
}
tests['putImageData() 4'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'rgb(' + Math.floor(255 - 42.5 * i) + ',' +
Math.floor(255 - 42.5 * j) + ',0)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
ctx.strokeRect(30, 30, 30, 30)
var data = ctx.getImageData(0, 0, 50, 50)
ctx.putImageData(data, 30, 30, 10, 10, 30, 30)
}
tests['putImageData() 5'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'rgb(' + Math.floor(255 - 42.5 * i) + ',' + Math.floor(255 - 42.5 * j) + ',0)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
ctx.strokeRect(60, 60, 50, 30)
var data = ctx.getImageData(0, 0, 50, 50)
ctx.putImageData(data, 60, 60, 0, 0, 50, 30)
}
tests['putImageData() 6'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'rgb(' + Math.floor(255 - 42.5 * i) + ',' + Math.floor(255 - 42.5 * j) + ',0)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
ctx.strokeRect(60, 60, 50, 30)
var data = ctx.getImageData(0, 0, 50, 50)
ctx.putImageData(data, 60, 60, 10, 0, 35, 30)
}
tests['putImageData() 7'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'rgb(' + Math.floor(255 - 42.5 * i) + ',' + Math.floor(255 - 42.5 * j) + ',0)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
ctx.strokeRect(60, 60, 50, 30)
ctx.translate(20, 20)
var data = ctx.getImageData(0, 0, 50, 50)
ctx.putImageData(data, 60, 60, 10, 20, 35, -10)
}
tests['putImageData() 8'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'rgb(' + Math.floor(255 - 42.5 * i) + ',' + Math.floor(255 - 42.5 * j) + ',0)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
ctx.translate(20, 20)
var data = ctx.getImageData(0, 0, 50, 50)
ctx.putImageData(data, -10, -10, 0, 20, 35, 30)
}
tests['putImageData() 9'] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'rgb(' + Math.floor(255 - 42.5 * i) + ',' + Math.floor(255 - 42.5 * j) + ',0)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
ctx.translate(20, 20)
var data = ctx.getImageData(0, 0, 50, 50)
ctx.putImageData(data, -10, -10, 0, 20, 500, 500)
}
tests['putImageData() 10'] = function (ctx) {
ctx.fillStyle = 'rgba(255,0,0,1)'
ctx.fillRect(0, 0, 50, 100)
ctx.fillStyle = 'rgba(0,255,0,1)'
ctx.fillRect(50, 0, 50, 100)
ctx.fillStyle = 'rgba(0,0,255,1)'
ctx.fillRect(100, 0, 50, 100)
var data = ctx.getImageData(0, 0, 120, 20)
ctx.putImageData(data, 20, 120)
}
tests['putImageData() alpha'] = function (ctx) {
ctx.fillStyle = 'rgba(255,0,0,0.5)'
ctx.fillRect(0, 0, 50, 100)
ctx.fillStyle = 'rgba(0,255,0,0.5)'
ctx.fillRect(50, 0, 50, 100)
ctx.fillStyle = 'rgba(0,0,255,0.5)'
ctx.fillRect(100, 0, 50, 100)
var data = ctx.getImageData(0, 0, 120, 20)
ctx.putImageData(data, 20, 120)
}
tests['putImageData() alpha 2'] = function (ctx) {
ctx.fillStyle = 'rgba(255,0,0,0.2)'
ctx.fillRect(0, 0, 50, 100)
ctx.fillStyle = 'rgba(0,255,0,0.5)'
ctx.fillRect(50, 0, 50, 100)
ctx.fillStyle = 'rgba(0,0,255,0.75)'
ctx.fillRect(100, 0, 50, 100)
var data = ctx.getImageData(0, 0, 120, 20)
ctx.putImageData(data, 20, 120)
}
tests['putImageData() globalAlpha'] = function (ctx) {
ctx.globalAlpha = 0.5
ctx.fillStyle = '#f00'
ctx.fillRect(0, 0, 50, 100)
ctx.fillStyle = '#0f0'
ctx.fillRect(50, 0, 50, 100)
ctx.fillStyle = '#00f'
ctx.fillRect(100, 0, 50, 100)
var data = ctx.getImageData(0, 0, 120, 20)
ctx.putImageData(data, 20, 120)
}
tests['putImageData() png data'] = function (ctx, done) {
var img = new Image()
ctx.fillRect(50, 50, 30, 30)
img.onload = function () {
ctx.drawImage(img, 0, 0, 200, 200)
var imageData = ctx.getImageData(0, 0, 50, 50)
var data = imageData.data
for (var i = 0, len = data.length; i < len; i += 4) {
data[i + 3] = 80
}
ctx.putImageData(imageData, 50, 50)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['putImageData() png data 2'] = function (ctx, done) {
var img = new Image()
ctx.fillRect(50, 50, 30, 30)
img.onload = function () {
ctx.drawImage(img, 0, 0, 200, 200)
var imageData = ctx.getImageData(0, 0, 50, 50)
var data = imageData.data
for (var i = 0, len = data.length; i < len; i += 4) {
data[i + 3] = 80
}
ctx.putImageData(imageData, 50, 50, 10, 10, 20, 20)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['putImageData() png data 3'] = function (ctx, done) {
var img = new Image()
ctx.fillRect(50, 50, 30, 30)
img.onload = function () {
ctx.drawImage(img, 0, 0, 200, 200)
var imageData = ctx.getImageData(0, 0, 50, 50)
var data = imageData.data
for (var i = 0, len = data.length; i < len; i += 4) {
data[i + 0] = data[i + 0] * 0.2
data[i + 1] = data[i + 1] * 0.2
data[i + 2] = data[i + 2] * 0.2
}
ctx.putImageData(imageData, 50, 50)
done(null)
}
img.onerror = function () {
done(new Error('Failed to load image'))
}
img.src = imageSrc('state.png')
}
tests['setLineDash'] = function (ctx) {
ctx.setLineDash([10, 5, 25, 15])
ctx.lineWidth = 17
var y = 5
var line = function (lineDash, color) {
ctx.setLineDash(lineDash)
if (color) ctx.strokeStyle = color
ctx.beginPath()
ctx.moveTo(0, y)
ctx.lineTo(200, y)
ctx.stroke()
y += ctx.lineWidth + 4
}
line([15, 30], 'blue')
line([], 'black')
line([5, 10, 15, 20, 25, 30, 35, 40, 45, 50], 'purple')
line([8], 'green')
line([3, 3, -30], 'red')
line([4, Infinity, 4])
line([10, 10, NaN])
line((function () {
ctx.setLineDash([8])
var a = ctx.getLineDash()
a[0] -= 3
a.push(20)
return a
})(), 'orange')
}
tests['lineDashOffset'] = function (ctx) {
ctx.setLineDash([10, 5, 25, 15])
ctx.lineWidth = 4
var y = 5
var line = function (lineDashOffset, color) {
ctx.lineDashOffset = lineDashOffset
if (color) ctx.strokeStyle = color
ctx.beginPath()
ctx.moveTo(0, y)
ctx.lineTo(200, y)
ctx.stroke()
y += ctx.lineWidth + 4
}
line(-10, 'black')
line(0)
line(10)
line(20)
line(30)
line(40, 'blue')
line(NaN)
line(50, 'green')
line(Infinity)
line(60, 'orange')
line(-Infinity)
line(70, 'purple')
line(void 0)
line(80, 'black')
line(ctx.lineDashOffset + 10)
for (var i = 0; i < 10; i++) {
line(90 + i / 5, 'red')
}
}
tests['fillStyle=\'hsl(...)\''] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'hsl(' + (360 - 60 * i) + ',' + (100 - 16.66 * j) + '%,' + (50 + (i + j) * (50 / 12)) + '%)'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
}
tests['fillStyle=\'hsla(...)\''] = function (ctx) {
for (var i = 0; i < 6; i++) {
for (var j = 0; j < 6; j++) {
ctx.fillStyle = 'hsla(' + (360 - 60 * i) + ',' + (100 - 16.66 * j) + '%,50%,' + (1 - 0.16 * j) + ')'
ctx.fillRect(j * 25, i * 25, 25, 25)
}
}
}