|
1 | 1 | using System; |
| 2 | +using System.Collections.Generic; |
2 | 3 | using System.Runtime.InteropServices; |
3 | 4 | using Xunit; |
4 | 5 |
|
5 | 6 | namespace SkiaSharp.Tests |
6 | 7 | { |
7 | 8 | public class SKPixmapTest : SKTest |
8 | 9 | { |
| 10 | + public static IEnumerable<object[]> GetAllColorTypes() |
| 11 | + { |
| 12 | + foreach (SKColorType ct in Enum.GetValues(typeof(SKColorType))) |
| 13 | + yield return new object[] { ct }; |
| 14 | + } |
| 15 | + |
9 | 16 | [SkippableFact] |
10 | 17 | public void CanScalePixels() |
11 | 18 | { |
@@ -48,7 +55,7 @@ public void ReadPixelSucceeds() |
48 | 55 |
|
49 | 56 | Assert.True(result); |
50 | 57 | } |
51 | | - |
| 58 | + |
52 | 59 | [SkippableFact] |
53 | 60 | public void WithMethodsDoNotModifySource() |
54 | 61 | { |
@@ -176,5 +183,90 @@ public void EncodeWithWebpEncoder() |
176 | 183 |
|
177 | 184 | Assert.Equal(SKEncodedImageFormat.Webp, codec.EncodedFormat); |
178 | 185 | } |
| 186 | + |
| 187 | + [SkippableFact] |
| 188 | + public void MismatchingColorTypesThrow() |
| 189 | + { |
| 190 | + var info = new SKImageInfo(1, 1, SKColorType.Rgba8888); |
| 191 | + using var bmp = new SKBitmap(info); |
| 192 | + using var pixmap = bmp.PeekPixels(); |
| 193 | + |
| 194 | + Assert.Throws<ArgumentException>(() => pixmap.GetPixelSpan<ushort>()); |
| 195 | + } |
| 196 | + |
| 197 | + [SkippableTheory] |
| 198 | + [MemberData(nameof(GetAllColorTypes))] |
| 199 | + public void ByteWorksForEverything(SKColorType colortype) |
| 200 | + { |
| 201 | + var info = new SKImageInfo(1, 1, colortype); |
| 202 | + using var bmp = new SKBitmap(info); |
| 203 | + using var pixmap = bmp.PeekPixels(); |
| 204 | + |
| 205 | + Assert.Equal(info.BytesSize, pixmap?.GetPixelSpan<byte>().Length ?? 0); |
| 206 | + } |
| 207 | + |
| 208 | + [SkippableTheory] |
| 209 | + [InlineData(0x00000000)] |
| 210 | + [InlineData(0xFF000000)] |
| 211 | + [InlineData(0xFFFF0000)] |
| 212 | + [InlineData(0xFF00FF00)] |
| 213 | + [InlineData(0xFF0000FF)] |
| 214 | + [InlineData(0xFFFFFFFF)] |
| 215 | + public void GetPixelSpanReadsValuesCorrectly(uint color) |
| 216 | + { |
| 217 | + var rgb888 = (SKColor)color; |
| 218 | + |
| 219 | + var info = new SKImageInfo(1, 1, SKColorType.Rgba8888); |
| 220 | + using var bmp = new SKBitmap(info); |
| 221 | + using var pixmap = bmp.PeekPixels(); |
| 222 | + |
| 223 | + pixmap.Erase(rgb888); |
| 224 | + |
| 225 | + // no need for swizzle |
| 226 | + Assert.Equal(rgb888, pixmap.GetPixelColor(0, 0)); |
| 227 | + |
| 228 | + // swizzle for some CPU endianness |
| 229 | + if (BitConverter.IsLittleEndian) |
| 230 | + rgb888 = new SKColor(rgb888.Blue, rgb888.Green, rgb888.Red, rgb888.Alpha); |
| 231 | + |
| 232 | + Assert.Equal(rgb888, pixmap.GetPixelSpan<SKColor>()[0]); |
| 233 | + Assert.Equal(rgb888, pixmap.GetPixelSpan<uint>()[0]); |
| 234 | + } |
| 235 | + |
| 236 | + [SkippableTheory] |
| 237 | + [InlineData(0x00000000, 0x0000)] |
| 238 | + [InlineData(0xFF000000, 0x0000)] |
| 239 | + [InlineData(0xFFFF0000, 0xF800)] |
| 240 | + [InlineData(0xFF00FF00, 0x07E0)] |
| 241 | + [InlineData(0xFF0000FF, 0x001F)] |
| 242 | + [InlineData(0xFFFFFFFF, 0xFFFF)] |
| 243 | + public void GetPixelSpanReads565Correctly(uint rgb888, ushort rgb565) |
| 244 | + { |
| 245 | + var info = new SKImageInfo(1, 1, SKColorType.Rgb565); |
| 246 | + using var bmp = new SKBitmap(info); |
| 247 | + using var pixmap = bmp.PeekPixels(); |
| 248 | + |
| 249 | + pixmap.Erase(rgb888); |
| 250 | + |
| 251 | + Assert.Equal(rgb565, pixmap.GetPixelSpan<ushort>()[0]); |
| 252 | + } |
| 253 | + |
| 254 | + [SkippableTheory] |
| 255 | + [InlineData(0x00000000, 0)] |
| 256 | + [InlineData(0xFF000000, 0)] |
| 257 | + [InlineData(0xFFFF0000, 53)] |
| 258 | + [InlineData(0xFF00FF00, 182)] |
| 259 | + [InlineData(0xFF0000FF, 18)] |
| 260 | + [InlineData(0xFFFFFFFF, 255)] |
| 261 | + public void GetPixelSpanReadsGray8Correctly(uint rgb888, byte gray8) |
| 262 | + { |
| 263 | + var info = new SKImageInfo(1, 1, SKColorType.Gray8); |
| 264 | + using var bmp = new SKBitmap(info); |
| 265 | + using var pixmap = bmp.PeekPixels(); |
| 266 | + |
| 267 | + pixmap.Erase(rgb888); |
| 268 | + |
| 269 | + Assert.Equal(gray8, pixmap.GetPixelSpan<byte>()[0]); |
| 270 | + } |
179 | 271 | } |
180 | 272 | } |
0 commit comments