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.

2043 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()
14 years ago
}
ctx.restore()
14 years ago
}
}
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()
14 years ago
}
}
function drawSpirograph (ctx, R, r, O) {
var x1 = R - O
var y1 = 0
var i = 1
ctx.beginPath()
ctx.moveTo(x1, y1)
14 years ago
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()
14 years ago
}
}
14 years ago
tests['scale()'] = function (ctx) {
ctx.strokeStyle = '#fc0'
ctx.lineWidth = 1.5
ctx.fillRect(0, 0, 300, 300)
14 years ago
// Uniform scaling
ctx.save()
ctx.translate(50, 50)
drawSpirograph(ctx, 22, 6, 5) // no scaling
14 years ago
ctx.translate(100, 0)
ctx.scale(0.75, 0.75)
drawSpirograph(ctx, 22, 6, 5)
14 years ago
ctx.translate(133.333, 0)
ctx.scale(0.75, 0.75)
drawSpirograph(ctx, 22, 6, 5)
ctx.restore()
14 years ago
// Non-uniform scaling (y direction)
ctx.strokeStyle = '#0cf'
14 years ago
ctx.save()
ctx.translate(50, 150)
ctx.scale(1, 0.75)
drawSpirograph(ctx, 22, 6, 5)
14 years ago
ctx.translate(100, 0)
ctx.scale(1, 0.75)
drawSpirograph(ctx, 22, 6, 5)
14 years ago
ctx.translate(100, 0)
ctx.scale(1, 0.75)
drawSpirograph(ctx, 22, 6, 5)
ctx.restore()
14 years ago
// Non-uniform scaling (x direction)
ctx.strokeStyle = '#cf0'
14 years ago
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)
14 years ago
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()
14 years ago
}
}
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()
14 years ago
}
}
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)
14 years ago
}
}
}
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()
14 years ago
}
}
}
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()
14 years ago
}
}
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()
14 years ago
}
}
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()
14 years ago
}
}
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
14 years ago
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)
14 years ago
}
}
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)
14 years ago
}
}
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)
14 years ago
}
}
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)
14 years ago
}
}
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) {
14 years ago
ctx.fillStyle = 'rgba(255,0,0,1)'
ctx.fillRect(0, 0, 50, 100)
14 years ago
ctx.fillStyle = 'rgba(0,255,0,1)'
ctx.fillRect(50, 0, 50, 100)
14 years ago
ctx.fillStyle = 'rgba(0,0,255,1)'
ctx.fillRect(100, 0, 50, 100)
14 years ago
var data = ctx.getImageData(0, 0, 120, 20)
ctx.putImageData(data, 20, 120)
}
14 years ago
tests['putImageData() alpha'] = function (ctx) {
14 years ago
ctx.fillStyle = 'rgba(255,0,0,0.5)'
ctx.fillRect(0, 0, 50, 100)
14 years ago
ctx.fillStyle = 'rgba(0,255,0,0.5)'
ctx.fillRect(50, 0, 50, 100)
14 years ago
ctx.fillStyle = 'rgba(0,0,255,0.5)'
ctx.fillRect(100, 0, 50, 100)
14 years ago
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)
}
}
}