| Index: experimental/docs/canvasBackend.js
|
| diff --git a/experimental/docs/canvasBackend.js b/experimental/docs/canvasBackend.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0574813f2224b952fb9903bfdbed6aedf6785ede
|
| --- /dev/null
|
| +++ b/experimental/docs/canvasBackend.js
|
| @@ -0,0 +1,167 @@
|
| +var canvas;
|
| +var ctx;
|
| +var canvasGradients = {};
|
| +
|
| +function canvas_rbga(color) {
|
| + var a = canvas_opacity(color);
|
| + var r = (color >> 16) & 0xFF;
|
| + var g = (color >> 8) & 0xFF;
|
| + var b = (color >> 0) & 0xFF;
|
| + return "rgba(" + r + "," + g + "," + b + "," + a + ")";
|
| +}
|
| +
|
| +function canvas_opacity(color) {
|
| + var a = (color >> 24) & 0xFF;
|
| + return a / 255.;
|
| +}
|
| +
|
| +function displayCanvas(displayList) {
|
| + if (displayList.clear) {
|
| + ctx.clearRect(0, 0, canvas.width, canvas.height);
|
| + }
|
| + for (var index = 0; index < displayList.length; ++index) {
|
| + drawToCanvas(displayList[index]);
|
| + }
|
| +}
|
| +
|
| +function drawToCanvas(action) {
|
| + ctx.save();
|
| + var paint = paintToCanvas(action.paint);
|
| + var draw = action.draw;
|
| + if ('string' == typeof(draw)) {
|
| + draw = (new Function("return " + draw))();
|
| + }
|
| + if (isArray(draw)) {
|
| + assert(draw.length > 0);
|
| + var picture = 'draw' in draw[0];
|
| + if (picture) {
|
| + for (var index = 0; index < draw.length; ++index) {
|
| + drawToCanvas(draw[index]);
|
| + }
|
| + return;
|
| + }
|
| + ctx.beginPath();
|
| + for (var index = 0; index < draw.length; ++index) {
|
| + for (var prop in draw[index]) {
|
| + var v = draw[index][prop];
|
| + switch (prop) {
|
| + case 'arcTo':
|
| + ctx.arcTo(v[0], v[1], v[2], v[3], v[4]);
|
| + break;
|
| + case 'close':
|
| + ctx.closePath();
|
| + break;
|
| + case 'cubic':
|
| + ctx.moveTo(v[0], v[1]);
|
| + ctx.bezierCurveTo(v[2], v[3], v[4], v[5], v[6], v[7]);
|
| + break;
|
| + case 'line':
|
| + ctx.moveTo(v[0], v[1]);
|
| + ctx.lineTo(v[2], v[3]);
|
| + break;
|
| + case 'quad':
|
| + ctx.moveTo(v[0], v[1]);
|
| + ctx.quadraticCurveTo(v[2], v[3], v[4], v[5]);
|
| + break;
|
| + default:
|
| + assert(0);
|
| + }
|
| + }
|
| + }
|
| + if ('fill' == paint.style) {
|
| + ctx.fill();
|
| + } else {
|
| + assert('stroke' == paint.style);
|
| + ctx.stroke();
|
| + }
|
| + } else {
|
| + assert('string' in draw);
|
| + if ('fill' == paint.style) {
|
| + ctx.fillText(draw.string, draw.x, draw.y);
|
| + } else {
|
| + assert('stroke' == paint.style);
|
| + ctx.strokeText(draw.string, draw.x, draw.y);
|
| + }
|
| + }
|
| + ctx.restore();
|
| +}
|
| +
|
| +function keyframeCanvasInit(displayList, first) {
|
| + if ('canvas' in first && 'clear' == first.canvas) {
|
| + displayList.clear = true;
|
| + }
|
| +}
|
| +
|
| +function paintToCanvas(paint) {
|
| + var color;
|
| + var inPicture = 'string' == typeof(paint);
|
| + if (inPicture) {
|
| + paint = (new Function("return " + paint))();
|
| + assert('object' == typeof(paint) && !isArray(paint));
|
| + }
|
| + if ('gradient' in paint) {
|
| + var gradient = paint.gradient.split('.');
|
| + var gradName = gradient[1];
|
| + if (!canvasGradients[gradName]) {
|
| + var g = window[gradient[0]][gradient[1]];
|
| + var grad = ctx.createRadialGradient(g.cx, g.cy, 0, g.cx, g.cy, g.r);
|
| + var stopLen = g.stops.length;
|
| + for (var index = 0; index < stopLen; ++index) {
|
| + var stop = g.stops[index];
|
| + var color = canvas_rbga(stop.color);
|
| + grad.addColorStop(index, color);
|
| + }
|
| + canvasGradients[gradName] = grad;
|
| + }
|
| + color = canvasGradients[gradName];
|
| + if (!inPicture) {
|
| + ctx.globalAlpha = canvas_opacity(paint.color);
|
| + }
|
| + } else {
|
| + color = canvas_rbga(paint.color);
|
| + }
|
| + if ('fill' == paint.style) {
|
| + ctx.fillStyle = color;
|
| + } else if ('stroke' == paint.style) {
|
| + ctx.strokeStyle = color;
|
| + } else {
|
| + ctx.globalAlpha = canvas_opacity(paint.color);
|
| + }
|
| + if ('strokeWidth' in paint) {
|
| + ctx.lineWidth = paint.strokeWidth;
|
| + }
|
| + if ('typeface' in paint) {
|
| + var typeface = typefaces[paint.typeface];
|
| + var font = typeface.style;
|
| + if ('textSize' in paint) {
|
| + font += " " + paint.textSize;
|
| + }
|
| + if ('family' in typeface) {
|
| + font += " " + typeface.family;
|
| + }
|
| + ctx.font = font;
|
| + if ('textAlign' in paint) {
|
| + ctx.textAlign = paint.textAlign;
|
| + }
|
| + if ('textBaseline' in paint) {
|
| + ctx.textBaseline = paint.textBaseline;
|
| + }
|
| + }
|
| + return paint;
|
| +}
|
| +
|
| +function setupCanvas() {
|
| + canvas = document.getElementById("canvas");
|
| + ctx = canvas ? canvas.getContext("2d") : null;
|
| + assert(ctx);
|
| + var resScale = window.devicePixelRatio ? window.devicePixelRatio : 1;
|
| + var unscaledWidth = canvas.width;
|
| + var unscaledHeight = canvas.height;
|
| + canvas.width = unscaledWidth * resScale;
|
| + canvas.height = unscaledHeight * resScale;
|
| + canvas.style.width = unscaledWidth + 'px';
|
| + canvas.style.height = unscaledHeight + 'px';
|
| + if (resScale != 1) {
|
| + ctx.scale(resScale, resScale);
|
| + }
|
| +}
|
|
|