123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- /**
- * Utility class for drawing canvas shapes.
- */
- var CanvasUtil = (function(my) {
-
- /**
- * Draws a round rectangle with a glow. The glowWidth indicates the depth
- * of the glow.
- *
- * @param drawContext the context of the canvas to draw to
- * @param x the x coordinate of the round rectangle
- * @param y the y coordinate of the round rectangle
- * @param w the width of the round rectangle
- * @param h the height of the round rectangle
- * @param glowColor the color of the glow
- * @param glowWidth the width of the glow
- */
- my.drawRoundRectGlow
- = function(drawContext, x, y, w, h, r, glowColor, glowWidth) {
-
- // Save the previous state of the context.
- drawContext.save();
-
- if (w < 2 * r) r = w / 2;
- if (h < 2 * r) r = h / 2;
-
- // Draw a round rectangle.
- drawContext.beginPath();
- drawContext.moveTo(x+r, y);
- drawContext.arcTo(x+w, y, x+w, y+h, r);
- drawContext.arcTo(x+w, y+h, x, y+h, r);
- drawContext.arcTo(x, y+h, x, y, r);
- drawContext.arcTo(x, y, x+w, y, r);
- drawContext.closePath();
-
- // Add a shadow around the rectangle
- drawContext.shadowColor = glowColor;
- drawContext.shadowBlur = glowWidth;
- drawContext.shadowOffsetX = 0;
- drawContext.shadowOffsetY = 0;
-
- // Fill the shape.
- drawContext.fill();
-
- drawContext.save();
-
- drawContext.restore();
-
- // 1) Uncomment this line to use Composite Operation, which is doing the
- // same as the clip function below and is also antialiasing the round
- // border, but is said to be less fast performance wise.
-
- // drawContext.globalCompositeOperation='destination-out';
-
- drawContext.beginPath();
- drawContext.moveTo(x+r, y);
- drawContext.arcTo(x+w, y, x+w, y+h, r);
- drawContext.arcTo(x+w, y+h, x, y+h, r);
- drawContext.arcTo(x, y+h, x, y, r);
- drawContext.arcTo(x, y, x+w, y, r);
- drawContext.closePath();
-
- // 2) Uncomment this line to use Composite Operation, which is doing the
- // same as the clip function below and is also antialiasing the round
- // border, but is said to be less fast performance wise.
-
- // drawContext.fill();
-
- // Comment these two lines if choosing to do the same with composite
- // operation above 1 and 2.
- drawContext.clip();
- drawContext.clearRect(0, 0, 277, 200);
-
- // Restore the previous context state.
- drawContext.restore();
- };
-
- /**
- * Clones the given canvas.
- *
- * @return the new cloned canvas.
- */
- my.cloneCanvas = function (oldCanvas) {
- /*
- * FIXME Testing has shown that oldCanvas may not exist. In such a case,
- * the method CanvasUtil.cloneCanvas may throw an error. Since audio
- * levels are frequently updated, the errors have been observed to pile
- * into the console, strain the CPU.
- */
- if (!oldCanvas)
- return oldCanvas;
-
- //create a new canvas
- var newCanvas = document.createElement('canvas');
- var context = newCanvas.getContext('2d');
-
- //set dimensions
- newCanvas.width = oldCanvas.width;
- newCanvas.height = oldCanvas.height;
-
- //apply the old canvas to the new one
- context.drawImage(oldCanvas, 0, 0);
-
- //return the new canvas
- return newCanvas;
- };
-
- return my;
- })(CanvasUtil || {});
-
- module.exports = CanvasUtil;
|