Update SkSpecialImage to be able to create tight SkImages and SkSurfaces

This calved off of: https://codereview.chromium.org/1810693003/ (Switch SkTileImageFilter over to new onFilterImage interface) since the TileImageFilter needs a tight bitmap/texture/image to perform its draw.

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

Review URL: https://codereview.chromium.org/1816223002
diff --git a/tests/SpecialImageTest.cpp b/tests/SpecialImageTest.cpp
index 3240fbd..432adc8 100644
--- a/tests/SpecialImageTest.cpp
+++ b/tests/SpecialImageTest.cpp
@@ -12,6 +12,7 @@
 #include "SkPixmap.h"
 #include "SkSpecialImage.h"
 #include "SkSpecialSurface.h"
+#include "SkSurface.h"
 #include "Test.h"
 #include "TestingSpecialImageAccess.h"
 
@@ -59,10 +60,12 @@
     REPORTER_ASSERT(reporter, kSmallerSize == subset.height());
 
     //--------------
+    // Test that peekTexture reports the correct backing type
     REPORTER_ASSERT(reporter, peekTextureSucceeds ==
                                         !!TestingSpecialImageAccess::PeekTexture(img.get()));
 
     //--------------
+    // Test that peekPixels reports the correct backing type
     SkPixmap pixmap;
     REPORTER_ASSERT(reporter, peekPixelsSucceeds ==
                               !!TestingSpecialImageAccess::PeekPixels(img.get(), &pixmap));
@@ -72,6 +75,7 @@
     }
 
     //--------------
+    // Test that draw restricts itself to the subset
     SkImageInfo info = SkImageInfo::MakeN32(kFullSize, kFullSize, kOpaque_SkAlphaType);
 
     sk_sp<SkSpecialSurface> surf(img->makeSurface(info));
@@ -94,6 +98,32 @@
                                                           kSmallerSize+kPad-1));
     REPORTER_ASSERT(reporter, SK_ColorBLUE == bm.getColor(kSmallerSize+kPad,
                                                           kSmallerSize+kPad));
+
+    //--------------
+    // Test that makeTightSubset & makeTightSurface return appropriately sized objects
+    // of the correct backing type
+    SkIRect newSubset = SkIRect::MakeWH(subset.width(), subset.height());
+    {
+        sk_sp<SkImage> tightImg(img->makeTightSubset(newSubset));
+
+        REPORTER_ASSERT(reporter, tightImg->width() == subset.width());
+        REPORTER_ASSERT(reporter, tightImg->height() == subset.height());
+        REPORTER_ASSERT(reporter, peekTextureSucceeds == !!tightImg->getTexture());
+        SkPixmap tmpPixmap;
+        REPORTER_ASSERT(reporter, peekPixelsSucceeds == !!tightImg->peekPixels(&tmpPixmap));
+    }
+    {
+        SkImageInfo info = SkImageInfo::MakeN32(subset.width(), subset.height(),
+                                                kPremul_SkAlphaType);
+        sk_sp<SkSurface> tightSurf(img->makeTightSurface(info));
+
+        REPORTER_ASSERT(reporter, tightSurf->width() == subset.width());
+        REPORTER_ASSERT(reporter, tightSurf->height() == subset.height());
+        REPORTER_ASSERT(reporter, peekTextureSucceeds ==
+                     !!tightSurf->getTextureHandle(SkSurface::kDiscardWrite_BackendHandleAccess));
+        SkPixmap tmpPixmap;
+        REPORTER_ASSERT(reporter, peekPixelsSucceeds == !!tightSurf->peekPixels(&tmpPixmap));
+    }
 }
 
 DEF_TEST(SpecialImage_Raster, reporter) {