Index: tests/BitmapCopyTest.cpp |
diff --git a/tests/BitmapCopyTest.cpp b/tests/BitmapCopyTest.cpp |
index 57ac95009f79621da9501ed742b15be0b4fe5e30..db03e5cddb17f8e62c90e79ba34d9fb97b4adb13 100644 |
--- a/tests/BitmapCopyTest.cpp |
+++ b/tests/BitmapCopyTest.cpp |
@@ -13,37 +13,37 @@ static const char* boolStr(bool value) { |
} |
// these are in the same order as the SkBitmap::Config enum |
-static const char* gConfigName[] = { |
- "None", "A8", "Index8", "565", "4444", "8888" |
+static const char* gColorTypeName[] = { |
+ "None", "A8", "565", "4444", "RGBA", "BGRA", "Index8" |
}; |
static void report_opaqueness(skiatest::Reporter* reporter, const SkBitmap& src, |
const SkBitmap& dst) { |
ERRORF(reporter, "src %s opaque:%d, dst %s opaque:%d", |
- gConfigName[src.config()], src.isOpaque(), |
- gConfigName[dst.config()], dst.isOpaque()); |
+ gColorTypeName[src.colorType()], src.isOpaque(), |
+ gColorTypeName[dst.colorType()], dst.isOpaque()); |
} |
-static bool canHaveAlpha(SkBitmap::Config config) { |
- return config != SkBitmap::kRGB_565_Config; |
+static bool canHaveAlpha(SkColorType ct) { |
+ return kRGB_565_SkColorType != ct; |
} |
// copyTo() should preserve isOpaque when it makes sense |
static void test_isOpaque(skiatest::Reporter* reporter, |
const SkBitmap& srcOpaque, const SkBitmap& srcPremul, |
- SkBitmap::Config dstConfig) { |
+ SkColorType dstColorType) { |
SkBitmap dst; |
- if (canHaveAlpha(srcPremul.config()) && canHaveAlpha(dstConfig)) { |
- REPORTER_ASSERT(reporter, srcPremul.copyTo(&dst, dstConfig)); |
- REPORTER_ASSERT(reporter, dst.config() == dstConfig); |
+ if (canHaveAlpha(srcPremul.colorType()) && canHaveAlpha(dstColorType)) { |
+ REPORTER_ASSERT(reporter, srcPremul.copyTo(&dst, dstColorType)); |
+ REPORTER_ASSERT(reporter, dst.colorType() == dstColorType); |
if (srcPremul.isOpaque() != dst.isOpaque()) { |
report_opaqueness(reporter, srcPremul, dst); |
} |
} |
- REPORTER_ASSERT(reporter, srcOpaque.copyTo(&dst, dstConfig)); |
- REPORTER_ASSERT(reporter, dst.config() == dstConfig); |
+ REPORTER_ASSERT(reporter, srcOpaque.copyTo(&dst, dstColorType)); |
+ REPORTER_ASSERT(reporter, dst.colorType() == dstColorType); |
if (srcOpaque.isOpaque() != dst.isOpaque()) { |
report_opaqueness(reporter, srcOpaque, dst); |
} |
@@ -68,8 +68,8 @@ static SkColorTable* init_ctable(SkAlphaType alphaType) { |
} |
struct Pair { |
- SkBitmap::Config fConfig; |
- const char* fValid; |
+ SkColorType fColorType; |
+ const char* fValid; |
}; |
// Utility functions for copyPixelsTo()/copyPixelsFrom() tests. |
@@ -199,30 +199,30 @@ static void writeCoordPixels(SkBitmap& bm, const Coordinates& coords) { |
} |
static const Pair gPairs[] = { |
- { SkBitmap::kNo_Config, "0000000" }, |
- { SkBitmap::kA8_Config, "0101010" }, |
- { SkBitmap::kIndex8_Config, "0111010" }, |
- { SkBitmap::kRGB_565_Config, "0101010" }, |
- { SkBitmap::kARGB_4444_Config, "0101110" }, |
- { SkBitmap::kARGB_8888_Config, "0101110" }, |
+ { kUnknown_SkColorType, "000000" }, |
+ { kAlpha_8_SkColorType, "010101" }, |
+ { kIndex_8_SkColorType, "011101" }, |
+ { kRGB_565_SkColorType, "010101" }, |
+ { kARGB_4444_SkColorType, "010111" }, |
+ { kPMColor_SkColorType, "010111" }, |
}; |
static const int W = 20; |
static const int H = 33; |
static void setup_src_bitmaps(SkBitmap* srcOpaque, SkBitmap* srcPremul, |
- SkBitmap::Config config) { |
+ SkColorType ct) { |
SkColorTable* ctOpaque = NULL; |
SkColorTable* ctPremul = NULL; |
- |
- srcOpaque->setConfig(config, W, H, 0, kOpaque_SkAlphaType); |
- srcPremul->setConfig(config, W, H, 0, kPremul_SkAlphaType); |
- if (SkBitmap::kIndex8_Config == config) { |
+ if (kIndex_8_SkColorType == ct) { |
ctOpaque = init_ctable(kOpaque_SkAlphaType); |
ctPremul = init_ctable(kPremul_SkAlphaType); |
} |
- srcOpaque->allocPixels(ctOpaque); |
- srcPremul->allocPixels(ctPremul); |
+ |
+ srcOpaque->allocPixels(SkImageInfo::Make(W, H, ct, kOpaque_SkAlphaType), |
+ NULL, ctOpaque); |
+ srcPremul->allocPixels(SkImageInfo::Make(W, H, ct, kPremul_SkAlphaType), |
+ NULL, ctPremul); |
SkSafeUnref(ctOpaque); |
SkSafeUnref(ctPremul); |
init_src(*srcOpaque); |
@@ -232,7 +232,7 @@ static void setup_src_bitmaps(SkBitmap* srcOpaque, SkBitmap* srcPremul, |
DEF_TEST(BitmapCopy_extractSubset, reporter) { |
for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) { |
SkBitmap srcOpaque, srcPremul; |
- setup_src_bitmaps(&srcOpaque, &srcPremul, gPairs[i].fConfig); |
+ setup_src_bitmaps(&srcOpaque, &srcPremul, gPairs[i].fColorType); |
SkBitmap bitmap(srcOpaque); |
SkBitmap subset; |
@@ -241,7 +241,8 @@ DEF_TEST(BitmapCopy_extractSubset, reporter) { |
// catches a bug where we cloned the genID incorrectly. |
r.set(0, 1, W, 3); |
bitmap.setIsVolatile(true); |
- if (bitmap.extractSubset(&subset, r)) { |
+ // Relies on old behavior of extractSubset failing if colortype is unknown |
+ if (kUnknown_SkColorType != bitmap.colorType() && bitmap.extractSubset(&subset, r)) { |
REPORTER_ASSERT(reporter, subset.width() == W); |
REPORTER_ASSERT(reporter, subset.height() == 2); |
REPORTER_ASSERT(reporter, subset.alphaType() == bitmap.alphaType()); |
@@ -250,11 +251,11 @@ DEF_TEST(BitmapCopy_extractSubset, reporter) { |
// Test copying an extracted subset. |
for (size_t j = 0; j < SK_ARRAY_COUNT(gPairs); j++) { |
SkBitmap copy; |
- bool success = subset.copyTo(©, gPairs[j].fConfig); |
+ bool success = subset.copyTo(©, gPairs[j].fColorType); |
if (!success) { |
// Skip checking that success matches fValid, which is redundant |
// with the code below. |
- REPORTER_ASSERT(reporter, gPairs[i].fConfig != gPairs[j].fConfig); |
+ REPORTER_ASSERT(reporter, gPairs[i].fColorType != gPairs[j].fColorType); |
continue; |
} |
@@ -265,7 +266,7 @@ DEF_TEST(BitmapCopy_extractSubset, reporter) { |
REPORTER_ASSERT(reporter, copy.width() == W); |
REPORTER_ASSERT(reporter, copy.height() == 2); |
- if (gPairs[i].fConfig == gPairs[j].fConfig) { |
+ if (gPairs[i].fColorType == gPairs[j].fColorType) { |
SkAutoLockPixels alp0(subset); |
SkAutoLockPixels alp1(copy); |
// they should both have, or both not-have, a colortable |
@@ -291,31 +292,31 @@ DEF_TEST(BitmapCopy, reporter) { |
for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) { |
SkBitmap srcOpaque, srcPremul; |
- setup_src_bitmaps(&srcOpaque, &srcPremul, gPairs[i].fConfig); |
+ setup_src_bitmaps(&srcOpaque, &srcPremul, gPairs[i].fColorType); |
for (size_t j = 0; j < SK_ARRAY_COUNT(gPairs); j++) { |
SkBitmap dst; |
- bool success = srcPremul.copyTo(&dst, gPairs[j].fConfig); |
+ bool success = srcPremul.copyTo(&dst, gPairs[j].fColorType); |
bool expected = gPairs[i].fValid[j] != '0'; |
if (success != expected) { |
ERRORF(reporter, "SkBitmap::copyTo from %s to %s. expected %s " |
- "returned %s", gConfigName[i], gConfigName[j], |
+ "returned %s", gColorTypeName[i], gColorTypeName[j], |
boolStr(expected), boolStr(success)); |
} |
- bool canSucceed = srcPremul.canCopyTo(gPairs[j].fConfig); |
+ bool canSucceed = srcPremul.canCopyTo(gPairs[j].fColorType); |
if (success != canSucceed) { |
ERRORF(reporter, "SkBitmap::copyTo from %s to %s. returned %s " |
- "canCopyTo %s", gConfigName[i], gConfigName[j], |
+ "canCopyTo %s", gColorTypeName[i], gColorTypeName[j], |
boolStr(success), boolStr(canSucceed)); |
} |
if (success) { |
REPORTER_ASSERT(reporter, srcPremul.width() == dst.width()); |
REPORTER_ASSERT(reporter, srcPremul.height() == dst.height()); |
- REPORTER_ASSERT(reporter, dst.config() == gPairs[j].fConfig); |
- test_isOpaque(reporter, srcOpaque, srcPremul, dst.config()); |
+ REPORTER_ASSERT(reporter, dst.colorType() == gPairs[j].fColorType); |
+ test_isOpaque(reporter, srcOpaque, srcPremul, dst.colorType()); |
if (srcPremul.config() == dst.config()) { |
SkAutoLockPixels srcLock(srcPremul); |
SkAutoLockPixels dstLock(dst); |
@@ -351,8 +352,9 @@ DEF_TEST(BitmapCopy, reporter) { |
// Test with a very large configuration without pixel buffer |
// attached. |
SkBitmap tstSafeSize; |
- tstSafeSize.setConfig(gPairs[i].fConfig, 100000000U, |
- 100000000U); |
+ tstSafeSize.setConfig(SkImageInfo::Make(100000000U, 100000000U, |
+ gPairs[i].fColorType, |
+ kPremul_SkAlphaType)); |
int64_t safeSize = tstSafeSize.computeSafeSize64(); |
if (safeSize < 0) { |
ERRORF(reporter, "getSafeSize64() negative: %s", |
@@ -360,25 +362,25 @@ DEF_TEST(BitmapCopy, reporter) { |
} |
bool sizeFail = false; |
// Compare against hand-computed values. |
- switch (gPairs[i].fConfig) { |
- case SkBitmap::kNo_Config: |
+ switch (gPairs[i].fColorType) { |
+ case kUnknown_SkColorType: |
break; |
- case SkBitmap::kA8_Config: |
- case SkBitmap::kIndex8_Config: |
+ case kAlpha_8_SkColorType: |
+ case kIndex_8_SkColorType: |
if (safeSize != 0x2386F26FC10000LL) { |
sizeFail = true; |
} |
break; |
- case SkBitmap::kRGB_565_Config: |
- case SkBitmap::kARGB_4444_Config: |
+ case kRGB_565_SkColorType: |
+ case kARGB_4444_SkColorType: |
if (safeSize != 0x470DE4DF820000LL) { |
sizeFail = true; |
} |
break; |
- case SkBitmap::kARGB_8888_Config: |
+ case kPMColor_SkColorType: |
if (safeSize != 0x8E1BC9BF040000LL) { |
sizeFail = true; |
} |
@@ -398,22 +400,28 @@ DEF_TEST(BitmapCopy, reporter) { |
// 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(kPremul_SkAlphaType); |
} |
- src.allocPixels(ct); |
+ if (isExtracted[copyCase]) { // A larger image to extract from. |
+ src.allocPixels(SkImageInfo::Make(2 * subW + 1, subH, |
+ gPairs[i].fColorType, |
+ kPremul_SkAlphaType)); |
+ } else { // Tests expect a 2x2 bitmap, so make smaller. |
+ src.allocPixels(SkImageInfo::Make(subW, subH, |
+ gPairs[i].fColorType, |
+ kPremul_SkAlphaType)); |
+ } |
SkSafeUnref(ct); |
// Either copy src or extract into 'subset', which is used |
// for subsequent calls to copyPixelsTo/From. |
bool srcReady = false; |
- if (isExtracted[copyCase]) { |
+ // Test relies on older behavior that extractSubset will fail on |
+ // no_config |
+ if (kUnknown_SkColorType != src.colorType() && |
+ isExtracted[copyCase]) { |
// The extractedSubset() test case allows us to test copy- |
// ing when src and dst mave possibly different strides. |
SkIRect r; |
@@ -421,7 +429,7 @@ DEF_TEST(BitmapCopy, reporter) { |
srcReady = src.extractSubset(&subset, r); |
} else { |
- srcReady = src.copyTo(&subset, src.config()); |
+ srcReady = src.copyTo(&subset); |
} |
// Not all configurations will generate a valid 'subset'. |
@@ -454,13 +462,14 @@ DEF_TEST(BitmapCopy, reporter) { |
// Test #1 //////////////////////////////////////////// |
+ const SkImageInfo info = SkImageInfo::Make(subW, subH, |
+ gPairs[i].fColorType, |
+ kPremul_SkAlphaType); |
// 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.config(), subW) * 2); |
- bufBm.setPixels(buf); |
+ bufBm.installPixels(info, buf, info.minRowBytes() * 2); |
successExpected = false; |
// Then attempt to copy with a stride that is too large |
// to fit in the buffer. |
@@ -479,9 +488,7 @@ DEF_TEST(BitmapCopy, reporter) { |
// 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); |
+ bufBm.installPixels(info, buf, subset.rowBytes()); |
successExpected = subset.getSafeSize() <= bufSize; |
REPORTER_ASSERT(reporter, |
subset.copyPixelsTo(buf, bufSize) == |
@@ -493,9 +500,7 @@ DEF_TEST(BitmapCopy, 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); |
+ bufBm.installPixels(info, buf, subset.rowBytes()+1); |
successExpected = true; // Should always work. |
REPORTER_ASSERT(reporter, |
subset.copyPixelsTo(buf, bufSize, |
@@ -507,8 +512,7 @@ DEF_TEST(BitmapCopy, reporter) { |
// Test #4 //////////////////////////////////////////// |
// Test copy with stride too small. |
memset(buf, 0xFF, bufSize); |
- bufBm.setConfig(gPairs[i].fConfig, subW, subH); |
- bufBm.setPixels(buf); |
+ bufBm.installPixels(info, buf, info.minRowBytes()); |
successExpected = false; |
// Request copy with stride too small. |
REPORTER_ASSERT(reporter, |
@@ -523,8 +527,7 @@ DEF_TEST(BitmapCopy, reporter) { |
// 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); |
+ bufBm.installPixels(info, buf, info.minRowBytes()); |
writeCoordPixels(bufBm, coords); |
REPORTER_ASSERT(reporter, |
subset.copyPixelsFrom(buf, bufSize, 1) == false); |
@@ -535,8 +538,7 @@ DEF_TEST(BitmapCopy, reporter) { |
// 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); |
+ bufBm.installPixels(info, buf, info.minRowBytes()); |
writeCoordPixels(bufBm, coords); |
REPORTER_ASSERT(reporter, |
subset.copyPixelsFrom(buf, bufSize, bufBm.rowBytes()) == |