Browse Source

Add default alpha and pixel formats to render interfaces.

pull/4106/head
Dariusz Komosinski 6 years ago
parent
commit
aff78fa662
  1. 8
      src/Avalonia.Headless/HeadlessPlatformRenderInterface.cs
  2. 18
      src/Avalonia.Visuals/Media/Imaging/Bitmap.cs
  3. 32
      src/Avalonia.Visuals/Media/Imaging/WriteableBitmap.cs
  4. 16
      src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs
  5. 8
      src/Skia/Avalonia.Skia/PlatformRenderInterface.cs
  6. 7
      src/Skia/Avalonia.Skia/WriteableBitmapImpl.cs
  7. 6
      src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs
  8. 6
      tests/Avalonia.Benchmarks/NullRenderingPlatform.cs
  9. 8
      tests/Avalonia.UnitTests/MockPlatformRenderInterface.cs
  10. 4
      tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs

8
src/Avalonia.Headless/HeadlessPlatformRenderInterface.cs

@ -21,7 +21,11 @@ namespace Avalonia.Headless
public IEnumerable<string> InstalledFontNames { get; } = new[] { "Tahoma" };
public bool SupportsIndividualRoundRects => throw new NotImplementedException();
public bool SupportsIndividualRoundRects => false;
public AlphaFormat DefaultAlphaFormat => AlphaFormat.Premul;
public PixelFormat DefaultPixelFormat => PixelFormat.Rgba8888;
public IFormattedTextImpl CreateFormattedText(string text, Typeface typeface, double fontSize, TextAlignment textAlignment, TextWrapping wrapping, Size constraint, IReadOnlyList<FormattedTextStyleSpan> spans)
{
@ -51,7 +55,7 @@ namespace Avalonia.Headless
return new HeadlessBitmapStub(size, dpi);
}
public IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat? format = null, AlphaFormat? alphaFormat = null)
public IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat format, AlphaFormat alphaFormat)
{
return new HeadlessBitmapStub(size, dpi);
}

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

@ -95,6 +95,24 @@ namespace Avalonia.Media.Imaging
PlatformImpl.Dispose();
}
/// <summary>
/// Initializes a new instance of the <see cref="Bitmap"/> class.
/// </summary>
/// <param name="format">The pixel format.</param>
/// <param name="alphaFormat">The alpha format.</param>
/// <param name="data">The pointer to the source bytes.</param>
/// <param name="size">The size of the bitmap in device pixels.</param>
/// <param name="dpi">The DPI of the bitmap.</param>
/// <param name="stride">The number of bytes per row.</param>
[Obsolete("Use overload taking an AlphaFormat.")]
public Bitmap(PixelFormat format, IntPtr data, PixelSize size, Vector dpi, int stride)
{
var ri = AvaloniaLocator.Current.GetService<IPlatformRenderInterface>();
PlatformImpl = RefCountable.Create(AvaloniaLocator.Current.GetService<IPlatformRenderInterface>()
.LoadBitmap(format, ri.DefaultAlphaFormat, data, size, dpi, stride));
}
/// <summary>
/// Initializes a new instance of the <see cref="Bitmap"/> class.
/// </summary>

32
src/Avalonia.Visuals/Media/Imaging/WriteableBitmap.cs

@ -1,4 +1,5 @@
using Avalonia.Platform;
using System;
using Avalonia.Platform;
namespace Avalonia.Media.Imaging
{
@ -7,6 +8,19 @@ namespace Avalonia.Media.Imaging
/// </summary>
public class WriteableBitmap : Bitmap
{
/// <summary>
/// Initializes a new instance of the <see cref="WriteableBitmap"/> class.
/// </summary>
/// <param name="size">The size of the bitmap in device pixels.</param>
/// <param name="dpi">The DPI of the bitmap.</param>
/// <param name="format">The pixel format (optional).</param>
/// <returns>An <see cref="IWriteableBitmapImpl"/>.</returns>
[Obsolete("Use overload taking an AlphaFormat.")]
public WriteableBitmap(PixelSize size, Vector dpi, PixelFormat? format = null)
: base(CreatePlatformImpl(size, dpi, format, null))
{
}
/// <summary>
/// Initializes a new instance of the <see cref="WriteableBitmap"/> class.
/// </summary>
@ -15,11 +29,21 @@ namespace Avalonia.Media.Imaging
/// <param name="format">The pixel format (optional).</param>
/// <param name="alphaFormat">The alpha format (optional).</param>
/// <returns>An <see cref="IWriteableBitmapImpl"/>.</returns>
public WriteableBitmap(PixelSize size, Vector dpi, PixelFormat? format = null, AlphaFormat? alphaFormat = null)
: base(AvaloniaLocator.Current.GetService<IPlatformRenderInterface>().CreateWriteableBitmap(size, dpi, format, alphaFormat))
public WriteableBitmap(PixelSize size, Vector dpi, PixelFormat format, AlphaFormat alphaFormat)
: base(CreatePlatformImpl(size, dpi, format, alphaFormat))
{
}
public ILockedFramebuffer Lock() => ((IWriteableBitmapImpl) PlatformImpl.Item).Lock();
private static IBitmapImpl CreatePlatformImpl(PixelSize size, in Vector dpi, PixelFormat? format, AlphaFormat? alphaFormat)
{
var ri = AvaloniaLocator.Current.GetService<IPlatformRenderInterface>();
PixelFormat finalFormat = format ?? ri.DefaultPixelFormat;
AlphaFormat finalAlphaFormat = alphaFormat ?? ri.DefaultAlphaFormat;
return ri.CreateWriteableBitmap(size, dpi, finalFormat, finalAlphaFormat);
}
}
}

16
src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs

@ -81,10 +81,10 @@ namespace Avalonia.Platform
/// </summary>
/// <param name="size">The size of the bitmap in device pixels.</param>
/// <param name="dpi">The DPI of the bitmap.</param>
/// <param name="format">Pixel format (optional).</param>
/// <param name="alphaFormat">Alpha format (optional).</param>
/// <param name="format">Pixel format.</param>
/// <param name="alphaFormat">Alpha format .</param>
/// <returns>An <see cref="IWriteableBitmapImpl"/>.</returns>
IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat? format = null, AlphaFormat? alphaFormat = null);
IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat format, AlphaFormat alphaFormat);
/// <summary>
/// Loads a bitmap implementation from a file..
@ -141,5 +141,15 @@ namespace Avalonia.Platform
IGlyphRunImpl CreateGlyphRun(GlyphRun glyphRun, out double width);
bool SupportsIndividualRoundRects { get; }
/// <summary>
/// Default <see cref="AlphaFormat"/> used on this platform.
/// </summary>
public AlphaFormat DefaultAlphaFormat { get; }
/// <summary>
/// Default <see cref="PixelFormat"/> used on this platform.
/// </summary>
public PixelFormat DefaultPixelFormat { get; }
}
}

8
src/Skia/Avalonia.Skia/PlatformRenderInterface.cs

@ -22,6 +22,8 @@ namespace Avalonia.Skia
public PlatformRenderInterface(ISkiaGpu skiaGpu, long? maxResourceBytes = null)
{
DefaultPixelFormat = SKImageInfo.PlatformColorType.ToPixelFormat();
if (skiaGpu != null)
{
_skiaGpu = skiaGpu;
@ -150,7 +152,7 @@ namespace Avalonia.Skia
}
/// <inheritdoc />
public IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat? format = null, AlphaFormat? alphaFormat = null)
public IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat format, AlphaFormat alphaFormat)
{
return new WriteableBitmapImpl(size, dpi, format, alphaFormat);
}
@ -265,5 +267,9 @@ namespace Avalonia.Skia
}
public bool SupportsIndividualRoundRects => true;
public AlphaFormat DefaultAlphaFormat => AlphaFormat.Premul;
public PixelFormat DefaultPixelFormat { get; }
}
}

7
src/Skia/Avalonia.Skia/WriteableBitmapImpl.cs

@ -23,14 +23,13 @@ namespace Avalonia.Skia
/// <param name="dpi">The DPI of the bitmap.</param>
/// <param name="format">The pixel format.</param>
/// <param name="alphaFormat">The alpha format.</param>
public WriteableBitmapImpl(PixelSize size, Vector dpi, PixelFormat? format = null, AlphaFormat? alphaFormat = null)
public WriteableBitmapImpl(PixelSize size, Vector dpi, PixelFormat format, AlphaFormat alphaFormat)
{
PixelSize = size;
Dpi = dpi;
var colorType = PixelFormatHelper.ResolveColorType(format);
SKAlphaType alphaType = alphaFormat?.ToSkAlphaType() ?? SKAlphaType.Premul;
SKColorType colorType = format.ToSkColorType();
SKAlphaType alphaType = alphaFormat.ToSkAlphaType();
var runtimePlatform = AvaloniaLocator.Current?.GetService<IRuntimePlatform>();

6
src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs

@ -166,7 +166,7 @@ namespace Avalonia.Direct2D1
return new WicRenderTargetBitmapImpl(size, dpi);
}
public IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat? format = null, AlphaFormat? alphaFormat = null)
public IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat format, AlphaFormat alphaFormat)
{
return new WriteableWicBitmapImpl(size, dpi, format, alphaFormat);
}
@ -261,5 +261,9 @@ namespace Avalonia.Direct2D1
}
public bool SupportsIndividualRoundRects => false;
public AlphaFormat DefaultAlphaFormat => AlphaFormat.Premul;
public PixelFormat DefaultPixelFormat => PixelFormat.Bgra8888;
}
}

6
tests/Avalonia.Benchmarks/NullRenderingPlatform.cs

@ -46,7 +46,7 @@ namespace Avalonia.Benchmarks
throw new NotImplementedException();
}
public IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat? format = null, AlphaFormat? alphaFormat = null)
public IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat format, AlphaFormat alphaFormat)
{
throw new NotImplementedException();
}
@ -94,5 +94,9 @@ namespace Avalonia.Benchmarks
}
public bool SupportsIndividualRoundRects => true;
public AlphaFormat DefaultAlphaFormat => AlphaFormat.Premul;
public PixelFormat DefaultPixelFormat => PixelFormat.Rgba8888;
}
}

8
tests/Avalonia.UnitTests/MockPlatformRenderInterface.cs

@ -55,8 +55,8 @@ namespace Avalonia.UnitTests
public IWriteableBitmapImpl CreateWriteableBitmap(
PixelSize size,
Vector dpi,
PixelFormat? format = null,
AlphaFormat? alphaFormat = null)
PixelFormat format,
AlphaFormat alphaFormat)
{
throw new NotImplementedException();
}
@ -104,5 +104,9 @@ namespace Avalonia.UnitTests
}
public bool SupportsIndividualRoundRects { get; set; }
public AlphaFormat DefaultAlphaFormat => AlphaFormat.Premul;
public PixelFormat DefaultPixelFormat => PixelFormat.Rgba8888;
}
}

4
tests/Avalonia.Visuals.UnitTests/VisualTree/MockRenderInterface.cs

@ -58,13 +58,15 @@ namespace Avalonia.Visuals.UnitTests.VisualTree
}
public bool SupportsIndividualRoundRects { get; set; }
public AlphaFormat DefaultAlphaFormat { get; }
public PixelFormat DefaultPixelFormat { get; }
public IFontManagerImpl CreateFontManager()
{
return new MockFontManagerImpl();
}
public IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat? fmt, AlphaFormat? alphaFormat)
public IWriteableBitmapImpl CreateWriteableBitmap(PixelSize size, Vector dpi, PixelFormat fmt, AlphaFormat alphaFormat)
{
throw new NotImplementedException();
}

Loading…
Cancel
Save