Browse Source

Add Rgb32 and Bgr32 pixel formats (#15398)

release/11.1.0-beta2
Benedikt Stebner 2 years ago
committed by Max Katz
parent
commit
0829faeab1
  1. 46
      src/Avalonia.Base/Media/Imaging/PixelFormatReaders.cs
  2. 42
      src/Avalonia.Base/Media/Imaging/PixelFormatWriter.cs
  3. 5
      src/Avalonia.Base/Platform/PixelFormat.cs
  4. 4
      src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs

46
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<Rgba8888PixelFormatReader>(pixels, source, size, stride);
break;
case PixelFormatEnum.Bgra8888:
Read<Bgra8888PixelFormatReader>(pixels, source, size, stride);
case PixelFormatEnum.Bgra8888:
Read<Bgra8888PixelFormatReader>(pixels, source, size, stride);
break;
case PixelFormatEnum.BlackWhite:
Read<BlackWhitePixelFormatReader>(pixels, source, size, stride);
@ -439,9 +475,15 @@ internal static unsafe class PixelFormatReader
case PixelFormatEnum.Rgb24:
Read<Rgb24PixelFormatReader>(pixels, source, size, stride);
break;
case PixelFormatEnum.Rgb32:
Read<Rgb32PixelFormatReader>(pixels, source, size, stride);
break;
case PixelFormatEnum.Bgr24:
Read<Bgr24PixelFormatReader>(pixels, source, size, stride);
break;
case PixelFormatEnum.Bgr32:
Read<Bgr32PixelFormatReader>(pixels, source, size, stride);
break;
case PixelFormatEnum.Bgr555:
Read<Bgr555PixelFormatReader>(pixels, source, size, stride);
break;

42
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<Rgb24PixelFormatWriter>(pixels, dest, size, stride, alphaFormat, srcAlphaFormat);
break;
case PixelFormatEnum.Rgb32:
Write<Rgb32PixelFormatWriter>(pixels, dest, size, stride, alphaFormat, srcAlphaFormat);
break;
case PixelFormatEnum.Bgr24:
Write<Bgr24PixelFormatWriter>(pixels, dest, size, stride, alphaFormat, srcAlphaFormat);
break;
case PixelFormatEnum.Bgr32:
Write<Bgr32PixelFormatWriter>(pixels, dest, size, stride, alphaFormat, srcAlphaFormat);
break;
case PixelFormatEnum.Bgr555:
Write<Bgr555PixelFormatWriter>(pixels, dest, size, stride, alphaFormat, srcAlphaFormat);
break;

5
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);
}

4
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;
}

Loading…
Cancel
Save