Browse Source

Merge remote-tracking branch 'origin/master' into scenegraph

Conflicts:
	src/Avalonia.Visuals/Media/GradientBrush.cs
	src/Avalonia.Visuals/Media/IGradientBrush.cs
	src/Avalonia.Visuals/Media/IRadialGradientBrush.cs
	src/Avalonia.Visuals/Media/ImageBrush.cs
	src/Avalonia.Visuals/Media/LinearGradientBrush.cs
	src/Avalonia.Visuals/Media/RadialGradientBrush.cs
	src/Avalonia.Visuals/Media/VisualBrush.cs
	src/Gtk/Avalonia.Cairo/Media/DrawingContext.cs
	src/Gtk/Avalonia.Cairo/Media/ImageBrushImpl.cs
	src/Gtk/Avalonia.Cairo/Media/LinearGradientBrushImpl.cs
	src/Gtk/Avalonia.Cairo/Media/RadialGradientBrushImpl.cs
	src/Gtk/Avalonia.Cairo/Media/TileBrushes.cs
	src/Gtk/Avalonia.Cairo/Media/VisualBrushImpl.cs
	src/Skia/Avalonia.Skia/DrawingContextImpl.cs
	src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
	src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs
	src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs
	src/Windows/Avalonia.Direct2D1/Media/TileBrushImpl.cs
scenegraph-after-breakage
Steven Kirk 9 years ago
parent
commit
e0ef467ea5
  1. 2
      src/Avalonia.HtmlRenderer/Adapters/AvaloniaAdapter.cs
  2. 2
      src/Avalonia.Visuals/Avalonia.Visuals.csproj
  3. 26
      src/Avalonia.Visuals/Media/GradientBrush.cs
  4. 2
      src/Avalonia.Visuals/Media/IGradientBrush.cs
  5. 3
      src/Avalonia.Visuals/Media/IRadialGradientBrush.cs
  6. 0
      src/Avalonia.Visuals/Media/ImageBrush.cs
  7. 15
      src/Avalonia.Visuals/Media/Imaging/IImageBrush.cs
  8. 6
      src/Avalonia.Visuals/Media/RadialGradientBrush.cs
  9. 1
      src/Gtk/Avalonia.Cairo/Media/ImageBrushImpl.cs
  10. 3
      src/Gtk/Avalonia.Cairo/Media/LinearGradientBrushImpl.cs
  11. 3
      src/Gtk/Avalonia.Cairo/Media/RadialGradientBrushImpl.cs
  12. 55
      src/Gtk/Avalonia.Cairo/Media/TileBrushes.cs
  13. 15
      src/Gtk/Avalonia.Cairo/Media/VisualBrushImpl.cs
  14. 2
      src/Shared/RenderHelpers/TileBrushImplHelper.cs
  15. 10
      src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
  16. 3
      src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs
  17. 3
      src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs
  18. 78
      src/Windows/Avalonia.Direct2D1/Media/TileBrushImpl.cs
  19. 4
      tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs
  20. 2
      tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs

2
src/Avalonia.HtmlRenderer/Adapters/AvaloniaAdapter.cs

@ -80,7 +80,7 @@ namespace TheArtOfDev.HtmlRenderer.Avalonia.Adapters
{
StartPoint = new RelativePoint(x, y, RelativeUnit.Relative),
EndPoint = new RelativePoint(1 - x, 1 - y, RelativeUnit.Relative),
GradientStops =
GradientStops = new[]
{
new GradientStop(startColor, 0),
new GradientStop(endColor, 1)

2
src/Avalonia.Visuals/Avalonia.Visuals.csproj

@ -181,7 +181,7 @@
<Compile Include="Media\TextHitTestResult.cs" />
<Compile Include="Media\Transform.cs" />
<Compile Include="Media\TileBrush.cs" />
<Compile Include="Media\ImageBush.cs" />
<Compile Include="Media\ImageBrush.cs" />
<Compile Include="Media\VisualBrush.cs" />
<Compile Include="Platform\IPlatformSettings.cs" />
<Compile Include="Platform\IFormattedTextImpl.cs" />

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

@ -7,28 +7,46 @@ using Avalonia.Metadata;
namespace Avalonia.Media
{
/// <summary>
/// Base class for brushes that draw with a gradient.
/// </summary>
public abstract class GradientBrush : Brush, IGradientBrush
{
/// <summary>
/// Defines the <see cref="SpreadMethod"/> property.
/// </summary>
public static readonly StyledProperty<GradientSpreadMethod> SpreadMethodProperty =
AvaloniaProperty.Register<GradientBrush, GradientSpreadMethod>(nameof(SpreadMethod));
public static readonly StyledProperty<List<GradientStop>> GradientStopsProperty =
AvaloniaProperty.Register<GradientBrush, List<GradientStop>>(nameof(Opacity));
/// <summary>
/// Defines the <see cref="GradientStops"/> property.
/// </summary>
public static readonly StyledProperty<IReadOnlyList<GradientStop>> GradientStopsProperty =
AvaloniaProperty.Register<GradientBrush, IReadOnlyList<GradientStop>>(nameof(Opacity));
/// <summary>
/// Initializes a new instance of the <see cref="GradientBrush"/> class.
/// </summary>
public GradientBrush()
{
this.GradientStops = new List<GradientStop>();
}
/// <summary>
/// Gets or sets the brush's spread method that defines how to draw a gradient that
/// doesn't fill the bounds of the destination control.
/// </summary>
public GradientSpreadMethod SpreadMethod
{
get { return GetValue(SpreadMethodProperty); }
set { SetValue(SpreadMethodProperty, value); }
}
// TODO: We shouldn't be returning a concrete List<> here
/// <summary>
/// Gets or sets the brush's gradient stops.
/// </summary>
[Content]
public List<GradientStop> GradientStops
public IReadOnlyList<GradientStop> GradientStops
{
get { return GetValue(GradientStopsProperty); }
set { SetValue(GradientStopsProperty, value); }

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

@ -3,7 +3,7 @@
namespace Avalonia.Media
{
/// <summary>
/// A brush that draws with a linear gradient.
/// A brush that draws with a gradient.
/// </summary>
public interface IGradientBrush : IBrush
{

3
src/Avalonia.Visuals/Media/IRadialGradientBrush.cs

@ -11,7 +11,8 @@
RelativePoint Center { get; }
/// <summary>
/// Gets the location of the two-dimensional focal point that defines the beginning of the gradient.
/// Gets the location of the two-dimensional focal point that defines the beginning of the
/// gradient.
/// </summary>
RelativePoint GradientOrigin { get; }

0
src/Avalonia.Visuals/Media/ImageBush.cs → src/Avalonia.Visuals/Media/ImageBrush.cs

15
src/Avalonia.Visuals/Media/Imaging/IImageBrush.cs

@ -0,0 +1,15 @@
using Avalonia.Media.Imaging;
namespace Avalonia.Media
{
/// <summary>
/// Paints an area with an <see cref="IBitmap"/>.
/// </summary>
public interface IImageBrush : ITileBrush
{
/// <summary>
/// Gets the image to draw.
/// </summary>
IBitmap Source { get; }
}
}

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

@ -44,7 +44,8 @@ namespace Avalonia.Media
}
/// <summary>
/// Gets or sets the location of the two-dimensional focal point that defines the beginning of the gradient.
/// Gets or sets the location of the two-dimensional focal point that defines the beginning
/// of the gradient.
/// </summary>
public RelativePoint GradientOrigin
{
@ -53,7 +54,8 @@ namespace Avalonia.Media
}
/// <summary>
/// Gets or sets the horizontal and vertical radius of the outermost circle of the radial gradient.
/// Gets or sets the horizontal and vertical radius of the outermost circle of the radial
/// gradient.
/// </summary>
// TODO: This appears to always be relative so should use a RelativeSize struct or something.
public double Radius

1
src/Gtk/Avalonia.Cairo/Media/ImageBrushImpl.cs

@ -4,6 +4,7 @@ using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Rendering.Utilities;
using Gdk;
using Avalonia.Media;
using global::Cairo;
namespace Avalonia.Cairo.Media

3
src/Gtk/Avalonia.Cairo/Media/LinearGradientBrushImpl.cs

@ -1,11 +1,12 @@
using System;
using Avalonia.Media;
using global::Cairo;
namespace Avalonia.Cairo
{
public class LinearGradientBrushImpl : BrushImpl
{
public LinearGradientBrushImpl(Avalonia.Media.ILinearGradientBrush brush, Size destinationSize)
public LinearGradientBrushImpl(ILinearGradientBrush brush, Size destinationSize)
{
var start = brush.StartPoint.ToPixels(destinationSize);
var end = brush.EndPoint.ToPixels(destinationSize);

3
src/Gtk/Avalonia.Cairo/Media/RadialGradientBrushImpl.cs

@ -1,11 +1,12 @@
using System;
using Avalonia.Media;
using global::Cairo;
namespace Avalonia.Cairo
{
public class RadialGradientBrushImpl : BrushImpl
{
public RadialGradientBrushImpl(Avalonia.Media.IRadialGradientBrush brush, Size destinationSize)
public RadialGradientBrushImpl(IRadialGradientBrush brush, Size destinationSize)
{
var center = brush.Center.ToPixels(destinationSize);
var gradientOrigin = brush.GradientOrigin.ToPixels(destinationSize);

55
src/Gtk/Avalonia.Cairo/Media/TileBrushes.cs

@ -0,0 +1,55 @@
// 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 Cairo;
using Avalonia.Cairo.Media.Imaging;
using Avalonia.Layout;
using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Rendering;
using Avalonia.RenderHelpers;
namespace Avalonia.Cairo.Media
{
internal static class TileBrushes
{
public static SurfacePattern CreateTileBrush(ITileBrush brush, Size targetSize)
{
var helper = new TileBrushImplHelper(brush, targetSize);
if (!helper.IsValid)
return null;
using (var intermediate = new ImageSurface(Format.ARGB32, (int)helper.IntermediateSize.Width, (int)helper.IntermediateSize.Height))
using (var ctx = new RenderTarget(intermediate).CreateDrawingContext())
{
helper.DrawIntermediate(ctx);
var result = new SurfacePattern(intermediate);
if ((brush.TileMode & TileMode.FlipXY) != 0)
{
// TODO: Currently always FlipXY as that's all cairo supports natively.
// Support separate FlipX and FlipY by drawing flipped images to intermediate
// surface.
result.Extend = Extend.Reflect;
}
else
{
result.Extend = Extend.Repeat;
}
if (brush.TileMode != TileMode.None)
{
var matrix = result.Matrix;
matrix.InitTranslate(-helper.DestinationRect.X, -helper.DestinationRect.Y);
result.Matrix = matrix;
}
return result;
}
}
}
}

15
src/Gtk/Avalonia.Cairo/Media/VisualBrushImpl.cs

@ -0,0 +1,15 @@
using System;
using Avalonia.Media;
using global::Cairo;
namespace Avalonia.Cairo.Media
{
public class VisualBrushImpl : BrushImpl
{
public VisualBrushImpl(IVisualBrush brush, Size destinationSize)
{
this.PlatformBrush = TileBrushes.CreateTileBrush(brush, destinationSize);
}
}
}

2
src/Shared/RenderHelpers/TileBrushImplHelper.cs

@ -105,7 +105,7 @@ namespace Avalonia.RenderHelpers
/// <summary>
/// Calculates a translate based on a <see cref="TileBrush"/>, a source and destination
/// Calculates a translate based on an <see cref="ITileBrush"/>, a source and destination
/// rectangle and a scale.
/// </summary>
/// <param name="brush">The brush.</param>

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

@ -341,11 +341,11 @@ namespace Avalonia.Direct2D1.Media
/// <returns>The Direct2D brush wrapper.</returns>
public BrushImpl CreateBrush(IBrush brush, Size destinationSize)
{
var solidColorBrush = brush as Avalonia.Media.ISolidColorBrush;
var linearGradientBrush = brush as Avalonia.Media.ILinearGradientBrush;
var radialGradientBrush = brush as Avalonia.Media.IRadialGradientBrush;
var imageBrush = brush as Avalonia.Media.IImageBrush;
var visualBrush = brush as Avalonia.Media.IVisualBrush;
var solidColorBrush = brush as ISolidColorBrush;
var linearGradientBrush = brush as ILinearGradientBrush;
var radialGradientBrush = brush as IRadialGradientBrush;
var imageBrush = brush as IImageBrush;
var visualBrush = brush as IVisualBrush;
if (solidColorBrush != null)
{

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

@ -2,13 +2,14 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Linq;
using Avalonia.Media;
namespace Avalonia.Direct2D1.Media
{
public class LinearGradientBrushImpl : BrushImpl
{
public LinearGradientBrushImpl(
Avalonia.Media.ILinearGradientBrush brush,
ILinearGradientBrush brush,
SharpDX.Direct2D1.RenderTarget target,
Size destinationSize)
{

3
src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs

@ -2,13 +2,14 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Linq;
using Avalonia.Media;
namespace Avalonia.Direct2D1.Media
{
public class RadialGradientBrushImpl : BrushImpl
{
public RadialGradientBrushImpl(
Avalonia.Media.IRadialGradientBrush brush,
IRadialGradientBrush brush,
SharpDX.Direct2D1.RenderTarget target,
Size destinationSize)
{

78
src/Windows/Avalonia.Direct2D1/Media/TileBrushImpl.cs

@ -0,0 +1,78 @@
// 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 Avalonia.Media;
using Avalonia.RenderHelpers;
using SharpDX.Direct2D1;
namespace Avalonia.Direct2D1.Media
{
public sealed class TileBrushImpl : BrushImpl
{
public TileBrushImpl(
ITileBrush brush,
SharpDX.Direct2D1.RenderTarget target,
Size targetSize)
{
var helper = new TileBrushImplHelper(brush, targetSize);
if (!helper.IsValid)
return;
using (var intermediate = new BitmapRenderTarget(target, CompatibleRenderTargetOptions.None, helper.IntermediateSize.ToSharpDX()))
{
using (var ctx = new RenderTarget(intermediate).CreateDrawingContext())
{
intermediate.Clear(null);
helper.DrawIntermediate(ctx);
}
PlatformBrush = new BitmapBrush(
target,
intermediate.Bitmap,
GetBitmapBrushProperties(brush),
GetBrushProperties(brush, helper.DestinationRect));
}
}
private static BrushProperties GetBrushProperties(ITileBrush brush, Rect destinationRect)
{
var tileTransform =
brush.TileMode != TileMode.None ?
Matrix.CreateTranslation(destinationRect.X, destinationRect.Y) :
Matrix.Identity;
return new BrushProperties
{
Opacity = (float)brush.Opacity,
Transform = tileTransform.ToDirect2D(),
};
}
private static BitmapBrushProperties GetBitmapBrushProperties(ITileBrush brush)
{
var tileMode = brush.TileMode;
return new BitmapBrushProperties
{
ExtendModeX = GetExtendModeX(tileMode),
ExtendModeY = GetExtendModeY(tileMode),
};
}
private static ExtendMode GetExtendModeX(TileMode tileMode)
{
return (tileMode & TileMode.FlipX) != 0 ? ExtendMode.Mirror : ExtendMode.Wrap;
}
private static ExtendMode GetExtendModeY(TileMode tileMode)
{
return (tileMode & TileMode.FlipY) != 0 ? ExtendMode.Mirror : ExtendMode.Wrap;
}
public override void Dispose()
{
((BitmapBrush)PlatformBrush)?.Bitmap.Dispose();
base.Dispose();
}
}
}

4
tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs

@ -42,7 +42,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media
{
StartPoint = new RelativePoint(0, 0.5, RelativeUnit.Relative),
EndPoint = new RelativePoint(1, 0.5, RelativeUnit.Relative),
GradientStops =
GradientStops = new[]
{
new GradientStop { Color = Colors.Red, Offset = 0 },
new GradientStop { Color = Colors.Blue, Offset = 1 }
@ -73,7 +73,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media
{
StartPoint = new RelativePoint(0.5, 0, RelativeUnit.Relative),
EndPoint = new RelativePoint(0.5, 1, RelativeUnit.Relative),
GradientStops =
GradientStops = new[]
{
new GradientStop { Color = Colors.Red, Offset = 0 },
new GradientStop { Color = Colors.Blue, Offset = 1 }

2
tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs

@ -40,7 +40,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media
{
Background = new RadialGradientBrush
{
GradientStops =
GradientStops = new[]
{
new GradientStop { Color = Colors.Red, Offset = 0 },
new GradientStop { Color = Colors.Blue, Offset = 1 }

Loading…
Cancel
Save