A cross-platform UI framework for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

355 lines
14 KiB

using System;
using Avalonia.Media.Imaging;
using Xunit;
namespace Avalonia.Base.UnitTests.Media.Imaging
{
public class PixelFormatWriterTests
{
private static readonly Rgba8888Pixel s_white = new Rgba8888Pixel
{
A = 255,
B = 255,
G = 255,
R = 255
};
private static readonly Rgba8888Pixel s_black = new Rgba8888Pixel
{
A = 255,
B = 0,
G = 0,
R = 0
};
[Fact]
public void Should_Write_Bgr555()
{
var bitmapMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Bgr555),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.Bgr555PixelFormatWriter();
var pixelReader = new PixelFormatReader.Bgr555PixelFormatReader();
pixelWriter.Reset(bitmapMemory.Address);
pixelReader.Reset(bitmapMemory.Address);
pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
Assert.Equal(new Rgba8888Pixel { R = 255, A = 255 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { G = 255 });
Assert.Equal(new Rgba8888Pixel { G = 255, A = 255 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { B = 255 });
Assert.Equal(new Rgba8888Pixel { B = 255, A = 255 }, pixelReader.ReadNext());
}
[Fact]
public void Should_Write_Bgra8888()
{
var sourceMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Bgra8888),
Platform.AlphaFormat.Unpremul,
new PixelSize(3, 1));
var sourceWriter = new PixelFormatWriter.Bgra8888PixelFormatWriter();
var sourceReader = new PixelFormatReader.Bgra8888PixelFormatReader();
sourceWriter.Reset(sourceMemory.Address);
sourceReader.Reset(sourceMemory.Address);
sourceWriter.WriteNext(new Rgba8888Pixel { R = 255 });
Assert.Equal(new Rgba8888Pixel { R = 255 }, sourceReader.ReadNext());
sourceWriter.WriteNext(new Rgba8888Pixel { G = 255 });
Assert.Equal(new Rgba8888Pixel { G = 255 }, sourceReader.ReadNext());
sourceWriter.WriteNext(new Rgba8888Pixel { B = 255 });
Assert.Equal(new Rgba8888Pixel { B = 255 }, sourceReader.ReadNext());
}
[Fact]
public void Should_Write_Rgba8888()
{
var sourceMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Rgba8888),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.Rgba8888PixelFormatWriter();
var pixelReader = new PixelFormatReader.Rgba8888PixelFormatReader();
pixelWriter.Reset(sourceMemory.Address);
pixelReader.Reset(sourceMemory.Address);
pixelWriter.WriteNext(new Rgba8888Pixel { R = 255, G = 125, B = 125, A = 125 });
Assert.Equal(new Rgba8888Pixel { R = 255, G = 125, B = 125, A = 125 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 255, B = 125, A = 125 });
Assert.Equal(new Rgba8888Pixel { R = 125, G = 255, B = 125, A = 125 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 125, B = 255, A = 125 });
Assert.Equal(new Rgba8888Pixel { R = 125, G = 125, B = 255, A = 125 }, pixelReader.ReadNext());
}
[Fact]
public void Should_Write_Rgb24()
{
var sourceMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Rgb24),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.Rgb24PixelFormatWriter();
var pixelReader = new PixelFormatReader.Rgb24PixelFormatReader();
pixelWriter.Reset(sourceMemory.Address);
pixelReader.Reset(sourceMemory.Address);
pixelWriter.WriteNext(new Rgba8888Pixel { R = 255, G = 125, B = 125 });
Assert.Equal(new Rgba8888Pixel { R = 255, G = 125, B = 125, A = 255 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 255, B = 125 });
Assert.Equal(new Rgba8888Pixel { R = 125, G = 255, B = 125, A = 255 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 125, B = 255 });
Assert.Equal(new Rgba8888Pixel { R = 125, G = 125, B = 255, A = 255 }, pixelReader.ReadNext());
}
[Fact]
public void Should_Write_Rgba64()
{
var sourceMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Rgba64),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.Rgba64PixelFormatWriter();
var pixelReader = new PixelFormatReader.Rgba64PixelFormatReader();
pixelWriter.Reset(sourceMemory.Address);
pixelReader.Reset(sourceMemory.Address);
pixelWriter.WriteNext(new Rgba8888Pixel { R = 255, G = 125, B = 125, A = 125 });
Assert.Equal(new Rgba8888Pixel { R = 255, G = 125, B = 125, A = 125 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 255, B = 125, A = 125 });
Assert.Equal(new Rgba8888Pixel { R = 125, G = 255, B = 125, A = 125 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 125, B = 255, A = 125 });
Assert.Equal(new Rgba8888Pixel { R = 125, G = 125, B = 255, A = 125 }, pixelReader.ReadNext());
}
[Fact]
public void Should_Write_Bgr565()
{
var bitmapMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Bgr565),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.Bgr565PixelFormatWriter();
var pixelReader = new PixelFormatReader.Bgr565PixelFormatReader();
pixelWriter.Reset(bitmapMemory.Address);
pixelReader.Reset(bitmapMemory.Address);
pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
Assert.Equal(new Rgba8888Pixel { R = 255, A = 255 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { G = 255 });
Assert.Equal(new Rgba8888Pixel { G = 255, A = 255 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { B = 255 });
Assert.Equal(new Rgba8888Pixel { B = 255, A = 255 }, pixelReader.ReadNext());
}
[Fact]
public void Should_Write_Gray32Float()
{
var bitmapMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Gray32Float),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.Gray32FloatPixelFormatWriter();
var pixelReader = new PixelFormatReader.Gray32FloatPixelFormatReader();
pixelWriter.Reset(bitmapMemory.Address);
pixelReader.Reset(bitmapMemory.Address);
pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
Assert.Equal(new Rgba8888Pixel { R = 255, G = 255, B = 255, A = 255 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { R = 125 });
Assert.Equal(new Rgba8888Pixel { R = 125, G = 125, B = 125, A = 255 }, pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel());
Assert.Equal(new Rgba8888Pixel { A = 255 }, pixelReader.ReadNext());
}
[Fact]
public void Should_Write_BlackWhite()
{
var bitmapMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.BlackWhite),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.BlackWhitePixelFormatWriter();
var pixelReader = new PixelFormatReader.BlackWhitePixelFormatReader();
pixelWriter.Reset(bitmapMemory.Address);
pixelReader.Reset(bitmapMemory.Address);
pixelWriter.WriteNext(s_white);
Assert.Equal(s_white, pixelReader.ReadNext());
pixelWriter.WriteNext(s_black);
Assert.Equal(s_black, pixelReader.ReadNext());
}
[Fact]
public void Should_Write_Gray2()
{
var palette = new[]
{
s_black,
new Rgba8888Pixel
{
A = 255, B = 0x55, G = 0x55, R = 0x55
},
new Rgba8888Pixel
{
A = 255, B = 0xAA, G = 0xAA, R = 0xAA
},
s_white
};
var bitmapMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Gray2),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.Gray2PixelFormatWriter();
var pixelReader = new PixelFormatReader.Gray2PixelFormatReader();
pixelWriter.Reset(bitmapMemory.Address);
pixelReader.Reset(bitmapMemory.Address);
pixelWriter.WriteNext(palette[0]);
Assert.Equal(palette[0], pixelReader.ReadNext());
pixelWriter.WriteNext(palette[1]);
Assert.Equal(palette[1], pixelReader.ReadNext());
pixelWriter.WriteNext(palette[2]);
Assert.Equal(palette[2], pixelReader.ReadNext());
pixelWriter.WriteNext(palette[3]);
Assert.Equal(palette[3], pixelReader.ReadNext());
}
[Fact]
public void Should_Write_Gray4()
{
var bitmapMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Gray4),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.Gray4PixelFormatWriter();
var pixelReader = new PixelFormatReader.Gray4PixelFormatReader();
pixelWriter.Reset(bitmapMemory.Address);
pixelReader.Reset(bitmapMemory.Address);
pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
Assert.Equal(GetGray4(new Rgba8888Pixel { R = 255 }), pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { R = 17 });
Assert.Equal(GetGray4(new Rgba8888Pixel { R = 17 }), pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel());
Assert.Equal(new Rgba8888Pixel { A = 255 }, pixelReader.ReadNext());
}
private static Rgba8888Pixel GetGray4(Rgba8888Pixel pixel)
{
var grayscale = (byte)Math.Round(0.299F * pixel.R + 0.587F * pixel.G + 0.114F * pixel.B);
var value = (byte)(grayscale / 255F * 0xF);
value = (byte)(value | (value << 4));
return new Rgba8888Pixel(value, value, value, 255);
}
[Fact]
public void Should_Write_Gray8()
{
var bitmapMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Gray8),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.Gray8PixelFormatWriter();
var pixelReader = new PixelFormatReader.Gray8PixelFormatReader();
pixelWriter.Reset(bitmapMemory.Address);
pixelReader.Reset(bitmapMemory.Address);
pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
Assert.Equal(GetGray8(new Rgba8888Pixel { R = 255 }), pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { R = 120 });
Assert.Equal(GetGray8(new Rgba8888Pixel { R = 120 }), pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel());
Assert.Equal(GetGray8(new Rgba8888Pixel { A = 255 }), pixelReader.ReadNext());
}
private static Rgba8888Pixel GetGray8(Rgba8888Pixel pixel)
{
var value = (byte)Math.Round(0.299F * pixel.R + 0.587F * pixel.G + 0.114F * pixel.B);
return new Rgba8888Pixel(value, value, value, 255);
}
[Fact]
public void Should_Write_Gray16()
{
var bitmapMemory = new BitmapMemory(
new Platform.PixelFormat(Platform.PixelFormatEnum.Gray16),
Platform.AlphaFormat.Unpremul,
new PixelSize(10, 10));
var pixelWriter = new PixelFormatWriter.Gray16PixelFormatWriter();
var pixelReader = new PixelFormatReader.Gray16PixelFormatReader();
pixelWriter.Reset(bitmapMemory.Address);
pixelReader.Reset(bitmapMemory.Address);
pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
Assert.Equal(GetGray16(new Rgba8888Pixel { R = 255 }), pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel { R = 120 });
Assert.Equal(GetGray16(new Rgba8888Pixel { R = 120 }), pixelReader.ReadNext());
pixelWriter.WriteNext(new Rgba8888Pixel());
Assert.Equal(GetGray16(new Rgba8888Pixel { A = 255 }), pixelReader.ReadNext());
}
private static Rgba8888Pixel GetGray16(Rgba8888Pixel pixel)
{
var grayscale = (ushort)Math.Round((0.299F * pixel.R + 0.587F * pixel.G + 0.114F * pixel.B) * 0x0101);
var value = (byte)(grayscale >> 8);
return new Rgba8888Pixel(value, value, value, 255);
}
}
}