Browse Source

More work on VisualBrush, not entirely correct yet.

pull/111/head
Steven Kirk 11 years ago
parent
commit
a1ee3efab8
  1. 35
      src/Perspex.Controls/Image.cs
  2. 29
      src/Perspex.SceneGraph/Media/AlignmentX.cs
  3. 29
      src/Perspex.SceneGraph/Media/AlignmentY.cs
  4. 47
      src/Perspex.SceneGraph/Media/MediaExtensions.cs
  5. 90
      src/Perspex.SceneGraph/Media/TileBrush.cs
  6. 18
      src/Perspex.SceneGraph/Media/VisualBrush.cs
  7. 5
      src/Perspex.SceneGraph/Perspex.SceneGraph.csproj
  8. 105
      src/Perspex.SceneGraph/RelativeRect.cs
  9. 15
      src/Perspex.SceneGraph/Rendering/RendererBase.cs
  10. 32
      src/Windows/Perspex.Direct2D1/Media/DrawingContext.cs
  11. 4
      src/Windows/Perspex.Direct2D1/Media/PerspexTextRenderer.cs
  12. 120
      tests/Perspex.RenderTests/Brushes/VisualBrushTests.cs
  13. 1
      tests/Perspex.RenderTests/Perspex.Direct2D1.RenderTests.csproj

35
src/Perspex.Controls/Image.cs

@ -57,7 +57,7 @@ namespace Perspex.Controls
{
Rect viewPort = new Rect(this.Bounds.Size);
Size sourceSize = new Size(source.PixelWidth, source.PixelHeight);
Vector scale = CalculateScaling(this.Bounds.Size, sourceSize, this.Stretch);
Vector scale = this.Stretch.CalculateScaling(this.Bounds.Size, sourceSize);
Size scaledSize = sourceSize * scale;
Rect destRect = viewPort
.CenterIn(new Rect(scaledSize))
@ -95,41 +95,10 @@ namespace Perspex.Controls
availableSize = new Size(availableSize.Width, this.Height);
}
scale = CalculateScaling(availableSize, new Size(width, height), this.Stretch);
scale = this.Stretch.CalculateScaling(availableSize, new Size(width, height));
}
return new Size(width * scale.X, height * scale.Y);
}
/// <summary>
/// Calculates the scaling for the image.
/// </summary>
/// <param name="availableSize">The size available to display the image.</param>
/// <param name="imageSize">The pxiel size of the image.</param>
/// <param name="stretch">The stretch mode of the control.</param>
/// <returns>A vector with the X and Y scaling factors.</returns>
private static Vector CalculateScaling(Size availableSize, Size imageSize, Stretch stretch)
{
double scaleX = 1;
double scaleY = 1;
if (stretch != Stretch.None)
{
scaleX = availableSize.Width / imageSize.Width;
scaleY = availableSize.Height / imageSize.Height;
switch (stretch)
{
case Stretch.Uniform:
scaleX = scaleY = Math.Min(scaleX, scaleY);
break;
case Stretch.UniformToFill:
scaleX = scaleY = Math.Max(scaleX, scaleY);
break;
}
}
return new Vector(scaleX, scaleY);
}
}
}

29
src/Perspex.SceneGraph/Media/AlignmentX.cs

@ -0,0 +1,29 @@
// -----------------------------------------------------------------------
// <copyright file="AlignmentX.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Media
{
/// <summary>
/// Describes how content is positioned horizontally in a container.
/// </summary>
public enum AlignmentX
{
/// <summary>
/// The contents align themselves with the left of the container
/// </summary>
Left,
/// <summary>
/// The contents align themselves with the center of the container
/// </summary>
Center,
/// <summary>
/// The contents align themselves with the right of the container
/// </summary>
Right,
}
}

29
src/Perspex.SceneGraph/Media/AlignmentY.cs

@ -0,0 +1,29 @@
// -----------------------------------------------------------------------
// <copyright file="AlignmentY.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Media
{
/// <summary>
/// Describes how content is positioned vertically in a container.
/// </summary>
public enum AlignmentY
{
/// <summary>
/// The contents align themselves with the top of the container
/// </summary>
Top,
/// <summary>
/// The contents align themselves with the center of the container
/// </summary>
Center,
/// <summary>
/// The contents align themselves with the bottom of the container
/// </summary>
Bottom,
}
}

47
src/Perspex.SceneGraph/Media/MediaExtensions.cs

@ -0,0 +1,47 @@
// -----------------------------------------------------------------------
// <copyright file="MediaExtensions.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Media
{
using System;
/// <summary>
/// Provides extension methods for Perspex media.
/// </summary>
public static class MediaExtensions
{
/// <summary>
/// Calculates scaling based on a <see cref="Stretch"/> value.
/// </summary>
/// <param name="stretch">The stretch mode.</param>
/// <param name="destinationSize">The size of the destination viewport.</param>
/// <param name="sourceSize">The size of the source.</param>
/// <returns>A vector with the X and Y scaling factors.</returns>
public static Vector CalculateScaling(this Stretch stretch, Size destinationSize, Size sourceSize)
{
double scaleX = 1;
double scaleY = 1;
if (stretch != Stretch.None)
{
scaleX = destinationSize.Width / sourceSize.Width;
scaleY = destinationSize.Height / sourceSize.Height;
switch (stretch)
{
case Stretch.Uniform:
scaleX = scaleY = Math.Min(scaleX, scaleY);
break;
case Stretch.UniformToFill:
scaleX = scaleY = Math.Max(scaleX, scaleY);
break;
}
}
return new Vector(scaleX, scaleY);
}
}
}

90
src/Perspex.SceneGraph/Media/TileBrush.cs

@ -0,0 +1,90 @@
// -----------------------------------------------------------------------
// <copyright file="TileBrush.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Media
{
/// <summary>
/// Base class for brushes which display repeating images.
/// </summary>
public abstract class TileBrush : Brush
{
/// <summary>
/// Defines the <see cref="AlignmentX"/> property.
/// </summary>
public static readonly PerspexProperty<AlignmentX> AlignmentXProperty =
PerspexProperty.Register<TileBrush, AlignmentX>("ALignmentX", AlignmentX.Center);
/// <summary>
/// Defines the <see cref="AlignmentY"/> property.
/// </summary>
public static readonly PerspexProperty<AlignmentY> AlignmentYProperty =
PerspexProperty.Register<TileBrush, AlignmentY>("ALignmentY", AlignmentY.Center);
/// <summary>
/// Defines the <see cref="DestinationRect"/> property.
/// </summary>
public static readonly PerspexProperty<RelativeRect> DestinationRectProperty =
PerspexProperty.Register<TileBrush, RelativeRect>("DestinationRect", RelativeRect.Fill);
/// <summary>
/// Defines the <see cref="SourceRect"/> property.
/// </summary>
public static readonly PerspexProperty<RelativeRect> SourceRectProperty =
PerspexProperty.Register<TileBrush, RelativeRect>("SourceRect", RelativeRect.Fill);
/// <summary>
/// Defines the <see cref="Stretch"/> property.
/// </summary>
public static readonly PerspexProperty<Stretch> StretchProperty =
PerspexProperty.Register<TileBrush, Stretch>(nameof(Stretch), Stretch.Uniform);
/// <summary>
/// Gets or sets the horizontal alignment of a tile in the destination.
/// </summary>
public AlignmentX AlignmentX
{
get { return this.GetValue(AlignmentXProperty); }
set { this.SetValue(AlignmentXProperty, value); }
}
/// <summary>
/// Gets or sets the horizontal alignment of a tile in the destination.
/// </summary>
public AlignmentY AlignmentY
{
get { return this.GetValue(AlignmentYProperty); }
set { this.SetValue(AlignmentYProperty, value); }
}
/// <summary>
/// Gets or sets the rectangle on the destination in which to paint a tile.
/// </summary>
public RelativeRect DestinationRect
{
get { return this.GetValue(DestinationRectProperty); }
set { this.SetValue(DestinationRectProperty, value); }
}
/// <summary>
/// Gets or sets the rectangle of the source image that will be displayed.
/// </summary>
public RelativeRect SourceRect
{
get { return this.GetValue(SourceRectProperty); }
set { this.SetValue(SourceRectProperty, value); }
}
/// <summary>
/// Gets or sets a value controlling how the source rectangle will be stretched to fill
/// the destination rect.
/// </summary>
public Stretch Stretch
{
get { return (Stretch)this.GetValue(StretchProperty); }
set { this.SetValue(StretchProperty, value); }
}
}
}

18
src/Perspex.SceneGraph/Media/VisualBrush.cs

@ -6,20 +6,36 @@
namespace Perspex.Media
{
public class VisualBrush : Brush
/// <summary>
/// Paints an area with an <see cref="IVisual"/>.
/// </summary>
public class VisualBrush : TileBrush
{
/// <summary>
/// Defines the <see cref="Visual"/> property.
/// </summary>
public static readonly PerspexProperty<IVisual> VisualProperty =
PerspexProperty.Register<VisualBrush, IVisual>("Visual");
/// <summary>
/// Initializes a new instance of the <see cref="VisualBrush"/> class.
/// </summary>
public VisualBrush()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="VisualBrush"/> class.
/// </summary>
/// <param name="visual">The visual to draw.</param>
public VisualBrush(IVisual visual)
{
this.Visual = visual;
}
/// <summary>
/// Gets or sets the visual to draw.
/// </summary>
public IVisual Visual
{
get { return this.GetValue(VisualProperty); }

5
src/Perspex.SceneGraph/Perspex.SceneGraph.csproj

@ -57,10 +57,13 @@
<Compile Include="Animation\IPageTransition.cs" />
<Compile Include="GlobalSuppressions.cs" />
<Compile Include="Matrix.cs" />
<Compile Include="Media\AlignmentY.cs" />
<Compile Include="Media\AlignmentX.cs" />
<Compile Include="Media\Brush.cs" />
<Compile Include="Media\Brushes.cs" />
<Compile Include="Media\Color.cs" />
<Compile Include="Media\Colors.cs" />
<Compile Include="Media\MediaExtensions.cs" />
<Compile Include="Media\TextAlignment.cs" />
<Compile Include="Media\FontWeight.cs" />
<Compile Include="Media\FontStyle.cs" />
@ -86,6 +89,7 @@
<Compile Include="Media\SweepDirection.cs" />
<Compile Include="Media\TextHitTestResult.cs" />
<Compile Include="Media\Transform.cs" />
<Compile Include="Media\TileBrush.cs" />
<Compile Include="Media\VisualBrush.cs" />
<Compile Include="Origin.cs" />
<Compile Include="Platform\IFormattedTextImpl.cs" />
@ -98,6 +102,7 @@
<Compile Include="Platform\IStreamGeometryImpl.cs" />
<Compile Include="Point.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RelativeRect.cs" />
<Compile Include="Rect.cs" />
<Compile Include="Rendering\IRenderRoot.cs" />
<Compile Include="Rendering\IRenderManager.cs" />

105
src/Perspex.SceneGraph/RelativeRect.cs

@ -0,0 +1,105 @@
// -----------------------------------------------------------------------
// <copyright file="RelativeRect.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex
{
/// <summary>
/// Defines a rectangle that may be defined relative to another rectangle.
/// </summary>
public struct RelativeRect
{
/// <summary>
/// A rectangle that represents 100% of an area.
/// </summary>
public static readonly RelativeRect Fill = new RelativeRect(0, 0, 1, 1, OriginUnit.Percent);
/// <summary>
/// Initializes a new instance of the <see cref="RelativeRect"/> structure.
/// </summary>
/// <param name="x">The X position.</param>
/// <param name="y">The Y position.</param>
/// <param name="width">The width.</param>
/// <param name="height">The height.</param>
/// <param name="unit">The unit of the rect.</param>
public RelativeRect(double x, double y, double width, double height, OriginUnit unit)
{
this.Rect = new Rect(x, y, width, height);
this.Unit = unit;
}
/// <summary>
/// Initializes a new instance of the <see cref="RelativeRect"/> structure.
/// </summary>
/// <param name="rect">The rectangle.</param>
/// <param name="unit">The unit of the rect.</param>
public RelativeRect(Rect rect, OriginUnit unit)
{
this.Rect = rect;
this.Unit = unit;
}
/// <summary>
/// Initializes a new instance of the <see cref="RelativeRect"/> structure.
/// </summary>
/// <param name="size">The size of the rectangle.</param>
/// <param name="unit">The unit of the rect.</param>
public RelativeRect(Size size, OriginUnit unit)
{
this.Rect = new Rect(size);
this.Unit = unit;
}
/// <summary>
/// Initializes a new instance of the <see cref="RelativeRect"/> structure.
/// </summary>
/// <param name="position">The position of the rectangle.</param>
/// <param name="size">The size of the rectangle.</param>
/// <param name="unit">The unit of the rect.</param>
public RelativeRect(Point position, Size size, OriginUnit unit)
{
this.Rect = new Rect(position, size);
this.Unit = unit;
}
/// <summary>
/// Initializes a new instance of the <see cref="RelativeRect"/> structure.
/// </summary>
/// <param name="topLeft">The top left position of the rectangle.</param>
/// <param name="bottomRight">The bottom right position of the rectangle.</param>
/// <param name="unit">The unit of the rect.</param>
public RelativeRect(Point topLeft, Point bottomRight, OriginUnit unit)
{
this.Rect = new Rect(topLeft, bottomRight);
this.Unit = unit;
}
/// <summary>
/// Gets the unit of the rectangle.
/// </summary>
public OriginUnit Unit { get; }
/// <summary>
/// Gets the rectangle.
/// </summary>
public Rect Rect { get; }
/// <summary>
/// Converts a <see cref="RelativeRect"/> into pixels.
/// </summary>
/// <param name="size">The size of the visual.</param>
/// <returns>The origin point in pixels.</returns>
public Rect ToPixels(Size size)
{
return this.Unit == OriginUnit.Pixels ?
this.Rect :
new Rect(
this.Rect.X * size.Width,
this.Rect.Y * size.Height,
this.Rect.Width * size.Width,
this.Rect.Height * size.Height);
}
}
}

15
src/Perspex.SceneGraph/Rendering/RendererBase.cs

@ -33,10 +33,23 @@ namespace Perspex.Rendering
/// <param name="visual">The visual to render.</param>
/// <param name="handle">An optional platform-specific handle.</param>
public virtual void Render(IVisual visual, IPlatformHandle handle)
{
this.Render(visual, handle, Matrix.Identity, Matrix.Identity);
}
/// <summary>
/// Renders the specified visual with the specified transform.
/// </summary>
/// <param name="visual">The visual to render.</param>
/// <param name="handle">An optional platform-specific handle.</param>
/// <param name="translation">The translation.</param>
/// <param name="transform">The transform.</param>
public virtual void Render(IVisual visual, IPlatformHandle handle, Matrix translation, Matrix transform)
{
using (var context = this.CreateDrawingContext(handle))
{
this.Render(visual, context, Matrix.Identity, Matrix.Identity);
//context.PushTransform(translation * transform);
this.Render(visual, context, translation, transform);
}
++this.RenderCount;

32
src/Windows/Perspex.Direct2D1/Media/DrawingContext.cs

@ -90,7 +90,9 @@ namespace Perspex.Direct2D1.Media
{
if (pen != null)
{
using (var d2dBrush = this.CreateBrush(pen.Brush))
var size = new Rect(p1, p2).Size;
using (var d2dBrush = this.CreateBrush(pen.Brush, size))
using (var d2dStroke = pen.ToDirect2DStrokeStyle(this.renderTarget))
{
this.renderTarget.DrawLine(
@ -113,7 +115,7 @@ namespace Perspex.Direct2D1.Media
{
if (brush != null)
{
using (var d2dBrush = this.CreateBrush(brush))
using (var d2dBrush = this.CreateBrush(brush, geometry.Bounds.Size))
{
GeometryImpl impl = (GeometryImpl)geometry.PlatformImpl;
this.renderTarget.FillGeometry(impl.Geometry, d2dBrush);
@ -122,7 +124,7 @@ namespace Perspex.Direct2D1.Media
if (pen != null)
{
using (var d2dBrush = this.CreateBrush(pen.Brush))
using (var d2dBrush = this.CreateBrush(pen.Brush, geometry.GetRenderBounds(pen.Thickness).Size))
using (var d2dStroke = pen.ToDirect2DStrokeStyle(this.renderTarget))
{
GeometryImpl impl = (GeometryImpl)geometry.PlatformImpl;
@ -139,7 +141,7 @@ namespace Perspex.Direct2D1.Media
/// <param name="cornerRadius">The corner radius.</param>
public void DrawRectange(Pen pen, Rect rect, float cornerRadius)
{
using (var brush = this.CreateBrush(pen.Brush))
using (var brush = this.CreateBrush(pen.Brush, rect.Size))
using (var d2dStroke = pen.ToDirect2DStrokeStyle(this.renderTarget))
{
this.renderTarget.DrawRoundedRectangle(
@ -162,7 +164,7 @@ namespace Perspex.Direct2D1.Media
{
var impl = (FormattedTextImpl)text.PlatformImpl;
using (var brush = this.CreateBrush(foreground))
using (var brush = this.CreateBrush(foreground, impl.Measure()))
using (var renderer = new PerspexTextRenderer(this, this.renderTarget, brush))
{
impl.TextLayout.Draw(renderer, (float)origin.X, (float)origin.Y);
@ -178,7 +180,7 @@ namespace Perspex.Direct2D1.Media
/// <param name="cornerRadius">The corner radius.</param>
public void FillRectange(Perspex.Media.Brush brush, Rect rect, float cornerRadius)
{
using (var b = this.CreateBrush(brush))
using (var b = this.CreateBrush(brush, rect.Size))
{
this.renderTarget.FillRoundedRectangle(
new RoundedRectangle
@ -263,8 +265,9 @@ namespace Perspex.Direct2D1.Media
/// Creates a Direct2D brush from a Perspex brush.
/// </summary>
/// <param name="brush">The perspex brush.</param>
/// <param name="destinationSize">The size of the brush's target area.</param>
/// <returns>The Direct2D brush.</returns>
public Disposable<SharpDX.Direct2D1.Brush> CreateBrush(Perspex.Media.Brush brush)
public Disposable<SharpDX.Direct2D1.Brush> CreateBrush(Perspex.Media.Brush brush, Size destinationSize)
{
var solidColorBrush = brush as Perspex.Media.SolidColorBrush;
var visualBrush = brush as Perspex.Media.VisualBrush;
@ -278,7 +281,7 @@ namespace Perspex.Direct2D1.Media
}
else if (visualBrush != null)
{
return this.CreateBrush(visualBrush);
return this.CreateBrush(visualBrush, destinationSize);
}
else
{
@ -292,8 +295,9 @@ namespace Perspex.Direct2D1.Media
/// Creates a Direct2D <see cref="BitmapBrush"/> from a Perspex <see cref="VisualBrush"/>.
/// </summary>
/// <param name="brush">The perspex brush.</param>
/// <param name="destinationSize">The size of the brush's target area.</param>
/// <returns>The Direct2D brush.</returns>
private Disposable<SharpDX.Direct2D1.Brush> CreateBrush(VisualBrush brush)
private Disposable<SharpDX.Direct2D1.Brush> CreateBrush(VisualBrush brush, Size destinationSize)
{
var visual = brush.Visual;
var layoutable = visual as ILayoutable;
@ -304,17 +308,19 @@ namespace Perspex.Direct2D1.Media
layoutable.Arrange(new Rect(layoutable.DesiredSize));
}
var sourceSize = layoutable.Bounds.Size;
var destinationRect = brush.DestinationRect.ToPixels(destinationSize);
var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceSize);
using (var target = new BitmapRenderTarget(
this.renderTarget,
CompatibleRenderTargetOptions.None,
visual.Bounds.Size.ToSharpDX()))
destinationRect.Size.ToSharpDX()))
{
var renderer = new Renderer(target);
renderer.Render(visual, null);
renderer.Render(visual, null, Matrix.Identity, Matrix.CreateScale(scale));
var result = new BitmapBrush(this.renderTarget, target.Bitmap);
result.ExtendModeX = ExtendMode.Wrap;
result.ExtendModeY = ExtendMode.Wrap;
return new Disposable<SharpDX.Direct2D1.Brush>(result, target);
}
}

4
src/Windows/Perspex.Direct2D1/Media/PerspexTextRenderer.cs

@ -49,9 +49,11 @@ namespace Perspex.Direct2D1.Media
ComObject clientDrawingEffect)
{
var wrapper = clientDrawingEffect as BrushWrapper;
// TODO: Work out how to get the size below rather than passing new Size().
var brush = (wrapper == null) ?
this.foreground :
this.context.CreateBrush(wrapper.Brush);
this.context.CreateBrush(wrapper.Brush, new Size());
this.renderTarget.DrawGlyphRun(
new Vector2(baselineOriginX, baselineOriginY),

120
tests/Perspex.RenderTests/Brushes/VisualBrushTests.cs

@ -20,7 +20,7 @@ namespace Perspex.Direct2D1.RenderTests.Controls
}
[Fact]
public void VisualBrush_Should_Draw_Visual()
public void VisualBrush_Stretch_None()
{
Decorator target = new Decorator
{
@ -54,5 +54,123 @@ namespace Perspex.Direct2D1.RenderTests.Controls
this.RenderToFile(target);
this.CompareImages();
}
[Fact]
public void VisualBrush_Align_Center()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new VisualBrush
{
AlignmentX = AlignmentX.Center,
AlignmentY = AlignmentY.Center,
Visual = new Border
{
Width = 92,
Height = 92,
Background = Brushes.Red,
BorderBrush = Brushes.Black,
BorderThickness = 2,
Child = new TextBlock
{
Text = "Perspex",
FontSize = 12,
FontFamily = "Arial",
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
}
}
}
}
};
this.RenderToFile(target);
this.CompareImages();
}
[Fact]
public void VisualBrush_Stretch_Fill_Large()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 920,
Height = 920,
Child = new Rectangle
{
Fill = new VisualBrush
{
Stretch = Stretch.Fill,
Visual = new Border
{
Width = 92,
Height = 92,
Background = Brushes.Red,
BorderBrush = Brushes.Black,
BorderThickness = 2,
Child = new TextBlock
{
Text = "Perspex",
FontSize = 12,
FontFamily = "Arial",
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
}
}
}
}
};
this.RenderToFile(target);
this.CompareImages();
}
////[Fact]
////public void VisualBrush_Line_Fill()
////{
//// Decorator target = new Decorator
//// {
//// Padding = new Thickness(8),
//// Width = 200,
//// Height = 200,
//// Child = new Line
//// {
//// X1 = 16,
//// Y1 = 16,
//// X2 = 184,
//// Y2 = 184,
//// StrokeThickness = 40,
//// StrokeStartLineCap = "Triangle",
//// StrokeEndLineCap = "Triangle",
//// Fill = new VisualBrush
//// {
//// Visual = new Border
//// {
//// Width = 92,
//// Height = 92,
//// Background = Brushes.Red,
//// BorderBrush = Brushes.Black,
//// BorderThickness = 2,
//// Child = new TextBlock
//// {
//// Text = "Perspex",
//// FontSize = 12,
//// FontFamily = "Arial",
//// HorizontalAlignment = HorizontalAlignment.Center,
//// VerticalAlignment = VerticalAlignment.Center,
//// }
//// }
//// }
//// }
//// };
//// this.RenderToFile(target);
//// this.CompareImages();
////}
}
}

1
tests/Perspex.RenderTests/Perspex.Direct2D1.RenderTests.csproj

@ -77,6 +77,7 @@
<Otherwise />
</Choose>
<ItemGroup>
<Compile Include="Brushes\VisualBrushTests.cs" />
<Compile Include="Controls\ImageTests.cs" />
<Compile Include="Controls\BorderTests.cs" />
<Compile Include="GlobalSuppressions.cs" />

Loading…
Cancel
Save