Skip to content

Commit 9a94a62

Browse files
committed
Skia - Only reverse radial gradient stops if we cover the whole content bounds
1 parent 03f91a2 commit 9a94a62

File tree

4 files changed

+47
-16
lines changed

4 files changed

+47
-16
lines changed

src/Skia/Avalonia.Skia/DrawingContextImpl.cs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -964,34 +964,39 @@ private static void ConfigureGradientBrush(ref PaintWrapper paintWrapper, Rect t
964964
(originPoint.Y - centerPoint.Y) * radiusX / radiusY + centerPoint.Y);
965965

966966
var origin = originPoint.ToSKPoint();
967-
968-
// reverse the order of the stops to match D2D
969-
var reversedColors = new SKColor[stopColors.Length];
970-
Array.Copy(stopColors, reversedColors, stopColors.Length);
971-
Array.Reverse(reversedColors);
967+
968+
var endOffset = 0.0;
972969

973970
// and then reverse the reference point of the stops
974971
var reversedStops = new float[stopOffsets.Length];
975972
for (var i = 0; i < stopOffsets.Length; i++)
976973
{
977-
reversedStops[i] = stopOffsets[i];
974+
var offset = stopOffsets[i];
975+
976+
if (endOffset < offset)
977+
{
978+
endOffset = offset;
979+
}
980+
981+
reversedStops[i] = offset;
982+
978983
if (reversedStops[i] > 0 && reversedStops[i] < 1)
979984
{
980-
reversedStops[i] = Math.Abs(1 - stopOffsets[i]);
985+
reversedStops[i] = Math.Abs(1 - offset);
981986
}
982987
}
983988

984989
// compose with a background colour of the final stop to match D2D's behaviour of filling with the final color
985990
using (var shader = SKShader.CreateCompose(
986-
SKShader.CreateColor(reversedColors[0]),
987-
transform.HasValue
988-
? SKShader.CreateTwoPointConicalGradient(center, (float)radiusX, origin, 0,
989-
reversedColors, reversedStops, tileMode, transform.Value.ToSKMatrix())
990-
: SKShader.CreateTwoPointConicalGradient(center, (float)radiusX, origin, 0,
991-
reversedColors, reversedStops, tileMode)
992-
993-
)
994-
)
991+
SKShader.CreateColor(stopColors[0]),
992+
transform.HasValue
993+
? SKShader.CreateTwoPointConicalGradient(start, radiusStart, end, radiusEnd,
994+
stopColors, stopOffsets, tileMode, transform.Value.ToSKMatrix())
995+
: SKShader.CreateTwoPointConicalGradient(start, radiusStart, end, radiusEnd,
996+
stopColors, stopOffsets, tileMode)
997+
998+
)
999+
)
9951000
{
9961001
paintWrapper.Paint.Shader = shader;
9971002
}

tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,32 @@ public RadialGradientBrushTests() : base(@"Media\RadialGradientBrush")
1919
{
2020
}
2121

22+
[Fact]
23+
public async Task RadialGradientBrush_Partial_Cover()
24+
{
25+
Decorator target = new Decorator
26+
{
27+
Padding = new Thickness(8),
28+
Width = 200,
29+
Height = 200,
30+
Child = new Border
31+
{
32+
Background = new RadialGradientBrush
33+
{
34+
GradientStops =
35+
{
36+
new GradientStop { Color = Colors.White, Offset = 0 },
37+
new GradientStop { Color = Color.Parse("#00DD00"), Offset = 0.7 }
38+
},
39+
GradientOrigin = new RelativePoint(0.7, 0.15, RelativeUnit.Relative)
40+
}
41+
}
42+
};
43+
44+
await RenderToFile(target);
45+
CompareImages();
46+
}
47+
2248
[Fact]
2349
public async Task RadialGradientBrush_RedBlue()
2450
{
Loading

0 commit comments

Comments
 (0)