Browse Source

Merge branch 'imagebrush'

pull/145/head
Steven Kirk 11 years ago
parent
commit
f408b571e2
  1. 395
      Tests/Perspex.RenderTests/Media/ImageBrushTests.cs
  2. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Fill_NoTile.expected.png
  3. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_FlipXY_TopLeftDest.expected.png
  4. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_FlipX_TopLeftDest.expected.png
  5. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_FlipY_TopLeftDest.expected.png
  6. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_BottomRight.expected.png
  7. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_Center.expected.png
  8. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_TopLeft.expected.png
  9. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png
  10. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterSource.expected.png
  11. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest.expected.png
  12. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest.expected.png
  13. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_UniformToFill_NoTile.expected.png
  14. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Uniform_NoTile.expected.png
  15. BIN
      Tests/TestFiles/Direct2D1/Media/ImageBrush/github_icon.png
  16. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png
  17. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_FlipXY_TopLeftDest.expected.png
  18. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_FlipX_TopLeftDest.expected.png
  19. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_FlipY_TopLeftDest.expected.png
  20. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_BottomRight.expected.png
  21. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_Center.expected.png
  22. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_TopLeft.expected.png
  23. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png
  24. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterSource.expected.png
  25. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest.expected.png
  26. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest.expected.png
  27. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_No_Visual.expected.png
  28. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_UniformToFill_NoTile.expected.png
  29. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Uniform_NoTile.expected.png
  30. BIN
      Tests/TestFiles/Direct2D1/Media/VisualBrush/github_icon.png
  31. 25
      src/Perspex.Controls/Image.cs
  32. 44
      src/Perspex.SceneGraph/Media/ImageBush.cs
  33. 3
      src/Perspex.SceneGraph/Perspex.SceneGraph.csproj
  34. 5
      src/Windows/Perspex.Direct2D1/Media/DrawingContext.cs
  35. 95
      src/Windows/Perspex.Direct2D1/Media/ImageBrushImpl.cs
  36. 135
      src/Windows/Perspex.Direct2D1/Media/TileBrushImpl.cs
  37. 130
      src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs
  38. 2
      src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj
  39. 414
      tests/Perspex.RenderTests/Media/VisualBrushTests.cs
  40. 1
      tests/Perspex.RenderTests/Perspex.Direct2D1.RenderTests.csproj
  41. BIN
      tests/Perspex.RenderTests/TestBase.cs
  42. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_BottomRight.expected.png
  43. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_Center.expected.png
  44. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_TopLeft.expected.png
  45. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_DestinationRect_Absolute.expected.png
  46. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_FlipX.expected.png
  47. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_FlipXY.expected.png
  48. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_FlipY.expected.png
  49. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_SourceRect_Absolute.expected.png
  50. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_SourceRect_DestinationRect_Absolute.expected.png
  51. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_SourceRect_DestinationRect_Percent.expected.png
  52. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Stretch_Fill_Large.expected.png
  53. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Stretch_Uniform.expected.png
  54. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Stretch_UniformToFill.expected.png
  55. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Tile.expected.png
  56. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Tile_Alignment_BottomRight.expected.png

395
Tests/Perspex.RenderTests/Media/ImageBrushTests.cs

@ -0,0 +1,395 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Perspex.Controls;
using Perspex.Controls.Shapes;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Media.Imaging;
using Xunit;
#if PERSPEX_CAIRO
namespace Perspex.Cairo.RenderTests.Media
#else
namespace Perspex.Direct2D1.RenderTests.Media
#endif
{
public class ImageBrushTests : TestBase
{
public ImageBrushTests()
: base(@"Media\ImageBrush")
{
}
private string BitmapPath
{
get { return System.IO.Path.Combine(OutputPath, "github_icon.png"); }
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_NoStretch_NoTile_Alignment_TopLeft()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.None,
TileMode = TileMode.None,
AlignmentX = AlignmentX.Left,
AlignmentY = AlignmentY.Top,
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_NoStretch_NoTile_Alignment_Center()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.None,
TileMode = TileMode.None,
AlignmentX = AlignmentX.Center,
AlignmentY = AlignmentY.Center,
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_NoStretch_NoTile_Alignment_BottomRight()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.None,
TileMode = TileMode.None,
AlignmentX = AlignmentX.Right,
AlignmentY = AlignmentY.Bottom,
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_Fill_NoTile()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 920,
Height = 920,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.Fill,
TileMode = TileMode.None,
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_Uniform_NoTile()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 300,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.Uniform,
TileMode = TileMode.None,
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_UniformToFill_NoTile()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 300,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.UniformToFill,
TileMode = TileMode.None,
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_NoStretch_NoTile_BottomRightQuarterSource()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.None,
TileMode = TileMode.None,
SourceRect = new RelativeRect(250, 250, 250, 250, RelativeUnit.Absolute),
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_NoStretch_NoTile_BottomRightQuarterDest()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.None,
TileMode = TileMode.None,
DestinationRect = new RelativeRect(92, 92, 92, 92, RelativeUnit.Absolute),
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.None,
TileMode = TileMode.None,
SourceRect = new RelativeRect(0.5, 0.5, 0.5, 0.5, RelativeUnit.Relative),
DestinationRect = new RelativeRect(0.5, 0.5, 0.5, 0.5, RelativeUnit.Relative),
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.None,
TileMode = TileMode.Tile,
SourceRect = new RelativeRect(0.5, 0.5, 0.5, 0.5, RelativeUnit.Relative),
DestinationRect = new RelativeRect(0.25, 0.25, 0.5, 0.5, RelativeUnit.Relative),
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_NoStretch_FlipX_TopLeftDest()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.None,
TileMode = TileMode.FlipX,
DestinationRect = new RelativeRect(0, 0, 0.5, 0.5, RelativeUnit.Relative),
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_NoStretch_FlipY_TopLeftDest()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.None,
TileMode = TileMode.FlipY,
DestinationRect = new RelativeRect(0, 0, 0.5, 0.5, RelativeUnit.Relative),
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "ImageBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void ImageBrush_NoStretch_FlipXY_TopLeftDest()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new ImageBrush
{
Stretch = Stretch.None,
TileMode = TileMode.FlipXY,
DestinationRect = new RelativeRect(0, 0, 0.5, 0.5, RelativeUnit.Relative),
Source = new Bitmap(BitmapPath),
}
}
};
RenderToFile(target);
CompareImages();
}
}
}

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Fill_NoTile.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_FlipXY_TopLeftDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_FlipX_TopLeftDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_FlipY_TopLeftDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_BottomRight.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_Center.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_Alignment_TopLeft.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterSource.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 B

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_UniformToFill_NoTile.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/ImageBrush_Uniform_NoTile.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
Tests/TestFiles/Direct2D1/Media/ImageBrush/github_icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_FlipXY_TopLeftDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_FlipX_TopLeftDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_FlipY_TopLeftDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_BottomRight.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_Center.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_TopLeft.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterSource.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 B

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_No_Visual.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 B

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_UniformToFill_NoTile.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Uniform_NoTile.expected.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
Tests/TestFiles/Direct2D1/Media/VisualBrush/github_icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

25
src/Perspex.Controls/Image.cs

@ -73,29 +73,14 @@ namespace Perspex.Controls
/// <returns>The desired size of the control.</returns>
protected override Size MeasureOverride(Size availableSize)
{
double width = 0;
double height = 0;
Vector scale = new Vector();
if (Source != null)
{
width = Source.PixelWidth;
height = Source.PixelHeight;
if (Width > 0)
{
availableSize = new Size(Width, availableSize.Height);
}
if (Height > 0)
{
availableSize = new Size(availableSize.Width, Height);
}
scale = Stretch.CalculateScaling(availableSize, new Size(width, height));
return new Size(Source.PixelWidth, Source.PixelHeight);
}
else
{
return new Size();
}
return new Size(width * scale.X, height * scale.Y);
}
}
}

44
src/Perspex.SceneGraph/Media/ImageBush.cs

@ -0,0 +1,44 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using Perspex.Media.Imaging;
namespace Perspex.Media
{
/// <summary>
/// Paints an area with an <see cref="IBitmap"/>.
/// </summary>
public class ImageBrush : TileBrush
{
/// <summary>
/// Defines the <see cref="Visual"/> property.
/// </summary>
public static readonly PerspexProperty<IBitmap> SourceProperty =
PerspexProperty.Register<ImageBrush, IBitmap>("Source");
/// <summary>
/// Initializes a new instance of the <see cref="VisualBrush"/> class.
/// </summary>
public ImageBrush()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="VisualBrush"/> class.
/// </summary>
/// <param name="source">The image to draw.</param>
public ImageBrush(IBitmap source)
{
Source = source;
}
/// <summary>
/// Gets or sets the image to draw.
/// </summary>
public IBitmap Source
{
get { return GetValue(SourceProperty); }
set { SetValue(SourceProperty, value); }
}
}
}

3
src/Perspex.SceneGraph/Perspex.SceneGraph.csproj

@ -64,11 +64,11 @@
<Compile Include="Media\Color.cs" />
<Compile Include="Media\Colors.cs" />
<Compile Include="Media\DashStyle.cs" />
<Compile Include="Media\MediaExtensions.cs" />
<Compile Include="Media\GradientBrush.cs" />
<Compile Include="Media\GradientSpreadMethod.cs" />
<Compile Include="Media\GradientStop.cs" />
<Compile Include="Media\LinearGradientBrush.cs" />
<Compile Include="Media\MediaExtensions.cs" />
<Compile Include="Media\PenLineCap.cs" />
<Compile Include="Media\PenLineJoin.cs" />
<Compile Include="Media\TextAlignment.cs" />
@ -97,6 +97,7 @@
<Compile Include="Media\TextHitTestResult.cs" />
<Compile Include="Media\Transform.cs" />
<Compile Include="Media\TileBrush.cs" />
<Compile Include="Media\ImageBush.cs" />
<Compile Include="Media\VisualBrush.cs" />
<Compile Include="RelativePoint.cs" />
<Compile Include="Platform\IFormattedTextImpl.cs" />

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

@ -303,6 +303,7 @@ namespace Perspex.Direct2D1.Media
{
var solidColorBrush = brush as Perspex.Media.SolidColorBrush;
var linearGradientBrush = brush as Perspex.Media.LinearGradientBrush;
var imageBrush = brush as ImageBrush;
var visualBrush = brush as VisualBrush;
if (solidColorBrush != null)
@ -313,6 +314,10 @@ namespace Perspex.Direct2D1.Media
{
return new LinearGradientBrushImpl(linearGradientBrush, _renderTarget, destinationSize);
}
else if (imageBrush != null)
{
return new ImageBrushImpl(imageBrush, _renderTarget, destinationSize);
}
else if (visualBrush != null)
{
return new VisualBrushImpl(visualBrush, _renderTarget, destinationSize);

95
src/Windows/Perspex.Direct2D1/Media/ImageBrushImpl.cs

@ -0,0 +1,95 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using Perspex.Media;
using SharpDX.Direct2D1;
namespace Perspex.Direct2D1.Media
{
public class ImageBrushImpl : TileBrushImpl
{
public ImageBrushImpl(
ImageBrush brush,
RenderTarget target,
Size targetSize)
{
if (brush.Source == null)
{
return;
}
var image = ((BitmapImpl)brush.Source.PlatformImpl).GetDirect2DBitmap(target);
var imageSize = new Size(brush.Source.PixelWidth, brush.Source.PixelHeight);
var tileMode = brush.TileMode;
var sourceRect = brush.SourceRect.ToPixels(imageSize);
var destinationRect = brush.DestinationRect.ToPixels(targetSize);
var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size);
var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale);
var intermediateSize = CalculateIntermediateSize(tileMode, targetSize, destinationRect.Size);
var brtOpts = CompatibleRenderTargetOptions.None;
// TODO: There are times where we don't need to draw an intermediate bitmap. Identify
// them and directly use 'image' in those cases.
using (var intermediate = new BitmapRenderTarget(target, brtOpts, intermediateSize))
{
Rect drawRect;
var transform = CalculateIntermediateTransform(
tileMode,
sourceRect,
destinationRect,
scale,
translate,
out drawRect);
intermediate.BeginDraw();
intermediate.Transform = transform.ToDirect2D();
drawRect *= -transform;
intermediate.PushAxisAlignedClip(drawRect.ToDirect2D(), AntialiasMode.Aliased);
intermediate.DrawBitmap(image, 1, BitmapInterpolationMode.Linear);
intermediate.PopAxisAlignedClip();
intermediate.EndDraw();
this.PlatformBrush = new BitmapBrush(
target,
intermediate.Bitmap,
GetBitmapBrushProperties(brush),
GetBrushProperties(brush, destinationRect));
}
}
private BitmapBrush CreateDirectBrush(
ImageBrush brush,
RenderTarget target,
Bitmap image,
Rect sourceRect,
Rect destinationRect)
{
var tileMode = brush.TileMode;
var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size);
var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale);
var transform = Matrix.CreateTranslation(-sourceRect.Position) *
Matrix.CreateScale(scale) *
Matrix.CreateTranslation(translate);
var opts = new BrushProperties
{
Transform = transform.ToDirect2D(),
Opacity = (float)brush.Opacity,
};
var bitmapOpts = new BitmapBrushProperties
{
ExtendModeX = GetExtendModeX(tileMode),
ExtendModeY = GetExtendModeY(tileMode),
};
return new BitmapBrush(target, image, bitmapOpts, opts);
}
private BitmapBrush CreateIndirectBrush()
{
throw new NotImplementedException();
}
}
}

135
src/Windows/Perspex.Direct2D1/Media/TileBrushImpl.cs

@ -0,0 +1,135 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using Perspex.Layout;
using Perspex.Media;
using SharpDX;
using SharpDX.Direct2D1;
namespace Perspex.Direct2D1.Media
{
public class TileBrushImpl : BrushImpl
{
/// <summary>
/// Calculates a translate based on a <see cref="TileBrush"/>, a source and destination
/// rectangle and a scale.
/// </summary>
/// <param name="brush">The brush.</param>
/// <param name="sourceRect">The source rectangle.</param>
/// <param name="destinationRect">The destination rectangle.</param>
/// <param name="scale">The scale factor.</param>
/// <returns>A vector with the X and Y translate.</returns>
protected static Vector CalculateTranslate(
TileBrush brush,
Rect sourceRect,
Rect destinationRect,
Vector scale)
{
var x = 0.0;
var y = 0.0;
var size = sourceRect.Size * scale;
switch (brush.AlignmentX)
{
case AlignmentX.Center:
x += (destinationRect.Width - size.Width) / 2;
break;
case AlignmentX.Right:
x += destinationRect.Width - size.Width;
break;
}
switch (brush.AlignmentY)
{
case AlignmentY.Center:
y += (destinationRect.Height - size.Height) / 2;
break;
case AlignmentY.Bottom:
y += destinationRect.Height - size.Height;
break;
}
return new Vector(x, y);
}
protected static Size2F CalculateIntermediateSize(
TileMode tileMode,
Size targetSize,
Size destinationSize)
{
var result = tileMode == TileMode.None ? targetSize : destinationSize;
return result.ToSharpDX();
}
protected static Matrix CalculateIntermediateTransform(
TileMode tileMode,
Rect sourceRect,
Rect destinationRect,
Vector scale,
Vector translate,
out Rect drawRect)
{
var transform = Matrix.CreateTranslation(-sourceRect.Position) *
Matrix.CreateScale(scale) *
Matrix.CreateTranslation(translate);
Rect dr;
if (tileMode == TileMode.None)
{
dr = destinationRect;
transform *= Matrix.CreateTranslation(destinationRect.Position);
}
else
{
dr = new Rect(destinationRect.Size);
}
drawRect = dr;
return transform;
}
protected static BrushProperties GetBrushProperties(TileBrush brush, Rect destinationRect)
{
var tileMode = brush.TileMode;
return new BrushProperties
{
Opacity = (float)brush.Opacity,
Transform = brush.TileMode != TileMode.None ?
SharpDX.Matrix3x2.Translation(
(float)destinationRect.X,
(float)destinationRect.Y) :
SharpDX.Matrix3x2.Identity,
};
}
protected static BitmapBrushProperties GetBitmapBrushProperties(TileBrush brush)
{
var tileMode = brush.TileMode;
return new BitmapBrushProperties
{
ExtendModeX = GetExtendModeX(tileMode),
ExtendModeY = GetExtendModeY(tileMode),
};
}
protected static ExtendMode GetExtendModeX(TileMode tileMode)
{
return (tileMode & TileMode.FlipX) != 0 ? ExtendMode.Mirror : ExtendMode.Wrap;
}
protected static ExtendMode GetExtendModeY(TileMode tileMode)
{
return (tileMode & TileMode.FlipY) != 0 ? ExtendMode.Mirror : ExtendMode.Wrap;
}
public override void Dispose()
{
((BitmapBrush)PlatformBrush)?.Bitmap.Dispose();
base.Dispose();
}
}
}

130
src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs

@ -8,7 +8,7 @@ using SharpDX.Direct2D1;
namespace Perspex.Direct2D1.Media
{
public class VisualBrushImpl : BrushImpl
public class VisualBrushImpl : TileBrushImpl
{
public VisualBrushImpl(
VisualBrush brush,
@ -30,86 +30,78 @@ namespace Perspex.Direct2D1.Media
layoutable.Arrange(new Rect(layoutable.DesiredSize));
}
var tileMode = brush.TileMode;
var sourceRect = brush.SourceRect.ToPixels(layoutable.Bounds.Size);
var destinationRect = brush.DestinationRect.ToPixels(targetSize);
var bitmapSize = brush.TileMode == TileMode.None ? targetSize : destinationRect.Size;
var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size);
var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale);
var options = CompatibleRenderTargetOptions.None;
var intermediateSize = CalculateIntermediateSize(tileMode, targetSize, destinationRect.Size);
var brtOpts = CompatibleRenderTargetOptions.None;
using (var brt = new BitmapRenderTarget(target, options, bitmapSize.ToSharpDX()))
// TODO: There are times where we don't need to draw an intermediate bitmap. Identify
// them and directly use 'image' in those cases.
using (var intermediate = new BitmapRenderTarget(target, brtOpts, intermediateSize))
{
var renderer = new Renderer(brt);
var transform = Matrix.CreateTranslation(-sourceRect.Position) *
Matrix.CreateScale(scale) *
Matrix.CreateTranslation(translate);
Rect drawRect;
if (brush.TileMode == TileMode.None)
{
drawRect = destinationRect;
transform *= Matrix.CreateTranslation(destinationRect.Position);
}
else
{
drawRect = new Rect(0, 0, destinationRect.Width, destinationRect.Height);
}
var transform = CalculateIntermediateTransform(
tileMode,
sourceRect,
destinationRect,
scale,
translate,
out drawRect);
var renderer = new Renderer(intermediate);
renderer.Render(visual, null, transform, drawRect);
var result = new BitmapBrush(brt, brt.Bitmap);
result.ExtendModeX = (brush.TileMode & TileMode.FlipX) != 0 ? ExtendMode.Mirror : ExtendMode.Wrap;
result.ExtendModeY = (brush.TileMode & TileMode.FlipY) != 0 ? ExtendMode.Mirror : ExtendMode.Wrap;
if (brush.TileMode != TileMode.None)
{
result.Transform = SharpDX.Matrix3x2.Translation(
(float)destinationRect.X,
(float)destinationRect.Y);
}
PlatformBrush = result;
this.PlatformBrush = new BitmapBrush(
target,
intermediate.Bitmap,
GetBitmapBrushProperties(brush),
GetBrushProperties(brush, destinationRect));
}
}
private static Vector CalculateTranslate(
VisualBrush brush,
Rect sourceRect,
Rect destinationRect,
Vector scale)
{
var x = 0.0;
var y = 0.0;
var size = sourceRect.Size * scale;
switch (brush.AlignmentX)
{
case AlignmentX.Center:
x += (destinationRect.Width - size.Width) / 2;
break;
case AlignmentX.Right:
x += destinationRect.Width - size.Width;
break;
}
switch (brush.AlignmentY)
{
case AlignmentY.Center:
y += (destinationRect.Height - size.Height) / 2;
break;
case AlignmentY.Bottom:
y += destinationRect.Height - size.Height;
break;
}
return new Vector(x, y);
}
public override void Dispose()
{
((BitmapBrush)PlatformBrush)?.Bitmap.Dispose();
base.Dispose();
//var sourceRect = brush.SourceRect.ToPixels(layoutable.Bounds.Size);
//var destinationRect = brush.DestinationRect.ToPixels(targetSize);
//var bitmapSize = brush.TileMode == TileMode.None ? targetSize : destinationRect.Size;
//var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size);
//var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale);
//var options = CompatibleRenderTargetOptions.None;
//using (var brt = new BitmapRenderTarget(target, options, bitmapSize.ToSharpDX()))
//{
// var renderer = new Renderer(brt);
// var transform = Matrix.CreateTranslation(-sourceRect.Position) *
// Matrix.CreateScale(scale) *
// Matrix.CreateTranslation(translate);
// Rect drawRect;
// if (brush.TileMode == TileMode.None)
// {
// drawRect = destinationRect;
// transform *= Matrix.CreateTranslation(destinationRect.Position);
// }
// else
// {
// drawRect = new Rect(0, 0, destinationRect.Width, destinationRect.Height);
// }
// renderer.Render(visual, null, transform, drawRect);
// var result = new BitmapBrush(brt, brt.Bitmap);
// result.ExtendModeX = GetExtendModeX(brush.TileMode);
// result.ExtendModeY = GetExtendModeY(brush.TileMode);
// if (brush.TileMode != TileMode.None)
// {
// result.Transform = SharpDX.Matrix3x2.Translation(
// (float)destinationRect.X,
// (float)destinationRect.Y);
// }
// PlatformBrush = result;
//}
}
}
}

2
src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj

@ -82,6 +82,8 @@
<Compile Include="Media\Imaging\BitmapImpl.cs" />
<Compile Include="Media\LinearGradientBrushImpl.cs" />
<Compile Include="Media\PerspexTextRenderer.cs" />
<Compile Include="Media\ImageBrushImpl.cs" />
<Compile Include="Media\TileBrushImpl.cs" />
<Compile Include="Media\VisualBrushImpl.cs" />
<Compile Include="Media\SolidColorBrushImpl.cs" />
<Compile Include="Media\StreamGeometryContextImpl.cs" />

414
tests/Perspex.RenderTests/Media/VisualBrushTests.cs

@ -5,6 +5,7 @@ using Perspex.Controls;
using Perspex.Controls.Shapes;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Media.Imaging;
using Xunit;
#if PERSPEX_CAIRO
@ -20,47 +21,41 @@ namespace Perspex.Direct2D1.RenderTests.Media
{
}
#if PERSPEX_CAIRO
[Fact(Skip = "VisualBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void VisualBrush_Align_TopLeft()
private string BitmapPath
{
Decorator target = new Decorator
get { return System.IO.Path.Combine(OutputPath, "github_icon.png"); }
}
private Control Visual
{
get
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
return new Panel
{
Fill = new VisualBrush
Children = new Perspex.Controls.Controls
{
AlignmentX = AlignmentX.Left,
AlignmentY = AlignmentY.Top,
Stretch = Stretch.None,
Visual = new Border
new Image
{
Source = new Bitmap(BitmapPath),
},
new Border
{
Width = 92,
Height = 92,
Background = Brushes.Red,
BorderBrush = Brushes.Black,
BorderBrush = Brushes.Blue,
BorderThickness = 2,
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
Child = new TextBlock
{
Text = "Perspex",
FontSize = 12,
FontSize = 24,
FontFamily = "Arial",
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
Background = Brushes.Green,
Foreground = Brushes.Yellow,
Text = "VisualBrush",
}
}
}
}
};
RenderToFile(target);
CompareImages();
};
}
}
#if PERSPEX_CAIRO
@ -68,7 +63,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_Align_Center()
public void VisualBrush_NoStretch_NoTile_Alignment_TopLeft()
{
Decorator target = new Decorator
{
@ -79,25 +74,11 @@ namespace Perspex.Direct2D1.RenderTests.Media
{
Fill = new VisualBrush
{
AlignmentX = AlignmentX.Center,
AlignmentY = AlignmentY.Center,
Stretch = Stretch.None,
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,
}
}
TileMode = TileMode.None,
AlignmentX = AlignmentX.Left,
AlignmentY = AlignmentY.Top,
Visual = Visual,
}
}
};
@ -111,7 +92,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_Align_BottomRight()
public void VisualBrush_NoStretch_NoTile_Alignment_Center()
{
Decorator target = new Decorator
{
@ -122,25 +103,11 @@ namespace Perspex.Direct2D1.RenderTests.Media
{
Fill = new VisualBrush
{
AlignmentX = AlignmentX.Right,
AlignmentY = AlignmentY.Bottom,
Stretch = Stretch.None,
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,
}
}
TileMode = TileMode.None,
AlignmentX = AlignmentX.Center,
AlignmentY = AlignmentY.Center,
Visual = Visual,
}
}
};
@ -154,34 +121,22 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_Stretch_Fill_Large()
public void VisualBrush_NoStretch_NoTile_Alignment_BottomRight()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 920,
Height = 920,
Width = 200,
Height = 200,
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,
}
}
Stretch = Stretch.None,
TileMode = TileMode.None,
AlignmentX = AlignmentX.Right,
AlignmentY = AlignmentY.Bottom,
Visual = Visual,
}
}
};
@ -195,34 +150,20 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_Stretch_Uniform()
public void VisualBrush_Fill_NoTile()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 920,
Height = 820,
Height = 920,
Child = new Rectangle
{
Fill = new VisualBrush
{
Stretch = Stretch.Uniform,
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,
}
}
Stretch = Stretch.Fill,
TileMode = TileMode.None,
Visual = Visual,
}
}
};
@ -236,34 +177,20 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_Stretch_UniformToFill()
public void VisualBrush_Uniform_NoTile()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 920,
Height = 820,
Width = 300,
Height = 200,
Child = new Rectangle
{
Fill = new VisualBrush
{
Stretch = Stretch.UniformToFill,
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,
}
}
Stretch = Stretch.Uniform,
TileMode = TileMode.None,
Visual = Visual,
}
}
};
@ -277,34 +204,20 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_SourceRect_Absolute()
public void VisualBrush_UniformToFill_NoTile()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Width = 300,
Height = 200,
Child = new Rectangle
{
Fill = new VisualBrush
{
SourceRect = new RelativeRect(40, 40, 100, 100, RelativeUnit.Absolute),
Visual = new Border
{
Width = 180,
Height = 180,
Background = Brushes.Red,
BorderBrush = Brushes.Black,
BorderThickness = 2,
Child = new Ellipse
{
Width = 100,
Height = 100,
Fill = Brushes.Yellow,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center,
}
}
Stretch = Stretch.UniformToFill,
TileMode = TileMode.None,
Visual = Visual,
}
}
};
@ -318,7 +231,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_DestinationRect_Absolute()
public void VisualBrush_NoStretch_NoTile_BottomRightQuarterSource()
{
Decorator target = new Decorator
{
@ -329,23 +242,10 @@ namespace Perspex.Direct2D1.RenderTests.Media
{
Fill = new VisualBrush
{
DestinationRect = new RelativeRect(92, 92, 92, 92, RelativeUnit.Absolute),
Visual = new Border
{
Width = 180,
Height = 180,
Background = Brushes.Red,
BorderBrush = Brushes.Black,
BorderThickness = 2,
Child = new Ellipse
{
Width = 100,
Height = 100,
Fill = Brushes.Yellow,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center,
}
}
Stretch = Stretch.None,
TileMode = TileMode.None,
SourceRect = new RelativeRect(250, 250, 250, 250, RelativeUnit.Absolute),
Visual = Visual,
}
}
};
@ -359,7 +259,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_SourceRect_DestinationRect_Absolute()
public void VisualBrush_NoStretch_NoTile_BottomRightQuarterDest()
{
Decorator target = new Decorator
{
@ -370,24 +270,10 @@ namespace Perspex.Direct2D1.RenderTests.Media
{
Fill = new VisualBrush
{
SourceRect = new RelativeRect(40, 40, 100, 100, RelativeUnit.Absolute),
Stretch = Stretch.None,
TileMode = TileMode.None,
DestinationRect = new RelativeRect(92, 92, 92, 92, RelativeUnit.Absolute),
Visual = new Border
{
Width = 180,
Height = 180,
Background = Brushes.Red,
BorderBrush = Brushes.Black,
BorderThickness = 2,
Child = new Ellipse
{
Width = 100,
Height = 100,
Fill = Brushes.Yellow,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center,
}
}
Visual = Visual,
}
}
};
@ -401,7 +287,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_SourceRect_DestinationRect_Percent()
public void VisualBrush_NoStretch_NoTile_BottomRightQuarterSource_BottomRightQuarterDest()
{
Decorator target = new Decorator
{
@ -412,24 +298,11 @@ namespace Perspex.Direct2D1.RenderTests.Media
{
Fill = new VisualBrush
{
SourceRect = new RelativeRect(0.22, 0.22, 0.56, 0.56, RelativeUnit.Relative),
Stretch = Stretch.None,
TileMode = TileMode.None,
SourceRect = new RelativeRect(0.5, 0.5, 0.5, 0.5, RelativeUnit.Relative),
DestinationRect = new RelativeRect(0.5, 0.5, 0.5, 0.5, RelativeUnit.Relative),
Visual = new Border
{
Width = 180,
Height = 180,
Background = Brushes.Red,
BorderBrush = Brushes.Black,
BorderThickness = 2,
Child = new Ellipse
{
Width = 100,
Height = 100,
Fill = Brushes.Yellow,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment = HorizontalAlignment.Center,
}
}
Visual = Visual,
}
}
};
@ -443,7 +316,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_Tile()
public void VisualBrush_NoStretch_Tile_BottomRightQuarterSource_CenterQuarterDest()
{
Decorator target = new Decorator
{
@ -456,67 +329,9 @@ namespace Perspex.Direct2D1.RenderTests.Media
{
Stretch = Stretch.None,
TileMode = TileMode.Tile,
SourceRect = new RelativeRect(0.5, 0.5, 0.5, 0.5, RelativeUnit.Relative),
DestinationRect = new RelativeRect(0.25, 0.25, 0.5, 0.5, RelativeUnit.Relative),
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,
}
}
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "VisualBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void VisualBrush_Tile_Alignment_BottomRight()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new VisualBrush
{
Stretch = Stretch.None,
TileMode = TileMode.Tile,
AlignmentX = AlignmentX.Right,
AlignmentY = AlignmentY.Bottom,
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,
}
}
Visual = Visual,
}
}
};
@ -530,7 +345,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_FlipX()
public void VisualBrush_NoStretch_FlipX_TopLeftDest()
{
Decorator target = new Decorator
{
@ -544,22 +359,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
Stretch = Stretch.None,
TileMode = TileMode.FlipX,
DestinationRect = new RelativeRect(0, 0, 0.5, 0.5, RelativeUnit.Relative),
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,
}
}
Visual = Visual,
}
}
};
@ -573,7 +373,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_FlipY()
public void VisualBrush_NoStretch_FlipY_TopLeftDest()
{
Decorator target = new Decorator
{
@ -587,22 +387,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
Stretch = Stretch.None,
TileMode = TileMode.FlipY,
DestinationRect = new RelativeRect(0, 0, 0.5, 0.5, RelativeUnit.Relative),
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,
}
}
Visual = Visual,
}
}
};
@ -616,7 +401,7 @@ namespace Perspex.Direct2D1.RenderTests.Media
#else
[Fact]
#endif
public void VisualBrush_FlipXY()
public void VisualBrush_NoStretch_FlipXY_TopLeftDest()
{
Decorator target = new Decorator
{
@ -630,48 +415,11 @@ namespace Perspex.Direct2D1.RenderTests.Media
Stretch = Stretch.None,
TileMode = TileMode.FlipXY,
DestinationRect = new RelativeRect(0, 0, 0.5, 0.5, RelativeUnit.Relative),
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,
}
}
Visual = Visual,
}
}
};
RenderToFile(target);
CompareImages();
}
#if PERSPEX_CAIRO
[Fact(Skip = "VisualBrush not yet implemented on Cairo")]
#else
[Fact]
#endif
public void VisualBrush_No_Visual()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new VisualBrush(),
}
};
RenderToFile(target);
CompareImages();
}

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

@ -75,6 +75,7 @@
<Otherwise />
</Choose>
<ItemGroup>
<Compile Include="Media\ImageBrushTests.cs" />
<Compile Include="Media\VisualBrushTests.cs" />
<Compile Include="Controls\ImageTests.cs" />
<Compile Include="Controls\BorderTests.cs" />

BIN
tests/Perspex.RenderTests/TestBase.cs

Binary file not shown.

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_BottomRight.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 928 B

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_Center.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 924 B

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Align_TopLeft.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 934 B

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_DestinationRect_Absolute.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_FlipX.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_FlipXY.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_FlipY.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_SourceRect_Absolute.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_SourceRect_DestinationRect_Absolute.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_SourceRect_DestinationRect_Percent.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Stretch_Fill_Large.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Stretch_Uniform.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Stretch_UniformToFill.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Tile.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Tile_Alignment_BottomRight.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 928 B

Loading…
Cancel
Save