|
|
|
@ -1,5 +1,6 @@ |
|
|
|
using System; |
|
|
|
using System.IO; |
|
|
|
using System.Security.Cryptography; |
|
|
|
using Avalonia.Win32.Interop; |
|
|
|
using SharpDX.WIC; |
|
|
|
using APixelFormat = Avalonia.Platform.PixelFormat; |
|
|
|
@ -14,6 +15,26 @@ namespace Avalonia.Direct2D1.Media |
|
|
|
{ |
|
|
|
private BitmapDecoder _decoder; |
|
|
|
|
|
|
|
private static BitmapInterpolationMode ConvertInterpolationMode(Avalonia.Visuals.Media.Imaging.BitmapInterpolationMode interpolationMode) |
|
|
|
{ |
|
|
|
switch (interpolationMode) |
|
|
|
{ |
|
|
|
case Visuals.Media.Imaging.BitmapInterpolationMode.Default: |
|
|
|
return BitmapInterpolationMode.Fant; |
|
|
|
|
|
|
|
case Visuals.Media.Imaging.BitmapInterpolationMode.LowQuality: |
|
|
|
return BitmapInterpolationMode.NearestNeighbor; |
|
|
|
|
|
|
|
case Visuals.Media.Imaging.BitmapInterpolationMode.MediumQuality: |
|
|
|
return BitmapInterpolationMode.Fant; |
|
|
|
|
|
|
|
default: |
|
|
|
case Visuals.Media.Imaging.BitmapInterpolationMode.HighQuality: |
|
|
|
return BitmapInterpolationMode.HighQualityCubic; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Initializes a new instance of the <see cref="WicBitmapImpl"/> class.
|
|
|
|
/// </summary>
|
|
|
|
@ -27,6 +48,12 @@ namespace Avalonia.Direct2D1.Media |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private WicBitmapImpl(Bitmap bmp) |
|
|
|
{ |
|
|
|
WicImpl = bmp; |
|
|
|
Dpi = new Vector(96, 96); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Initializes a new instance of the <see cref="WicBitmapImpl"/> class.
|
|
|
|
/// </summary>
|
|
|
|
@ -60,7 +87,7 @@ namespace Avalonia.Direct2D1.Media |
|
|
|
size.Height, |
|
|
|
pixelFormat.Value.ToWic(), |
|
|
|
BitmapCreateCacheOption.CacheOnLoad); |
|
|
|
WicImpl.SetResolution(dpi.X, dpi.Y); |
|
|
|
|
|
|
|
Dpi = dpi; |
|
|
|
} |
|
|
|
|
|
|
|
@ -84,6 +111,43 @@ namespace Avalonia.Direct2D1.Media |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public WicBitmapImpl(Stream stream, int decodeSize, bool horizontal, Avalonia.Visuals.Media.Imaging.BitmapInterpolationMode interpolationMode) |
|
|
|
{ |
|
|
|
_decoder = new BitmapDecoder(Direct2D1Platform.ImagingFactory, stream, DecodeOptions.CacheOnLoad); |
|
|
|
|
|
|
|
var frame = _decoder.GetFrame(0); |
|
|
|
|
|
|
|
// now scale that to the size that we want
|
|
|
|
var realScale = horizontal ? ((double)frame.Size.Height / frame.Size.Width) : ((double)frame.Size.Width / frame.Size.Height); |
|
|
|
|
|
|
|
PixelSize desired; |
|
|
|
|
|
|
|
if (horizontal) |
|
|
|
{ |
|
|
|
desired = new PixelSize(decodeSize, (int)(realScale * decodeSize)); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
desired = new PixelSize((int)(realScale * decodeSize), decodeSize); |
|
|
|
} |
|
|
|
|
|
|
|
if (frame.Size.Width != desired.Width || frame.Size.Height != desired.Height) |
|
|
|
{ |
|
|
|
using (var scaler = new BitmapScaler(Direct2D1Platform.ImagingFactory)) |
|
|
|
{ |
|
|
|
scaler.Initialize(frame, desired.Width, desired.Height, ConvertInterpolationMode(interpolationMode)); |
|
|
|
|
|
|
|
WicImpl = new Bitmap(Direct2D1Platform.ImagingFactory, scaler, BitmapCreateCacheOption.CacheOnLoad); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
WicImpl = new Bitmap(Direct2D1Platform.ImagingFactory, frame, BitmapCreateCacheOption.CacheOnLoad); |
|
|
|
} |
|
|
|
|
|
|
|
Dpi = new Vector(96, 96); |
|
|
|
} |
|
|
|
|
|
|
|
public override Vector Dpi { get; } |
|
|
|
|
|
|
|
public override PixelSize PixelSize => WicImpl.Size.ToAvalonia(); |
|
|
|
|