Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(325)

Unified Diff: tests/BitmapCopyTest.cpp

Issue 390693002: Add SkBitmap::readPixels() and reimplement copyTo and SkCanvas::readPixels (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkConfig8888.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/BitmapCopyTest.cpp
diff --git a/tests/BitmapCopyTest.cpp b/tests/BitmapCopyTest.cpp
index 40cfbe0d54232969c0873a395a10db84849c4071..4a49a6b487b1030b53bf56fd1f5a6ca0e5d6b1e1 100644
--- a/tests/BitmapCopyTest.cpp
+++ b/tests/BitmapCopyTest.cpp
@@ -185,7 +185,7 @@ static void writeCoordPixels(SkBitmap& bm, const Coordinates& coords) {
static const Pair gPairs[] = {
{ kUnknown_SkColorType, "000000" },
{ kAlpha_8_SkColorType, "010101" },
- { kIndex_8_SkColorType, "011101" },
+ { kIndex_8_SkColorType, "011111" },
{ kRGB_565_SkColorType, "010101" },
{ kARGB_4444_SkColorType, "010111" },
{ kN32_SkColorType, "010111" },
@@ -542,3 +542,96 @@ DEF_TEST(BitmapCopy, reporter) {
} // for (size_t copyCase ...
}
}
+
+#include "SkColorPriv.h"
+#include "SkUtils.h"
+
+/**
+ * Construct 4x4 pixels where we can look at a color and determine where it should be in the grid.
+ * alpha = 0xFF, blue = 0x80, red = x, green = y
+ */
+static void fill_4x4_pixels(SkPMColor colors[16]) {
+ for (int y = 0; y < 4; ++y) {
+ for (int x = 0; x < 4; ++x) {
+ colors[y*4+x] = SkPackARGB32(0xFF, x, y, 0x80);
+ }
+ }
+}
+
+static bool check_4x4_pixel(SkPMColor color, unsigned x, unsigned y) {
+ SkASSERT(x < 4 && y < 4);
+ return 0xFF == SkGetPackedA32(color) &&
+ x == SkGetPackedR32(color) &&
+ y == SkGetPackedG32(color) &&
+ 0x80 == SkGetPackedB32(color);
+}
+
+/**
+ * Fill with all zeros, which will never match any value from fill_4x4_pixels
+ */
+static void clear_4x4_pixels(SkPMColor colors[16]) {
+ sk_memset32(colors, 0, 16);
+}
+
+// Much of readPixels is exercised by copyTo testing, since readPixels is the backend for that
+// method. Here we explicitly test subset copies.
+//
+DEF_TEST(BitmapReadPixels, reporter) {
+ const int W = 4;
+ const int H = 4;
+ const size_t rowBytes = W * sizeof(SkPMColor);
+ const SkImageInfo srcInfo = SkImageInfo::MakeN32Premul(W, H);
+ SkPMColor srcPixels[16];
+ fill_4x4_pixels(srcPixels);
+ SkBitmap srcBM;
+ srcBM.installPixels(srcInfo, srcPixels, rowBytes);
+
+ SkImageInfo dstInfo = SkImageInfo::MakeN32Premul(W, H);
+ SkPMColor dstPixels[16];
+
+ const struct {
+ bool fExpectedSuccess;
+ SkIPoint fRequestedSrcLoc;
+ SkISize fRequestedDstSize;
+ // If fExpectedSuccess, check these, otherwise ignore
+ SkIPoint fExpectedDstLoc;
+ SkIRect fExpectedSrcR;
+ } gRec[] = {
+ { true, { 0, 0 }, { 4, 4 }, { 0, 0 }, { 0, 0, 4, 4 } },
+ { true, { 1, 1 }, { 2, 2 }, { 0, 0 }, { 1, 1, 3, 3 } },
+ { true, { 2, 2 }, { 4, 4 }, { 0, 0 }, { 2, 2, 4, 4 } },
+ { true, {-1,-1 }, { 2, 2 }, { 1, 1 }, { 0, 0, 1, 1 } },
+ { false, {-1,-1 }, { 1, 1 }, { 0, 0 }, { 0, 0, 0, 0 } },
+ };
+
+ for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
+ clear_4x4_pixels(dstPixels);
+
+ dstInfo.fWidth = gRec[i].fRequestedDstSize.width();
+ dstInfo.fHeight = gRec[i].fRequestedDstSize.height();
+ bool success = srcBM.readPixels(dstInfo, dstPixels, rowBytes,
+ gRec[i].fRequestedSrcLoc.x(), gRec[i].fRequestedSrcLoc.y());
+
+ REPORTER_ASSERT(reporter, gRec[i].fExpectedSuccess == success);
+ if (success) {
+ const SkIRect srcR = gRec[i].fExpectedSrcR;
+ const int dstX = gRec[i].fExpectedDstLoc.x();
+ const int dstY = gRec[i].fExpectedDstLoc.y();
+ // Walk the dst pixels, and check if we got what we expected
+ for (int y = 0; y < H; ++y) {
+ for (int x = 0; x < W; ++x) {
+ SkPMColor dstC = dstPixels[y*4+x];
+ // get into src coordinates
+ int sx = x - dstX + srcR.x();
+ int sy = y - dstY + srcR.y();
+ if (srcR.contains(sx, sy)) {
+ REPORTER_ASSERT(reporter, check_4x4_pixel(dstC, sx, sy));
+ } else {
+ REPORTER_ASSERT(reporter, 0 == dstC);
+ }
+ }
+ }
+ }
+ }
+}
+
« no previous file with comments | « src/core/SkConfig8888.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698