828c58761d90445b8b9d20a82d85dc1479317f71Trippvar SHAPE = "canvasShape",
a89ad754cce3cfc8aee71760e10217b54020360dTripp DOCUMENT = Y.config.doc,
a89ad754cce3cfc8aee71760e10217b54020360dTripp Y_LANG = Y.Lang,
828c58761d90445b8b9d20a82d85dc1479317f71Tripp AttributeLite = Y.AttributeLite,
828c58761d90445b8b9d20a82d85dc1479317f71Tripp CanvasShape,
828c58761d90445b8b9d20a82d85dc1479317f71Tripp CanvasPath,
828c58761d90445b8b9d20a82d85dc1479317f71Tripp CanvasRect,
828c58761d90445b8b9d20a82d85dc1479317f71Tripp CanvasEllipse,
828c58761d90445b8b9d20a82d85dc1479317f71Tripp CanvasCircle,
cff2b8ec796b9316395b305e8867408a6d7c3549Tripp CanvasPieSlice,
b08d5c81743759d32bccaf4bec55aa102491026eTripp Y_Color = Y.Color,
b08d5c81743759d32bccaf4bec55aa102491026eTripp PARSE_INT = parseInt,
aeee02c921674c7c98f1e3cbfdaa32b7da4a1ad5Tripp PARSE_FLOAT = parseFloat,
aeee02c921674c7c98f1e3cbfdaa32b7da4a1ad5Tripp IS_NUMBER = Y_LANG.isNumber,
b08d5c81743759d32bccaf4bec55aa102491026eTripp RE = RegExp,
b08d5c81743759d32bccaf4bec55aa102491026eTripp TORGB = Y_Color.toRGB,
b08d5c81743759d32bccaf4bec55aa102491026eTripp TOHEX = Y_Color.toHex;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp/**
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * <a href="http://www.w3.org/TR/html5/the-canvas-element.html">Canvas</a> implementation of the <a href="Drawing.html">`Drawing`</a> class.
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * `CanvasDrawing` is not intended to be used directly. Instead, use the <a href="Drawing.html">`Drawing`</a> class.
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * If the browser lacks <a href="http://www.w3.org/TR/SVG/">SVG</a> capabilities but has
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * <a href="http://www.w3.org/TR/html5/the-canvas-element.html">Canvas</a> capabilities, the <a href="Drawing.html">`Drawing`</a>
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * class will point to the `CanvasDrawing` class.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
a75ebc38c1de401b679953a9b87bd323f0f48d02Tripp * @module graphics
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @class CanvasDrawing
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @constructor
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTrippfunction CanvasDrawing()
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp{
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp}
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTrippCanvasDrawing.prototype = {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Parses hex color string and alpha value to rgba
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
b08d5c81743759d32bccaf4bec55aa102491026eTripp * @method _toRGBA
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param {Object} val Color value to parse. Can be hex string, rgb or name.
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param {Number} alpha Numeric value between 0 and 1 representing the alpha level.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
b08d5c81743759d32bccaf4bec55aa102491026eTripp _toRGBA: function(val, alpha) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp alpha = (alpha !== undefined) ? alpha : 1;
b08d5c81743759d32bccaf4bec55aa102491026eTripp if (!Y_Color.re_RGB.test(val)) {
b08d5c81743759d32bccaf4bec55aa102491026eTripp val = TOHEX(val);
b08d5c81743759d32bccaf4bec55aa102491026eTripp }
b08d5c81743759d32bccaf4bec55aa102491026eTripp
b08d5c81743759d32bccaf4bec55aa102491026eTripp if(Y_Color.re_hex.exec(val)) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp val = 'rgba(' + [
b08d5c81743759d32bccaf4bec55aa102491026eTripp PARSE_INT(RE.$1, 16),
b08d5c81743759d32bccaf4bec55aa102491026eTripp PARSE_INT(RE.$2, 16),
b08d5c81743759d32bccaf4bec55aa102491026eTripp PARSE_INT(RE.$3, 16)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ].join(',') + ',' + alpha + ')';
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return val;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Converts color to rgb format
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
b08d5c81743759d32bccaf4bec55aa102491026eTripp * @method _toRGB
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param val Color value to convert.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
b08d5c81743759d32bccaf4bec55aa102491026eTripp _toRGB: function(val) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp return TORGB(val);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Sets the size of the graphics object.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method setSize
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param w {Number} width to set for the instance.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param h {Number} height to set for the instance.
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp setSize: function(w, h) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(this.get("autoSize"))
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(w > this.node.getAttribute("width"))
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this.node.style.width = w + "px";
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this.node.setAttribute("width", w);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(h > this.node.getAttribute("height"))
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this.node.style.height = h + "px";
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this.node.setAttribute("height", h);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * Tracks coordinates. Used to calculate the start point of dashed lines.
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp *
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @method _updateCoords
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param {Number} x x-coordinate
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param {Number} y y-coordinate
9eaaa502227248d304ac9170902697d02158c1d9Tripp * @private
9eaaa502227248d304ac9170902697d02158c1d9Tripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp _updateCoords: function(x, y)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._xcoords.push(x);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._ycoords.push(y);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * Clears the coordinate arrays. Called at the end of a drawing operation.
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp *
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @method _clearAndUpdateCoords
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @private
9eaaa502227248d304ac9170902697d02158c1d9Tripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp _clearAndUpdateCoords: function()
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var x = this._xcoords.pop() || 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y = this._ycoords.pop() || 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateCoords(x, y);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * Moves the shape's dom node.
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp *
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @method _updateNodePosition
9eaaa502227248d304ac9170902697d02158c1d9Tripp * @private
9eaaa502227248d304ac9170902697d02158c1d9Tripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp _updateNodePosition: function()
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var node = this.get("node"),
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x = this.get("x"),
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y = this.get("y");
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp node.style.position = "absolute";
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp node.style.left = (x + this._left) + "px";
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp node.style.top = (y + this._top) + "px";
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * Queues up a method to be executed when a shape redraws.
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp *
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @method _updateDrawingQueue
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param {Array} val An array containing data that can be parsed into a method and arguments. The value at zero-index of the array is a string reference of
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * the drawing method that will be called. All subsequent indices are argument for that method. For example, `lineTo(10, 100)` would be structured as:
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * `["lineTo", 10, 100]`.
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp _updateDrawingQueue: function(val)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._methods.push(val);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Draws a line segment using the current line style from the current drawing position to the specified x and y coordinates.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method lineTo
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} point1 x-coordinate for the end point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} point2 y-coordinate for the end point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp lineTo: function(point1, point2, etc)
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var args = arguments,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp i = 0,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp len,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp x,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp y,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp wt = this._stroke && this._strokeWeight ? this._strokeWeight : 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(!this._lineToMethods)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._lineToMethods = [];
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if (typeof point1 === 'string' || typeof point1 === 'number') {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp args = [[point1, point2]];
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp len = args.length;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp for (; i < len; ++i)
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if(args[i])
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp x = args[i][0];
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp y = args[i][1];
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateDrawingQueue(["lineTo", x, y]);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._lineToMethods[this._lineToMethods.length] = this._methods[this._methods.length - 1];
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x - wt, y - wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x + wt, y + wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateCoords(x, y);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._drawingComplete = false;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return this;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Moves the current drawing position to specified x and y coordinates.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method moveTo
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} x x-coordinate for the end point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} y y-coordinate for the end point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp moveTo: function(x, y) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp var wt = this._stroke && this._strokeWeight ? this._strokeWeight : 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["moveTo", x, y]);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x - wt, y - wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x + wt, y + wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateCoords(x, y);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._drawingComplete = false;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return this;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Draws a bezier curve.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method curveTo
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} cp1x x-coordinate for the first control point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} cp1y y-coordinate for the first control point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} cp2x x-coordinate for the second control point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} cp2y y-coordinate for the second control point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} x x-coordinate for the end point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} y y-coordinate for the end point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp curveTo: function(cp1x, cp1y, cp2x, cp2y, x, y) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var hiX,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp hiY,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp loX,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp loY;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["bezierCurveTo", cp1x, cp1y, cp2x, cp2y, x, y]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._drawingComplete = false;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp hiX = Math.max(x, Math.max(cp1x, cp2x));
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp hiY = Math.max(y, Math.max(cp1y, cp2y));
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp loX = Math.min(x, Math.min(cp1x, cp2x));
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp loY = Math.min(y, Math.min(cp1y, cp2y));
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(hiX, hiY);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(loX, loY);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateCoords(hiX, hiY);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return this;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Draws a quadratic bezier curve.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method quadraticCurveTo
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} cpx x-coordinate for the control point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} cpy y-coordinate for the control point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} x x-coordinate for the end point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} y y-coordinate for the end point.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp quadraticCurveTo: function(cpx, cpy, x, y) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var hiX,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp hiY,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp loX,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp loY,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp wt = this._stroke && this._strokeWeight ? this._strokeWeight : 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["quadraticCurveTo", cpx, cpy, x, y]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._drawingComplete = false;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp hiX = Math.max(x, cpx);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp hiY = Math.max(y, cpy);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp loX = Math.min(x, cpx);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp loY = Math.min(y, cpy);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(hiX + wt, hiY + wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(loX - wt, loY - wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateCoords(hiX, hiY);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return this;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * Draws a circle. Used internally by `CanvasCircle` class.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method drawCircle
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} x y-coordinate
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} y x-coordinate
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} r radius
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * @protected
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp drawCircle: function(x, y, radius) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var startAngle = 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp endAngle = 2 * Math.PI,
121a85a95648f1bc78369e1cb7bfc99cc826d13aTripp wt = this._stroke && this._strokeWeight ? this._strokeWeight : 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp circum = radius * 2;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp circum += wt;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._drawingComplete = false;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x + circum, y + circum);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x - wt, y - wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateCoords(x, y);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["arc", x + radius, y + radius, radius, startAngle, endAngle, false]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return this;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp /**
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp * Draws a diamond.
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp *
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp * @method drawDiamond
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp * @param {Number} x y-coordinate
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp * @param {Number} y x-coordinate
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp * @param {Number} width width
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp * @param {Number} height height
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp * @protected
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp */
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp drawDiamond: function(x, y, width, height)
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp {
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp var midWidth = width * 0.5,
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp midHeight = height * 0.5;
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp this.moveTo(x + midWidth, y);
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp this.lineTo(x + width, y + midHeight);
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp this.lineTo(x + midWidth, y + height);
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp this.lineTo(x, y + midHeight);
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp this.lineTo(x + midWidth, y);
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp return this;
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp },
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * Draws an ellipse. Used internally by `CanvasEllipse` class.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method drawEllipse
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} x x-coordinate
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} y y-coordinate
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} w width
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} h height
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * @protected
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp drawEllipse: function(x, y, w, h) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var l = 8,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp theta = -(45/180) * Math.PI,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp angle = 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp angleMid,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp radius = w/2,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp yRadius = h/2,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp i = 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp centerX = x + radius,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp centerY = y + yRadius,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ax, ay, bx, by, cx, cy,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp wt = this._stroke && this._strokeWeight ? this._strokeWeight : 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ax = centerX + Math.cos(0) * radius;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ay = centerY + Math.sin(0) * yRadius;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this.moveTo(ax, ay);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp for(; i < l; i++)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp angle += theta;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp angleMid = angle - (theta / 2);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp bx = centerX + Math.cos(angle) * radius;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp by = centerY + Math.sin(angle) * yRadius;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp cx = centerX + Math.cos(angleMid) * (radius / Math.cos(theta / 2));
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp cy = centerY + Math.sin(angleMid) * (yRadius / Math.cos(theta / 2));
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateDrawingQueue(["quadraticCurveTo", cx, cy, bx, by]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x + w + wt, y + h + wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x - wt, y - wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateCoords(x, y);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return this;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Draws a rectangle.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method drawRect
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} x x-coordinate
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} y y-coordinate
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} w width
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} h height
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp drawRect: function(x, y, w, h) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp var wt = this._stroke && this._strokeWeight ? this._strokeWeight : 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._drawingComplete = false;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateDrawingQueue(["moveTo", x, y]);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateDrawingQueue(["lineTo", x + w, y]);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateDrawingQueue(["lineTo", x + w, y + h]);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateDrawingQueue(["lineTo", x, y + h]);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateDrawingQueue(["lineTo", x, y]);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x - wt, y - wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x + w + wt, y + h + wt);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return this;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Draws a rectangle with rounded corners.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method drawRect
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} x x-coordinate
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} y y-coordinate
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} w width
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} h height
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} ew width of the ellipse used to draw the rounded corners
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} eh height of the ellipse used to draw the rounded corners
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp drawRoundRect: function(x, y, w, h, ew, eh) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp var wt = this._stroke && this._strokeWeight ? this._strokeWeight : 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._drawingComplete = false;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["moveTo", x, y + eh]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["lineTo", x, y + h - eh]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["quadraticCurveTo", x, y + h, x + ew, y + h]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["lineTo", x + w - ew, y + h]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["quadraticCurveTo", x + w, y + h, x + w, y + h - eh]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["lineTo", x + w, y + eh]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["quadraticCurveTo", x + w, y, x + w - ew, y]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["lineTo", x + ew, y]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._updateDrawingQueue(["quadraticCurveTo", x, y, x, y + eh]);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x - wt, y - wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._trackSize(x + w + wt, y + h + wt);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._updateCoords(w, h);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return this;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Draws a wedge.
cec703a844d9691646231634fe709f4ea41d278aTripp *
cec703a844d9691646231634fe709f4ea41d278aTripp * @method drawWedge
cec703a844d9691646231634fe709f4ea41d278aTripp * @param {Number} x x-coordinate of the wedge's center point
cec703a844d9691646231634fe709f4ea41d278aTripp * @param {Number} y y-coordinate of the wedge's center point
cec703a844d9691646231634fe709f4ea41d278aTripp * @param {Number} startAngle starting angle in degrees
cec703a844d9691646231634fe709f4ea41d278aTripp * @param {Number} arc sweep of the wedge. Negative values draw clockwise.
cec703a844d9691646231634fe709f4ea41d278aTripp * @param {Number} radius radius of wedge. If [optional] yRadius is defined, then radius is the x radius.
cec703a844d9691646231634fe709f4ea41d278aTripp * @param {Number} yRadius [optional] y radius for wedge.
cec703a844d9691646231634fe709f4ea41d278aTripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp drawWedge: function(x, y, startAngle, arc, radius, yRadius)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp var segs,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp segAngle,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp theta,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp angle,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp angleMid,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ax,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ay,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp bx,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp by,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp cx,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp cy,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp i = 0;
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp yRadius = yRadius || radius;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._drawingComplete = false;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // move to x,y position
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp this._updateDrawingQueue(["moveTo", x, y]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp yRadius = yRadius || radius;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // limit sweep to reasonable numbers
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(Math.abs(arc) > 360)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp arc = 360;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // First we calculate how many segments are needed
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // for a smooth arc.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp segs = Math.ceil(Math.abs(arc) / 45);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // Now calculate the sweep of each segment.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp segAngle = arc / segs;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // The math requires radians rather than degrees. To convert from degrees
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // use the formula (degrees/180)*Math.PI to get radians.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp theta = -(segAngle / 180) * Math.PI;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // convert angle startAngle to radians
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp angle = (startAngle / 180) * Math.PI;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // draw the curve in segments no larger than 45 degrees.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(segs > 0)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // draw a line from the center to the start of the curve
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ax = x + Math.cos(startAngle / 180 * Math.PI) * radius;
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp ay = y + Math.sin(startAngle / 180 * Math.PI) * yRadius;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this.lineTo(ax, ay);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // Loop for drawing curve segments
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp for(; i < segs; ++i)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp angle += theta;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp angleMid = angle - (theta / 2);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp bx = x + Math.cos(angle) * radius;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp by = y + Math.sin(angle) * yRadius;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp cx = x + Math.cos(angleMid) * (radius / Math.cos(theta / 2));
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp cy = y + Math.sin(angleMid) * (yRadius / Math.cos(theta / 2));
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp this._updateDrawingQueue(["quadraticCurveTo", cx, cy, bx, by]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // close the wedge by drawing a line to the center
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp this._updateDrawingQueue(["lineTo", x, y]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp this._trackSize(0 , 0);
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp this._trackSize(radius * 2, radius * 2);
bbd1285cbb2183b7f89010412ad97ae1680b4b5eTripp return this;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Completes a drawing operation.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method end
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp end: function() {
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp this._closePath();
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return this;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp /**
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp * Ends a fill and stroke
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp *
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp * @method closePath
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp */
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp closePath: function()
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp {
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp this._updateDrawingQueue(["closePath"]);
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp this._updateDrawingQueue(["beginPath"]);
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp },
14bfa36e35102dbf271dcff98f773a01c75bd503Tripp
0fdefaa9ca017edfb76b736c825b34186f33045aTripp /**
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * Clears the graphics object.
0fdefaa9ca017edfb76b736c825b34186f33045aTripp *
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * @method clear
0fdefaa9ca017edfb76b736c825b34186f33045aTripp */
0fdefaa9ca017edfb76b736c825b34186f33045aTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Returns a linear gradient fill
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method _getLinearGradient
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @return CanvasGradient
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp _getLinearGradient: function() {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var isNumber = Y.Lang.isNumber,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp fill = this.get("fill"),
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp stops = fill.stops,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp opacity,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp color,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp stop,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp i = 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp len = stops.length,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp gradient,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x = 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y = 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp w = this.get("width"),
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp h = this.get("height"),
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp r = fill.rotation,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x1, x2, y1, y2,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp cx = x + w/2,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp cy = y + h/2,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp offset,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp radCon = Math.PI/180,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp tanRadians = parseFloat(parseFloat(Math.tan(r * radCon)).toFixed(8));
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(Math.abs(tanRadians) * w/2 >= h/2)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(r < 180)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y1 = y;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y2 = y + h;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp else
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y1 = y + h;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y2 = y;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x1 = cx - ((cy - y1)/tanRadians);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x2 = cx - ((cy - y2)/tanRadians);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp else
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(r > 90 && r < 270)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x1 = x + w;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x2 = x;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp else
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x1 = x;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x2 = x + w;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y1 = ((tanRadians * (cx - x1)) - cy) * -1;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y2 = ((tanRadians * (cx - x2)) - cy) * -1;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp gradient = this._context.createLinearGradient(x1, y1, x2, y2);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp for(; i < len; ++i)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp stop = stops[i];
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp opacity = stop.opacity;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp color = stop.color;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp offset = stop.offset;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(isNumber(opacity))
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp opacity = Math.max(0, Math.min(1, opacity));
b08d5c81743759d32bccaf4bec55aa102491026eTripp color = this._toRGBA(color, opacity);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp else
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
b08d5c81743759d32bccaf4bec55aa102491026eTripp color = TORGB(color);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp offset = stop.offset || i/(len - 1);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp gradient.addColorStop(offset, color);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return gradient;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Returns a radial gradient fill
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method _getRadialGradient
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @return CanvasGradient
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp _getRadialGradient: function() {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var isNumber = Y.Lang.isNumber,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp fill = this.get("fill"),
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp r = fill.r,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp fx = fill.fx,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp fy = fill.fy,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp stops = fill.stops,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp opacity,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp color,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp stop,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp i = 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp len = stops.length,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp gradient,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x = 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y = 0,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp w = this.get("width"),
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp h = this.get("height"),
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x1, x2, y1, y2, r2,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp xc, yc, xn, yn, d,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp offset,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ratio,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp stopMultiplier;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp xc = x + w/2;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp yc = y + h/2;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x1 = w * fx;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y1 = h * fy;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x2 = x + w/2;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y2 = y + h/2;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp r2 = w * r;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp d = Math.sqrt( Math.pow(Math.abs(xc - x1), 2) + Math.pow(Math.abs(yc - y1), 2) );
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(d >= r2)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ratio = d/r2;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp //hack. gradient won't show if it is exactly on the edge of the arc
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(ratio === 1)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ratio = 1.01;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp xn = (x1 - xc)/ratio;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp yn = (y1 - yc)/ratio;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp xn = xn > 0 ? Math.floor(xn) : Math.ceil(xn);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp yn = yn > 0 ? Math.floor(yn) : Math.ceil(yn);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp x1 = xc + xn;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp y1 = yc + yn;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp //If the gradient radius is greater than the circle's, adjusting the radius stretches the gradient properly.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp //If the gradient radius is less than the circle's, adjusting the radius of the gradient will not work.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp //Instead, adjust the color stops to reflect the smaller radius.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(r >= 0.5)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp gradient = this._context.createRadialGradient(x1, y1, r, x2, y2, r * w);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp stopMultiplier = 1;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp else
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp gradient = this._context.createRadialGradient(x1, y1, r, x2, y2, w/2);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp stopMultiplier = r * 2;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp for(; i < len; ++i)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp stop = stops[i];
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp opacity = stop.opacity;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp color = stop.color;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp offset = stop.offset;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(isNumber(opacity))
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp opacity = Math.max(0, Math.min(1, opacity));
b08d5c81743759d32bccaf4bec55aa102491026eTripp color = this._toRGBA(color, opacity);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp else
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
b08d5c81743759d32bccaf4bec55aa102491026eTripp color = TORGB(color);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp offset = stop.offset || i/(len - 1);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp offset *= stopMultiplier;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if(offset <= 1)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp gradient.addColorStop(offset, color);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return gradient;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Clears all values
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method _initProps
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp _initProps: function() {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._methods = [];
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._lineToMethods = [];
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._xcoords = [0];
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._ycoords = [0];
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._width = 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._height = 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._left = 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._top = 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._right = 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this._bottom = 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * Indicates a drawing has completed.
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp *
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @property _drawingComplete
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @type Boolean
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp _drawingComplete: false,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Creates canvas element
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method _createGraphic
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @return HTMLCanvasElement
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp _createGraphic: function(config) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var graphic = Y.config.doc.createElement('canvas');
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp return graphic;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp },
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp /**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Updates the size of the graphics object
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp *
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method _trackSize
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} w width
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @param {Number} h height
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @private
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp _trackSize: function(w, h) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (w > this._right) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._right = w;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if(w < this._left)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._left = w;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (h < this._top)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._top = h;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (h > this._bottom)
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._bottom = h;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._width = this._right - this._left;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._height = this._bottom - this._top;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp};
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTrippY.CanvasDrawing = CanvasDrawing;