63
Canvas Web Directions South 2009 Dmitry Baranovskiy HTML5 FTW!

Canvas

Embed Size (px)

DESCRIPTION

Talk about Canvas at Web Directions South ’09

Citation preview

Page 1: Canvas

CanvasWeb Directions South 2009Dmitry Baranovskiy

HTML5 FTW!

Page 2: Canvas

“The canvas element represents a!resolution-dependent bitmap canvas, which can be used for

rendering graphs, game graphics, or other visual images on the fly”

HTML 5 Specification

Page 3: Canvas
Page 4: Canvas

Teenager of web

technologies

Page 5: Canvas
Page 6: Canvas
Page 7: Canvas

Awesome!What is

Awesome?

Page 8: Canvas
Page 9: Canvas

Draw!You can draw!

Page 10: Canvas

apiAPI is small & simple

Page 11: Canvas

HTML5HTML 5

Page 12: Canvas

HTML5HTML5

Page 13: Canvas
Page 14: Canvas
Page 15: Canvas
Page 16: Canvas

Howto?How to…

Page 17: Canvas
Page 18: Canvas

JavaScript

Page 19: Canvas

ContextContext

Page 20: Canvas

var canvas = document.getElementById("canvas"), context = canvas.getContext("2d");

Page 21: Canvas

context.save();context.restore();context.scale(x, y);context.rotate(angle);context.translate(x, y);context.transform(m11, m12, m21, m22, dx, dy);context.setTransform(m11, m12, m21, m22, dx, dy);

Page 22: Canvas

var a = context.globalAlpha;

context.globalAlpha = a * 0.5;

var b = context.globalCompositeOperation;

context.globalCompositeOperation = "xor";

Page 23: Canvas

context.strokeStyle = "#fc0";context.fillStyle = "#000";

var gradient = context.createLinearGradient(x1, y1, x2, y2);// orvar gradient = context.createRadialGradient(x1, y1, r1, x2, y2, r2);gradient.addColorStop(0 / 6, "red");gradient.addColorStop(1 / 6, "orange");gradient.addColorStop(2 / 6, "yellow");gradient.addColorStop(3 / 6, "green");gradient.addColorStop(4 / 6, "blue");gradient.addColorStop(5 / 6, "navy");gradient.addColorStop(6 / 6, "purple");context.fillStyle = gradient;

Page 24: Canvas

context.lineWidth = 2;

context.lineCap = "round";

context.lineJoin = "bevel";

context.miterLimit = 5;

context.shadowColor = "#000";

context.shadowOffsetX = 0;

context.shadowOffsetY = 3;

context.shadowBlur = 7;

Page 25: Canvas

primitivePrimitives

Page 26: Canvas

context.clearRect(x, y, width, height);context.fillRect(x, y, width, height);context.strokeRect(x, y, width, height);

Page 27: Canvas

pathsPaths

Page 28: Canvas

context.beginPath();context.closePath();

context.moveTo(x, y);context.lineTo(x, y);context.quadraticCurveTo(cpx, cpy, x, y);context.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);context.arcTo(x1, y1, x2, y2, radius);context.arc(x, y, radius, startAngle, endAngle, anticlockwise);context.rect(x, y, width, height);

context.fill();context.stroke();context.clip();context.isPointInPath(x, y);

Page 29: Canvas

textText

Page 30: Canvas

context.font = 'italic 400 12px/2 Palatino, »

Georgia, serif';

context.textAlign = "center";

context.textBaseline = "middle";

context.fillText("Web Directions", 100, 120);

context.strokeText("Canvas FTW", 100, 150, 140);

var metrics = context.measureText("How wide is »

this text?"),

width = metrics.width;

Page 31: Canvas

imagesImages

Page 32: Canvas

var image = new Image;

image.onload = function () {

context.drawImage(image, x, y);

// or

context.drawImage(image, x, y, w, h);

// or

context.drawImage(image, sx, sy, sw, sh,

x, y, w, h);

};

image.src = "graffiti.jpg";

Page 33: Canvas

var image = new Image;

image.onload = function () {

context.drawImage(image, x, y);

// or

context.drawImage(image, x, y, w, h);

// or

context.drawImage(image, sx, sy, sw, sh,

x, y, w, h);

};

image.src = "graffiti.jpg";

sx

sy

sh

sw

x

y

h

w

Page 34: Canvas

pixelsPixel Pushing

Page 35: Canvas

var data = context.createImageData(w, h);

// or

var data = context.createImageData(old_data);

var data = context.getImageData(x, y, w, h);

context.putImageData(data, dx, dy);

// or

context.putImageData(data, dx, dy, x, y, w, h);

Page 36: Canvas

var data = {

width: 100,

height: 100,

data: [0, 0, 0, 0, 255, 128, 0, 255, … , 0]

};

Page 37: Canvas

var data = {

width: 100,

height: 100,

data: [0, 0, 0, 0, 255, 128, 0, 255, … , 0]

};

Page 38: Canvas

var data = {

width: 100,

height: 100,

data: [0, 0, 0, 0, 255, 128, 0, 255, … , 0]

};

R G B A

Page 39: Canvas

not!What is not Awesome?

Page 40: Canvas
Page 41: Canvas

uglyAPI is ugly

Page 42: Canvas

1by1Setting attributes one by one

Page 43: Canvas

context.lineWidth = 2;

context.lineCap = "round";

context.lineJoin = "bevel";

context.miterLimit = 5;

context.shadowColor = "#000";

context.shadowOffsetX = 0;

context.shadowOffsetY = 3;

context.shadowBlur = 7;

Page 44: Canvas

context.setAttr({

lineWidth: 2,

lineCap: "round",

lineJoin: "bevel",

miterLimit: 5,

shadowColor: "#000",

shadowOffsetX: 0,

shadowOffsetY: 3,

shadowBlur: 7

});

Page 45: Canvas

pain!Coding paths is painful

Page 46: Canvas

context.beginPath();context.moveTo(x, y);context.lineTo(x, y);context.quadraticCurveTo(cpx, cpy, x, y);context.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);context.arcTo(x1, y1, x2, y2, radius);context.arc(x, y, radius, startAngle, endAngle, anticlockwise);context.rect(x, y, width, height);context.closePath();context.fill();

Page 47: Canvas

context.beginPath() .moveTo(x, y) .lineTo(x, y) .quadraticCurveTo(cpx, cpy, x, y) .bezierCurveTo(c1x, c1y, c2x, c2y, x, y) .arcTo(x1, y1, x2, y2, radius) .arc(x, y, radius, startAngle, endAngle, anticlockwise) .rect(x, y, width, height) .closePath() .fill();

Page 48: Canvas

var path = ["move", x, y,

"line", x, y,

"quadratic", cpx, cpy, x, y,

"arc", x, y, radius, startAngle,

endAngle, anticlockwise];

context.path(path).close().fill();

context.path(["move", 10, 10, "line", 50,

50]).close().fill();

Page 49: Canvas

no wayNo way to store path

Page 50: Canvas

more!Not enough primitives

Page 51: Canvas
Page 52: Canvas
Page 53: Canvas

supportBad support

Page 54: Canvas
Page 55: Canvas

89%

Page 56: Canvas

81%

Page 57: Canvas

76%

Page 58: Canvas

74%

Page 59: Canvas

Zero

Page 60: Canvas

HTML 5

Page 61: Canvas
Page 63: Canvas

Thank You

[email protected]

Photos used in this presentation:http://www.flickr.com/photos/garryknight/2390411392/http://www.flickr.com/photos/livenature/233281535/http://www.flickr.com/photos/yoadolescente/3212368604/http://www.flickr.com/photos/andreassolberg/433734311/http://www.flickr.com/photos/cassidy/67331975/http://www.flickr.com/photos/b-tal/93425807/http://www.flickr.com/photos/pefectfutures/163853250/http://www.flickr.com/photos/streetart-berlin/3746020273/http://www.flickr.com/photos/streetart-berlin/3954856553/http://www.flickr.com/photos/streetart-berlin/3947360186/http://www.flickr.com/photos/streetart-berlin/3949549099/http://www.flickr.com/photos/streetart-berlin/3949546871/http://www.flickr.com/photos/streetart-berlin/3926942710/http://www.flickr.com/photos/streetart-berlin/3834021290/