Skip to content

Commit 2178c53

Browse files
committed
fix: shape save/restore canvas to ensure we dont polute other shapes
feat: ignorePadding option
1 parent 367f9f2 commit 2178c53

File tree

1 file changed

+33
-30
lines changed

1 file changed

+33
-30
lines changed

Diff for: src/shapes/shape.ts

+33-30
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,11 @@ export default abstract class Shape extends Observable {
230230
@percentLengthProperty({ nonPaintProp: true }) translateX: PercentLength = 0;
231231
@percentLengthProperty({ nonPaintProp: true }) translateY: PercentLength = 0;
232232
@numberProperty({ nonPaintProp: true }) rotate: number = 0;
233+
@numberProperty({ nonPaintProp: true }) originX: number = 0;
234+
@numberProperty({ nonPaintProp: true }) originY: number = 0;
233235
@numberProperty({ nonPaintProp: true }) scaleX: number = 1;
234236
@numberProperty({ nonPaintProp: true }) scaleY: number = 1;
237+
@booleanProperty({ nonPaintProp: true }) ignorePadding: boolean = false;
235238

236239
protected handleAlignment = false;
237240

@@ -260,28 +263,33 @@ export default abstract class Shape extends Observable {
260263
dy += Utils.layout.toDeviceIndependentPixels(PercentLength.toDevicePixels(this.translateY, 0, availableHeight));
261264
}
262265
if (!this.handleAlignment) {
263-
const paddingLeft = Utils.layout.toDeviceIndependentPixels(
264-
parent.effectivePaddingLeft + PercentLength.toDevicePixels(this.paddingLeft, 0, availableWidth) + parent.effectiveBorderLeftWidth
265-
);
266-
const paddingRight = Utils.layout.toDeviceIndependentPixels(
267-
parent.effectivePaddingRight + PercentLength.toDevicePixels(this.paddingRight, 0, availableWidth) + parent.effectiveBorderRightWidth
268-
);
269-
const paddingTop = Utils.layout.toDeviceIndependentPixels(parent.effectivePaddingTop + PercentLength.toDevicePixels(this.paddingTop, 0, availableHeight) + parent.effectiveBorderTopWidth);
270-
const paddingBottom = Utils.layout.toDeviceIndependentPixels(
271-
parent.effectivePaddingBottom + PercentLength.toDevicePixels(this.paddingBottom, 0, availableHeight) + parent.effectiveBorderBottomWidth
272-
);
273-
if (paddingLeft > 0) {
274-
dx += paddingLeft;
275-
}
276-
if (this.horizontalAlignment && this.horizontalAlignment !== 'left' && paddingRight > 0) {
277-
dx -= paddingRight;
278-
}
279-
if (paddingTop > 0) {
280-
dy += paddingTop;
281-
}
282-
if (this.verticalAlignment && this.verticalAlignment !== 'top' && paddingBottom > 0) {
283-
dy -= paddingBottom;
266+
if (!this.ignorePadding) {
267+
const paddingLeft = Utils.layout.toDeviceIndependentPixels(
268+
parent.effectivePaddingLeft + PercentLength.toDevicePixels(this.paddingLeft, 0, availableWidth) + parent.effectiveBorderLeftWidth
269+
);
270+
const paddingRight = Utils.layout.toDeviceIndependentPixels(
271+
parent.effectivePaddingRight + PercentLength.toDevicePixels(this.paddingRight, 0, availableWidth) + parent.effectiveBorderRightWidth
272+
);
273+
const paddingTop = Utils.layout.toDeviceIndependentPixels(
274+
parent.effectivePaddingTop + PercentLength.toDevicePixels(this.paddingTop, 0, availableHeight) + parent.effectiveBorderTopWidth
275+
);
276+
const paddingBottom = Utils.layout.toDeviceIndependentPixels(
277+
parent.effectivePaddingBottom + PercentLength.toDevicePixels(this.paddingBottom, 0, availableHeight) + parent.effectiveBorderBottomWidth
278+
);
279+
if (paddingLeft > 0) {
280+
dx += paddingLeft;
281+
}
282+
if (this.horizontalAlignment && this.horizontalAlignment !== 'left' && paddingRight > 0) {
283+
dx -= paddingRight;
284+
}
285+
if (paddingTop > 0) {
286+
dy += paddingTop;
287+
}
288+
if (this.verticalAlignment && this.verticalAlignment !== 'top' && paddingBottom > 0) {
289+
dy -= paddingBottom;
290+
}
284291
}
292+
285293
if (this.horizontalAlignment === 'right') {
286294
const sWidth = this.getWidth(availableWidth, availableHeight);
287295
dx += width - sWidth;
@@ -297,16 +305,13 @@ export default abstract class Shape extends Observable {
297305
dy += height / 2 - sHeight / 2;
298306
}
299307
}
300-
const needsSave = dx !== 0 || dy !== 0 || this.rotate !== 0;
301-
if (needsSave) {
302-
canvas.save();
308+
canvas.save();
309+
if (this.rotate !== 0) {
310+
canvas.rotate(this.rotate, this.originX, this.originY);
303311
}
304312
if (dx !== 0 || dy !== 0) {
305313
canvas.translate(dx, dy);
306314
}
307-
if (this.rotate !== 0) {
308-
canvas.rotate(this.rotate);
309-
}
310315
if (this.scaleX !== 1 || this.scaleY !== 1) {
311316
canvas.scale(this.scaleX, this.scaleY);
312317
}
@@ -341,8 +346,6 @@ export default abstract class Shape extends Observable {
341346
} else {
342347
this.drawOnCanvas(canvas, parent);
343348
}
344-
if (needsSave) {
345-
canvas.restore();
346-
}
349+
canvas.restore();
347350
}
348351
}

0 commit comments

Comments
 (0)