Skip to content

Commit a633fa9

Browse files
committed
fix: ImageBrush RenderTransform does not throw
1 parent 00a3180 commit a633fa9

File tree

6 files changed

+52
-37
lines changed

6 files changed

+52
-37
lines changed

src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/GradientBrushTests/GradientsPage.xaml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@
281281
</Border.BorderBrush>
282282
</Border>
283283
</StackPanel>
284-
<TextBlock FontSize="15">Linear Gradient as Border with relative transform</TextBlock>
284+
<TextBlock FontSize="15">Linear Gradient as Border with relative transform / with single stop</TextBlock>
285285
<StackPanel Orientation="Horizontal" Spacing="10">
286286
<Border Width="100" Height="100" BorderThickness="40" CornerRadius="8">
287287
<Border.BorderBrush>
@@ -296,6 +296,15 @@
296296
</LinearGradientBrush>
297297
</Border.BorderBrush>
298298
</Border>
299+
<Border Width="100" Height="100" BorderThickness="40" CornerRadius="8">
300+
<Border.BorderBrush>
301+
<LinearGradientBrush MappingMode="Absolute" StartPoint="0,0" EndPoint="0,40">
302+
<LinearGradientBrush.GradientStops>
303+
<GradientStop Color="Red" Offset="0.5" />
304+
</LinearGradientBrush.GradientStops>
305+
</LinearGradientBrush>
306+
</Border.BorderBrush>
307+
</Border>
299308
</StackPanel>
300309
<TextBlock FontSize="15">Text with Radial/Linear gradient as foreground brush (fallback=green)</TextBlock>
301310
<StackPanel Orientation="Horizontal" Spacing="10">

src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/ImageBrushTests/ImageBrushWithRotateTransform.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<DataTemplate>
2121
<Border Width="150" Height="200">
2222
<Border.Background>
23-
<ImageBrush ImageSource="http://homepages.cae.wisc.edu/~ece533/images/fruits.png"
23+
<ImageBrush ImageSource="ms-appx:///Assets/ingredient2.png"
2424
Stretch="UniformToFill">
2525
<ImageBrush.RelativeTransform>
2626
<RotateTransform Angle="45" CenterX=".5" CenterY=".5"/>
@@ -31,4 +31,4 @@
3131
</DataTemplate>
3232
</controls:SampleControl.SampleContent>
3333
</controls:SampleControl>
34-
</UserControl>
34+
</UserControl>

src/SamplesApp/UITests.Shared/Windows_UI_Xaml_Media/ImageBrushTests/ImageBrushWithScaleTransform.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<Grid>
2222
<Border Width="150" Height="200">
2323
<Border.Background>
24-
<ImageBrush ImageSource="http://homepages.cae.wisc.edu/~ece533/images/fruits.png"
24+
<ImageBrush ImageSource="ms-appx:///Assets/ingredient2.png"
2525
Stretch="UniformToFill">
2626
<ImageBrush.RelativeTransform>
2727
<ScaleTransform ScaleX="1.5" ScaleY="1.5" CenterX=".5" CenterY=".5"/>
@@ -33,4 +33,4 @@
3333
</DataTemplate>
3434
</controls:SampleControl.SampleContent>
3535
</controls:SampleControl>
36-
</UserControl>
36+
</UserControl>

src/Uno.UI/UI/Xaml/Media/ImageBrush.Android.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ private Android.Graphics.Matrix GenerateMatrix(Windows.Foundation.Rect drawRect,
225225

226226
matrix.SetRectToRect(sourceRect.ToRectF(), destinationRect.ToRectF(), Android.Graphics.Matrix.ScaleToFit.Fill);
227227

228-
RelativeTransform?.ToNativeMatrix(matrix, size: new Size(drawRect.Width, drawRect.Height));
228+
RelativeTransform?.ToNativeMatrix(matrix, size: new Size(sourceRect.Width, sourceRect.Height));
229229
return matrix;
230230
}
231231

src/Uno.UI/UI/Xaml/Media/LinearGradientBrush.Android.cs

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,48 +10,54 @@ public partial class LinearGradientBrush
1010
{
1111
protected internal override Shader GetShader(Rect destinationRect)
1212
{
13-
// Android LinearGradient requires two ore more stop points.
14-
//TODO: If there is only one - we should use solid color brush here
15-
if (GradientStops.Count >= 2)
13+
if (GradientStops.Count == 0)
1614
{
17-
var colors = GradientStops.SelectToArray(s => ((Android.Graphics.Color)s.Color).ToArgb());
18-
var locations = GradientStops.SelectToArray(s => (float)s.Offset);
15+
return null;
16+
}
1917

20-
var width = destinationRect.Width;
21-
var height = destinationRect.Height;
18+
var colors = GradientStops.SelectToList(s => ((Android.Graphics.Color)s.Color).ToArgb());
19+
var locations = GradientStops.SelectToList(s => (float)s.Offset);
2220

23-
Android.Graphics.Matrix nativeTransformMatrix = null;
24-
if (RelativeTransform != null)
25-
{
26-
var matrix = RelativeTransform.ToMatrix(Foundation.Point.Zero, new Windows.Foundation.Size(width, height));
27-
matrix.M31 *= (float)width;
28-
matrix.M32 *= (float)height;
29-
nativeTransformMatrix = matrix.ToNative();
30-
}
21+
if (GradientStops.Count == 1)
22+
{
23+
// Android LinearGradient requires two ore more stop points.
24+
// We work around this by duplicating the first gradient stop.
25+
colors.Add(colors[0]);
26+
locations.Add(locations[0]);
27+
}
28+
29+
var width = destinationRect.Width;
30+
var height = destinationRect.Height;
31+
32+
Android.Graphics.Matrix nativeTransformMatrix = null;
33+
if (RelativeTransform != null)
34+
{
35+
var matrix = RelativeTransform.ToMatrix(Foundation.Point.Zero, new Windows.Foundation.Size(width, height));
36+
matrix.M31 *= (float)width;
37+
matrix.M32 *= (float)height;
38+
nativeTransformMatrix = matrix.ToNative();
39+
}
3140

32-
//Matrix .MapPoints takes an array of floats
33-
var pts = MappingMode == BrushMappingMode.RelativeToBoundingBox
34-
? new[]
35-
{
41+
//Matrix .MapPoints takes an array of floats
42+
var pts = MappingMode == BrushMappingMode.RelativeToBoundingBox
43+
? new[]
44+
{
3645
(float) (StartPoint.X * width),
3746
(float) (StartPoint.Y * height),
3847
(float) (EndPoint.X * width),
3948
(float) (EndPoint.Y * height)
40-
}
41-
: new[]
42-
{
49+
}
50+
: new[]
51+
{
4352
(float) ViewHelper.LogicalToPhysicalPixels(StartPoint.X),
4453
(float) ViewHelper.LogicalToPhysicalPixels(StartPoint.Y),
4554
(float) ViewHelper.LogicalToPhysicalPixels(EndPoint.X),
4655
(float) ViewHelper.LogicalToPhysicalPixels(EndPoint.Y)
47-
};
48-
49-
nativeTransformMatrix?.MapPoints(pts);
50-
nativeTransformMatrix?.Dispose();
51-
return new LinearGradient(pts[0], pts[1], pts[2], pts[3], colors, locations, Shader.TileMode.Clamp);
52-
}
56+
};
5357

54-
return null;
58+
nativeTransformMatrix?.MapPoints(pts);
59+
nativeTransformMatrix?.Dispose();
60+
return new LinearGradient(pts[0], pts[1], pts[2], pts[3], colors.ToArray(), locations.ToArray(), Shader.TileMode.Clamp);
5561
}
5662
}
5763
}

src/Uno.UI/UI/Xaml/Media/Transform.Android.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ public partial class Transform
2323

2424
targetMatrix.SetValues(new[]
2525
{
26-
matrix.M11, matrix.M21, matrix.M31,
27-
matrix.M12, matrix.M22, matrix.M32,
26+
matrix.M11, matrix.M21, matrix.M31 * (float)size.Width,
27+
matrix.M12, matrix.M22, matrix.M32 * (float)size.Height,
2828
0, 0, 1
2929
});
3030

0 commit comments

Comments
 (0)