@@ -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