Browse Source

Added support for VisualBrush TileMode.Tile.

pull/111/head
Steven Kirk 11 years ago
parent
commit
4cb1e66a56
  1. 41
      src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs
  2. 38
      tests/Perspex.RenderTests/Media/VisualBrushTests.cs
  3. BIN
      tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Tile.expected.png

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

@ -29,7 +29,7 @@ namespace Perspex.Direct2D1.Media
var sourceRect = brush.SourceRect.ToPixels(layoutable.Bounds.Size); var sourceRect = brush.SourceRect.ToPixels(layoutable.Bounds.Size);
var destinationRect = brush.DestinationRect.ToPixels(targetSize); var destinationRect = brush.DestinationRect.ToPixels(targetSize);
var bitmapSize = CalculateBitmapSize(brush.TileMode, destinationRect.Size, targetSize); var bitmapSize = CalculateBitmapSize(brush.TileMode, sourceRect.Size, targetSize);
var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size); var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size);
var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale); var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale);
var options = CompatibleRenderTargetOptions.None; var options = CompatibleRenderTargetOptions.None;
@ -43,6 +43,8 @@ namespace Perspex.Direct2D1.Media
renderer.Render(visual, null, transform, destinationRect); renderer.Render(visual, null, transform, destinationRect);
var result = new BitmapBrush(brt, brt.Bitmap); var result = new BitmapBrush(brt, brt.Bitmap);
result.ExtendModeX = ExtendMode.Wrap;
result.ExtendModeY = ExtendMode.Wrap;
this.PlatformBrush = result; this.PlatformBrush = result;
} }
} }
@ -53,6 +55,8 @@ namespace Perspex.Direct2D1.Media
{ {
case TileMode.None: case TileMode.None:
return targetSize; return targetSize;
case TileMode.Tile:
return size;
default: default:
throw new NotImplementedException(); throw new NotImplementedException();
} }
@ -68,24 +72,27 @@ namespace Perspex.Direct2D1.Media
var y = destinationRect.Y; var y = destinationRect.Y;
var size = sourceRect.Size * scale; var size = sourceRect.Size * scale;
switch (brush.AlignmentX) if (brush.TileMode == TileMode.None)
{ {
case AlignmentX.Center: switch (brush.AlignmentX)
x += (destinationRect.Width - size.Width) / 2; {
break; case AlignmentX.Center:
case AlignmentX.Right: x += (destinationRect.Width - size.Width) / 2;
x += destinationRect.Width - size.Width; break;
break; case AlignmentX.Right:
} x += destinationRect.Width - size.Width;
break;
}
switch (brush.AlignmentY) switch (brush.AlignmentY)
{ {
case AlignmentY.Center: case AlignmentY.Center:
y += (destinationRect.Height - size.Height) / 2; y += (destinationRect.Height - size.Height) / 2;
break; break;
case AlignmentY.Bottom: case AlignmentY.Bottom:
y += destinationRect.Height - size.Height; y += destinationRect.Height - size.Height;
break; break;
}
} }
return new Vector(x, y); return new Vector(x, y);

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

@ -396,5 +396,43 @@ namespace Perspex.Direct2D1.RenderTests.Media
this.RenderToFile(target); this.RenderToFile(target);
this.CompareImages(); this.CompareImages();
} }
[Fact]
public void VisualBrush_Tile()
{
Decorator target = new Decorator
{
Padding = new Thickness(8),
Width = 200,
Height = 200,
Child = new Rectangle
{
Fill = new VisualBrush
{
Stretch = Stretch.None,
TileMode = TileMode.Tile,
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();
}
} }
} }

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Loading…
Cancel
Save