| Index: tests/BitmapCopyTest.cpp
|
| diff --git a/tests/BitmapCopyTest.cpp b/tests/BitmapCopyTest.cpp
|
| index 88ce577f682aa974c60b54081829c3f9e4fc0382..38453c89b6a1cd79a0103ecab2228173d422dd8b 100644
|
| --- a/tests/BitmapCopyTest.cpp
|
| +++ b/tests/BitmapCopyTest.cpp
|
| @@ -32,47 +32,30 @@ static bool canHaveAlpha(SkBitmap::Config config) {
|
| }
|
|
|
| // copyTo() should preserve isOpaque when it makes sense
|
| -static void test_isOpaque(skiatest::Reporter* reporter, const SkBitmap& src,
|
| +static void test_isOpaque(skiatest::Reporter* reporter,
|
| + const SkBitmap& srcOpaque, const SkBitmap& srcPremul,
|
| SkBitmap::Config dstConfig) {
|
| - SkBitmap bitmap(src);
|
| SkBitmap dst;
|
|
|
| - // we need the lock so that we get a valid colorTable (when available)
|
| - SkAutoLockPixels alp(bitmap);
|
| - SkColorTable* ctable = bitmap.getColorTable();
|
| - unsigned ctableFlags = ctable ? ctable->getFlags() : 0;
|
| -
|
| - if (canHaveAlpha(bitmap.config()) && canHaveAlpha(dstConfig)) {
|
| - bitmap.setIsOpaque(false);
|
| - if (ctable) {
|
| - ctable->setFlags(ctableFlags & ~SkColorTable::kColorsAreOpaque_Flag);
|
| - }
|
| - REPORTER_ASSERT(reporter, bitmap.copyTo(&dst, dstConfig));
|
| + if (canHaveAlpha(srcPremul.config()) && canHaveAlpha(dstConfig)) {
|
| + REPORTER_ASSERT(reporter, srcPremul.copyTo(&dst, dstConfig));
|
| REPORTER_ASSERT(reporter, dst.config() == dstConfig);
|
| - if (bitmap.isOpaque() != dst.isOpaque()) {
|
| - report_opaqueness(reporter, bitmap, dst);
|
| + if (srcPremul.isOpaque() != dst.isOpaque()) {
|
| + report_opaqueness(reporter, srcPremul, dst);
|
| }
|
| }
|
|
|
| - bitmap.setIsOpaque(true);
|
| - if (ctable) {
|
| - ctable->setFlags(ctableFlags | SkColorTable::kColorsAreOpaque_Flag);
|
| - }
|
| - REPORTER_ASSERT(reporter, bitmap.copyTo(&dst, dstConfig));
|
| + REPORTER_ASSERT(reporter, srcOpaque.copyTo(&dst, dstConfig));
|
| REPORTER_ASSERT(reporter, dst.config() == dstConfig);
|
| - if (bitmap.isOpaque() != dst.isOpaque()) {
|
| - report_opaqueness(reporter, bitmap, dst);
|
| - }
|
| -
|
| - if (ctable) {
|
| - ctable->setFlags(ctableFlags);
|
| + if (srcOpaque.isOpaque() != dst.isOpaque()) {
|
| + report_opaqueness(reporter, srcOpaque, dst);
|
| }
|
| }
|
|
|
| -static void init_src(const SkBitmap& bitmap, const SkColorTable* ct) {
|
| +static void init_src(const SkBitmap& bitmap) {
|
| SkAutoLockPixels lock(bitmap);
|
| if (bitmap.getPixels()) {
|
| - if (ct) {
|
| + if (bitmap.getColorTable()) {
|
| sk_bzero(bitmap.getPixels(), bitmap.getSize());
|
| } else {
|
| bitmap.eraseColor(SK_ColorWHITE);
|
| @@ -80,11 +63,11 @@ static void init_src(const SkBitmap& bitmap, const SkColorTable* ct) {
|
| }
|
| }
|
|
|
| -static SkColorTable* init_ctable() {
|
| +static SkColorTable* init_ctable(SkAlphaType alphaType) {
|
| static const SkColor colors[] = {
|
| SK_ColorBLACK, SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE
|
| };
|
| - return new SkColorTable(colors, SK_ARRAY_COUNT(colors));
|
| + return new SkColorTable(colors, SK_ARRAY_COUNT(colors), alphaType);
|
| }
|
|
|
| struct Pair {
|
| @@ -256,18 +239,30 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
|
|
|
| for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) {
|
| for (size_t j = 0; j < SK_ARRAY_COUNT(gPairs); j++) {
|
| - SkBitmap src, dst;
|
| - SkColorTable* ct = NULL;
|
| -
|
| - src.setConfig(gPairs[i].fConfig, W, H);
|
| - if (SkBitmap::kIndex8_Config == src.config()) {
|
| - ct = init_ctable();
|
| + SkBitmap srcOpaque, srcPremul, dst;
|
| +
|
| + {
|
| + SkColorTable* ctOpaque = NULL;
|
| + SkColorTable* ctPremul = NULL;
|
| +
|
| + srcOpaque.setConfig(gPairs[i].fConfig, W, H);
|
| + srcPremul.setConfig(gPairs[i].fConfig, W, H);
|
| + if (SkBitmap::kIndex8_Config == gPairs[i].fConfig) {
|
| + ctOpaque = init_ctable(kOpaque_SkAlphaType);
|
| + ctPremul = init_ctable(kPremul_SkAlphaType);
|
| + }
|
| + srcOpaque.allocPixels(ctOpaque);
|
| + srcPremul.allocPixels(ctPremul);
|
| + SkSafeUnref(ctOpaque);
|
| + SkSafeUnref(ctPremul);
|
| +
|
| + srcOpaque.setIsOpaque(true);
|
| + srcPremul.setIsOpaque(false);
|
| }
|
| - src.allocPixels(ct);
|
| - SkSafeUnref(ct);
|
| + init_src(srcOpaque);
|
| + init_src(srcPremul);
|
|
|
| - init_src(src, ct);
|
| - bool success = src.copyTo(&dst, gPairs[j].fConfig);
|
| + bool success = srcPremul.copyTo(&dst, gPairs[j].fConfig);
|
| bool expected = gPairs[i].fValid[j] != '0';
|
| if (success != expected) {
|
| SkString str;
|
| @@ -277,7 +272,7 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
|
| reporter->reportFailed(str);
|
| }
|
|
|
| - bool canSucceed = src.canCopyTo(gPairs[j].fConfig);
|
| + bool canSucceed = srcPremul.canCopyTo(gPairs[j].fConfig);
|
| if (success != canSucceed) {
|
| SkString str;
|
| str.printf("SkBitmap::copyTo from %s to %s. returned %s canCopyTo %s",
|
| @@ -287,31 +282,30 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
|
| }
|
|
|
| if (success) {
|
| - REPORTER_ASSERT(reporter, src.width() == dst.width());
|
| - REPORTER_ASSERT(reporter, src.height() == dst.height());
|
| + 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, src, dst.config());
|
| - if (src.config() == dst.config()) {
|
| - SkAutoLockPixels srcLock(src);
|
| + test_isOpaque(reporter, srcOpaque, srcPremul, dst.config());
|
| + if (srcPremul.config() == dst.config()) {
|
| + SkAutoLockPixels srcLock(srcPremul);
|
| SkAutoLockPixels dstLock(dst);
|
| - REPORTER_ASSERT(reporter, src.readyToDraw());
|
| + REPORTER_ASSERT(reporter, srcPremul.readyToDraw());
|
| REPORTER_ASSERT(reporter, dst.readyToDraw());
|
| - const char* srcP = (const char*)src.getAddr(0, 0);
|
| + const char* srcP = (const char*)srcPremul.getAddr(0, 0);
|
| const char* dstP = (const char*)dst.getAddr(0, 0);
|
| REPORTER_ASSERT(reporter, srcP != dstP);
|
| REPORTER_ASSERT(reporter, !memcmp(srcP, dstP,
|
| - src.getSize()));
|
| - REPORTER_ASSERT(reporter, src.getGenerationID() == dst.getGenerationID());
|
| + srcPremul.getSize()));
|
| + REPORTER_ASSERT(reporter, srcPremul.getGenerationID() == dst.getGenerationID());
|
| } else {
|
| - REPORTER_ASSERT(reporter, src.getGenerationID() != dst.getGenerationID());
|
| + REPORTER_ASSERT(reporter, srcPremul.getGenerationID() != dst.getGenerationID());
|
| }
|
| // test extractSubset
|
| {
|
| - SkBitmap bitmap(src);
|
| + SkBitmap bitmap(srcOpaque);
|
| SkBitmap subset;
|
| SkIRect r;
|
| r.set(1, 1, 2, 2);
|
| - bitmap.setIsOpaque(true);
|
| bitmap.setIsVolatile(true);
|
| if (bitmap.extractSubset(&subset, r)) {
|
| REPORTER_ASSERT(reporter, subset.width() == 1);
|
| @@ -335,7 +329,8 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
|
| REPORTER_ASSERT(reporter,
|
| (copy.getColorTable() != NULL) == hasCT);
|
| }
|
| - bitmap.setIsOpaque(false);
|
| +
|
| + bitmap = srcPremul;
|
| bitmap.setIsVolatile(false);
|
| if (bitmap.extractSubset(&subset, r)) {
|
| REPORTER_ASSERT(reporter,
|
| @@ -441,7 +436,7 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
|
| src.setConfig(gPairs[i].fConfig, subW, subH);
|
| }
|
| if (SkBitmap::kIndex8_Config == src.config()) {
|
| - ct = init_ctable();
|
| + ct = init_ctable(kPremul_SkAlphaType);
|
| }
|
|
|
| src.allocPixels(ct);
|
|
|