Index: tests/CachedDecodingPixelRefTest.cpp |
diff --git a/tests/CachedDecodingPixelRefTest.cpp b/tests/CachedDecodingPixelRefTest.cpp |
index e3b249923eb98386d474734e395c38f4c55aa0fb..27eb695f811f0fad695bbd44cd3892a4863120b3 100644 |
--- a/tests/CachedDecodingPixelRefTest.cpp |
+++ b/tests/CachedDecodingPixelRefTest.cpp |
@@ -12,9 +12,12 @@ |
#include "SkImageDecoder.h" |
#include "SkImagePriv.h" |
#include "SkLazyPixelRef.h" |
+#include "SkLazyCachingPixelRef.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) { |
@@ -106,12 +110,9 @@ static void compare_bitmaps(skiatest::Reporter* reporter, |
/** |
* This checks to see that a SkLazyPixelRef works as advertized. |
*/ |
-#include "TestClassDef.h" |
DEF_TEST(CachedDecodingPixelRefTest, reporter) { |
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()))); |
static const SkImageEncoder::Type types[] = { |
@@ -134,10 +135,67 @@ DEF_TEST(CachedDecodingPixelRefTest, reporter) { |
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()); |
+ } |
+ |
+ bool comparePixels = (SkImageEncoder::kPNG_Type == type); |
+ // Only PNG is pixel-perfect. |
+ compare_bitmaps(reporter, original, lazy, comparePixels); |
+ } |
+} |
+ |
+ |
+/** |
+ * This checks to see that a SkLazyPixelRef works as advertized. |
scroggo
2013/10/31 21:53:06
advertised.
hal.canary
2013/11/01 03:29:24
Done.
|
+ */ |
+DEF_TEST(LazyCachedPixelRefTest, reporter) { |
scroggo
2013/10/31 21:53:06
Could these two tests share code?
hal.canary
2013/11/01 03:29:24
Done.
|
+ // 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); |
+ |
+ SkBitmap original; |
+ make_test_image(&original); |
+ REPORTER_ASSERT(reporter, (!(original.empty())) && (!(original.isNull()))); |
+ const size_t bitmapSize = original.getSize(); |
+ const size_t oldByteLimit = cache.getByteLimit(); |
+ |
+ 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; |
+ } |
+ 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) { |
- SkScaledImageCache::SetByteLimit(bitmapSize + oldByteLimit); |
+ cache.setByteLimit(bitmapSize + oldByteLimit); |
} |
void* lazyPixels = NULL; |
@@ -150,8 +208,8 @@ DEF_TEST(CachedDecodingPixelRefTest, reporter) { |
// 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(); |
+ == cache.getBytesUsed()); |
+ bytesUsed = cache.getBytesUsed(); |
} |
// pixels should be gone! |
REPORTER_ASSERT(reporter, NULL == lazy.getPixels()); |
@@ -168,12 +226,14 @@ DEF_TEST(CachedDecodingPixelRefTest, reporter) { |
compare_bitmaps(reporter, original, lazy, comparePixels); |
// force the cache to clear by making it too small. |
- SkScaledImageCache::SetByteLimit(bitmapSize / 2); |
+ 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, SkScaledImageCache::GetBytesUsed() == 0); |
+ 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. |
@@ -198,6 +258,6 @@ DEF_TEST(CachedDecodingPixelRefTest, reporter) { |
// } |
// restore cache size |
- SkScaledImageCache::SetByteLimit(oldByteLimit); |
+ cache.setByteLimit(oldByteLimit); |
} |
} |