ctx.arcTo(x, y + height, x, y + height - r, r);
ctx.lineTo(x, y + r);
ctx.arcTo(x, y, x + r, y, r);
+ ctx.closePath();
+ ctx.moveTo(x, y);
} else {
ctx.rect(x, y, width, height);
}
ctx.save();
ctx.translate(x, y);
ctx.rotate(rotation * Math.PI / 180);
+ ctx.beginPath();
switch (style) {
// Default includes circle
default:
- ctx.beginPath();
ctx.arc(0, 0, radius, 0, Math.PI * 2);
ctx.closePath();
- ctx.fill();
break;
case 'triangle':
- ctx.beginPath();
edgeLength = 3 * radius / Math.sqrt(3);
height = edgeLength * Math.sqrt(3) / 2;
ctx.moveTo(-edgeLength / 2, height / 3);
ctx.lineTo(edgeLength / 2, height / 3);
ctx.lineTo(0, -2 * height / 3);
ctx.closePath();
- ctx.fill();
break;
case 'rect':
size = 1 / Math.SQRT2 * radius;
- ctx.beginPath();
- ctx.fillRect(-size, -size, 2 * size, 2 * size);
- ctx.strokeRect(-size, -size, 2 * size, 2 * size);
+ ctx.rect(-size, -size, 2 * size, 2 * size);
break;
case 'rectRounded':
var offset = radius / Math.SQRT2;
var leftX = -offset;
var topY = -offset;
var sideSize = Math.SQRT2 * radius;
- ctx.beginPath();
// NOTE(SB) the rounded rect implementation changed to use `arcTo`
// instead of `quadraticCurveTo` since it generates better results
// when rect is almost a circle. 0.425 (instead of 0.5) produces
// results visually closer to the previous impl.
this.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius * 0.425);
-
- ctx.closePath();
- ctx.fill();
break;
case 'rectRot':
size = 1 / Math.SQRT2 * radius;
- ctx.beginPath();
ctx.moveTo(-size, 0);
ctx.lineTo(0, size);
ctx.lineTo(size, 0);
ctx.lineTo(0, -size);
ctx.closePath();
- ctx.fill();
break;
case 'cross':
- ctx.beginPath();
ctx.moveTo(0, radius);
ctx.lineTo(0, -radius);
ctx.moveTo(-radius, 0);
ctx.lineTo(radius, 0);
- ctx.closePath();
break;
case 'crossRot':
- ctx.beginPath();
xOffset = Math.cos(Math.PI / 4) * radius;
yOffset = Math.sin(Math.PI / 4) * radius;
ctx.moveTo(-xOffset, -yOffset);
ctx.lineTo(xOffset, yOffset);
ctx.moveTo(-xOffset, yOffset);
ctx.lineTo(xOffset, -yOffset);
- ctx.closePath();
break;
case 'star':
- ctx.beginPath();
ctx.moveTo(0, radius);
ctx.lineTo(0, -radius);
ctx.moveTo(-radius, 0);
ctx.lineTo(xOffset, yOffset);
ctx.moveTo(-xOffset, yOffset);
ctx.lineTo(xOffset, -yOffset);
- ctx.closePath();
break;
case 'line':
- ctx.beginPath();
ctx.moveTo(-radius, 0);
ctx.lineTo(radius, 0);
- ctx.closePath();
break;
case 'dash':
- ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(radius, 0);
- ctx.closePath();
break;
}
+ ctx.fill();
ctx.stroke();
ctx.restore();
},
helpers.drawRoundedRectangle = function(ctx) {
ctx.beginPath();
exports.roundedRect.apply(exports, arguments);
- ctx.closePath();
};
{name: 'lineTo', args: [15, 60]},
{name: 'arcTo', args: [10, 60, 10, 55, 5]},
{name: 'lineTo', args: [10, 25]},
- {name: 'arcTo', args: [10, 20, 15, 20, 5]}
+ {name: 'arcTo', args: [10, 20, 15, 20, 5]},
+ {name: 'closePath', args: []},
+ {name: 'moveTo', args: [10, 20]}
]);
});
it('should optimize path if radius is 0', function() {