Upgrade SkSpecialImage to have getTextureRef & getROPixels entry points

This more closely aligns the SkSpecialImage API with the SkImage API. In doing so it allows the image filters to handle SkImages that can sneak through while remaining encoded (e.g., if an input filter just returns a wrapped version of the source SkImage)

GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1861643003

Review URL: https://codereview.chromium.org/1861643003
diff --git a/tests/SpecialImageTest.cpp b/tests/SpecialImageTest.cpp
index 1c71f75..2818ce9 100644
--- a/tests/SpecialImageTest.cpp
+++ b/tests/SpecialImageTest.cpp
@@ -51,7 +51,7 @@
 
 // Basic test of the SkSpecialImage public API (e.g., peekTexture, peekPixels & draw)
 static void test_image(const sk_sp<SkSpecialImage>& img, skiatest::Reporter* reporter,
-                       bool peekPixelsSucceeds, bool peekTextureSucceeds,
+                       GrContext* context, bool peekTextureSucceeds,
                        int offset, int size) {
     const SkIRect subset = TestingSpecialImageAccess::Subset(img.get());
     REPORTER_ASSERT(reporter, offset == subset.left());
@@ -61,17 +61,27 @@
 
     //--------------
     // Test that peekTexture reports the correct backing type
-    REPORTER_ASSERT(reporter, peekTextureSucceeds ==
-                                        !!TestingSpecialImageAccess::PeekTexture(img.get()));
+    REPORTER_ASSERT(reporter, peekTextureSucceeds == img->isTextureBacked());
+
+#if SK_SUPPORT_GPU
+    //--------------
+    // Test getTextureAsRef - as long as there is a context this should succeed
+    if (context) {
+        sk_sp<GrTexture> texture(img->asTextureRef(context));
+        REPORTER_ASSERT(reporter, texture);
+    }
+#endif
 
     //--------------
-    // Test that peekPixels reports the correct backing type
-    SkPixmap pixmap;
-    REPORTER_ASSERT(reporter, peekPixelsSucceeds ==
-                              !!TestingSpecialImageAccess::PeekPixels(img.get(), &pixmap));
-    if (peekPixelsSucceeds) {
-        REPORTER_ASSERT(reporter, size == pixmap.width());
-        REPORTER_ASSERT(reporter, size == pixmap.height());
+    // Test getROPixels - this should always succeed regardless of backing store
+    SkBitmap bitmap;
+    REPORTER_ASSERT(reporter, img->getROPixels(&bitmap));
+    if (context) {
+        REPORTER_ASSERT(reporter, kSmallerSize == bitmap.width());
+        REPORTER_ASSERT(reporter, kSmallerSize == bitmap.height());
+    } else {
+        REPORTER_ASSERT(reporter, size == bitmap.width());
+        REPORTER_ASSERT(reporter, size == bitmap.height());
     }
 
     //--------------
@@ -110,7 +120,7 @@
         REPORTER_ASSERT(reporter, tightImg->height() == subset.height());
         REPORTER_ASSERT(reporter, peekTextureSucceeds == !!tightImg->getTexture());
         SkPixmap tmpPixmap;
-        REPORTER_ASSERT(reporter, peekPixelsSucceeds == !!tightImg->peekPixels(&tmpPixmap));
+        REPORTER_ASSERT(reporter, peekTextureSucceeds != !!tightImg->peekPixels(&tmpPixmap));
     }
     {
         SkImageInfo info = SkImageInfo::MakeN32(subset.width(), subset.height(),
@@ -122,7 +132,7 @@
         REPORTER_ASSERT(reporter, peekTextureSucceeds ==
                      !!tightSurf->getTextureHandle(SkSurface::kDiscardWrite_BackendHandleAccess));
         SkPixmap tmpPixmap;
-        REPORTER_ASSERT(reporter, peekPixelsSucceeds == !!tightSurf->peekPixels(&tmpPixmap));
+        REPORTER_ASSERT(reporter, peekTextureSucceeds != !!tightSurf->peekPixels(&tmpPixmap));
     }
 }
 
@@ -138,12 +148,12 @@
 
     {
         sk_sp<SkSpecialImage> subSImg1(SkSpecialImage::MakeFromRaster(nullptr, subset, bm));
-        test_image(subSImg1, reporter, true, false, kPad, kFullSize);
+        test_image(subSImg1, reporter, nullptr, false, kPad, kFullSize);
     }
 
     {
         sk_sp<SkSpecialImage> subSImg2(fullSImage->makeSubset(subset));
-        test_image(subSImg2, reporter, true, false, 0, kSmallerSize);
+        test_image(subSImg2, reporter, nullptr, false, 0, kSmallerSize);
     }
 }
 
@@ -162,12 +172,12 @@
     {
         sk_sp<SkSpecialImage> subSImg1(SkSpecialImage::MakeFromImage(nullptr, subset,
                                                                      fullImage));
-        test_image(subSImg1, reporter, true, false, kPad, kFullSize);
+        test_image(subSImg1, reporter, nullptr, false, kPad, kFullSize);
     }
 
     {
         sk_sp<SkSpecialImage> subSImg2(fullSImage->makeSubset(subset));
-        test_image(subSImg2, reporter, true, false, 0, kSmallerSize);
+        test_image(subSImg2, reporter, nullptr, false, 0, kSmallerSize);
     }
 }
 
@@ -185,7 +195,7 @@
     {
         sk_sp<SkSpecialImage> img(SkSpecialImage::MakeFromPixmap(nullptr, subset, pixmap,
                                                                  nullptr, nullptr));
-        test_image(img, reporter, true, false, kPad, kFullSize);
+        test_image(img, reporter, nullptr, false, kPad, kFullSize);
     }
 }
 
@@ -196,7 +206,7 @@
                                 const sk_sp<SkSpecialImage>& orig,
                                 const sk_sp<SkSpecialImage>& gpuBacked) {
     REPORTER_ASSERT(reporter, gpuBacked);
-    REPORTER_ASSERT(reporter, gpuBacked->peekTexture());
+    REPORTER_ASSERT(reporter, gpuBacked->isTextureBacked());
     REPORTER_ASSERT(reporter, gpuBacked->uniqueID() == orig->uniqueID());
     REPORTER_ASSERT(reporter, gpuBacked->subset().width() == orig->subset().width() &&
                               gpuBacked->subset().height() == orig->subset().height());
@@ -297,12 +307,12 @@
                                                                nullptr, subset,
                                                                kNeedNewImageUniqueID_SpecialImage,
                                                                texture));
-        test_image(subSImg1, reporter, false, true, kPad, kFullSize);
+        test_image(subSImg1, reporter, context, true, kPad, kFullSize);
     }
 
     {
         sk_sp<SkSpecialImage> subSImg2(fullSImg->makeSubset(subset));
-        test_image(subSImg2, reporter, false, true, kPad, kFullSize);
+        test_image(subSImg2, reporter, context, true, kPad, kFullSize);
     }
 }