@@ -319,10 +319,7 @@ static void ApplyRectangleContentCommon(
319
319
var height = size . InitialValue . Y ;
320
320
var trimOffsetDegrees = ( width / ( 2 * ( width + height ) ) ) * 360 ;
321
321
322
- // If offset is not animated then other computations for fill brush can be optimized.
323
- context . LayerContext . OriginOffset = size . IsAnimated ?
324
- new OriginOffsetContainer ( geometry , ExpressionFactory . GeometryHalfSize ) :
325
- new OriginOffsetContainer ( geometry , ConvertTo . Vector2 ( size . InitialValue / 2 ) ) ;
322
+ context . LayerContext . OriginOffset = GetOriginOffsetContainer ( geometry , size , position ) ;
326
323
327
324
Shapes . TranslateAndApplyShapeContextWithTrimOffset (
328
325
context ,
@@ -414,10 +411,7 @@ static void ApplyRectangleContentCommonXY(
414
411
var initialHeight = height . InitialValue ;
415
412
var trimOffsetDegrees = ( initialWidth / ( 2 * ( initialWidth + initialHeight ) ) ) * 360 ;
416
413
417
- // If offset is not animated then other computations for fill brush can be optimized.
418
- context . LayerContext . OriginOffset = width . IsAnimated || height . IsAnimated ?
419
- new OriginOffsetContainer ( geometry , ExpressionFactory . GeometryHalfSize ) :
420
- new OriginOffsetContainer ( geometry , ConvertTo . Vector2 ( width . InitialValue / 2 , height . InitialValue / 2 ) ) ;
414
+ context . LayerContext . OriginOffset = GetOriginOffsetContainerXY ( geometry , width , height , position ) ;
421
415
422
416
Shapes . TranslateAndApplyShapeContextWithTrimOffset (
423
417
context ,
@@ -429,6 +423,31 @@ static void ApplyRectangleContentCommonXY(
429
423
compositionRectangle . Geometry . SetDescription ( context , ( ) => $ "{ rectangle . Name } .RectangleGeometry") ;
430
424
}
431
425
426
+ static OriginOffsetContainer GetOriginOffsetContainer (
427
+ RectangleOrRoundedRectangleGeometry geometry ,
428
+ in TrimmedAnimatable < Vector3 > size ,
429
+ in TrimmedAnimatable < Vector3 > position )
430
+ {
431
+ // Note: Current implementation of Windows Composition API behaves differently for Rounded Rectangle and regular Rectangle geometry.
432
+ // In first case we need to offset the inner content (e.g. gradient) by position only, and in second case by position and half the size (total offset).
433
+ return size . IsAnimated || position . IsAnimated ?
434
+ new OriginOffsetContainer ( geometry , - ( geometry . IsRoundedRectangle ? ExpressionFactory . GeometryPosition : ExpressionFactory . GeometryOffset ) ) :
435
+ new OriginOffsetContainer ( geometry , - ( geometry . IsRoundedRectangle ? ConvertTo . Vector2 ( position . InitialValue ) : InitialOffset ( size , position ) ) ) ;
436
+ }
437
+
438
+ static OriginOffsetContainer GetOriginOffsetContainerXY (
439
+ RectangleOrRoundedRectangleGeometry geometry ,
440
+ in TrimmedAnimatable < double > width ,
441
+ in TrimmedAnimatable < double > height ,
442
+ in TrimmedAnimatable < Vector3 > position )
443
+ {
444
+ // Note: Current implementation of Windows Composition API behaves differently for Rounded Rectangle and regular Rectangle geometry.
445
+ // In first case we need to offset the inner content (e.g. gradient) by position only, and in second case by position and half the size (total offset).
446
+ return width . IsAnimated || height . IsAnimated || position . IsAnimated ?
447
+ new OriginOffsetContainer ( geometry , - ( geometry . IsRoundedRectangle ? ExpressionFactory . GeometryPosition : ExpressionFactory . GeometryOffset ) ) :
448
+ new OriginOffsetContainer ( geometry , - ( geometry . IsRoundedRectangle ? ConvertTo . Vector2 ( position . InitialValue ) : InitialOffset ( width , height , position ) ) ) ;
449
+ }
450
+
432
451
public static CanvasGeometry CreateWin2dRectangleGeometry (
433
452
ShapeContext context ,
434
453
Rectangle rectangle )
0 commit comments