Skip to content

Commit

Permalink
Merge pull request #1742 from asturur/Fix-free-drawing-mode
Browse files Browse the repository at this point in the history
Fix for free drwaing mode ( pencil ). Closes #1725
  • Loading branch information
kangax committed Oct 12, 2014
2 parents fe510f2 + 3257d9a commit 6070030
Showing 1 changed file with 7 additions and 68 deletions.
75 changes: 7 additions & 68 deletions src/brushes/pencil_brush.class.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
(function() {

var utilMin = fabric.util.array.min,
utilMax = fabric.util.array.max;

/**
* PencilBrush class
* @class fabric.PencilBrush
Expand Down Expand Up @@ -134,74 +131,28 @@
ctx.restore();
},

/**
* Return an SVG path based on our captured points and their bounding box
* @private
*/
_getSVGPathData: function() {
this.box = this.getPathBoundingBox(this._points);
return this.convertPointsToSVGPath(
this._points, this.box.minX, this.box.minY);
},

/**
* Returns bounding box of a path based on given points
* @param {Array} points Array of points
* @return {Object} Object with minX, minY, maxX, maxY
*/
getPathBoundingBox: function(points) {
var xBounds = [],
yBounds = [],
p1 = points[0],
p2 = points[1],
startPoint = p1;

for (var i = 1, len = points.length; i < len; i++) {
var midPoint = p1.midPointFrom(p2);
// with startPoint, p1 as control point, midpoint as end point
xBounds.push(startPoint.x);
xBounds.push(midPoint.x);
yBounds.push(startPoint.y);
yBounds.push(midPoint.y);

p1 = points[i];
p2 = points[i + 1];
startPoint = midPoint;
}

xBounds.push(p1.x);
yBounds.push(p1.y);

return {
minX: utilMin(xBounds),
minY: utilMin(yBounds),
maxX: utilMax(xBounds),
maxY: utilMax(yBounds)
};
},

/**
* Converts points to SVG path
* @param {Array} points Array of points
* @param {Number} minX
* @param {Number} minY
* @return {String} SVG path
*/
convertPointsToSVGPath: function(points, minX, minY) {
convertPointsToSVGPath: function(points) {
var path = [],
p1 = new fabric.Point(points[0].x - minX, points[0].y - minY),
p2 = new fabric.Point(points[1].x - minX, points[1].y - minY);
p1 = new fabric.Point(points[0].x, points[0].y),
p2 = new fabric.Point(points[1].x, points[1].y);

path.push('M ', points[0].x - minX, ' ', points[0].y - minY, ' ');
path.push('M ', points[0].x, ' ', points[0].y, ' ');
for (var i = 1, len = points.length; i < len; i++) {
var midPoint = p1.midPointFrom(p2);
// p1 is our bezier control point
// midpoint is our endpoint
// start point is p(i-1) value.
path.push('Q ', p1.x, ' ', p1.y, ' ', midPoint.x, ' ', midPoint.y, ' ');
p1 = new fabric.Point(points[i].x - minX, points[i].y - minY);
p1 = new fabric.Point(points[i].x, points[i].y);
if ((i + 1) < points.length) {
p2 = new fabric.Point(points[i + 1].x - minX, points[i + 1].y - minY);
p2 = new fabric.Point(points[i + 1].x, points[i + 1].y);
}
}
path.push('L ', p1.x, ' ', p1.y, ' ');
Expand Down Expand Up @@ -238,7 +189,7 @@
var ctx = this.canvas.contextTop;
ctx.closePath();

var pathData = this._getSVGPathData().join('');
var pathData = this.convertPointsToSVGPath(this._points).join('');
if (pathData === 'M 0 0 Q 0 0 0 0 L 0 0') {
// do not create 0 width/height paths, as they are
// rendered inconsistently across browsers
Expand All @@ -248,19 +199,7 @@
return;
}

// set path origin coordinates based on our bounding box
var originLeft = this.box.minX + (this.box.maxX - this.box.minX) / 2,
originTop = this.box.minY + (this.box.maxY - this.box.minY) / 2;

this.canvas.contextTop.arc(originLeft, originTop, 3, 0, Math.PI * 2, false);

var path = this.createPath(pathData);
path.set({
left: originLeft,
top: originTop,
originX: 'center',
originY: 'center'
});

this.canvas.add(path);
path.setCoords();
Expand Down

0 comments on commit 6070030

Please sign in to comment.