Index: tests/CachedDecodingPixelRefTest.cpp |
diff --git a/tests/CachedDecodingPixelRefTest.cpp b/tests/CachedDecodingPixelRefTest.cpp |
index e3b249923eb98386d474734e395c38f4c55aa0fb..68de2733fe0838243b841c669d017c25ffcf93e7 100644 |
--- a/tests/CachedDecodingPixelRefTest.cpp |
+++ b/tests/CachedDecodingPixelRefTest.cpp |
@@ -11,10 +11,13 @@ |
#include "SkForceLinking.h" |
#include "SkImageDecoder.h" |
#include "SkImagePriv.h" |
+#include "SkLazyCachingPixelRef.h" |
#include "SkLazyPixelRef.h" |
#include "SkScaledImageCache.h" |
#include "SkStream.h" |
+ |
#include "Test.h" |
+#include "TestClassDef.h" |
__SK_FORCE_IMAGE_DECODER_LINKING; |
@@ -92,6 +95,7 @@ static void compare_bitmaps(skiatest::Reporter* reporter, |
if (!pixelPerfect) { |
return; |
} |
+ |
int pixelErrors = 0; |
for (int y = 0; y < b2.height(); ++y) { |
for (int x = 0; x < b2.width(); ++x) { |
@@ -103,101 +107,159 @@ static void compare_bitmaps(skiatest::Reporter* reporter, |
REPORTER_ASSERT(reporter, 0 == pixelErrors); |
} |
+ |
+typedef void(*CompareEncodedToOriginal)(skiatest::Reporter* reporter, |
+ SkData* encoded, |
+ const SkBitmap& original, |
+ bool pixelPerfect); |
/** |
- * This checks to see that a SkLazyPixelRef works as advertized. |
- */ |
-#include "TestClassDef.h" |
-DEF_TEST(CachedDecodingPixelRefTest, reporter) { |
+ this function tests three differently encoded images against the |
+ origianl bitmap */ |
+void testThreeEncodings(skiatest::Reporter* reporter, |
scroggo
2013/11/01 15:48:00
This function should be static.
Also, static func
hal.canary
2013/11/01 16:31:09
Done.
|
+ CompareEncodedToOriginal comp) { |
SkBitmap original; |
make_test_image(&original); |
- const size_t bitmapSize = original.getSize(); |
- const size_t oldByteLimit = SkScaledImageCache::GetByteLimit(); |
- REPORTER_ASSERT(reporter, (!(original.empty())) && (!(original.isNull()))); |
- |
+ REPORTER_ASSERT(reporter, !original.empty()); |
+ REPORTER_ASSERT(reporter, !original.isNull()); |
+ if (original.empty() || original.isNull()) { |
+ return; |
+ } |
static const SkImageEncoder::Type types[] = { |
SkImageEncoder::kPNG_Type, |
SkImageEncoder::kJPEG_Type, |
SkImageEncoder::kWEBP_Type |
}; |
- |
for (size_t i = 0; i < SK_ARRAY_COUNT(types); i++) { |
SkImageEncoder::Type type = types[i]; |
SkAutoDataUnref encoded(create_data_from_bitmap(original, type)); |
REPORTER_ASSERT(reporter, encoded.get() != NULL); |
- if (NULL == encoded.get()) { |
- continue; |
+ if (NULL != encoded.get()) { |
+ bool comparePixels = (SkImageEncoder::kPNG_Type == type); |
+ comp(reporter, encoded, original, comparePixels); |
} |
- SkBitmap lazy; |
- static const SkBitmapFactory::DecodeProc decoder = |
- &(SkImageDecoder::DecodeMemoryToTarget); |
- bool success = simple_bitmap_factory(decoder, encoded.get(), &lazy); |
+ } |
+} |
- REPORTER_ASSERT(reporter, success); |
+/** |
+ * This checks to see that a SkLazyPixelRef works as advertised. |
+ */ |
+void compareWithSkLazyPixelRef(skiatest::Reporter* reporter, |
scroggo
2013/11/01 15:48:00
ditto
hal.canary
2013/11/01 16:31:09
Done.
|
+ SkData* encoded, |
+ const SkBitmap& original, |
+ bool comparePixels) { |
+ SkBitmap lazy; |
+ static const SkBitmapFactory::DecodeProc decoder = |
+ &(SkImageDecoder::DecodeMemoryToTarget); |
+ bool success = simple_bitmap_factory(decoder, encoded, &lazy); |
+ REPORTER_ASSERT(reporter, success); |
- size_t bytesUsed = SkScaledImageCache::GetBytesUsed(); |
+ REPORTER_ASSERT(reporter, NULL == lazy.getPixels()); |
+ { |
+ SkAutoLockPixels autoLockPixels(lazy); // now pixels are good. |
+ REPORTER_ASSERT(reporter, NULL != lazy.getPixels()); |
+ } |
+ // pixels should be gone! |
+ REPORTER_ASSERT(reporter, NULL == lazy.getPixels()); |
+ { |
+ SkAutoLockPixels autoLockPixels(lazy); // now pixels are good. |
+ REPORTER_ASSERT(reporter, NULL != lazy.getPixels()); |
+ } |
+ compare_bitmaps(reporter, original, lazy, comparePixels); |
+} |
+DEF_TEST(CachedDecodingPixelRefTest, reporter) { |
+ testThreeEncodings(reporter, compareWithSkLazyPixelRef); |
+} |
- if (oldByteLimit < bitmapSize) { |
- SkScaledImageCache::SetByteLimit(bitmapSize + oldByteLimit); |
- } |
- void* lazyPixels = NULL; |
- |
- // Since this is lazy, it shouldn't have fPixels yet! |
- REPORTER_ASSERT(reporter, NULL == lazy.getPixels()); |
- { |
- SkAutoLockPixels autoLockPixels(lazy); // now pixels are good. |
- lazyPixels = lazy.getPixels(); |
- REPORTER_ASSERT(reporter, NULL != lazy.getPixels()); |
- // first time we lock pixels, we should get bump in the size |
- // of the cache by exactly bitmapSize. |
- REPORTER_ASSERT(reporter, bytesUsed + bitmapSize |
- == SkScaledImageCache::GetBytesUsed()); |
- bytesUsed = SkScaledImageCache::GetBytesUsed(); |
- } |
- // pixels should be gone! |
- REPORTER_ASSERT(reporter, NULL == lazy.getPixels()); |
- { |
- SkAutoLockPixels autoLockPixels(lazy); // now pixels are good. |
- REPORTER_ASSERT(reporter, NULL != lazy.getPixels()); |
- |
- // verify that the same pixels are used this time. |
- REPORTER_ASSERT(reporter, lazy.getPixels() == lazyPixels); |
- } |
- bool comparePixels = (SkImageEncoder::kPNG_Type == type); |
- // Only PNG is pixel-perfect. |
- compare_bitmaps(reporter, original, lazy, comparePixels); |
- |
- // force the cache to clear by making it too small. |
- SkScaledImageCache::SetByteLimit(bitmapSize / 2); |
- compare_bitmaps(reporter, original, lazy, comparePixels); |
- |
- // I'm pretty sure that the logic of the cache should mean |
- // that it will clear to zero, regardless of where it started. |
- REPORTER_ASSERT(reporter, SkScaledImageCache::GetBytesUsed() == 0); |
- // TODO(someone) - write a custom allocator that can verify |
- // that the memory where those pixels were cached really did |
- // get freed. |
- |
- //////////////////////////////////////////////////////////////////////// |
- // The following commented-out code happens to work on my |
- // machine, and indicates to me that the SkLazyPixelRef is |
- // behaving as designed. But I don't know an easy way to |
- // guarantee that a second allocation of the same size will |
- // give a different address. |
- //////////////////////////////////////////////////////////////////////// |
- // { |
- // // confuse the heap allocation system |
- // SkAutoMalloc autoMalloc(bitmapSize); |
- // REPORTER_ASSERT(reporter, autoMalloc.get() == lazyPixels); |
- // { |
- // SkAutoLockPixels autoLockPixels(lazy); |
- // // verify that *different* pixels are used this time. |
- // REPORTER_ASSERT(reporter, lazy.getPixels() != lazyPixels); |
- // compare_bitmaps(reporter, original, lazy, comparePixels); |
- // } |
- // } |
- |
- // restore cache size |
- SkScaledImageCache::SetByteLimit(oldByteLimit); |
+ |
+/** |
+ * This checks to see that a SkLazyCachedPixelRef works as advertised. |
+ */ |
+ |
+void compareWithLazyCachedPixelRef(skiatest::Reporter* reporter, |
scroggo
2013/11/01 15:48:00
ditto
hal.canary
2013/11/01 16:31:09
Done.
|
+ SkData* encoded, |
+ const SkBitmap& original, |
+ bool comparePixels) { |
+ const size_t bitmapSize = original.getSize(); |
+ // By using a non-global cache, our unit tests won't collide with |
+ // other unit tests. Unit tests can be run in separate threads. |
+ // TODO(halcanary): Find a way to robustly test the global |
+ // instance of SkScaledImageCache. |
+ SkScaledImageCache cache(2000000, NULL); |
+ const size_t oldByteLimit = cache.getByteLimit(); |
+ SkBitmap lazy; |
+ static const SkBitmapFactory::DecodeProc decoder = |
+ &(SkImageDecoder::DecodeMemoryToTarget); |
+ |
+ bool success = SkLazyCachingPixelRef::Install(decoder, encoded, |
+ &lazy, &cache); |
+ REPORTER_ASSERT(reporter, success); |
+ |
+ size_t bytesUsed = cache.getBytesUsed(); |
+ |
+ if (oldByteLimit < bitmapSize) { |
+ cache.setByteLimit(bitmapSize + oldByteLimit); |
} |
+ void* lazyPixels = NULL; |
+ |
+ // Since this is lazy, it shouldn't have fPixels yet! |
+ REPORTER_ASSERT(reporter, NULL == lazy.getPixels()); |
+ { |
+ SkAutoLockPixels autoLockPixels(lazy); // now pixels are good. |
+ lazyPixels = lazy.getPixels(); |
+ REPORTER_ASSERT(reporter, NULL != lazy.getPixels()); |
+ // first time we lock pixels, we should get bump in the size |
+ // of the cache by exactly bitmapSize. |
+ REPORTER_ASSERT(reporter, bytesUsed + bitmapSize |
+ == cache.getBytesUsed()); |
+ bytesUsed = cache.getBytesUsed(); |
+ } |
+ // pixels should be gone! |
+ REPORTER_ASSERT(reporter, NULL == lazy.getPixels()); |
+ { |
+ SkAutoLockPixels autoLockPixels(lazy); // now pixels are good. |
+ REPORTER_ASSERT(reporter, NULL != lazy.getPixels()); |
+ |
+ // verify that the same pixels are used this time. |
+ REPORTER_ASSERT(reporter, lazy.getPixels() == lazyPixels); |
+ } |
+ |
+ // Only PNG is pixel-perfect. |
+ compare_bitmaps(reporter, original, lazy, comparePixels); |
+ |
+ // force the cache to clear by making it too small. |
+ cache.setByteLimit(bitmapSize / 2); |
+ |
+ compare_bitmaps(reporter, original, lazy, comparePixels); |
+ |
+ // I'm pretty sure that the logic of the cache should mean |
+ // that it will clear to zero, regardless of where it started. |
+ REPORTER_ASSERT(reporter, NULL == lazy.getPixels()); |
+ REPORTER_ASSERT(reporter, cache.getBytesUsed() == 0); |
+ // TODO(someone) - write a custom allocator that can verify |
+ // that the memory where those pixels were cached really did |
+ // get freed. |
+ |
+ //////////////////////////////////////////////////////////////////////// |
+ // The following commented-out code happens to work on my |
+ // machine, and indicates to me that the SkLazyPixelRef is |
+ // behaving as designed. But I don't know an easy way to |
+ // guarantee that a second allocation of the same size will |
+ // give a different address. |
+ //////////////////////////////////////////////////////////////////////// |
+ // { |
+ // // confuse the heap allocation system |
+ // SkAutoMalloc autoMalloc(bitmapSize); |
+ // REPORTER_ASSERT(reporter, autoMalloc.get() == lazyPixels); |
+ // { |
+ // SkAutoLockPixels autoLockPixels(lazy); |
+ // // verify that *different* pixels are used this time. |
+ // REPORTER_ASSERT(reporter, lazy.getPixels() != lazyPixels); |
+ // compare_bitmaps(reporter, original, lazy, comparePixels); |
+ // } |
+ // } |
} |
+DEF_TEST(LazyCachedPixelRefTest, reporter) { |
+ testThreeEncodings(reporter, compareWithLazyCachedPixelRef); |
+} |
+ |