Browse Source

Use common methods for Visual/ImageBrushImpl.

pull/145/head
Steven Kirk 11 years ago
parent
commit
5b401672d3
  1. 20
      src/Windows/Perspex.Direct2D1/Media/ImageBrushImpl.cs
  2. 8
      src/Windows/Perspex.Direct2D1/Media/TileBrushImpl.cs
  3. 89
      src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs

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

@ -33,17 +33,19 @@ namespace Perspex.Direct2D1.Media
// them and directly use 'image' in those cases. // them and directly use 'image' in those cases.
using (var intermediate = new BitmapRenderTarget(target, brtOpts, intermediateSize)) using (var intermediate = new BitmapRenderTarget(target, brtOpts, intermediateSize))
{ {
SharpDX.RectangleF drawRect; Rect drawRect;
var transform = CalculateIntermediateTransform(
tileMode,
sourceRect,
destinationRect,
scale,
translate,
out drawRect);
intermediate.BeginDraw(); intermediate.BeginDraw();
intermediate.Transform = CalculateIntermediateTransform( intermediate.Transform = transform.ToDirect2D();
tileMode, drawRect *= -transform;
sourceRect, intermediate.PushAxisAlignedClip(drawRect.ToDirect2D(), AntialiasMode.Aliased);
destinationRect,
scale,
translate,
out drawRect);
intermediate.PushAxisAlignedClip(drawRect, AntialiasMode.Aliased);
intermediate.DrawBitmap(image, 1, BitmapInterpolationMode.Linear); intermediate.DrawBitmap(image, 1, BitmapInterpolationMode.Linear);
intermediate.PopAxisAlignedClip(); intermediate.PopAxisAlignedClip();
intermediate.EndDraw(); intermediate.EndDraw();

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

@ -62,13 +62,13 @@ namespace Perspex.Direct2D1.Media
return result.ToSharpDX(); return result.ToSharpDX();
} }
protected static Matrix3x2 CalculateIntermediateTransform( protected static Matrix CalculateIntermediateTransform(
TileMode tileMode, TileMode tileMode,
Rect sourceRect, Rect sourceRect,
Rect destinationRect, Rect destinationRect,
Vector scale, Vector scale,
Vector translate, Vector translate,
out SharpDX.RectangleF drawRect) out Rect drawRect)
{ {
var transform = Matrix.CreateTranslation(-sourceRect.Position) * var transform = Matrix.CreateTranslation(-sourceRect.Position) *
Matrix.CreateScale(scale) * Matrix.CreateScale(scale) *
@ -85,9 +85,9 @@ namespace Perspex.Direct2D1.Media
dr = new Rect(destinationRect.Size); dr = new Rect(destinationRect.Size);
} }
drawRect = (dr * -transform).ToSharpDX(); drawRect = dr;
return transform.ToDirect2D(); return transform;
} }
protected static BrushProperties GetBrushProperties(TileBrush brush, Rect destinationRect) protected static BrushProperties GetBrushProperties(TileBrush brush, Rect destinationRect)

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

@ -30,47 +30,78 @@ namespace Perspex.Direct2D1.Media
layoutable.Arrange(new Rect(layoutable.DesiredSize)); layoutable.Arrange(new Rect(layoutable.DesiredSize));
} }
var tileMode = brush.TileMode;
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 = brush.TileMode == TileMode.None ? targetSize : destinationRect.Size;
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 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; Rect drawRect;
var transform = CalculateIntermediateTransform(
if (brush.TileMode == TileMode.None) tileMode,
{ sourceRect,
drawRect = destinationRect; destinationRect,
transform *= Matrix.CreateTranslation(destinationRect.Position); scale,
} translate,
else out drawRect);
{ var renderer = new Renderer(intermediate);
drawRect = new Rect(0, 0, destinationRect.Width, destinationRect.Height);
}
renderer.Render(visual, null, transform, drawRect); renderer.Render(visual, null, transform, drawRect);
var result = new BitmapBrush(brt, brt.Bitmap); this.PlatformBrush = new BitmapBrush(
result.ExtendModeX = GetExtendModeX(brush.TileMode); target,
result.ExtendModeY = GetExtendModeY(brush.TileMode); intermediate.Bitmap,
GetBitmapBrushProperties(brush),
GetBrushProperties(brush, destinationRect));
}
if (brush.TileMode != TileMode.None) //var sourceRect = brush.SourceRect.ToPixels(layoutable.Bounds.Size);
{ //var destinationRect = brush.DestinationRect.ToPixels(targetSize);
result.Transform = SharpDX.Matrix3x2.Translation( //var bitmapSize = brush.TileMode == TileMode.None ? targetSize : destinationRect.Size;
(float)destinationRect.X, //var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size);
(float)destinationRect.Y); //var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale);
} //var options = CompatibleRenderTargetOptions.None;
PlatformBrush = result; //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;
//}
} }
} }
} }

Loading…
Cancel
Save