Skip to content
36 changes: 25 additions & 11 deletions src/core/p5.Renderer2D.js
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ class Renderer2D extends Renderer {
// Start a new path. Everything from here on out should become part of this
// one path so that we can clip to the whole thing.
this.clipPath = new Path2D();
this._clipBaseTransform = this.drawingContext.getTransform();

if (this._clipInvert) {
// Slight hack: draw a big rectangle over everything with reverse winding
Expand All @@ -330,7 +331,11 @@ class Renderer2D extends Renderer {
}

endClip() {
const savedTransform = this.drawingContext.getTransform();
this.drawingContext.setTransform(this._clipBaseTransform);
this.drawingContext.clip(this.clipPath);
this.drawingContext.setTransform(savedTransform);

this.clipPath = null;

super.endClip();
Expand Down Expand Up @@ -705,7 +710,7 @@ class Renderer2D extends Renderer {
}

ellipse(args) {
const ctx = this.clipPath || this.drawingContext;
const ctx = this.drawingContext;
const doFill = !!this.states.fillColor,
doStroke = this.states.strokeColor;
const x = parseFloat(args[0]),
Expand All @@ -725,17 +730,26 @@ class Renderer2D extends Renderer {
centerY = y + h / 2,
radiusX = w / 2,
radiusY = h / 2;
if (!this._clipping) ctx.beginPath();

ctx.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, 2 * Math.PI);
ctx.closePath();

if (!this._clipping && doFill) {
ctx.fill();
}
if (!this._clipping && doStroke) {
ctx.stroke();
if (this._clipping) {
const tempPath = new Path2D();
tempPath.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, 2 * Math.PI);
const currentTransform = this.drawingContext.getTransform();
const ClipBaseTransform = this._clipBaseTransform.inverse();
const relativeTransform = ClipBaseTransform.multiply(currentTransform);
this.clipPath.addPath(tempPath, relativeTransform);
} else {
ctx.beginPath();
ctx.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, 2 * Math.PI);
ctx.closePath();
if (doFill) {
ctx.fill();
}
if (doStroke) {
ctx.stroke();
}
}

return this;
}

line(x1, y1, x2, y2) {
Expand Down
Loading