Index: tests/PremulAlphaRoundTripTest.cpp |
diff --git a/tests/PremulAlphaRoundTripTest.cpp b/tests/PremulAlphaRoundTripTest.cpp |
index 488d93e19d32d36d067c1e3d1724876da97962e9..68fbec80bd0d0ae087f23470ea97e0330487630f 100644 |
--- a/tests/PremulAlphaRoundTripTest.cpp |
+++ b/tests/PremulAlphaRoundTripTest.cpp |
@@ -9,31 +9,61 @@ |
#include "SkCanvas.h" |
#include "SkConfig8888.h" |
#include "Test.h" |
+#include "sk_tool_utils.h" |
#if SK_SUPPORT_GPU |
#include "GrContextFactory.h" |
#include "SkGpuDevice.h" |
#endif |
-static void fillCanvas(SkCanvas* canvas, SkCanvas::Config8888 unpremulConfig) { |
+static uint32_t pack_unpremul_rgba(SkColor c) { |
+ uint32_t packed; |
+ uint8_t* byte = reinterpret_cast<uint8_t*>(&packed); |
+ byte[0] = SkColorGetR(c); |
+ byte[1] = SkColorGetG(c); |
+ byte[2] = SkColorGetB(c); |
+ byte[3] = SkColorGetA(c); |
+ return packed; |
+} |
+ |
+static uint32_t pack_unpremul_bgra(SkColor c) { |
+ uint32_t packed; |
+ uint8_t* byte = reinterpret_cast<uint8_t*>(&packed); |
+ byte[0] = SkColorGetB(c); |
+ byte[1] = SkColorGetG(c); |
+ byte[2] = SkColorGetR(c); |
+ byte[3] = SkColorGetA(c); |
+ return packed; |
+} |
+ |
+typedef uint32_t (*PackUnpremulProc)(SkColor); |
+ |
+const struct { |
+ SkColorType fColorType; |
+ PackUnpremulProc fPackProc; |
+ SkCanvas::Config8888 fConfig8888; |
+} gUnpremul[] = { |
+ { kRGBA_8888_SkColorType, pack_unpremul_rgba, SkCanvas::kRGBA_Unpremul_Config8888 }, |
+ { kBGRA_8888_SkColorType, pack_unpremul_bgra, SkCanvas::kBGRA_Unpremul_Config8888 }, |
+}; |
+ |
+static void fillCanvas(SkCanvas* canvas, SkColorType colorType, PackUnpremulProc proc) { |
+ // Don't strictly need a bitmap, but its a handy way to allocate the pixels |
SkBitmap bmp; |
bmp.allocN32Pixels(256, 256); |
- SkAutoLockPixels alp(bmp); |
- uint32_t* pixels = reinterpret_cast<uint32_t*>(bmp.getPixels()); |
for (int a = 0; a < 256; ++a) { |
+ uint32_t* pixels = bmp.getAddr32(0, a); |
for (int r = 0; r < 256; ++r) { |
- pixels[a * 256 + r] = SkPackConfig8888(unpremulConfig, a, r, 0, 0); |
+ pixels[r] = proc(SkColorSetARGB(a, r, 0, 0)); |
} |
} |
- canvas->writePixels(bmp, 0, 0, unpremulConfig); |
-} |
-static const SkCanvas::Config8888 gUnpremulConfigs[] = { |
- SkCanvas::kNative_Unpremul_Config8888, |
- SkCanvas::kBGRA_Unpremul_Config8888, |
- SkCanvas::kRGBA_Unpremul_Config8888, |
-}; |
+ SkImageInfo info = bmp.info(); |
+ info.fColorType = colorType; |
+ info.fAlphaType = kUnpremul_SkAlphaType; |
+ canvas->writePixels(info, bmp.getPixels(), bmp.rowBytes(), 0, 0); |
+} |
DEF_GPUTEST(PremulAlphaRoundTrip, reporter, factory) { |
const SkImageInfo info = SkImageInfo::MakeN32Premul(256, 256); |
@@ -74,32 +104,23 @@ DEF_GPUTEST(PremulAlphaRoundTrip, reporter, factory) { |
SkBitmap readBmp2; |
readBmp2.allocN32Pixels(256, 256); |
- for (size_t upmaIdx = 0; |
- upmaIdx < SK_ARRAY_COUNT(gUnpremulConfigs); |
- ++upmaIdx) { |
- fillCanvas(&canvas, gUnpremulConfigs[upmaIdx]); |
- { |
- SkAutoLockPixels alp1(readBmp1); |
- SkAutoLockPixels alp2(readBmp2); |
- sk_bzero(readBmp1.getPixels(), readBmp1.getSafeSize()); |
- sk_bzero(readBmp2.getPixels(), readBmp2.getSafeSize()); |
- } |
+ for (size_t upmaIdx = 0; upmaIdx < SK_ARRAY_COUNT(gUnpremul); ++upmaIdx) { |
+ fillCanvas(&canvas, gUnpremul[upmaIdx].fColorType, gUnpremul[upmaIdx].fPackProc); |
+ |
+ readBmp1.eraseColor(0); |
+ readBmp2.eraseColor(0); |
- canvas.readPixels(&readBmp1, 0, 0, gUnpremulConfigs[upmaIdx]); |
- canvas.writePixels(readBmp1, 0, 0, gUnpremulConfigs[upmaIdx]); |
- canvas.readPixels(&readBmp2, 0, 0, gUnpremulConfigs[upmaIdx]); |
+ canvas.readPixels(&readBmp1, 0, 0, gUnpremul[upmaIdx].fConfig8888); |
+ sk_tool_utils::write_pixels(&canvas, readBmp1, 0, 0, gUnpremul[upmaIdx].fColorType, |
+ kUnpremul_SkAlphaType); |
+ canvas.readPixels(&readBmp2, 0, 0, gUnpremul[upmaIdx].fConfig8888); |
- SkAutoLockPixels alp1(readBmp1); |
- SkAutoLockPixels alp2(readBmp2); |
- uint32_t* pixels1 = |
- reinterpret_cast<uint32_t*>(readBmp1.getPixels()); |
- uint32_t* pixels2 = |
- reinterpret_cast<uint32_t*>(readBmp2.getPixels()); |
bool success = true; |
for (int y = 0; y < 256 && success; ++y) { |
+ const uint32_t* pixels1 = readBmp1.getAddr32(0, y); |
+ const uint32_t* pixels2 = readBmp2.getAddr32(0, y); |
for (int x = 0; x < 256 && success; ++x) { |
- int i = y * 256 + x; |
- REPORTER_ASSERT(reporter, success = pixels1[i] == pixels2[i]); |
+ REPORTER_ASSERT(reporter, success = pixels1[x] == pixels2[x]); |
} |
} |
} |