| Index: tests/BitmapCopyTest.cpp
|
| diff --git a/tests/BitmapCopyTest.cpp b/tests/BitmapCopyTest.cpp
|
| index 4058b0477503a24e583c2a6fc7735a5e20594d2f..10e5163dbb1cbea722a973f775e24bf3d8a00355 100644
|
| --- a/tests/BitmapCopyTest.cpp
|
| +++ b/tests/BitmapCopyTest.cpp
|
| @@ -183,8 +183,6 @@ static const char* getSkConfigName(const SkBitmap& bm) {
|
| case SkBitmap::kRGB_565_Config: return "SkBitmap::kRGB_565_Config";
|
| case SkBitmap::kARGB_4444_Config: return "SkBitmap::kARGB_4444_Config";
|
| case SkBitmap::kARGB_8888_Config: return "SkBitmap::kARGB_8888_Config";
|
| - case SkBitmap::kRLE_Index8_Config:
|
| - return "SkBitmap::kRLE_Index8_Config,";
|
| default: return "Unknown SkBitmap configuration.";
|
| }
|
| }
|
| @@ -247,8 +245,6 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
|
| { SkBitmap::kRGB_565_Config, "00101010" },
|
| { SkBitmap::kARGB_4444_Config, "00101110" },
|
| { SkBitmap::kARGB_8888_Config, "00101010" },
|
| -// TODO: create valid RLE bitmap to test with
|
| - // { SkBitmap::kRLE_Index8_Config, "00101111" }
|
| };
|
|
|
| static const bool isExtracted[] = {
|
| @@ -264,8 +260,7 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
|
| SkColorTable* ct = NULL;
|
|
|
| src.setConfig(gPairs[i].fConfig, W, H);
|
| - if (SkBitmap::kIndex8_Config == src.config() ||
|
| - SkBitmap::kRLE_Index8_Config == src.config()) {
|
| + if (SkBitmap::kIndex8_Config == src.config()) {
|
| ct = init_ctable();
|
| }
|
| src.allocPixels(ct);
|
| @@ -365,247 +360,242 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
|
| // Test copying to/from external buffer.
|
| // Note: the tests below have hard-coded values ---
|
| // Please take care if modifying.
|
| - if (gPairs[i].fConfig != SkBitmap::kRLE_Index8_Config) {
|
| -
|
| - // Tests for getSafeSize64().
|
| - // Test with a very large configuration without pixel buffer
|
| - // attached.
|
| - SkBitmap tstSafeSize;
|
| - tstSafeSize.setConfig(gPairs[i].fConfig, 100000000U,
|
| - 100000000U);
|
| - Sk64 safeSize = tstSafeSize.getSafeSize64();
|
| - if (safeSize.isNeg()) {
|
| - SkString str;
|
| - str.printf("getSafeSize64() negative: %s",
|
| - getSkConfigName(tstSafeSize));
|
| - reporter->reportFailed(str);
|
| - }
|
| - bool sizeFail = false;
|
| - // Compare against hand-computed values.
|
| - switch (gPairs[i].fConfig) {
|
| - case SkBitmap::kNo_Config:
|
| - break;
|
| -
|
| - case SkBitmap::kA1_Config:
|
| - if (safeSize.fHi != 0x470DE ||
|
| - safeSize.fLo != 0x4DF82000)
|
| - sizeFail = true;
|
| - break;
|
| -
|
| - case SkBitmap::kA8_Config:
|
| - case SkBitmap::kIndex8_Config:
|
| - if (safeSize.fHi != 0x2386F2 ||
|
| - safeSize.fLo != 0x6FC10000)
|
| - sizeFail = true;
|
| - break;
|
| -
|
| - case SkBitmap::kRGB_565_Config:
|
| - case SkBitmap::kARGB_4444_Config:
|
| - if (safeSize.fHi != 0x470DE4 ||
|
| - safeSize.fLo != 0xDF820000)
|
| - sizeFail = true;
|
| - break;
|
| -
|
| - case SkBitmap::kARGB_8888_Config:
|
| - if (safeSize.fHi != 0x8E1BC9 ||
|
| - safeSize.fLo != 0xBF040000)
|
| - sizeFail = true;
|
| - break;
|
| -
|
| - case SkBitmap::kRLE_Index8_Config:
|
| - break;
|
| -
|
| - default:
|
| - break;
|
| - }
|
| - if (sizeFail) {
|
| - SkString str;
|
| - str.printf("getSafeSize64() wrong size: %s",
|
| - getSkConfigName(tstSafeSize));
|
| - reporter->reportFailed(str);
|
| - }
|
|
|
| - size_t subW, subH;
|
| - // Set sizes to be height = 2 to force the last row of the
|
| - // source to be used, thus verifying correct operation if
|
| - // the bitmap is an extracted subset.
|
| - if (gPairs[i].fConfig == SkBitmap::kA1_Config) {
|
| - // If one-bit per pixel, use 9 pixels to force more than
|
| - // one byte per row.
|
| - subW = 9;
|
| - subH = 2;
|
| - } else {
|
| - // All other configurations are at least one byte per pixel,
|
| - // and different configs will test copying different numbers
|
| - // of bytes.
|
| - subW = subH = 2;
|
| - }
|
| + // Tests for getSafeSize64().
|
| + // Test with a very large configuration without pixel buffer
|
| + // attached.
|
| + SkBitmap tstSafeSize;
|
| + tstSafeSize.setConfig(gPairs[i].fConfig, 100000000U,
|
| + 100000000U);
|
| + Sk64 safeSize = tstSafeSize.getSafeSize64();
|
| + if (safeSize.isNeg()) {
|
| + SkString str;
|
| + str.printf("getSafeSize64() negative: %s",
|
| + getSkConfigName(tstSafeSize));
|
| + reporter->reportFailed(str);
|
| + }
|
| + bool sizeFail = false;
|
| + // Compare against hand-computed values.
|
| + switch (gPairs[i].fConfig) {
|
| + case SkBitmap::kNo_Config:
|
| + break;
|
| +
|
| + case SkBitmap::kA1_Config:
|
| + if (safeSize.fHi != 0x470DE ||
|
| + safeSize.fLo != 0x4DF82000)
|
| + sizeFail = true;
|
| + break;
|
| +
|
| + case SkBitmap::kA8_Config:
|
| + case SkBitmap::kIndex8_Config:
|
| + if (safeSize.fHi != 0x2386F2 ||
|
| + safeSize.fLo != 0x6FC10000)
|
| + sizeFail = true;
|
| + break;
|
| +
|
| + case SkBitmap::kRGB_565_Config:
|
| + case SkBitmap::kARGB_4444_Config:
|
| + if (safeSize.fHi != 0x470DE4 ||
|
| + safeSize.fLo != 0xDF820000)
|
| + sizeFail = true;
|
| + break;
|
| +
|
| + case SkBitmap::kARGB_8888_Config:
|
| + if (safeSize.fHi != 0x8E1BC9 ||
|
| + safeSize.fLo != 0xBF040000)
|
| + sizeFail = true;
|
| + break;
|
| +
|
| + default:
|
| + break;
|
| + }
|
| + if (sizeFail) {
|
| + SkString str;
|
| + str.printf("getSafeSize64() wrong size: %s",
|
| + getSkConfigName(tstSafeSize));
|
| + reporter->reportFailed(str);
|
| + }
|
|
|
| - // Create bitmap to act as source for copies and subsets.
|
| - SkBitmap src, subset;
|
| - SkColorTable* ct = NULL;
|
| - if (isExtracted[copyCase]) { // A larger image to extract from.
|
| - src.setConfig(gPairs[i].fConfig, 2 * subW + 1, subH);
|
| - } else // Tests expect a 2x2 bitmap, so make smaller.
|
| - src.setConfig(gPairs[i].fConfig, subW, subH);
|
| - if (SkBitmap::kIndex8_Config == src.config() ||
|
| - SkBitmap::kRLE_Index8_Config == src.config()) {
|
| - ct = init_ctable();
|
| - }
|
| + size_t subW, subH;
|
| + // Set sizes to be height = 2 to force the last row of the
|
| + // source to be used, thus verifying correct operation if
|
| + // the bitmap is an extracted subset.
|
| + if (gPairs[i].fConfig == SkBitmap::kA1_Config) {
|
| + // If one-bit per pixel, use 9 pixels to force more than
|
| + // one byte per row.
|
| + subW = 9;
|
| + subH = 2;
|
| + } else {
|
| + // All other configurations are at least one byte per pixel,
|
| + // and different configs will test copying different numbers
|
| + // of bytes.
|
| + subW = subH = 2;
|
| + }
|
|
|
| - src.allocPixels(ct);
|
| - SkSafeUnref(ct);
|
| + // Create bitmap to act as source for copies and subsets.
|
| + SkBitmap src, subset;
|
| + SkColorTable* ct = NULL;
|
| + if (isExtracted[copyCase]) { // A larger image to extract from.
|
| + src.setConfig(gPairs[i].fConfig, 2 * subW + 1, subH);
|
| + } else { // Tests expect a 2x2 bitmap, so make smaller.
|
| + src.setConfig(gPairs[i].fConfig, subW, subH);
|
| + }
|
| + if (SkBitmap::kIndex8_Config == src.config()) {
|
| + ct = init_ctable();
|
| + }
|
|
|
| - // Either copy src or extract into 'subset', which is used
|
| - // for subsequent calls to copyPixelsTo/From.
|
| - bool srcReady = false;
|
| - if (isExtracted[copyCase]) {
|
| - // The extractedSubset() test case allows us to test copy-
|
| - // ing when src and dst mave possibly different strides.
|
| - SkIRect r;
|
| - if (gPairs[i].fConfig == SkBitmap::kA1_Config)
|
| - // This config seems to need byte-alignment of
|
| - // extracted subset bits.
|
| - r.set(0, 0, subW, subH);
|
| - else
|
| - r.set(1, 0, 1 + subW, subH); // 2x2 extracted bitmap
|
| -
|
| - srcReady = src.extractSubset(&subset, r);
|
| - } else {
|
| - srcReady = src.copyTo(&subset, src.getConfig());
|
| - }
|
| + src.allocPixels(ct);
|
| + SkSafeUnref(ct);
|
|
|
| - // Not all configurations will generate a valid 'subset'.
|
| - if (srcReady) {
|
| -
|
| - // Allocate our target buffer 'buf' for all copies.
|
| - // To simplify verifying correctness of copies attach
|
| - // buf to a SkBitmap, but copies are done using the
|
| - // raw buffer pointer.
|
| - const uint32_t bufSize = subH *
|
| - SkBitmap::ComputeRowBytes(src.getConfig(), subW) * 2;
|
| - SkAutoMalloc autoBuf (bufSize);
|
| - uint8_t* buf = static_cast<uint8_t*>(autoBuf.get());
|
| -
|
| - SkBitmap bufBm; // Attach buf to this bitmap.
|
| - bool successExpected;
|
| -
|
| - // Set up values for each pixel being copied.
|
| - Coordinates coords(subW * subH);
|
| - for (size_t x = 0; x < subW; ++x)
|
| - for (size_t y = 0; y < subH; ++y)
|
| - {
|
| - int index = y * subW + x;
|
| - SkASSERT(index < coords.length);
|
| - coords[index]->fX = x;
|
| - coords[index]->fY = y;
|
| - }
|
| -
|
| - writeCoordPixels(subset, coords);
|
| -
|
| - // Test #1 ////////////////////////////////////////////
|
| -
|
| - // Before/after comparisons easier if we attach buf
|
| - // to an appropriately configured SkBitmap.
|
| - memset(buf, 0xFF, bufSize);
|
| - // Config with stride greater than src but that fits in buf.
|
| - bufBm.setConfig(gPairs[i].fConfig, subW, subH,
|
| - SkBitmap::ComputeRowBytes(subset.getConfig(), subW)
|
| - * 2);
|
| - bufBm.setPixels(buf);
|
| - successExpected = false;
|
| - // Then attempt to copy with a stride that is too large
|
| - // to fit in the buffer.
|
| - REPORTER_ASSERT(reporter,
|
| - subset.copyPixelsTo(buf, bufSize, bufBm.rowBytes() * 3)
|
| - == successExpected);
|
| + // Either copy src or extract into 'subset', which is used
|
| + // for subsequent calls to copyPixelsTo/From.
|
| + bool srcReady = false;
|
| + if (isExtracted[copyCase]) {
|
| + // The extractedSubset() test case allows us to test copy-
|
| + // ing when src and dst mave possibly different strides.
|
| + SkIRect r;
|
| + if (gPairs[i].fConfig == SkBitmap::kA1_Config)
|
| + // This config seems to need byte-alignment of
|
| + // extracted subset bits.
|
| + r.set(0, 0, subW, subH);
|
| + else
|
| + r.set(1, 0, 1 + subW, subH); // 2x2 extracted bitmap
|
| +
|
| + srcReady = src.extractSubset(&subset, r);
|
| + } else {
|
| + srcReady = src.copyTo(&subset, src.getConfig());
|
| + }
|
|
|
| - if (successExpected)
|
| - reportCopyVerification(subset, bufBm, coords,
|
| - "copyPixelsTo(buf, bufSize, 1.5*maxRowBytes)",
|
| - reporter);
|
| -
|
| - // Test #2 ////////////////////////////////////////////
|
| - // This test should always succeed, but in the case
|
| - // of extracted bitmaps only because we handle the
|
| - // issue of getSafeSize(). Without getSafeSize()
|
| - // buffer overrun/read would occur.
|
| - memset(buf, 0xFF, bufSize);
|
| - bufBm.setConfig(gPairs[i].fConfig, subW, subH,
|
| - subset.rowBytes());
|
| - bufBm.setPixels(buf);
|
| - successExpected = subset.getSafeSize() <= bufSize;
|
| - REPORTER_ASSERT(reporter,
|
| - subset.copyPixelsTo(buf, bufSize) ==
|
| - successExpected);
|
| - if (successExpected)
|
| - reportCopyVerification(subset, bufBm, coords,
|
| - "copyPixelsTo(buf, bufSize)", reporter);
|
| -
|
| - // Test #3 ////////////////////////////////////////////
|
| - // Copy with different stride between src and dst.
|
| - memset(buf, 0xFF, bufSize);
|
| - bufBm.setConfig(gPairs[i].fConfig, subW, subH,
|
| - subset.rowBytes()+1);
|
| - bufBm.setPixels(buf);
|
| - successExpected = true; // Should always work.
|
| - REPORTER_ASSERT(reporter,
|
| - subset.copyPixelsTo(buf, bufSize,
|
| - subset.rowBytes()+1) == successExpected);
|
| - if (successExpected)
|
| - reportCopyVerification(subset, bufBm, coords,
|
| - "copyPixelsTo(buf, bufSize, rowBytes+1)", reporter);
|
| -
|
| - // Test #4 ////////////////////////////////////////////
|
| - // Test copy with stride too small.
|
| - memset(buf, 0xFF, bufSize);
|
| - bufBm.setConfig(gPairs[i].fConfig, subW, subH);
|
| - bufBm.setPixels(buf);
|
| - successExpected = false;
|
| - // Request copy with stride too small.
|
| - REPORTER_ASSERT(reporter,
|
| - subset.copyPixelsTo(buf, bufSize, bufBm.rowBytes()-1)
|
| - == successExpected);
|
| - if (successExpected)
|
| - reportCopyVerification(subset, bufBm, coords,
|
| - "copyPixelsTo(buf, bufSize, rowBytes()-1)", reporter);
|
| + // Not all configurations will generate a valid 'subset'.
|
| + if (srcReady) {
|
| +
|
| + // Allocate our target buffer 'buf' for all copies.
|
| + // To simplify verifying correctness of copies attach
|
| + // buf to a SkBitmap, but copies are done using the
|
| + // raw buffer pointer.
|
| + const uint32_t bufSize = subH *
|
| + SkBitmap::ComputeRowBytes(src.getConfig(), subW) * 2;
|
| + SkAutoMalloc autoBuf (bufSize);
|
| + uint8_t* buf = static_cast<uint8_t*>(autoBuf.get());
|
| +
|
| + SkBitmap bufBm; // Attach buf to this bitmap.
|
| + bool successExpected;
|
| +
|
| + // Set up values for each pixel being copied.
|
| + Coordinates coords(subW * subH);
|
| + for (size_t x = 0; x < subW; ++x)
|
| + for (size_t y = 0; y < subH; ++y)
|
| + {
|
| + int index = y * subW + x;
|
| + SkASSERT(index < coords.length);
|
| + coords[index]->fX = x;
|
| + coords[index]->fY = y;
|
| + }
|
|
|
| -#if 0 // copyPixelsFrom is gone
|
| - // Test #5 ////////////////////////////////////////////
|
| - // Tests the case where the source stride is too small
|
| - // for the source configuration.
|
| - memset(buf, 0xFF, bufSize);
|
| - bufBm.setConfig(gPairs[i].fConfig, subW, subH);
|
| - bufBm.setPixels(buf);
|
| - writeCoordPixels(bufBm, coords);
|
| - REPORTER_ASSERT(reporter,
|
| - subset.copyPixelsFrom(buf, bufSize, 1) == false);
|
| -
|
| - // Test #6 ///////////////////////////////////////////
|
| - // Tests basic copy from an external buffer to the bitmap.
|
| - // If the bitmap is "extracted", this also tests the case
|
| - // where the source stride is different from the dest.
|
| - // stride.
|
| - // We've made the buffer large enough to always succeed.
|
| - bufBm.setConfig(gPairs[i].fConfig, subW, subH);
|
| - bufBm.setPixels(buf);
|
| - writeCoordPixels(bufBm, coords);
|
| - REPORTER_ASSERT(reporter,
|
| - subset.copyPixelsFrom(buf, bufSize, bufBm.rowBytes()) ==
|
| - true);
|
| - reportCopyVerification(bufBm, subset, coords,
|
| - "copyPixelsFrom(buf, bufSize)",
|
| + writeCoordPixels(subset, coords);
|
| +
|
| + // Test #1 ////////////////////////////////////////////
|
| +
|
| + // Before/after comparisons easier if we attach buf
|
| + // to an appropriately configured SkBitmap.
|
| + memset(buf, 0xFF, bufSize);
|
| + // Config with stride greater than src but that fits in buf.
|
| + bufBm.setConfig(gPairs[i].fConfig, subW, subH,
|
| + SkBitmap::ComputeRowBytes(subset.getConfig(), subW)
|
| + * 2);
|
| + bufBm.setPixels(buf);
|
| + successExpected = false;
|
| + // Then attempt to copy with a stride that is too large
|
| + // to fit in the buffer.
|
| + REPORTER_ASSERT(reporter,
|
| + subset.copyPixelsTo(buf, bufSize, bufBm.rowBytes() * 3)
|
| + == successExpected);
|
| +
|
| + if (successExpected)
|
| + reportCopyVerification(subset, bufBm, coords,
|
| + "copyPixelsTo(buf, bufSize, 1.5*maxRowBytes)",
|
| reporter);
|
|
|
| - // Test #7 ////////////////////////////////////////////
|
| - // Tests the case where the source buffer is too small
|
| - // for the transfer.
|
| - REPORTER_ASSERT(reporter,
|
| - subset.copyPixelsFrom(buf, 1, subset.rowBytes()) ==
|
| - false);
|
| + // Test #2 ////////////////////////////////////////////
|
| + // This test should always succeed, but in the case
|
| + // of extracted bitmaps only because we handle the
|
| + // issue of getSafeSize(). Without getSafeSize()
|
| + // buffer overrun/read would occur.
|
| + memset(buf, 0xFF, bufSize);
|
| + bufBm.setConfig(gPairs[i].fConfig, subW, subH,
|
| + subset.rowBytes());
|
| + bufBm.setPixels(buf);
|
| + successExpected = subset.getSafeSize() <= bufSize;
|
| + REPORTER_ASSERT(reporter,
|
| + subset.copyPixelsTo(buf, bufSize) ==
|
| + successExpected);
|
| + if (successExpected)
|
| + reportCopyVerification(subset, bufBm, coords,
|
| + "copyPixelsTo(buf, bufSize)", reporter);
|
| +
|
| + // Test #3 ////////////////////////////////////////////
|
| + // Copy with different stride between src and dst.
|
| + memset(buf, 0xFF, bufSize);
|
| + bufBm.setConfig(gPairs[i].fConfig, subW, subH,
|
| + subset.rowBytes()+1);
|
| + bufBm.setPixels(buf);
|
| + successExpected = true; // Should always work.
|
| + REPORTER_ASSERT(reporter,
|
| + subset.copyPixelsTo(buf, bufSize,
|
| + subset.rowBytes()+1) == successExpected);
|
| + if (successExpected)
|
| + reportCopyVerification(subset, bufBm, coords,
|
| + "copyPixelsTo(buf, bufSize, rowBytes+1)", reporter);
|
| +
|
| + // Test #4 ////////////////////////////////////////////
|
| + // Test copy with stride too small.
|
| + memset(buf, 0xFF, bufSize);
|
| + bufBm.setConfig(gPairs[i].fConfig, subW, subH);
|
| + bufBm.setPixels(buf);
|
| + successExpected = false;
|
| + // Request copy with stride too small.
|
| + REPORTER_ASSERT(reporter,
|
| + subset.copyPixelsTo(buf, bufSize, bufBm.rowBytes()-1)
|
| + == successExpected);
|
| + if (successExpected)
|
| + reportCopyVerification(subset, bufBm, coords,
|
| + "copyPixelsTo(buf, bufSize, rowBytes()-1)", reporter);
|
| +
|
| +#if 0 // copyPixelsFrom is gone
|
| + // Test #5 ////////////////////////////////////////////
|
| + // Tests the case where the source stride is too small
|
| + // for the source configuration.
|
| + memset(buf, 0xFF, bufSize);
|
| + bufBm.setConfig(gPairs[i].fConfig, subW, subH);
|
| + bufBm.setPixels(buf);
|
| + writeCoordPixels(bufBm, coords);
|
| + REPORTER_ASSERT(reporter,
|
| + subset.copyPixelsFrom(buf, bufSize, 1) == false);
|
| +
|
| + // Test #6 ///////////////////////////////////////////
|
| + // Tests basic copy from an external buffer to the bitmap.
|
| + // If the bitmap is "extracted", this also tests the case
|
| + // where the source stride is different from the dest.
|
| + // stride.
|
| + // We've made the buffer large enough to always succeed.
|
| + bufBm.setConfig(gPairs[i].fConfig, subW, subH);
|
| + bufBm.setPixels(buf);
|
| + writeCoordPixels(bufBm, coords);
|
| + REPORTER_ASSERT(reporter,
|
| + subset.copyPixelsFrom(buf, bufSize, bufBm.rowBytes()) ==
|
| + true);
|
| + reportCopyVerification(bufBm, subset, coords,
|
| + "copyPixelsFrom(buf, bufSize)",
|
| + reporter);
|
| +
|
| + // Test #7 ////////////////////////////////////////////
|
| + // Tests the case where the source buffer is too small
|
| + // for the transfer.
|
| + REPORTER_ASSERT(reporter,
|
| + subset.copyPixelsFrom(buf, 1, subset.rowBytes()) ==
|
| + false);
|
|
|
| #endif
|
| - }
|
| }
|
| } // for (size_t copyCase ...
|
| }
|
|
|