Browse Source

Make PixelSize accept a scaling factor for conversions.

For conversions between `PixelSize` and `Size` use a scaling factor by default; rename the DPI overloads to have a `WithDpi` suffix.
pull/2250/head
Steven Kirk 7 years ago
parent
commit
009b9a1ae7
  1. 2
      src/Avalonia.Visuals/Media/Imaging/Bitmap.cs
  2. 50
      src/Avalonia.Visuals/Media/PixelSize.cs
  3. 8
      src/Skia/Avalonia.Skia/DrawingContextImpl.cs
  4. 6
      src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
  5. 4
      src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs
  6. 4
      src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs

2
src/Avalonia.Visuals/Media/Imaging/Bitmap.cs

@ -75,7 +75,7 @@ namespace Avalonia.Media.Imaging
public Vector Dpi => PlatformImpl.Item.Dpi;
/// <inheritdoc/>
public Size Size => PlatformImpl.Item.PixelSize.ToSize(Dpi);
public Size Size => PlatformImpl.Item.PixelSize.ToSizeWithDpi(Dpi);
/// <inheritdoc/>
public PixelSize PixelSize => PlatformImpl.Item.PixelSize;

50
src/Avalonia.Visuals/Media/PixelSize.cs

@ -72,7 +72,7 @@ namespace Avalonia
/// <returns>The <see cref="PixelSize"/>.</returns>
public static PixelSize Parse(string s)
{
using (var tokenizer = new StringTokenizer(s, CultureInfo.InvariantCulture, exceptionMessage: "Invalid Size"))
using (var tokenizer = new StringTokenizer(s, CultureInfo.InvariantCulture, exceptionMessage: "Invalid PixelSize"))
{
return new PixelSize(
tokenizer.ReadInt32(),
@ -126,13 +126,29 @@ namespace Avalonia
/// <returns>The new <see cref="PixelSize"/>.</returns>
public PixelSize WithHeight(int height) => new PixelSize(Width, height);
/// <summary>
/// Converts the <see cref="PixelSize"/> to a device-independent <see cref="Size"/> using the
/// specified scaling factor.
/// </summary>
/// <param name="scale">The scaling factor.</param>
/// <returns>The device-independent size.</returns>
public Size ToSize(double scale) => new Size(Width / scale, Height / scale);
/// <summary>
/// Converts the <see cref="PixelSize"/> to a device-independent <see cref="Size"/> using the
/// specified scaling factor.
/// </summary>
/// <param name="scale">The scaling factor.</param>
/// <returns>The device-independent size.</returns>
public Size ToSize(Vector scale) => new Size(Width / scale.X, Height / scale.Y);
/// <summary>
/// Converts the <see cref="PixelSize"/> to a device-independent <see cref="Size"/> using the
/// specified dots per inch (DPI).
/// </summary>
/// <param name="dpi">The dots per inch.</param>
/// <returns>The device-independent size.</returns>
public Size ToSize(double dpi) => new Size(Width / (dpi / 96), Height / (dpi / 96));
public Size ToSizeWithDpi(double dpi) => ToSize(dpi / 96);
/// <summary>
/// Converts the <see cref="PixelSize"/> to a device-independent <see cref="Size"/> using the
@ -140,7 +156,27 @@ namespace Avalonia
/// </summary>
/// <param name="dpi">The dots per inch.</param>
/// <returns>The device-independent size.</returns>
public Size ToSize(Vector dpi) => new Size(Width / (dpi.X / 96), Height / (dpi.Y / 96));
public Size ToSizeWithDpi(Vector dpi) => ToSize(new Vector(dpi.X / 96, dpi.Y / 96));
/// <summary>
/// Converts a <see cref="Size"/> to device pixels using the specified scaling factor.
/// </summary>
/// <param name="size">The size.</param>
/// <param name="scale">The scaling factor.</param>
/// <returns>The device-independent size.</returns>
public static PixelSize FromSize(Size size, double scale) => new PixelSize(
(int)Math.Ceiling(size.Width * scale),
(int)Math.Ceiling(size.Height * scale));
/// <summary>
/// Converts a <see cref="Size"/> to device pixels using the specified scaling factor.
/// </summary>
/// <param name="size">The size.</param>
/// <param name="scale">The scaling factor.</param>
/// <returns>The device-independent size.</returns>
public static PixelSize FromSize(Size size, Vector scale) => new PixelSize(
(int)Math.Ceiling(size.Width * scale.X),
(int)Math.Ceiling(size.Height * scale.Y));
/// <summary>
/// Converts a <see cref="Size"/> to device pixels using the specified dots per inch (DPI).
@ -148,9 +184,7 @@ namespace Avalonia
/// <param name="size">The size.</param>
/// <param name="dpi">The dots per inch.</param>
/// <returns>The device-independent size.</returns>
public static PixelSize FromSize(Size size, double dpi) => new PixelSize(
(int)(size.Width * (dpi / 96)),
(int)(size.Height * (dpi / 96)));
public static PixelSize FromSizeWithDpi(Size size, double dpi) => FromSize(size, dpi / 96);
/// <summary>
/// Converts a <see cref="Size"/> to device pixels using the specified dots per inch (DPI).
@ -158,9 +192,7 @@ namespace Avalonia
/// <param name="size">The size.</param>
/// <param name="dpi">The dots per inch.</param>
/// <returns>The device-independent size.</returns>
public static PixelSize FromSize(Size size, Vector dpi) => new PixelSize(
(int)Math.Ceiling(size.Width * (dpi.X / 96)),
(int)Math.Ceiling(size.Height * (dpi.Y / 96)));
public static PixelSize FromSizeWithDpi(Size size, Vector dpi) => FromSize(size, new Vector(dpi.X / 96, dpi.Y / 96));
/// <summary>
/// Returns the string representation of the size.

8
src/Skia/Avalonia.Skia/DrawingContextImpl.cs

@ -401,15 +401,15 @@ namespace Avalonia.Skia
/// <param name="tileBrushImage">Tile brush image.</param>
private void ConfigureTileBrush(ref PaintWrapper paintWrapper, Size targetSize, ITileBrush tileBrush, IDrawableBitmapImpl tileBrushImage)
{
var calc = new TileBrushCalculator(tileBrush, tileBrushImage.PixelSize.ToSize(_dpi), targetSize);
var calc = new TileBrushCalculator(tileBrush, tileBrushImage.PixelSize.ToSizeWithDpi(_dpi), targetSize);
var intermediate = CreateRenderTarget(calc.IntermediateSize);
paintWrapper.AddDisposable(intermediate);
using (var context = intermediate.CreateDrawingContext(null))
{
var sourceRect = new Rect(tileBrushImage.PixelSize.ToSize(96));
var targetRect = new Rect(tileBrushImage.PixelSize.ToSize(_dpi));
var sourceRect = new Rect(tileBrushImage.PixelSize.ToSizeWithDpi(96));
var targetRect = new Rect(tileBrushImage.PixelSize.ToSizeWithDpi(_dpi));
context.Clear(Colors.Transparent);
context.PushClip(calc.IntermediateClip);
@ -634,7 +634,7 @@ namespace Avalonia.Skia
/// <returns></returns>
private SurfaceRenderTarget CreateRenderTarget(Size size, PixelFormat? format = null)
{
var pixelSize = PixelSize.FromSize(size, _dpi);
var pixelSize = PixelSize.FromSizeWithDpi(size, _dpi);
var createInfo = new SurfaceRenderTarget.CreateInfo
{
Width = pixelSize.Width,

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

@ -330,7 +330,7 @@ namespace Avalonia.Direct2D1.Media
{
var platform = AvaloniaLocator.Current.GetService<IPlatformRenderInterface>();
var dpi = new Vector(_deviceContext.DotsPerInch.Width, _deviceContext.DotsPerInch.Height);
var pixelSize = PixelSize.FromSize(size, dpi);
var pixelSize = PixelSize.FromSizeWithDpi(size, dpi);
return platform.CreateRenderTargetBitmap(pixelSize, dpi);
}
}
@ -438,12 +438,12 @@ namespace Avalonia.Direct2D1.Media
// D2D alters the DPI of the render target, which messes stuff up. PixelSize.FromSize
// will do the rounding for us.
var dpi = new Vector(_deviceContext.DotsPerInch.Width, _deviceContext.DotsPerInch.Height);
var pixelSize = PixelSize.FromSize(intermediateSize, dpi);
var pixelSize = PixelSize.FromSizeWithDpi(intermediateSize, dpi);
using (var intermediate = new BitmapRenderTarget(
_deviceContext,
CompatibleRenderTargetOptions.None,
pixelSize.ToSize(dpi).ToSharpDX()))
pixelSize.ToSizeWithDpi(dpi).ToSharpDX()))
{
using (var ctx = new RenderTarget(intermediate).CreateDrawingContext(_visualBrushRenderer))
{

4
src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs

@ -21,7 +21,7 @@ namespace Avalonia.Direct2D1.Media
Size targetSize)
{
var dpi = new Vector(target.DotsPerInch.Width, target.DotsPerInch.Height);
var calc = new TileBrushCalculator(brush, bitmap.PixelSize.ToSize(dpi), targetSize);
var calc = new TileBrushCalculator(brush, bitmap.PixelSize.ToSizeWithDpi(dpi), targetSize);
if (!calc.NeedsIntermediate)
{
@ -101,7 +101,7 @@ namespace Avalonia.Direct2D1.Media
using (var context = new RenderTarget(result).CreateDrawingContext(null))
{
var dpi = new Vector(target.DotsPerInch.Width, target.DotsPerInch.Height);
var rect = new Rect(bitmap.PixelSize.ToSize(dpi));
var rect = new Rect(bitmap.PixelSize.ToSizeWithDpi(dpi));
context.Clear(Colors.Transparent);
context.PushClip(calc.IntermediateClip);

4
src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs

@ -61,8 +61,8 @@ namespace Avalonia.Direct2D1.Media.Imaging
dc.DrawImage(
RefCountable.CreateUnownedNotClonable(this),
1,
new Rect(PixelSize.ToSize(Dpi.X)),
new Rect(PixelSize.ToSize(Dpi.X)));
new Rect(PixelSize.ToSizeWithDpi(Dpi.X)),
new Rect(PixelSize.ToSizeWithDpi(Dpi.X)));
}
wic.Save(stream);

Loading…
Cancel
Save