Browse Source

Make LinearGradientBrush work again.

With deferred renderer.
scenegraph-after-breakage
Steven Kirk 10 years ago
parent
commit
252bc9473e
  1. 4
      src/Avalonia.Visuals/Avalonia.Visuals.csproj
  2. 6
      src/Avalonia.Visuals/Media/GradientBrush.cs
  3. 21
      src/Avalonia.Visuals/Media/IGradientBrush.cs
  4. 18
      src/Avalonia.Visuals/Media/ILinearGradientBrush.cs
  5. 47
      src/Avalonia.Visuals/Media/Immutable/ImmutableGradientBrush.cs
  6. 51
      src/Avalonia.Visuals/Media/Immutable/ImmutableLinearGradientBrush.cs
  7. 10
      src/Avalonia.Visuals/Media/LinearGradientBrush.cs
  8. 2
      src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
  9. 2
      src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs
  10. 41
      tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject

4
src/Avalonia.Visuals/Avalonia.Visuals.csproj

@ -69,7 +69,11 @@
<Compile Include="Media\BrushMappingMode.cs" />
<Compile Include="Media\Color.cs" />
<Compile Include="Media\Colors.cs" />
<Compile Include="Media\IGradientBrush.cs" />
<Compile Include="Media\IImageBrush.cs" />
<Compile Include="Media\ILinearGradientBrush.cs" />
<Compile Include="Media\Immutable\ImmutableGradientBrush.cs" />
<Compile Include="Media\Immutable\ImmutableLinearGradientBrush.cs" />
<Compile Include="Media\Immutable\ImmutableTileBrush.cs" />
<Compile Include="Media\Immutable\ImmutableSolidColorBrush.cs" />
<Compile Include="Media\IMutableBrush.cs" />

6
src/Avalonia.Visuals/Media/GradientBrush.cs

@ -1,12 +1,13 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Collections.Generic;
using Avalonia.Metadata;
namespace Avalonia.Media
{
public abstract class GradientBrush : Brush
public abstract class GradientBrush : Brush, IGradientBrush
{
public static readonly StyledProperty<GradientSpreadMethod> SpreadMethodProperty =
AvaloniaProperty.Register<GradientBrush, GradientSpreadMethod>(nameof(SpreadMethod));
@ -25,11 +26,14 @@ namespace Avalonia.Media
set { SetValue(SpreadMethodProperty, value); }
}
// TODO: We shouldn't be returning a concrete List<> here
[Content]
public List<GradientStop> GradientStops
{
get { return GetValue(GradientStopsProperty); }
set { SetValue(GradientStopsProperty, value); }
}
IReadOnlyList<GradientStop> IGradientBrush.GradientStops => GradientStops;
}
}

21
src/Avalonia.Visuals/Media/IGradientBrush.cs

@ -0,0 +1,21 @@
using System.Collections.Generic;
namespace Avalonia.Media
{
/// <summary>
/// A brush that draws with a linear gradient.
/// </summary>
public interface IGradientBrush : IBrush
{
/// <summary>
/// Gets the brush's gradient stops.
/// </summary>
IReadOnlyList<GradientStop> GradientStops { get; }
/// <summary>
/// Gets the brush's spread method that defines how to draw a gradient that doesn't fill
/// the bounds of the destination control.
/// </summary>
GradientSpreadMethod SpreadMethod { get; }
}
}

18
src/Avalonia.Visuals/Media/ILinearGradientBrush.cs

@ -0,0 +1,18 @@
namespace Avalonia.Media
{
/// <summary>
/// A brush that draws with a linear gradient.
/// </summary>
public interface ILinearGradientBrush : IGradientBrush
{
/// <summary>
/// Gets or sets the start point for the gradient.
/// </summary>
RelativePoint StartPoint { get; }
/// <summary>
/// Gets or sets the end point for the gradient.
/// </summary>
RelativePoint EndPoint { get; }
}
}

47
src/Avalonia.Visuals/Media/Immutable/ImmutableGradientBrush.cs

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Avalonia.Media.Immutable
{
/// <summary>
/// A brush that draws with a gradient.
/// </summary>
public abstract class ImmutableGradientBrush : IGradientBrush
{
/// <summary>
/// Initializes a new instance of the <see cref="ImmutableGradientBrush"/> class.
/// </summary>
/// <param name="gradientStops">The gradient stops.</param>
/// <param name="opacity">The opacity of the brush.</param>
/// <param name="spreadMethod">The spread method.</param>
protected ImmutableGradientBrush(
IReadOnlyList<GradientStop> gradientStops,
double opacity,
GradientSpreadMethod spreadMethod)
{
GradientStops = gradientStops;
Opacity = opacity;
SpreadMethod = spreadMethod;
}
/// <summary>
/// Initializes a new instance of the <see cref="ImmutableGradientBrush"/> class.
/// </summary>
/// <param name="source">The brush from which this brush's properties should be copied.</param>
protected ImmutableGradientBrush(IGradientBrush source)
: this(source.GradientStops.ToList(), source.Opacity, source.SpreadMethod)
{
}
/// <inheritdoc/>
public IReadOnlyList<GradientStop> GradientStops { get; }
/// <inheritdoc/>
public double Opacity { get; }
/// <inheritdoc/>
public GradientSpreadMethod SpreadMethod { get; }
}
}

51
src/Avalonia.Visuals/Media/Immutable/ImmutableLinearGradientBrush.cs

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Avalonia.Media.Immutable
{
/// <summary>
/// A brush that draws with a linear gradient.
/// </summary>
public class ImmutableLinearGradientBrush : ImmutableGradientBrush, ILinearGradientBrush
{
/// <summary>
/// Initializes a new instance of the <see cref="ImmutableGradientBrush"/> class.
/// </summary>
/// <param name="gradientStops">The gradient stops.</param>
/// <param name="opacity">The opacity of the brush.</param>
/// <param name="spreadMethod">The spread method.</param>
/// <param name="startPoint">The start point for the gradient.</param>
/// <param name="endPoint">The end point for the gradient.</param>
public ImmutableLinearGradientBrush(
IReadOnlyList<GradientStop> gradientStops,
double opacity = 1,
GradientSpreadMethod spreadMethod = GradientSpreadMethod.Pad,
RelativePoint? startPoint = null,
RelativePoint? endPoint = null)
: base(gradientStops, opacity, spreadMethod)
{
StartPoint = startPoint ?? RelativePoint.TopLeft;
EndPoint = endPoint ?? RelativePoint.BottomRight;
}
/// <summary>
/// Initializes a new instance of the <see cref="ImmutableGradientBrush"/> class.
/// </summary>
/// <param name="source">The brush from which this brush's properties should be copied.</param>
public ImmutableLinearGradientBrush(ILinearGradientBrush source)
: base(source)
{
StartPoint = source.StartPoint;
EndPoint = source.EndPoint;
}
/// <inheritdoc/>
public RelativePoint StartPoint { get; }
/// <inheritdoc/>
public RelativePoint EndPoint { get; }
}
}

10
src/Avalonia.Visuals/Media/LinearGradientBrush.cs

@ -1,12 +1,14 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
namespace Avalonia.Media
{
/// <summary>
/// A brush that draws with a linear gradient.
/// </summary>
public sealed class LinearGradientBrush : GradientBrush
public sealed class LinearGradientBrush : GradientBrush, ILinearGradientBrush, IMutableBrush
{
/// <summary>
/// Defines the <see cref="StartPoint"/> property.
@ -41,5 +43,11 @@ namespace Avalonia.Media
get { return GetValue(EndPointProperty); }
set { SetValue(EndPointProperty, value); }
}
/// <inheritdoc/>
IBrush IMutableBrush.ToImmutable()
{
return new Immutable.ImmutableLinearGradientBrush(this);
}
}
}

2
src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs

@ -319,7 +319,7 @@ namespace Avalonia.Direct2D1.Media
public BrushImpl CreateBrush(IBrush brush, Size destinationSize)
{
var solidColorBrush = brush as Avalonia.Media.ISolidColorBrush;
var linearGradientBrush = brush as Avalonia.Media.LinearGradientBrush;
var linearGradientBrush = brush as Avalonia.Media.ILinearGradientBrush;
var radialGradientBrush = brush as Avalonia.Media.RadialGradientBrush;
var imageBrush = brush as Avalonia.Media.IImageBrush;
var visualBrush = brush as Avalonia.Media.IVisualBrush;

2
src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs

@ -8,7 +8,7 @@ namespace Avalonia.Direct2D1.Media
public class LinearGradientBrushImpl : BrushImpl
{
public LinearGradientBrushImpl(
Avalonia.Media.LinearGradientBrush brush,
Avalonia.Media.ILinearGradientBrush brush,
SharpDX.Direct2D1.RenderTarget target,
Size destinationSize)
{

41
tests/Avalonia.RenderTests/Avalonia.Direct2D1.RenderTests.v3.ncrunchproject

@ -1,47 +1,6 @@
<ProjectConfiguration>
<Settings>
<DefaultTestTimeout>1000</DefaultTestTimeout>
<IgnoredTests>
<NamedTestSelector>
<TestName>Avalonia.Direct2D1.RenderTests.Media.LinearGradientBrushTests.LinearGradientBrush_RedBlue_Vertical_Fill</TestName>
</NamedTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.Controls.BorderTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.Controls.ImageTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.GeometryClippingTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.Media.FormattedTextImplTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.OpacityMaskTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.Shapes.EllipseTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.Shapes.LineTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.Shapes.PathTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.Shapes.PolygonTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.Shapes.PolylineTests</FixtureName>
</FixtureTestSelector>
<FixtureTestSelector>
<FixtureName>Avalonia.Direct2D1.RenderTests.Shapes.RectangleTests</FixtureName>
</FixtureTestSelector>
<NamedTestSelector>
<TestName>Avalonia.Direct2D1.RenderTests.Media.LinearGradientBrushTests.LinearGradientBrush_RedBlue_Horizontal_Fill</TestName>
</NamedTestSelector>
</IgnoredTests>
<PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
</Settings>
</ProjectConfiguration>
Loading…
Cancel
Save