drawBitmap is deprecated, use drawImage

Change-Id: Ib66517fe26036704ccb8328ef92fa0f5240c79f4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/358222
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/gm/bitmapshader.cpp b/gm/bitmapshader.cpp
index 56e034a..cbf153a 100644
--- a/gm/bitmapshader.cpp
+++ b/gm/bitmapshader.cpp
@@ -24,26 +24,26 @@
 
 namespace skiagm {
 
-static void draw_bm(SkBitmap* bm) {
+static sk_sp<SkImage> draw_bm() {
     SkPaint bluePaint;
     bluePaint.setColor(SK_ColorBLUE);
 
-    bm->allocN32Pixels(20, 20);
-    bm->eraseColor(SK_ColorRED);
-
-    SkCanvas canvas(*bm);
-    canvas.drawCircle(10, 10, 5, bluePaint);
+    SkBitmap bm;
+    bm.allocN32Pixels(20, 20);
+    bm.eraseColor(SK_ColorRED);
+    SkCanvas(bm).drawCircle(10, 10, 5, bluePaint);
+    return bm.asImage();
 }
 
-static void draw_mask(SkBitmap* bm) {
+static sk_sp<SkImage> draw_mask() {
     SkPaint circlePaint;
     circlePaint.setColor(SK_ColorBLACK);
 
-    bm->allocPixels(SkImageInfo::MakeA8(20, 20));
-    bm->eraseColor(SK_ColorTRANSPARENT);
-
-    SkCanvas canvas(*bm);
-    canvas.drawCircle(10, 10, 10, circlePaint);
+    SkBitmap bm;
+    bm.allocPixels(SkImageInfo::MakeA8(20, 20));
+    bm.eraseColor(SK_ColorTRANSPARENT);
+    SkCanvas(bm).drawCircle(10, 10, 10, circlePaint);
+    return bm.asImage();
 }
 
 class BitmapShaderGM : public GM {
@@ -51,8 +51,8 @@
 protected:
     void onOnceBeforeDraw() override {
         this->setBGColor(SK_ColorGRAY);
-        draw_bm(&fBitmap);
-        draw_mask(&fMask);
+        fImage = draw_bm();
+        fMask = draw_mask();
     }
 
     SkString onShortName() override {
@@ -75,12 +75,12 @@
             }
 
             canvas->save();
-            paint.setShader(fBitmap.makeShader(SkSamplingOptions(), s));
+            paint.setShader(fImage->makeShader(SkSamplingOptions(), s));
 
             // draw the shader with a bitmap mask
-            canvas->drawBitmap(fMask, 0, 0, &paint);
+            canvas->drawImage(fMask, 0, 0,  SkSamplingOptions(), &paint);
             // no blue circle expected (the bitmap shader's coordinates are aligned to CTM still)
-            canvas->drawBitmap(fMask, 30, 0, &paint);
+            canvas->drawImage(fMask, 30, 0, SkSamplingOptions(), &paint);
 
             canvas->translate(0, 25);
 
@@ -92,13 +92,13 @@
             // clear the shader, colorized by a solid color with a bitmap mask
             paint.setShader(nullptr);
             paint.setColor(SK_ColorGREEN);
-            canvas->drawBitmap(fMask, 0, 0, &paint);
-            canvas->drawBitmap(fMask, 30, 0, &paint);
+            canvas->drawImage(fMask, 0, 0,  SkSamplingOptions(), &paint);
+            canvas->drawImage(fMask, 30, 0, SkSamplingOptions(), &paint);
 
             canvas->translate(0, 25);
 
-            paint.setShader(fMask.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
-                                             SkSamplingOptions(), s));
+            paint.setShader(fMask->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
+                                              SkSamplingOptions(), s));
             paint.setColor(SK_ColorRED);
 
             // draw the mask using the shader and a color
@@ -110,8 +110,7 @@
     }
 
 private:
-    SkBitmap fBitmap;
-    SkBitmap fMask;
+    sk_sp<SkImage> fImage, fMask;
 
     using INHERITED = GM;
 };
diff --git a/gm/bitmaptiled.cpp b/gm/bitmaptiled.cpp
index 1dd6ab6..40b498d 100644
--- a/gm/bitmaptiled.cpp
+++ b/gm/bitmaptiled.cpp
@@ -50,13 +50,17 @@
     for (int i = 0; i < 10; ++i) {
         float offset = i * 0.1f;
         if (vertical) {
-            canvas->drawBitmapRect(bmp, SkRect::MakeXYWH(0.0f, (kTileSize - 50) + offset,
-                                                         32.0f, 1124.0f),
-                                   SkRect::MakeXYWH(37.0f * i, 0.0f, 32.0f, 1124.0f), nullptr);
+            canvas->drawImageRect(bmp.asImage(),
+                                  SkRect::MakeXYWH(0, (kTileSize - 50) + offset, 32, 1124.0f),
+                                  SkRect::MakeXYWH(37.0f * i, 0.0f, 32.0f, 1124.0f),
+                                  SkSamplingOptions(), nullptr,
+                                  SkCanvas::kStrict_SrcRectConstraint);
         } else {
-            canvas->drawBitmapRect(bmp, SkRect::MakeXYWH((kTileSize - 50) + offset, 0.0f,
-                                                         1124.0f, 32.0f),
-                                   SkRect::MakeXYWH(0.0f, 37.0f * i, 1124.0f, 32.0f), nullptr);
+            canvas->drawImageRect(bmp.asImage(),
+                                  SkRect::MakeXYWH((kTileSize - 50) + offset, 0, 1124, 32),
+                                  SkRect::MakeXYWH(0.0f, 37.0f * i, 1124.0f, 32.0f),
+                                  SkSamplingOptions(), nullptr,
+                                  SkCanvas::kStrict_SrcRectConstraint);
         }
     }
 }
diff --git a/gm/blurrect.cpp b/gm/blurrect.cpp
index 9cb1e42..ee8aafd 100644
--- a/gm/blurrect.cpp
+++ b/gm/blurrect.cpp
@@ -232,7 +232,7 @@
                     canvas->save();
                     canvas->translate((SkScalar)cur_x, (SkScalar)cur_y);
                     canvas->translate(-(bm.width() - r.width())/2, -(bm.height()-r.height())/2);
-                    canvas->drawBitmap(bm, 0.f, 0.f, nullptr);
+                    canvas->drawImage(bm.asImage(), 0.f, 0.f);
                     canvas->restore();
 
                     cur_x += bm.width() + fPadding;
diff --git a/gm/convexpolyclip.cpp b/gm/convexpolyclip.cpp
index 0953ee7..f46104e 100644
--- a/gm/convexpolyclip.cpp
+++ b/gm/convexpolyclip.cpp
@@ -29,11 +29,10 @@
 #include "src/core/SkTLList.h"
 #include "tools/ToolUtils.h"
 
-static SkBitmap make_bmp(int w, int h) {
-    SkBitmap bmp;
-    bmp.allocN32Pixels(w, h, true);
+static sk_sp<SkImage> make_img(int w, int h) {
+    auto surf = SkSurface::MakeRaster(SkImageInfo::MakeN32(w, h, kOpaque_SkAlphaType));
+    auto canvas = surf->getCanvas();
 
-    SkCanvas canvas(bmp);
     SkScalar wScalar = SkIntToScalar(w);
     SkScalar hScalar = SkIntToScalar(h);
 
@@ -67,7 +66,7 @@
                         SK_ARRAY_COUNT(colors),
                         SkTileMode::kRepeat,
                         0, &mat));
-        canvas.drawRect(rect, paint);
+        canvas->drawRect(rect, paint);
         rect.inset(wScalar / 8, hScalar / 8);
         mat.preTranslate(6 * wScalar, 6 * hScalar);
         mat.postScale(SK_Scalar1 / 3, SK_Scalar1 / 3);
@@ -79,14 +78,14 @@
     paint.setColor(SK_ColorLTGRAY);
     constexpr char kTxt[] = "Skia";
     SkPoint texPos = { wScalar / 17, hScalar / 2 + font.getSize() / 2.5f };
-    canvas.drawSimpleText(kTxt, SK_ARRAY_COUNT(kTxt)-1, SkTextEncoding::kUTF8,
-                          texPos.fX, texPos.fY, font, paint);
+    canvas->drawSimpleText(kTxt, SK_ARRAY_COUNT(kTxt)-1, SkTextEncoding::kUTF8,
+                           texPos.fX, texPos.fY, font, paint);
     paint.setColor(SK_ColorBLACK);
     paint.setStyle(SkPaint::kStroke_Style);
     paint.setStrokeWidth(SK_Scalar1);
-    canvas.drawSimpleText(kTxt, SK_ARRAY_COUNT(kTxt)-1, SkTextEncoding::kUTF8,
-                          texPos.fX, texPos.fY, font, paint);
-    return bmp;
+    canvas->drawSimpleText(kTxt, SK_ARRAY_COUNT(kTxt)-1, SkTextEncoding::kUTF8,
+                           texPos.fX, texPos.fY, font, paint);
+    return surf->makeImageSnapshot();
 }
 
 namespace skiagm {
@@ -147,7 +146,7 @@
         rotM.setRotate(23.f, rect.centerX(), rect.centerY());
         fClips.addToTail()->setPath(SkPath::Rect(rect).makeTransform(rotM));
 
-        fBmp = make_bmp(100, 100);
+        fImg = make_img(100, 100);
     }
 
     void onDraw(SkCanvas* canvas) override {
@@ -157,7 +156,8 @@
         SkPaint bgPaint;
         bgPaint.setAlpha(0x15);
         SkISize size = canvas->getBaseLayerSize();
-        canvas->drawBitmapRect(fBmp, SkRect::MakeIWH(size.fWidth, size.fHeight), &bgPaint);
+        canvas->drawImageRect(fImg, SkRect::MakeIWH(size.fWidth, size.fHeight),
+                              SkSamplingOptions(), &bgPaint);
 
         constexpr char kTxt[] = "Clip Me!";
         SkFont         font(ToolUtils::create_portable_typeface(), 23);
@@ -185,9 +185,9 @@
                     }
                     canvas->translate(x, y);
                     clip->setOnCanvas(canvas, kIntersect_SkClipOp, SkToBool(aa));
-                    canvas->drawBitmap(fBmp, 0, 0);
+                    canvas->drawImage(fImg, 0, 0);
                     canvas->restore();
-                    x += fBmp.width() + kMargin;
+                    x += fImg->width() + kMargin;
                 }
                 for (int aa = 0; aa < 2; ++aa) {
 
@@ -216,10 +216,10 @@
                     canvas->restore();
                     x += textW + 2 * kMargin;
                 }
-                y += fBmp.height() + kMargin;
+                y += fImg->height() + kMargin;
             }
             y = 0;
-            startX += 2 * fBmp.width() + SkScalarCeilToInt(2 * textW) + 6 * kMargin;
+            startX += 2 * fImg->width() + SkScalarCeilToInt(2 * textW) + 6 * kMargin;
         }
     }
 
@@ -299,7 +299,7 @@
 
     typedef SkTLList<Clip, 1> ClipList;
     ClipList         fClips;
-    SkBitmap         fBmp;
+    sk_sp<SkImage>   fImg;;
 
     using INHERITED = GM;
 };
diff --git a/gm/copy_to_4444.cpp b/gm/copy_to_4444.cpp
index ff9a73b..aaa7349 100644
--- a/gm/copy_to_4444.cpp
+++ b/gm/copy_to_4444.cpp
@@ -54,9 +54,9 @@
     bitmap.allocPixels(imageInfo);
     SkCanvas offscreen(bitmap);
     offscreen.clear(SK_ColorRED);
-    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawImage(bitmap.asImage(), 0, 0);
     offscreen.clear(SK_ColorBLUE);
-    canvas->drawBitmap(bitmap, 1, 1);
+    canvas->drawImage(bitmap.asImage(), 1, 1);
     auto pack4444 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint16_t {
         return (a << 0) | (b << 4) | (g << 8) | (r << 12);
     };
@@ -64,10 +64,10 @@
     uint16_t blue4444 = pack4444(0xF, 0x0, 0x0, 0x0F);
     SkPixmap redPixmap(imageInfo, &red4444, 2);
     if (bitmap.writePixels(redPixmap, 0, 0)) {
-        canvas->drawBitmap(bitmap, 2, 2);
+        canvas->drawImage(bitmap.asImage(), 2, 2);
     }
     SkPixmap bluePixmap(imageInfo, &blue4444, 2);
     if (bitmap.writePixels(bluePixmap, 0, 0)) {
-        canvas->drawBitmap(bitmap, 3, 3);
+        canvas->drawImage(bitmap.asImage(), 3, 3);
     }
 }
diff --git a/gm/filterfastbounds.cpp b/gm/filterfastbounds.cpp
index 284403d..4a505f8 100644
--- a/gm/filterfastbounds.cpp
+++ b/gm/filterfastbounds.cpp
@@ -87,7 +87,7 @@
     SkCanvas temp(bm);
     temp.clear(SK_ColorMAGENTA);
 
-    canvas->drawBitmapRect(bm, r, &p);
+    canvas->drawImageRect(bm.asImage(), r, SkSamplingOptions(), &p);
 }
 
 constexpr drawMth gDrawMthds[] = {
diff --git a/gm/image.cpp b/gm/image.cpp
index b32c413..cbedd64 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -183,7 +183,7 @@
 static void draw_pixmap(SkCanvas* canvas, const SkPixmap& pmap) {
     SkBitmap bitmap;
     bitmap.installPixels(pmap);
-    canvas->drawBitmap(bitmap, 0, 0, nullptr);
+    canvas->drawImage(bitmap.asImage(), 0, 0);
 }
 
 static void show_scaled_pixels(SkCanvas* canvas, SkImage* image) {
diff --git a/gm/imageblurrepeatmode.cpp b/gm/imageblurrepeatmode.cpp
index 58b589c..ac0aef4 100644
--- a/gm/imageblurrepeatmode.cpp
+++ b/gm/imageblurrepeatmode.cpp
@@ -138,9 +138,9 @@
 //     draw and then clipping)).
 DEF_SIMPLE_GM(imageblurrepeatunclipped, canvas, 256, 128) {
     // To show translucency
-    SkBitmap checkerboard = ToolUtils::create_checkerboard_bitmap(256, 128, SK_ColorLTGRAY,
-                                                                  SK_ColorGRAY, 8);
-    canvas->drawBitmap(checkerboard, 0, 0);
+    auto checkerboard = ToolUtils::create_checkerboard_image(256, 128, SK_ColorLTGRAY,
+                                                             SK_ColorGRAY, 8);
+    canvas->drawImage(checkerboard, 0, 0);
 
     // Make an image with one red and one blue band
     SkBitmap bmp;
diff --git a/gm/lighting.cpp b/gm/lighting.cpp
index c2bded7..268842a 100644
--- a/gm/lighting.cpp
+++ b/gm/lighting.cpp
@@ -46,9 +46,8 @@
     void drawClippedBitmap(SkCanvas* canvas, const SkPaint& paint, int x, int y) {
         canvas->save();
         canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
-        canvas->clipRect(SkRect::MakeWH(
-          SkIntToScalar(fBitmap.width()), SkIntToScalar(fBitmap.height())));
-        canvas->drawBitmap(fBitmap, 0, 0, &paint);
+        canvas->clipIRect(fBitmap.bounds());
+        canvas->drawImage(fBitmap.asImage(), 0, 0, SkSamplingOptions(), &paint);
         canvas->restore();
     }
 
diff --git a/gm/p3.cpp b/gm/p3.cpp
index 511b093..3c2347c 100644
--- a/gm/p3.cpp
+++ b/gm/p3.cpp
@@ -10,16 +10,14 @@
 #include "include/core/SkCanvas.h"
 #include "include/core/SkColor.h"
 #include "include/core/SkColorSpace.h"
-#include "include/core/SkFilterQuality.h"
 #include "include/core/SkFont.h"
+#include "include/core/SkImage.h"
 #include "include/core/SkImageInfo.h"
 #include "include/core/SkMatrix.h"
 #include "include/core/SkPaint.h"
 #include "include/core/SkPathEffect.h"
 #include "include/core/SkPixmap.h"
 #include "include/core/SkPoint.h"
-#include "include/core/SkRefCnt.h"
-#include "include/core/SkScalar.h"
 #include "include/core/SkShader.h"
 #include "include/core/SkString.h"
 #include "include/core/SkTileMode.h"
@@ -145,7 +143,7 @@
         paint.setColor4f({1,0,0,1}, p3.get());
         SkCanvas{bm}.drawPaint(paint);
 
-        canvas->drawBitmap(bm, 10,10);
+        canvas->drawImage(bm.asImage(), 10,10);
         compare_pixel("drawBitmap P3 red, from drawPaint",
                       canvas, 10,10,
                       {1,0,0,1}, p3.get());
@@ -163,7 +161,7 @@
         SkAssertResult(bm.peekPixels(&pm));
         SkAssertResult(pm.erase({1,0,0,1}, p3.get()));
 
-        canvas->drawBitmap(bm, 10,10);
+        canvas->drawImage(bm.asImage(), 10,10);
         compare_pixel("drawBitmap P3 red, from SkPixmap::erase",
                       canvas, 10,10,
                       {1,0,0,1}, p3.get());
@@ -339,18 +337,19 @@
         for (int i = 0; i < 256; i++) {
             mask[i] = 255-i;
         }
+
         SkBitmap bm;
         bm.installPixels(SkImageInfo::MakeA8(16,16), mask, 16);
 
         SkPaint as_bitmap;
         as_bitmap.setColor4f({1,0,0,1}, p3.get());
-        as_bitmap.setFilterQuality(kLow_SkFilterQuality);
+        SkSamplingOptions sampling(SkFilterMode::kLinear);
 
         SkPaint as_shader;
         as_shader.setColor4f({1,0,0,1}, p3.get());
-        as_shader.setShader(bm.makeShader(SkSamplingOptions(SkFilterMode::kLinear)));
+        as_shader.setShader(bm.makeShader(sampling));
 
-        canvas->drawBitmap(bm, 10,10, &as_bitmap);
+        canvas->drawImage(bm.asImage(), 10,10, sampling, &as_bitmap);
         compare_pixel("A8 sprite bitmap P3 red",
                       canvas, 10,10,
                       {1,0,0,1}, p3.get());
@@ -367,7 +366,7 @@
 
         canvas->translate(0,80);
 
-        canvas->drawBitmapRect(bm, {10,10,70,70}, &as_bitmap);
+        canvas->drawImageRect(bm.asImage(), {10,10,70,70}, sampling, &as_bitmap);
         compare_pixel("A8 scaled bitmap P3 red",
                       canvas, 10,10,
                       {1,0,0,1}, p3.get());
diff --git a/gm/pictureimagegenerator.cpp b/gm/pictureimagegenerator.cpp
index 454ba18..ed10848 100644
--- a/gm/pictureimagegenerator.cpp
+++ b/gm/pictureimagegenerator.cpp
@@ -194,7 +194,7 @@
             canvas->drawRect(SkRect::MakeXYWH(x, y,
                                               SkIntToScalar(bm.width()),
                                               SkIntToScalar(bm.height())), p);
-            canvas->drawBitmap(bm, x, y);
+            canvas->drawImage(bm.asImage(), x, y);
         }
     }
 
diff --git a/gm/shadertext3.cpp b/gm/shadertext3.cpp
index 29861bc..36796b9 100644
--- a/gm/shadertext3.cpp
+++ b/gm/shadertext3.cpp
@@ -83,9 +83,10 @@
 
         SkPaint bmpPaint;
         bmpPaint.setAntiAlias(true);
-        bmpPaint.setFilterQuality(kLow_SkFilterQuality);
         bmpPaint.setAlphaf(0.5f);
-        canvas->drawBitmap(fBmp, 5.f, 5.f, &bmpPaint);
+        SkSamplingOptions sampling(SkFilterMode::kLinear);
+
+        canvas->drawImage(fBmp.asImage(), 5.f, 5.f, sampling, &bmpPaint);
 
         SkFont  font(ToolUtils::create_portable_typeface(), SkIntToScalar(kPointSize));
         SkPaint outlinePaint;
@@ -117,8 +118,7 @@
                 SkPaint fillPaint;
                 fillPaint.setAntiAlias(true);
                 fillPaint.setShader(fBmp.makeShader(kTileModes[tm0], kTileModes[tm1],
-                                                    SkSamplingOptions(SkFilterMode::kLinear),
-                                                    localM));
+                                                    sampling, localM));
 
                 constexpr char kText[] = "B";
                 canvas->drawString(kText, 0, 0, font, fillPaint);
diff --git a/gm/showmiplevels.cpp b/gm/showmiplevels.cpp
index 75061df..0182cfe 100644
--- a/gm/showmiplevels.cpp
+++ b/gm/showmiplevels.cpp
@@ -21,301 +21,11 @@
 #include "include/private/SkNx.h"
 #include "src/core/SkMipmap.h"
 #include "src/core/SkMipmapBuilder.h"
+#include "tools/Resources.h"
 #include "tools/ToolUtils.h"
 
 #include <math.h>
 
-#define SHOW_MIP_COLOR  0xFF000000
-
-static SkBitmap make_bitmap(int w, int h) {
-    SkBitmap bm;
-    bm.allocN32Pixels(w, h);
-    SkCanvas canvas(bm);
-    canvas.clear(0xFFFFFFFF);
-    SkPaint paint;
-    paint.setStyle(SkPaint::kStroke_Style);
-    paint.setStrokeWidth(w / 16.0f);
-    paint.setColor(SHOW_MIP_COLOR);
-    canvas.drawCircle(w/2.0f, h/2.0f, w/3.0f, paint);
-    return bm;
-}
-
-static SkBitmap make_bitmap2(int w, int h) {
-    SkBitmap bm;
-    bm.allocN32Pixels(w, h);
-    SkCanvas canvas(bm);
-    canvas.clear(0xFFFFFFFF);
-    SkPaint paint;
-    paint.setColor(SHOW_MIP_COLOR);
-    paint.setStyle(SkPaint::kStroke_Style);
-
-    SkScalar inset = 2;
-    SkRect r = SkRect::MakeIWH(w, h).makeInset(0.5f, 0.5f);
-    while (r.width() > 4) {
-        canvas.drawRect(r, paint);
-        r.inset(inset, inset);
-        inset += 1;
-    }
-    return bm;
-}
-
-static SkBitmap make_bitmap3(int w, int h) {
-    SkBitmap bm;
-    bm.allocN32Pixels(w, h);
-    SkCanvas canvas(bm);
-    canvas.clear(0xFFFFFFFF);
-    SkPaint paint;
-    paint.setStyle(SkPaint::kStroke_Style);
-    paint.setStrokeWidth(2.1f);
-    paint.setColor(SHOW_MIP_COLOR);
-
-    SkScalar s = SkIntToScalar(w);
-    Sk4f p(s, -s, -s, s);
-    Sk4f d(5);
-    while (p[1] < s) {
-        canvas.drawLine(p[0],p[1], p[2], p[3], paint);
-        p = p + d;
-    }
-    return bm;
-}
-
-class ShowMipLevels : public skiagm::GM {
-    const int fN;
-    SkBitmap  fBM[4];
-
-public:
-    static unsigned gamma(unsigned n) {
-        float x = n / 255.0f;
-#if 0
-        x = sqrtf(x);
-#else
-        if (x > 0.0031308f) {
-            x = 1.055f * (powf(x, (1.0f / 2.4f))) - 0.055f;
-        } else {
-            x = 12.92f * x;
-        }
-#endif
-        return (int)(x * 255);
-    }
-
-    static void apply_gamma(const SkBitmap& bm) {
-        return; // below is our experiment for sRGB correction
-        for (int y = 0; y < bm.height(); ++y) {
-            for (int x = 0; x < bm.width(); ++x) {
-                SkPMColor c = *bm.getAddr32(x, y);
-                unsigned r = gamma(SkGetPackedR32(c));
-                unsigned g = gamma(SkGetPackedG32(c));
-                unsigned b = gamma(SkGetPackedB32(c));
-                *bm.getAddr32(x, y) = SkPackARGB32(0xFF, r, g, b);
-            }
-        }
-    }
-
-    ShowMipLevels(int N) : fN(N) { }
-
-protected:
-
-    SkString onShortName() override {
-        SkString str;
-        str.printf("showmiplevels_%d", fN);
-        return str;
-    }
-
-    SkISize onISize() override { return { 150, 862 }; }
-
-    static void DrawAndFrame(SkCanvas* canvas, const SkBitmap& orig, SkScalar x, SkScalar y) {
-        SkBitmap bm;
-        ToolUtils::copy_to(&bm, orig.colorType(), orig);
-        apply_gamma(bm);
-
-        canvas->drawBitmap(bm, x, y, nullptr);
-        SkPaint paint;
-        paint.setStyle(SkPaint::kStroke_Style);
-        paint.setColor(0xFFFFCCCC);
-        canvas->drawRect(SkRect::MakeIWH(bm.width(), bm.height()).makeOffset(x, y).makeOutset(0.5f, 0.5f), paint);
-    }
-
-    template <typename F> void drawLevels(SkCanvas* canvas, const SkBitmap& baseBM, F func) {
-        SkScalar x = 4;
-        SkScalar y = 4;
-
-        SkPixmap prevPM;
-        baseBM.peekPixels(&prevPM);
-
-        sk_sp<SkMipmap> mm(SkMipmap::Build(baseBM, nullptr));
-
-        int index = 0;
-        SkMipmap::Level level;
-        SkScalar scale = 0.5f;
-        while (mm->extractLevel(SkSize::Make(scale, scale), &level)) {
-            SkBitmap bm = func(prevPM, level.fPixmap);
-            DrawAndFrame(canvas, bm, x, y);
-
-            if (level.fPixmap.width() <= 2 || level.fPixmap.height() <= 2) {
-                break;
-            }
-            if (index & 1) {
-                x += level.fPixmap.width() + 4;
-            } else {
-                y += level.fPixmap.height() + 4;
-            }
-            scale /= 2;
-            prevPM = level.fPixmap;
-            index += 1;
-        }
-    }
-
-    void drawSet(SkCanvas* canvas, const SkBitmap& orig) {
-        SkAutoCanvasRestore acr(canvas, true);
-
-        drawLevels(canvas, orig, [](const SkPixmap& prev, const SkPixmap& curr) {
-            SkBitmap bm;
-            bm.installPixels(curr);
-            return bm;
-        });
-    }
-
-    void onOnceBeforeDraw() override {
-        fBM[0] = ToolUtils::create_checkerboard_bitmap(fN, fN, SK_ColorBLACK, SK_ColorWHITE, 2);
-        fBM[1] = make_bitmap(fN, fN);
-        fBM[2] = make_bitmap2(fN, fN);
-        fBM[3] = make_bitmap3(fN, fN);
-    }
-
-    void onDraw(SkCanvas* canvas) override {
-        canvas->translate(4, 4);
-        for (const auto& bm : fBM) {
-            this->drawSet(canvas, bm);
-            // round so we always produce an integral translate, so the GOLD tool won't show
-            // unimportant diffs if this is drawn on a GPU with different rounding rules
-            // since we draw the bitmaps using nearest-neighbor
-            canvas->translate(0, SkScalarRoundToScalar(bm.height() * 0.85f));
-        }
-    }
-
-private:
-    using INHERITED = skiagm::GM;
-};
-DEF_GM( return new ShowMipLevels(255); )
-DEF_GM( return new ShowMipLevels(256); )
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-void copy_to(SkBitmap* dst, SkColorType dstColorType, const SkBitmap& src) {
-    if (kGray_8_SkColorType == dstColorType) {
-        return ToolUtils::copy_to_g8(dst, src);
-    }
-
-    const SkBitmap* srcPtr = &src;
-    SkBitmap tmp(src);
-    if (kRGB_565_SkColorType == dstColorType) {
-        tmp.setAlphaType(kOpaque_SkAlphaType);
-        srcPtr = &tmp;
-    }
-
-    ToolUtils::copy_to(dst, dstColorType, *srcPtr);
-}
-
-/**
- *  Show mip levels that were built, for all supported colortypes
- */
-class ShowMipLevels2 : public skiagm::GM {
-    const int fW, fH;
-    SkBitmap  fBM[4];
-
-public:
-    ShowMipLevels2(int w, int h) : fW(w), fH(h) { }
-
-protected:
-
-    SkString onShortName() override {
-        SkString str;
-        str.printf("showmiplevels2_%dx%d", fW, fH);
-        return str;
-    }
-
-    SkISize onISize() override {
-        return { 824, 862 };
-    }
-
-    static void DrawAndFrame(SkCanvas* canvas, const SkBitmap& bm, SkScalar x, SkScalar y) {
-        canvas->drawBitmap(bm, x, y, nullptr);
-        SkPaint paint;
-        paint.setStyle(SkPaint::kStroke_Style);
-        paint.setColor(0xFFFFCCCC);
-        canvas->drawRect(SkRect::MakeIWH(bm.width(), bm.height()).makeOffset(x, y).makeOutset(0.5f, 0.5f), paint);
-    }
-
-    void drawLevels(SkCanvas* canvas, const SkBitmap& baseBM) {
-        SkScalar x = 4;
-        SkScalar y = 4;
-
-        sk_sp<SkMipmap> mm(SkMipmap::Build(baseBM, nullptr));
-
-        int index = 0;
-        SkMipmap::Level level;
-        SkScalar scale = 0.5f;
-        while (mm->extractLevel(SkSize::Make(scale, scale), &level)) {
-            SkBitmap bm;
-            bm.installPixels(level.fPixmap);
-            DrawAndFrame(canvas, bm, x, y);
-
-            if (level.fPixmap.width() <= 2 || level.fPixmap.height() <= 2) {
-                break;
-            }
-            if (index & 1) {
-                x += level.fPixmap.width() + 4;
-            } else {
-                y += level.fPixmap.height() + 4;
-            }
-            scale /= 2;
-            index += 1;
-        }
-    }
-
-    void drawSet(SkCanvas* canvas, const SkBitmap& orig) {
-        const SkColorType ctypes[] = {
-            kN32_SkColorType, kRGB_565_SkColorType, kARGB_4444_SkColorType, kGray_8_SkColorType
-        };
-
-        SkAutoCanvasRestore acr(canvas, true);
-
-        for (auto ctype : ctypes) {
-            SkBitmap bm;
-            copy_to(&bm, ctype, orig);
-            drawLevels(canvas, bm);
-            canvas->translate(orig.width()/2 + 8.0f, 0);
-        }
-    }
-
-    void onOnceBeforeDraw() override {
-        fBM[0] = ToolUtils::create_checkerboard_bitmap(fW, fH, SHOW_MIP_COLOR, SK_ColorWHITE, 2);
-        fBM[1] = make_bitmap(fW, fH);
-        fBM[2] = make_bitmap2(fW, fH);
-        fBM[3] = make_bitmap3(fW, fH);
-    }
-
-    void onDraw(SkCanvas* canvas) override {
-        canvas->translate(4, 4);
-        for (const auto& bm : fBM) {
-            this->drawSet(canvas, bm);
-            // round so we always produce an integral translate, so the GOLD tool won't show
-            // unimportant diffs if this is drawn on a GPU with different rounding rules
-            // since we draw the bitmaps using nearest-neighbor
-            canvas->translate(0, SkScalarRoundToScalar(bm.height() * 0.85f));
-        }
-    }
-
-private:
-    using INHERITED = skiagm::GM;
-};
-DEF_GM( return new ShowMipLevels2(255, 255); )
-DEF_GM( return new ShowMipLevels2(256, 255); )
-DEF_GM( return new ShowMipLevels2(255, 256); )
-DEF_GM( return new ShowMipLevels2(256, 256); )
-
-#include "tools/Resources.h"
-
 class ShowMipLevels3 : public skiagm::GM {
     sk_sp<SkImage> fImg;
 
diff --git a/gm/simpleaaclip.cpp b/gm/simpleaaclip.cpp
index cf4c9eb..5f78995 100644
--- a/gm/simpleaaclip.cpp
+++ b/gm/simpleaaclip.cpp
@@ -43,10 +43,11 @@
 
     ToolUtils::copy_to(&bm2, bm.colorType(), bm);
 
-    canvas->drawBitmap(bm2,
-                       SK_Scalar1 * mask.fBounds.fLeft,
-                       SK_Scalar1 * mask.fBounds.fTop,
-                       &paint);
+    canvas->drawImage(bm2.asImage(),
+                      SK_Scalar1 * mask.fBounds.fLeft,
+                      SK_Scalar1 * mask.fBounds.fTop,
+                      SkSamplingOptions(),
+                      &paint);
 }
 
 //////////////////////////////////////////////////////////////////////////////
diff --git a/gm/tablecolorfilter.cpp b/gm/tablecolorfilter.cpp
index 08f71a6..101905d 100644
--- a/gm/tablecolorfilter.cpp
+++ b/gm/tablecolorfilter.cpp
@@ -167,14 +167,16 @@
             // Draw the first element of the first line
             x = 0;
             SkPaint paint;
-            canvas->drawBitmap(bm, x, y, &paint);
+            SkSamplingOptions sampling;
+
+            canvas->drawImage(bm.asImage(), x, y);
 
             // Draws the rest of the first line for this bitmap
             // each draw being at xOffset of the previous one
             for (unsigned i = 1; i < SK_ARRAY_COUNT(gColorFilterMakers); ++i) {
                 x += xOffset;
                 paint.setColorFilter(gColorFilterMakers[i]());
-                canvas->drawBitmap(bm, x, y, &paint);
+                canvas->drawImage(bm.asImage(), x, y, sampling, &paint);
             }
 
             paint.setColorFilter(nullptr);
@@ -193,7 +195,7 @@
                     sk_sp<SkImageFilter> imageFilter2(SkImageFilters::ColorFilter(
                             std::move(colorFilter2), imageFilter1, nullptr));
                     paint.setImageFilter(std::move(imageFilter2));
-                    canvas->drawBitmap(bm, x, y, &paint);
+                    canvas->drawImage(bm.asImage(), x, y, sampling, &paint);
                     x += xOffset;
                 }
             }
diff --git a/gm/tallstretchedbitmaps.cpp b/gm/tallstretchedbitmaps.cpp
index d0e3ccf..0045b40 100644
--- a/gm/tallstretchedbitmaps.cpp
+++ b/gm/tallstretchedbitmaps.cpp
@@ -8,7 +8,7 @@
 #include "gm/gm.h"
 #include "include/core/SkBitmap.h"
 #include "include/core/SkCanvas.h"
-#include "include/core/SkFilterQuality.h"
+#include "include/core/SkImage.h"
 #include "include/core/SkPaint.h"
 #include "include/core/SkRect.h"
 #include "include/core/SkScalar.h"
@@ -93,9 +93,9 @@
             SkIRect subRect = SkIRect::MakeLTRB(0, startItem * itemHeight,
                                                bmp.width(), bmp.height());
             SkRect dstRect = SkRect::MakeWH(SkIntToScalar(bmp.width()), 10.f * itemHeight);
-            SkPaint paint;
-            paint.setFilterQuality(kLow_SkFilterQuality);
-            canvas->drawBitmapRect(bmp, subRect, dstRect, &paint);
+            canvas->drawImageRect(bmp.asImage(), SkRect::Make(subRect), dstRect,
+                                  SkSamplingOptions(SkFilterMode::kLinear), nullptr,
+                                  SkCanvas::kStrict_SrcRectConstraint);
             canvas->translate(SkIntToScalar(bmp.width() + 10), 0);
         }
     }
diff --git a/gm/unpremul.cpp b/gm/unpremul.cpp
index 25ddae5..5e3cffb 100644
--- a/gm/unpremul.cpp
+++ b/gm/unpremul.cpp
@@ -11,6 +11,7 @@
 #include "include/core/SkCanvas.h"
 #include "include/core/SkColor.h"
 #include "include/core/SkColorSpace.h"
+#include "include/core/SkImage.h"
 #include "include/core/SkImageInfo.h"
 #include "include/core/SkPaint.h"
 
@@ -69,7 +70,7 @@
         bm.allocPixels(SkImageInfo::Make(100,100, kRGBA_8888_SkColorType, kUnpremul_SkAlphaType));
         bm.eraseColor(color);
 
-        canvas->drawBitmap(bm, 0,0, &paint);
+        canvas->drawImage(bm.asImage(), 0,0, SkSamplingOptions(), &paint);
         grade(50,150);
     }
 
diff --git a/gm/verifiers/gmverifier.cpp b/gm/verifiers/gmverifier.cpp
index 6b7c3e9..a09835a 100644
--- a/gm/verifiers/gmverifier.cpp
+++ b/gm/verifiers/gmverifier.cpp
@@ -76,7 +76,7 @@
     SkBitmap goldVerifierBmp;
     goldVerifierBmp.allocPixels(SkImageInfo::Make(size, VerifierColorInfo()));
     SkCanvas verifierCanvas(goldVerifierBmp);
-    verifierCanvas.drawBitmap(goldBmp, 0, 0);
+    verifierCanvas.drawImage(goldBmp.asImage(), 0, 0);
 
     return goldVerifierBmp;
 }
diff --git a/gm/wacky_yuv_formats.cpp b/gm/wacky_yuv_formats.cpp
index c2c0b75..5222459 100644
--- a/gm/wacky_yuv_formats.cpp
+++ b/gm/wacky_yuv_formats.cpp
@@ -395,7 +395,7 @@
     SkMatrix matrix = SkEncodedOriginToMatrix(origin, origBM.width(), origBM.height());
     SkAssertResult(matrix.invert(&matrix));
     canvas.concat(matrix);
-    canvas.drawBitmap(origBM, 0, 0);
+    canvas.drawImage(origBM.asImage(), 0, 0);
 
     if (yuvColorSpace == kIdentity_SkYUVColorSpace) {
         // To test the identity color space we use JPEG YUV planes
diff --git a/gm/xfermodeimagefilter.cpp b/gm/xfermodeimagefilter.cpp
index b498bc7..61f8cc4 100644
--- a/gm/xfermodeimagefilter.cpp
+++ b/gm/xfermodeimagefilter.cpp
@@ -199,7 +199,7 @@
         canvas->save();
         canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
         canvas->clipIRect(bitmap.bounds());
-        canvas->drawBitmap(bitmap, 0, 0, &paint);
+        canvas->drawImage(bitmap.asImage(), 0, 0, SkSamplingOptions(), &paint);
         canvas->restore();
     }
 
diff --git a/gm/xfermodes.cpp b/gm/xfermodes.cpp
index 9bd41c2..2c180f4 100644
--- a/gm/xfermodes.cpp
+++ b/gm/xfermodes.cpp
@@ -133,11 +133,12 @@
      */
     void draw_mode(SkCanvas* canvas, SkBlendMode mode, SrcType srcType, SkScalar x, SkScalar y) {
         SkPaint p;
+        SkSamplingOptions sampling;
         SkMatrix m;
         bool restoreNeeded = false;
         m.setTranslate(x, y);
 
-        canvas->drawBitmap(fSrcB, x, y, &p);
+        canvas->drawImage(fSrcB.asImage(), x, y, sampling, &p);
         p.setBlendMode(mode);
         switch (srcType) {
             case kSmallTransparentImage_SrcType: {
@@ -145,7 +146,7 @@
 
                 SkAutoCanvasRestore acr(canvas, true);
                 canvas->concat(m);
-                canvas->drawBitmap(fTransparent, 0, 0, &p);
+                canvas->drawImage(fTransparent.asImage(), 0, 0, sampling, &p);
                 break;
             }
             case kQuarterClearInLayer_SrcType: {
@@ -195,7 +196,7 @@
             case kRectangleImage_SrcType: {
                 SkAutoCanvasRestore acr(canvas, true);
                 canvas->concat(m);
-                canvas->drawBitmap(fDstB, 0, 0, &p);
+                canvas->drawImage(fDstB.asImage(), 0, 0, sampling, &p);
                 break;
             }
             default: