PixelFormatWriterTests.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. using System;
  2. using Avalonia.Media.Imaging;
  3. using Xunit;
  4. namespace Avalonia.Base.UnitTests.Media.Imaging
  5. {
  6. public class PixelFormatWriterTests
  7. {
  8. private static readonly Rgba8888Pixel s_white = new Rgba8888Pixel
  9. {
  10. A = 255,
  11. B = 255,
  12. G = 255,
  13. R = 255
  14. };
  15. private static readonly Rgba8888Pixel s_black = new Rgba8888Pixel
  16. {
  17. A = 255,
  18. B = 0,
  19. G = 0,
  20. R = 0
  21. };
  22. [Fact]
  23. public void Should_Write_Bgr555()
  24. {
  25. var bitmapMemory = new BitmapMemory(
  26. new Platform.PixelFormat(Platform.PixelFormatEnum.Bgr555),
  27. Platform.AlphaFormat.Unpremul,
  28. new PixelSize(10, 10));
  29. var pixelWriter = new PixelFormatWriter.Bgr555PixelFormatWriter();
  30. var pixelReader = new PixelFormatReader.Bgr555PixelFormatReader();
  31. pixelWriter.Reset(bitmapMemory.Address);
  32. pixelReader.Reset(bitmapMemory.Address);
  33. pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
  34. Assert.Equal(new Rgba8888Pixel { R = 255, A = 255 }, pixelReader.ReadNext());
  35. pixelWriter.WriteNext(new Rgba8888Pixel { G = 255 });
  36. Assert.Equal(new Rgba8888Pixel { G = 255, A = 255 }, pixelReader.ReadNext());
  37. pixelWriter.WriteNext(new Rgba8888Pixel { B = 255 });
  38. Assert.Equal(new Rgba8888Pixel { B = 255, A = 255 }, pixelReader.ReadNext());
  39. }
  40. [Fact]
  41. public void Should_Write_Bgra8888()
  42. {
  43. var sourceMemory = new BitmapMemory(
  44. new Platform.PixelFormat(Platform.PixelFormatEnum.Bgra8888),
  45. Platform.AlphaFormat.Unpremul,
  46. new PixelSize(3, 1));
  47. var sourceWriter = new PixelFormatWriter.Bgra8888PixelFormatWriter();
  48. var sourceReader = new PixelFormatReader.Bgra8888PixelFormatReader();
  49. sourceWriter.Reset(sourceMemory.Address);
  50. sourceReader.Reset(sourceMemory.Address);
  51. sourceWriter.WriteNext(new Rgba8888Pixel { R = 255 });
  52. Assert.Equal(new Rgba8888Pixel { R = 255 }, sourceReader.ReadNext());
  53. sourceWriter.WriteNext(new Rgba8888Pixel { G = 255 });
  54. Assert.Equal(new Rgba8888Pixel { G = 255 }, sourceReader.ReadNext());
  55. sourceWriter.WriteNext(new Rgba8888Pixel { B = 255 });
  56. Assert.Equal(new Rgba8888Pixel { B = 255 }, sourceReader.ReadNext());
  57. }
  58. [Fact]
  59. public void Should_Write_Rgba8888()
  60. {
  61. var sourceMemory = new BitmapMemory(
  62. new Platform.PixelFormat(Platform.PixelFormatEnum.Rgba8888),
  63. Platform.AlphaFormat.Unpremul,
  64. new PixelSize(10, 10));
  65. var pixelWriter = new PixelFormatWriter.Rgba8888PixelFormatWriter();
  66. var pixelReader = new PixelFormatReader.Rgba8888PixelFormatReader();
  67. pixelWriter.Reset(sourceMemory.Address);
  68. pixelReader.Reset(sourceMemory.Address);
  69. pixelWriter.WriteNext(new Rgba8888Pixel { R = 255, G = 125, B = 125, A = 125 });
  70. Assert.Equal(new Rgba8888Pixel { R = 255, G = 125, B = 125, A = 125 }, pixelReader.ReadNext());
  71. pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 255, B = 125, A = 125 });
  72. Assert.Equal(new Rgba8888Pixel { R = 125, G = 255, B = 125, A = 125 }, pixelReader.ReadNext());
  73. pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 125, B = 255, A = 125 });
  74. Assert.Equal(new Rgba8888Pixel { R = 125, G = 125, B = 255, A = 125 }, pixelReader.ReadNext());
  75. }
  76. [Fact]
  77. public void Should_Write_Rgb24()
  78. {
  79. var sourceMemory = new BitmapMemory(
  80. new Platform.PixelFormat(Platform.PixelFormatEnum.Rgb24),
  81. Platform.AlphaFormat.Unpremul,
  82. new PixelSize(10, 10));
  83. var pixelWriter = new PixelFormatWriter.Rgb24PixelFormatWriter();
  84. var pixelReader = new PixelFormatReader.Rgb24PixelFormatReader();
  85. pixelWriter.Reset(sourceMemory.Address);
  86. pixelReader.Reset(sourceMemory.Address);
  87. pixelWriter.WriteNext(new Rgba8888Pixel { R = 255, G = 125, B = 125 });
  88. Assert.Equal(new Rgba8888Pixel { R = 255, G = 125, B = 125, A = 255 }, pixelReader.ReadNext());
  89. pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 255, B = 125 });
  90. Assert.Equal(new Rgba8888Pixel { R = 125, G = 255, B = 125, A = 255 }, pixelReader.ReadNext());
  91. pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 125, B = 255 });
  92. Assert.Equal(new Rgba8888Pixel { R = 125, G = 125, B = 255, A = 255 }, pixelReader.ReadNext());
  93. }
  94. [Fact]
  95. public void Should_Write_Rgba64()
  96. {
  97. var sourceMemory = new BitmapMemory(
  98. new Platform.PixelFormat(Platform.PixelFormatEnum.Rgba64),
  99. Platform.AlphaFormat.Unpremul,
  100. new PixelSize(10, 10));
  101. var pixelWriter = new PixelFormatWriter.Rgba64PixelFormatWriter();
  102. var pixelReader = new PixelFormatReader.Rgba64PixelFormatReader();
  103. pixelWriter.Reset(sourceMemory.Address);
  104. pixelReader.Reset(sourceMemory.Address);
  105. pixelWriter.WriteNext(new Rgba8888Pixel { R = 255, G = 125, B = 125, A = 125 });
  106. Assert.Equal(new Rgba8888Pixel { R = 255, G = 125, B = 125, A = 125 }, pixelReader.ReadNext());
  107. pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 255, B = 125, A = 125 });
  108. Assert.Equal(new Rgba8888Pixel { R = 125, G = 255, B = 125, A = 125 }, pixelReader.ReadNext());
  109. pixelWriter.WriteNext(new Rgba8888Pixel { R = 125, G = 125, B = 255, A = 125 });
  110. Assert.Equal(new Rgba8888Pixel { R = 125, G = 125, B = 255, A = 125 }, pixelReader.ReadNext());
  111. }
  112. [Fact]
  113. public void Should_Write_Bgr565()
  114. {
  115. var bitmapMemory = new BitmapMemory(
  116. new Platform.PixelFormat(Platform.PixelFormatEnum.Bgr565),
  117. Platform.AlphaFormat.Unpremul,
  118. new PixelSize(10, 10));
  119. var pixelWriter = new PixelFormatWriter.Bgr565PixelFormatWriter();
  120. var pixelReader = new PixelFormatReader.Bgr565PixelFormatReader();
  121. pixelWriter.Reset(bitmapMemory.Address);
  122. pixelReader.Reset(bitmapMemory.Address);
  123. pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
  124. Assert.Equal(new Rgba8888Pixel { R = 255, A = 255 }, pixelReader.ReadNext());
  125. pixelWriter.WriteNext(new Rgba8888Pixel { G = 255 });
  126. Assert.Equal(new Rgba8888Pixel { G = 255, A = 255 }, pixelReader.ReadNext());
  127. pixelWriter.WriteNext(new Rgba8888Pixel { B = 255 });
  128. Assert.Equal(new Rgba8888Pixel { B = 255, A = 255 }, pixelReader.ReadNext());
  129. }
  130. [Fact]
  131. public void Should_Write_Gray32Float()
  132. {
  133. var bitmapMemory = new BitmapMemory(
  134. new Platform.PixelFormat(Platform.PixelFormatEnum.Gray32Float),
  135. Platform.AlphaFormat.Unpremul,
  136. new PixelSize(10, 10));
  137. var pixelWriter = new PixelFormatWriter.Gray32FloatPixelFormatWriter();
  138. var pixelReader = new PixelFormatReader.Gray32FloatPixelFormatReader();
  139. pixelWriter.Reset(bitmapMemory.Address);
  140. pixelReader.Reset(bitmapMemory.Address);
  141. pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
  142. Assert.Equal(new Rgba8888Pixel { R = 255, G = 255, B = 255, A = 255 }, pixelReader.ReadNext());
  143. pixelWriter.WriteNext(new Rgba8888Pixel { R = 125 });
  144. Assert.Equal(new Rgba8888Pixel { R = 125, G = 125, B = 125, A = 255 }, pixelReader.ReadNext());
  145. pixelWriter.WriteNext(new Rgba8888Pixel());
  146. Assert.Equal(new Rgba8888Pixel { A = 255 }, pixelReader.ReadNext());
  147. }
  148. [Fact]
  149. public void Should_Write_BlackWhite()
  150. {
  151. var bitmapMemory = new BitmapMemory(
  152. new Platform.PixelFormat(Platform.PixelFormatEnum.BlackWhite),
  153. Platform.AlphaFormat.Unpremul,
  154. new PixelSize(10, 10));
  155. var pixelWriter = new PixelFormatWriter.BlackWhitePixelFormatWriter();
  156. var pixelReader = new PixelFormatReader.BlackWhitePixelFormatReader();
  157. pixelWriter.Reset(bitmapMemory.Address);
  158. pixelReader.Reset(bitmapMemory.Address);
  159. pixelWriter.WriteNext(s_white);
  160. Assert.Equal(s_white, pixelReader.ReadNext());
  161. pixelWriter.WriteNext(s_black);
  162. Assert.Equal(s_black, pixelReader.ReadNext());
  163. }
  164. [Fact]
  165. public void Should_Write_Gray2()
  166. {
  167. var palette = new[]
  168. {
  169. s_black,
  170. new Rgba8888Pixel
  171. {
  172. A = 255, B = 0x55, G = 0x55, R = 0x55
  173. },
  174. new Rgba8888Pixel
  175. {
  176. A = 255, B = 0xAA, G = 0xAA, R = 0xAA
  177. },
  178. s_white
  179. };
  180. var bitmapMemory = new BitmapMemory(
  181. new Platform.PixelFormat(Platform.PixelFormatEnum.Gray2),
  182. Platform.AlphaFormat.Unpremul,
  183. new PixelSize(10, 10));
  184. var pixelWriter = new PixelFormatWriter.Gray2PixelFormatWriter();
  185. var pixelReader = new PixelFormatReader.Gray2PixelFormatReader();
  186. pixelWriter.Reset(bitmapMemory.Address);
  187. pixelReader.Reset(bitmapMemory.Address);
  188. pixelWriter.WriteNext(palette[0]);
  189. Assert.Equal(palette[0], pixelReader.ReadNext());
  190. pixelWriter.WriteNext(palette[1]);
  191. Assert.Equal(palette[1], pixelReader.ReadNext());
  192. pixelWriter.WriteNext(palette[2]);
  193. Assert.Equal(palette[2], pixelReader.ReadNext());
  194. pixelWriter.WriteNext(palette[3]);
  195. Assert.Equal(palette[3], pixelReader.ReadNext());
  196. }
  197. [Fact]
  198. public void Should_Write_Gray4()
  199. {
  200. var bitmapMemory = new BitmapMemory(
  201. new Platform.PixelFormat(Platform.PixelFormatEnum.Gray4),
  202. Platform.AlphaFormat.Unpremul,
  203. new PixelSize(10, 10));
  204. var pixelWriter = new PixelFormatWriter.Gray4PixelFormatWriter();
  205. var pixelReader = new PixelFormatReader.Gray4PixelFormatReader();
  206. pixelWriter.Reset(bitmapMemory.Address);
  207. pixelReader.Reset(bitmapMemory.Address);
  208. pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
  209. Assert.Equal(GetGray4(new Rgba8888Pixel { R = 255 }), pixelReader.ReadNext());
  210. pixelWriter.WriteNext(new Rgba8888Pixel { R = 17 });
  211. Assert.Equal(GetGray4(new Rgba8888Pixel { R = 17 }), pixelReader.ReadNext());
  212. pixelWriter.WriteNext(new Rgba8888Pixel());
  213. Assert.Equal(new Rgba8888Pixel { A = 255 }, pixelReader.ReadNext());
  214. }
  215. private static Rgba8888Pixel GetGray4(Rgba8888Pixel pixel)
  216. {
  217. var grayscale = (byte)Math.Round(0.299F * pixel.R + 0.587F * pixel.G + 0.114F * pixel.B);
  218. var value = (byte)(grayscale / 255F * 0xF);
  219. value = (byte)(value | (value << 4));
  220. return new Rgba8888Pixel(value, value, value, 255);
  221. }
  222. [Fact]
  223. public void Should_Write_Gray8()
  224. {
  225. var bitmapMemory = new BitmapMemory(
  226. new Platform.PixelFormat(Platform.PixelFormatEnum.Gray8),
  227. Platform.AlphaFormat.Unpremul,
  228. new PixelSize(10, 10));
  229. var pixelWriter = new PixelFormatWriter.Gray8PixelFormatWriter();
  230. var pixelReader = new PixelFormatReader.Gray8PixelFormatReader();
  231. pixelWriter.Reset(bitmapMemory.Address);
  232. pixelReader.Reset(bitmapMemory.Address);
  233. pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
  234. Assert.Equal(GetGray8(new Rgba8888Pixel { R = 255 }), pixelReader.ReadNext());
  235. pixelWriter.WriteNext(new Rgba8888Pixel { R = 120 });
  236. Assert.Equal(GetGray8(new Rgba8888Pixel { R = 120 }), pixelReader.ReadNext());
  237. pixelWriter.WriteNext(new Rgba8888Pixel());
  238. Assert.Equal(GetGray8(new Rgba8888Pixel { A = 255 }), pixelReader.ReadNext());
  239. }
  240. private static Rgba8888Pixel GetGray8(Rgba8888Pixel pixel)
  241. {
  242. var value = (byte)Math.Round(0.299F * pixel.R + 0.587F * pixel.G + 0.114F * pixel.B);
  243. return new Rgba8888Pixel(value, value, value, 255);
  244. }
  245. [Fact]
  246. public void Should_Write_Gray16()
  247. {
  248. var bitmapMemory = new BitmapMemory(
  249. new Platform.PixelFormat(Platform.PixelFormatEnum.Gray16),
  250. Platform.AlphaFormat.Unpremul,
  251. new PixelSize(10, 10));
  252. var pixelWriter = new PixelFormatWriter.Gray16PixelFormatWriter();
  253. var pixelReader = new PixelFormatReader.Gray16PixelFormatReader();
  254. pixelWriter.Reset(bitmapMemory.Address);
  255. pixelReader.Reset(bitmapMemory.Address);
  256. pixelWriter.WriteNext(new Rgba8888Pixel { R = 255 });
  257. Assert.Equal(GetGray16(new Rgba8888Pixel { R = 255 }), pixelReader.ReadNext());
  258. pixelWriter.WriteNext(new Rgba8888Pixel { R = 120 });
  259. Assert.Equal(GetGray16(new Rgba8888Pixel { R = 120 }), pixelReader.ReadNext());
  260. pixelWriter.WriteNext(new Rgba8888Pixel());
  261. Assert.Equal(GetGray16(new Rgba8888Pixel { A = 255 }), pixelReader.ReadNext());
  262. }
  263. private static Rgba8888Pixel GetGray16(Rgba8888Pixel pixel)
  264. {
  265. var grayscale = (ushort)Math.Round((0.299F * pixel.R + 0.587F * pixel.G + 0.114F * pixel.B) * 0x0101);
  266. var value = (byte)(grayscale >> 8);
  267. return new Rgba8888Pixel(value, value, value, 255);
  268. }
  269. }
  270. }