diff --git a/src/Avalonia.Base/Media/Imaging/PixelFormatReaders.cs b/src/Avalonia.Base/Media/Imaging/PixelFormatReaders.cs index bf055f892d..bbb9e404d4 100644 --- a/src/Avalonia.Base/Media/Imaging/PixelFormatReaders.cs +++ b/src/Avalonia.Base/Media/Imaging/PixelFormatReaders.cs @@ -344,6 +344,23 @@ internal static unsafe class PixelFormatReader public void Reset(IntPtr address) => _address = (Rgba8888Pixel*)address; } + public unsafe struct Rgb32PixelFormatReader : IPixelFormatReader + { + private Rgba8888Pixel* _address; + public Rgba8888Pixel ReadNext() + { + var address = (byte*)_address; + + var value = new Rgba8888Pixel(address[0], address[1], address[2], 255); + + _address++; + + return value; + } + + public void Reset(IntPtr address) => _address = (Rgba8888Pixel*)address; + } + public unsafe struct Bgra8888PixelFormatReader : IPixelFormatReader { private byte* _address; @@ -359,6 +376,23 @@ internal static unsafe class PixelFormatReader public void Reset(IntPtr address) => _address = (byte*)address; } + public unsafe struct Bgr32PixelFormatReader : IPixelFormatReader + { + private Rgba8888Pixel* _address; + public Rgba8888Pixel ReadNext() + { + var address = (byte*)_address; + + var value = new Rgba8888Pixel(address[2], address[1], address[0], 255); + + _address++; + + return value; + } + + public void Reset(IntPtr address) => _address = (Rgba8888Pixel*)address; + } + public static bool SupportsFormat(PixelFormat format) { switch (format.FormatEnum) @@ -374,7 +408,9 @@ internal static unsafe class PixelFormatReader case PixelFormatEnum.Gray32Float: case PixelFormatEnum.Rgba64: case PixelFormatEnum.Rgb24: + case PixelFormatEnum.Rgb32: case PixelFormatEnum.Bgr24: + case PixelFormatEnum.Bgr32: case PixelFormatEnum.Bgr555: case PixelFormatEnum.Bgr565: return true; @@ -412,8 +448,8 @@ internal static unsafe class PixelFormatReader case PixelFormatEnum.Rgba8888: Read(pixels, source, size, stride); break; - case PixelFormatEnum.Bgra8888: - Read(pixels, source, size, stride); + case PixelFormatEnum.Bgra8888: + Read(pixels, source, size, stride); break; case PixelFormatEnum.BlackWhite: Read(pixels, source, size, stride); @@ -439,9 +475,15 @@ internal static unsafe class PixelFormatReader case PixelFormatEnum.Rgb24: Read(pixels, source, size, stride); break; + case PixelFormatEnum.Rgb32: + Read(pixels, source, size, stride); + break; case PixelFormatEnum.Bgr24: Read(pixels, source, size, stride); break; + case PixelFormatEnum.Bgr32: + Read(pixels, source, size, stride); + break; case PixelFormatEnum.Bgr555: Read(pixels, source, size, stride); break; diff --git a/src/Avalonia.Base/Media/Imaging/PixelFormatWriter.cs b/src/Avalonia.Base/Media/Imaging/PixelFormatWriter.cs index 9cc399e432..732345fc0c 100644 --- a/src/Avalonia.Base/Media/Imaging/PixelFormatWriter.cs +++ b/src/Avalonia.Base/Media/Imaging/PixelFormatWriter.cs @@ -27,6 +27,24 @@ internal static unsafe class PixelFormatWriter public void Reset(IntPtr address) => _address = (byte*)address; } + public unsafe struct Rgb32PixelFormatWriter : IPixelFormatWriter + { + private byte* _address; + public void WriteNext(Rgba8888Pixel pixel) + { + var address = _address; + + address[0] = pixel.R; + address[1] = pixel.G; + address[2] = pixel.B; + address[3] = 255; + + _address += 4; + } + + public void Reset(IntPtr address) => _address = (byte*)address; + } + public unsafe struct Rgba64PixelFormatWriter : IPixelFormatWriter { private Rgba64Pixel* _address; @@ -92,6 +110,24 @@ internal static unsafe class PixelFormatWriter public void Reset(IntPtr address) => _address = (byte*)address; } + public unsafe struct Bgr32PixelFormatWriter : IPixelFormatWriter + { + private byte* _address; + public void WriteNext(Rgba8888Pixel pixel) + { + var address = _address; + + address[0] = pixel.B; + address[1] = pixel.G; + address[2] = pixel.R; + address[3] = 255; + + _address += 4; + } + + public void Reset(IntPtr address) => _address = (byte*)address; + } + public unsafe struct Bgra32PixelFormatWriter : IPixelFormatWriter { private byte* _address; @@ -434,9 +470,15 @@ internal static unsafe class PixelFormatWriter case PixelFormatEnum.Rgb24: Write(pixels, dest, size, stride, alphaFormat, srcAlphaFormat); break; + case PixelFormatEnum.Rgb32: + Write(pixels, dest, size, stride, alphaFormat, srcAlphaFormat); + break; case PixelFormatEnum.Bgr24: Write(pixels, dest, size, stride, alphaFormat, srcAlphaFormat); break; + case PixelFormatEnum.Bgr32: + Write(pixels, dest, size, stride, alphaFormat, srcAlphaFormat); + break; case PixelFormatEnum.Bgr555: Write(pixels, dest, size, stride, alphaFormat, srcAlphaFormat); break; diff --git a/src/Avalonia.Base/Platform/PixelFormat.cs b/src/Avalonia.Base/Platform/PixelFormat.cs index d03b4e04b8..68ebacbdcd 100644 --- a/src/Avalonia.Base/Platform/PixelFormat.cs +++ b/src/Avalonia.Base/Platform/PixelFormat.cs @@ -15,7 +15,9 @@ namespace Avalonia.Platform Gray32Float, Rgba64, Rgb24, + Rgb32, Bgr24, + Bgr32, Bgr555, Bgr565 } @@ -61,6 +63,7 @@ namespace Avalonia.Platform public static PixelFormat Rgb565 => PixelFormats.Rgb565; public static PixelFormat Rgba8888 => PixelFormats.Rgba8888; + public static PixelFormat Rgb32 => PixelFormats.Rgb32; public static PixelFormat Bgra8888 => PixelFormats.Bgra8888; public override string ToString() => FormatEnum.ToString(); @@ -79,7 +82,9 @@ namespace Avalonia.Platform public static PixelFormat Gray16 { get; } = new PixelFormat(PixelFormatEnum.Gray16); public static PixelFormat Gray32Float { get; } = new PixelFormat(PixelFormatEnum.Gray32Float); public static PixelFormat Rgb24 { get; } = new PixelFormat(PixelFormatEnum.Rgb24); + public static PixelFormat Rgb32 { get; } = new PixelFormat(PixelFormatEnum.Rgb32); public static PixelFormat Bgr24 { get; } = new PixelFormat(PixelFormatEnum.Bgr24); + public static PixelFormat Bgr32 { get; } = new PixelFormat(PixelFormatEnum.Bgr32); public static PixelFormat Bgr555 { get; } = new PixelFormat(PixelFormatEnum.Bgr555); public static PixelFormat Bgr565 { get; } = new PixelFormat(PixelFormatEnum.Bgr565); } diff --git a/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs b/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs index 273308cb57..9c0e867149 100644 --- a/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs +++ b/src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs @@ -142,6 +142,8 @@ namespace Avalonia.Skia return SKColorType.Bgra8888; if (fmt == PixelFormat.Rgba8888) return SKColorType.Rgba8888; + if (fmt == PixelFormat.Rgb32) + return SKColorType.Rgb888x; throw new ArgumentException("Unknown pixel format: " + fmt); } @@ -153,6 +155,8 @@ namespace Avalonia.Skia return PixelFormats.Bgra8888; if (colorType == SKColorType.Rgba8888) return PixelFormats.Rgba8888; + if (colorType == SKColorType.Rgb888x) + return PixelFormats.Rgb32; return null; }