Index: tests/SkResourceCacheTest.cpp |
diff --git a/tests/SkResourceCacheTest.cpp b/tests/SkResourceCacheTest.cpp |
index 9faddd016da3f593882f0af86573217407a86c17..be3db08d321a067185f99387648c89fcc53086c8 100644 |
--- a/tests/SkResourceCacheTest.cpp |
+++ b/tests/SkResourceCacheTest.cpp |
@@ -14,11 +14,18 @@ |
#include "SkPictureRecorder.h" |
#include "SkResourceCache.h" |
#include "SkSurface.h" |
+#include "SkTypes.h" |
//////////////////////////////////////////////////////////////////////////////////////// |
static void make_bitmap(SkBitmap* bitmap, const SkImageInfo& info, SkBitmap::Allocator* allocator) { |
- if (allocator) { |
+ if (info.colorType() == kIndex_8_SkColorType) { |
+ bitmap->setInfo(info); |
+ SkPMColor ctStorage[256]; |
+ memset(ctStorage, 0xFF, sizeof(ctStorage)); // init with opaque-white for the moment |
+ SkAutoTUnref<SkColorTable> ctable(new SkColorTable(ctStorage, 256)); |
+ bitmap->allocPixels(allocator, ctable); |
+ } else if (allocator) { |
bitmap->setInfo(info); |
allocator->allocPixelRef(bitmap, 0); |
} else { |
@@ -173,55 +180,88 @@ static void test_bitmap_notify(skiatest::Reporter* reporter, SkResourceCache* ca |
} |
} |
-DEF_TEST(BitmapCache_discarded_bitmap, reporter) { |
- SkResourceCache::DiscardableFactory factory = SkResourceCache::GetDiscardableFactory(); |
- SkBitmap::Allocator* allocator = SkBitmapCache::GetAllocator(); |
- |
- SkAutoTDelete<SkResourceCache> cache; |
- if (factory) { |
- cache.reset(new SkResourceCache(factory)); |
- } else { |
- const size_t byteLimit = 100 * 1024; |
- cache.reset(new SkResourceCache(byteLimit)); |
- } |
- SkBitmap cachedBitmap; |
- make_bitmap(&cachedBitmap, SkImageInfo::MakeN32Premul(5, 5), allocator); |
- cachedBitmap.setImmutable(); |
- cachedBitmap.unlockPixels(); |
- |
- SkBitmap bm; |
- SkIRect rect = SkIRect::MakeWH(5, 5); |
+#include "SkDiscardableMemoryPool.h" |
- // Add a bitmap to the cache. |
- REPORTER_ASSERT(reporter, SkBitmapCache::Add(cachedBitmap.pixelRef(), rect, cachedBitmap, cache)); |
- REPORTER_ASSERT(reporter, SkBitmapCache::Find(cachedBitmap.getGenerationID(), rect, &bm, cache)); |
+static SkDiscardableMemoryPool* gPool = 0; |
+static SkDiscardableMemory* pool_factory(size_t bytes) { |
+ SkASSERT(gPool); |
+ return gPool->create(bytes); |
+} |
- // Finding more than once works fine. |
- REPORTER_ASSERT(reporter, SkBitmapCache::Find(cachedBitmap.getGenerationID(), rect, &bm, cache)); |
- bm.unlockPixels(); |
+static void testBitmapCache_discarded_bitmap(skiatest::Reporter* reporter, SkResourceCache* cache, |
+ SkResourceCache::DiscardableFactory factory) { |
+ SkBitmap::Allocator* allocator = cache->allocator(); |
+ const SkColorType testTypes[] = { |
+ kAlpha_8_SkColorType, |
+ kRGB_565_SkColorType, |
+ kRGBA_8888_SkColorType, |
+ kBGRA_8888_SkColorType, |
+ kIndex_8_SkColorType, |
+ kGray_8_SkColorType |
+ }; |
+ for (const SkColorType testType : testTypes) { |
+ SkBitmap cachedBitmap; |
+ make_bitmap(&cachedBitmap, SkImageInfo::Make(5, 5, testType, kPremul_SkAlphaType), |
+ allocator); |
+ cachedBitmap.setImmutable(); |
+ cachedBitmap.unlockPixels(); |
+ |
+ SkBitmap bm; |
+ SkIRect rect = SkIRect::MakeWH(5, 5); |
+ |
+ // Add a bitmap to the cache. |
+ REPORTER_ASSERT(reporter, SkBitmapCache::Add(cachedBitmap.pixelRef(), rect, cachedBitmap, |
+ cache)); |
+ REPORTER_ASSERT(reporter, SkBitmapCache::Find(cachedBitmap.getGenerationID(), rect, &bm, |
+ cache)); |
+ |
+ // Finding more than once works fine. |
+ REPORTER_ASSERT(reporter, SkBitmapCache::Find(cachedBitmap.getGenerationID(), rect, &bm, |
+ cache)); |
+ bm.unlockPixels(); |
+ |
+ // Drop the pixels in the bitmap. |
+ if (factory) { |
+ REPORTER_ASSERT(reporter, gPool->getRAMUsed() > 0); |
+ gPool->dumpPool(); |
+ |
+ // The bitmap is not in the cache since it has been dropped. |
+ REPORTER_ASSERT(reporter, !SkBitmapCache::Find(cachedBitmap.getGenerationID(), rect, |
+ &bm, cache)); |
+ } |
- // Drop the pixels in the bitmap. |
- if (factory) { |
- REPORTER_ASSERT(reporter, SkGetGlobalDiscardableMemoryPool()->getRAMUsed() > 0); |
- SkGetGlobalDiscardableMemoryPool()->dumpPool(); |
+ make_bitmap(&cachedBitmap, SkImageInfo::Make(5, 5, testType, kPremul_SkAlphaType), |
+ allocator); |
+ cachedBitmap.setImmutable(); |
+ cachedBitmap.unlockPixels(); |
- // The bitmap is not in the cache since it has been dropped. |
- REPORTER_ASSERT(reporter, !SkBitmapCache::Find(cachedBitmap.getGenerationID(), rect, &bm, cache)); |
+ // We can add the bitmap back to the cache and find it again. |
+ REPORTER_ASSERT(reporter, SkBitmapCache::Add(cachedBitmap.pixelRef(), rect, cachedBitmap, |
+ cache)); |
+ REPORTER_ASSERT(reporter, SkBitmapCache::Find(cachedBitmap.getGenerationID(), rect, &bm, |
+ cache)); |
} |
- |
- make_bitmap(&cachedBitmap, SkImageInfo::MakeN32Premul(5, 5), allocator); |
- cachedBitmap.setImmutable(); |
- cachedBitmap.unlockPixels(); |
- |
- // We can add the bitmap back to the cache and find it again. |
- REPORTER_ASSERT(reporter, SkBitmapCache::Add(cachedBitmap.pixelRef(), rect, cachedBitmap, cache)); |
- REPORTER_ASSERT(reporter, SkBitmapCache::Find(cachedBitmap.getGenerationID(), rect, &bm, cache)); |
- |
test_mipmapcache(reporter, cache); |
test_bitmap_notify(reporter, cache); |
test_mipmap_notify(reporter, cache); |
} |
+DEF_TEST(BitmapCache_discarded_bitmap, reporter) { |
+ const size_t byteLimit = 100 * 1024; |
+ { |
+ SkResourceCache cache(byteLimit); |
+ testBitmapCache_discarded_bitmap(reporter, &cache, nullptr); |
+ } |
+ { |
+ SkAutoTUnref<SkDiscardableMemoryPool> pool( |
+ SkDiscardableMemoryPool::Create(byteLimit, nullptr)); |
+ gPool = pool.get(); |
+ SkResourceCache::DiscardableFactory factory = pool_factory; |
+ SkResourceCache cache(factory); |
+ testBitmapCache_discarded_bitmap(reporter, &cache, factory); |
+ } |
+} |
+ |
static void test_discarded_image(skiatest::Reporter* reporter, const SkMatrix& transform, |
SkImage* (*buildImage)()) { |
SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(10, 10)); |