|
|
@@ -614,10 +614,21 @@ namespace Avalonia.Skia
|
|
|
var end = linearGradient.EndPoint.ToPixels(targetSize).ToSKPoint();
|
|
|
|
|
|
// would be nice to cache these shaders possibly?
|
|
|
- using (var shader =
|
|
|
- SKShader.CreateLinearGradient(start, end, stopColors, stopOffsets, tileMode))
|
|
|
+ if (linearGradient.Transform is null)
|
|
|
{
|
|
|
- paintWrapper.Paint.Shader = shader;
|
|
|
+ using (var shader =
|
|
|
+ SKShader.CreateLinearGradient(start, end, stopColors, stopOffsets, tileMode))
|
|
|
+ {
|
|
|
+ paintWrapper.Paint.Shader = shader;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ using (var shader =
|
|
|
+ SKShader.CreateLinearGradient(start, end, stopColors, stopOffsets, tileMode, linearGradient.Transform.Value.ToSKMatrix()))
|
|
|
+ {
|
|
|
+ paintWrapper.Paint.Shader = shader;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
@@ -632,10 +643,21 @@ namespace Avalonia.Skia
|
|
|
if (origin.Equals(center))
|
|
|
{
|
|
|
// when the origin is the same as the center the Skia RadialGradient acts the same as D2D
|
|
|
- using (var shader =
|
|
|
- SKShader.CreateRadialGradient(center, radius, stopColors, stopOffsets, tileMode))
|
|
|
+ if (radialGradient.Transform is null)
|
|
|
{
|
|
|
- paintWrapper.Paint.Shader = shader;
|
|
|
+ using (var shader =
|
|
|
+ SKShader.CreateRadialGradient(center, radius, stopColors, stopOffsets, tileMode))
|
|
|
+ {
|
|
|
+ paintWrapper.Paint.Shader = shader;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ using (var shader =
|
|
|
+ SKShader.CreateRadialGradient(center, radius, stopColors, stopOffsets, tileMode, radialGradient.Transform.Value.ToSKMatrix()))
|
|
|
+ {
|
|
|
+ paintWrapper.Paint.Shader = shader;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
@@ -659,12 +681,25 @@ namespace Avalonia.Skia
|
|
|
}
|
|
|
|
|
|
// compose with a background colour of the final stop to match D2D's behaviour of filling with the final color
|
|
|
- using (var shader = SKShader.CreateCompose(
|
|
|
- SKShader.CreateColor(reversedColors[0]),
|
|
|
- SKShader.CreateTwoPointConicalGradient(center, radius, origin, 0, reversedColors, reversedStops, tileMode)
|
|
|
- ))
|
|
|
+ if (radialGradient.Transform is null)
|
|
|
{
|
|
|
- paintWrapper.Paint.Shader = shader;
|
|
|
+ using (var shader = SKShader.CreateCompose(
|
|
|
+ SKShader.CreateColor(reversedColors[0]),
|
|
|
+ SKShader.CreateTwoPointConicalGradient(center, radius, origin, 0, reversedColors, reversedStops, tileMode)
|
|
|
+ ))
|
|
|
+ {
|
|
|
+ paintWrapper.Paint.Shader = shader;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ using (var shader = SKShader.CreateCompose(
|
|
|
+ SKShader.CreateColor(reversedColors[0]),
|
|
|
+ SKShader.CreateTwoPointConicalGradient(center, radius, origin, 0, reversedColors, reversedStops, tileMode, radialGradient.Transform.Value.ToSKMatrix())
|
|
|
+ ))
|
|
|
+ {
|
|
|
+ paintWrapper.Paint.Shader = shader;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -679,6 +714,11 @@ namespace Avalonia.Skia
|
|
|
var angle = (float)(conicGradient.Angle - 90);
|
|
|
var rotation = SKMatrix.CreateRotationDegrees(angle, center.X, center.Y);
|
|
|
|
|
|
+ if (conicGradient.Transform is { })
|
|
|
+ {
|
|
|
+ rotation = rotation.PreConcat(conicGradient.Transform.Value.ToSKMatrix());
|
|
|
+ }
|
|
|
+
|
|
|
using (var shader =
|
|
|
SKShader.CreateSweepGradient(center, stopColors, stopOffsets, rotation))
|
|
|
{
|
|
|
@@ -751,6 +791,11 @@ namespace Avalonia.Skia
|
|
|
tileTransform,
|
|
|
SKMatrix.CreateScale((float)(96.0 / _dpi.X), (float)(96.0 / _dpi.Y)));
|
|
|
|
|
|
+ if (tileBrush.Transform is { })
|
|
|
+ {
|
|
|
+ paintTransform = paintTransform.PreConcat(tileBrush.Transform.Value.ToSKMatrix());
|
|
|
+ }
|
|
|
+
|
|
|
using (var shader = image.ToShader(tileX, tileY, paintTransform))
|
|
|
{
|
|
|
paintWrapper.Paint.Shader = shader;
|