Revert "Revert "Use SkImage to manage mip map cache purging, not Bitmap/PixelRef""

This reverts commit f7ddaa8a1bb305b679632c5b52e3a9e0f9be987a.

Bug: skia:
Change-Id: Idc0459e119cefbf580aea1f27dda9836d16bb293
Reviewed-on: https://skia-review.googlesource.com/c/162039
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/tests/SkResourceCacheTest.cpp b/tests/SkResourceCacheTest.cpp
index 341eb07..9701ae1 100644
--- a/tests/SkResourceCacheTest.cpp
+++ b/tests/SkResourceCacheTest.cpp
@@ -7,6 +7,7 @@
 
 #include "Test.h"
 #include "SkBitmapCache.h"
+#include "SkBitmapProvider.h"
 #include "SkCanvas.h"
 #include "SkDiscardableMemoryPool.h"
 #include "SkGraphics.h"
@@ -43,15 +44,18 @@
     SkBitmap src;
     src.allocN32Pixels(5, 5);
     src.setImmutable();
+    sk_sp<SkImage> img = SkImage::MakeFromBitmap(src);
+    SkBitmapProvider provider(img.get());
+    const auto desc = provider.makeCacheDesc();
 
-    const SkMipMap* mipmap = SkMipMapCache::FindAndRef(SkBitmapCacheDesc::Make(src), cache);
+    const SkMipMap* mipmap = SkMipMapCache::FindAndRef(desc, cache);
     REPORTER_ASSERT(reporter, nullptr == mipmap);
 
-    mipmap = SkMipMapCache::AddAndRef(src, cache);
+    mipmap = SkMipMapCache::AddAndRef(provider, cache);
     REPORTER_ASSERT(reporter, mipmap);
 
     {
-        const SkMipMap* mm = SkMipMapCache::FindAndRef(SkBitmapCacheDesc::Make(src), cache);
+        const SkMipMap* mm = SkMipMapCache::FindAndRef(desc, cache);
         REPORTER_ASSERT(reporter, mm);
         REPORTER_ASSERT(reporter, mm == mipmap);
         mm->unref();
@@ -65,7 +69,7 @@
     check_data(reporter, mipmap, 1, kInCache, kNotLocked);
 
     // find us again
-    mipmap = SkMipMapCache::FindAndRef(SkBitmapCacheDesc::Make(src), cache);
+    mipmap = SkMipMapCache::FindAndRef(desc, cache);
     check_data(reporter, mipmap, 2, kInCache, kLocked);
 
     cache->purgeAll();
@@ -78,25 +82,30 @@
     const int N = 3;
 
     SkBitmap src[N];
+    sk_sp<SkImage> img[N];
+    SkBitmapCacheDesc desc[N];
     for (int i = 0; i < N; ++i) {
         src[i].allocN32Pixels(5, 5);
         src[i].setImmutable();
-        SkMipMapCache::AddAndRef(src[i], cache)->unref();
+        img[i] = SkImage::MakeFromBitmap(src[i]);
+        SkBitmapProvider provider(img[i].get());
+        SkMipMapCache::AddAndRef(provider, cache)->unref();
+        desc[i] = provider.makeCacheDesc();
     }
 
     for (int i = 0; i < N; ++i) {
-        const auto desc = SkBitmapCacheDesc::Make(src[i]);
-        const SkMipMap* mipmap = SkMipMapCache::FindAndRef(desc, cache);
-        if (cache) {
-            // if cache is null, we're working on the global cache, and other threads might purge
-            // it, making this check fragile.
-            REPORTER_ASSERT(reporter, mipmap);
-        }
+        const SkMipMap* mipmap = SkMipMapCache::FindAndRef(desc[i], cache);
+        // We're always using a local cache, so we know we won't be purged by other threads
+        REPORTER_ASSERT(reporter, mipmap);
+        SkSafeUnref(mipmap);
+
+        img[i].reset(); // delete the image, which *should not* remove us from the cache
+        mipmap = SkMipMapCache::FindAndRef(desc[i], cache);
+        REPORTER_ASSERT(reporter, mipmap);
         SkSafeUnref(mipmap);
 
         src[i].reset(); // delete the underlying pixelref, which *should* remove us from the cache
-
-        mipmap = SkMipMapCache::FindAndRef(desc, cache);
+        mipmap = SkMipMapCache::FindAndRef(desc[i], cache);
         REPORTER_ASSERT(reporter, !mipmap);
     }
 }