@@ -230,8 +230,11 @@ export default abstract class Shape extends Observable {
230
230
@percentLengthProperty ( { nonPaintProp : true } ) translateX : PercentLength = 0 ;
231
231
@percentLengthProperty ( { nonPaintProp : true } ) translateY : PercentLength = 0 ;
232
232
@numberProperty ( { nonPaintProp : true } ) rotate : number = 0 ;
233
+ @numberProperty ( { nonPaintProp : true } ) originX : number = 0 ;
234
+ @numberProperty ( { nonPaintProp : true } ) originY : number = 0 ;
233
235
@numberProperty ( { nonPaintProp : true } ) scaleX : number = 1 ;
234
236
@numberProperty ( { nonPaintProp : true } ) scaleY : number = 1 ;
237
+ @booleanProperty ( { nonPaintProp : true } ) ignorePadding : boolean = false ;
235
238
236
239
protected handleAlignment = false ;
237
240
@@ -260,28 +263,33 @@ export default abstract class Shape extends Observable {
260
263
dy += Utils . layout . toDeviceIndependentPixels ( PercentLength . toDevicePixels ( this . translateY , 0 , availableHeight ) ) ;
261
264
}
262
265
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
+ }
284
291
}
292
+
285
293
if ( this . horizontalAlignment === 'right' ) {
286
294
const sWidth = this . getWidth ( availableWidth , availableHeight ) ;
287
295
dx += width - sWidth ;
@@ -297,16 +305,13 @@ export default abstract class Shape extends Observable {
297
305
dy += height / 2 - sHeight / 2 ;
298
306
}
299
307
}
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 ) ;
303
311
}
304
312
if ( dx !== 0 || dy !== 0 ) {
305
313
canvas . translate ( dx , dy ) ;
306
314
}
307
- if ( this . rotate !== 0 ) {
308
- canvas . rotate ( this . rotate ) ;
309
- }
310
315
if ( this . scaleX !== 1 || this . scaleY !== 1 ) {
311
316
canvas . scale ( this . scaleX , this . scaleY ) ;
312
317
}
@@ -341,8 +346,6 @@ export default abstract class Shape extends Observable {
341
346
} else {
342
347
this . drawOnCanvas ( canvas , parent ) ;
343
348
}
344
- if ( needsSave ) {
345
- canvas . restore ( ) ;
346
- }
349
+ canvas . restore ( ) ;
347
350
}
348
351
}
0 commit comments