don't use drawBitmap

Bug: skia:11216
Change-Id: I89a40e330f27f30c461f2b6012bf26c082b66094
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/359076
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index e235431..30645a0 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -406,7 +406,7 @@
     SkBitmap bitmap;
     bitmap.installPixels(info, pixels, rowBytes);
     swap_rb_if_necessary(bitmap, dstColorType);
-    canvas->drawBitmap(bitmap, left, top);
+    canvas->drawImage(bitmap.asImage(), left, top);
 }
 
 // For codec srcs, we want the "draw" step to be a memcpy.  Any interesting color space or
@@ -2201,7 +2201,7 @@
     canvas.concat(upright);
     SkPaint paint;
     paint.setBlendMode(SkBlendMode::kSrc);
-    canvas.drawBitmap(*bitmap, 0, 0, &paint);
+    canvas.drawImage(bitmap->asImage(), 0, 0, SkSamplingOptions(), &paint);
 
     *bitmap = uprighted;
     return Result::Ok();
diff --git a/docs/examples/Alpha_Constants_a.cpp b/docs/examples/Alpha_Constants_a.cpp
index aa2c7a3..391d04b 100644
--- a/docs/examples/Alpha_Constants_a.cpp
+++ b/docs/examples/Alpha_Constants_a.cpp
@@ -31,8 +31,6 @@
             }
         }
     }
-    SkBitmap bitmap;
-    bitmap.installPixels(pixmap);
-    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawImage(SkImage::MakeRasterCopy(pixmap), 0, 0);
 }
 }  // END FIDDLE
diff --git a/docs/examples/Alpha_Constants_b.cpp b/docs/examples/Alpha_Constants_b.cpp
index 34068d3..1e9191f 100644
--- a/docs/examples/Alpha_Constants_b.cpp
+++ b/docs/examples/Alpha_Constants_b.cpp
@@ -18,8 +18,6 @@
             }
         }
     }
-    SkBitmap bitmap;
-    bitmap.installPixels(pixmap);
-    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawImage(SkImage::MakeRasterCopy(pixmap), 0, 0);
 }
 }  // END FIDDLE
diff --git a/docs/examples/Anti_Alias.cpp b/docs/examples/Anti_Alias.cpp
index 120ac60..4f92642 100644
--- a/docs/examples/Anti_Alias.cpp
+++ b/docs/examples/Anti_Alias.cpp
@@ -18,7 +18,7 @@
         canvas->drawLine(5, 5, 15, 30, paint);
         canvas->save();
         canvas->scale(10, 10);
-        canvas->drawBitmap(bitmap, antialias ? 12 : 0, 0);
+        canvas->drawImage(bitmap.asImage(), antialias ? 12 : 0, 0);
         canvas->restore();
         canvas->translate(15, 0);
     }
diff --git a/docs/examples/Bitmap_allocN32Pixels.cpp b/docs/examples/Bitmap_allocN32Pixels.cpp
index bf89e68..6bff77f 100644
--- a/docs/examples/Bitmap_allocN32Pixels.cpp
+++ b/docs/examples/Bitmap_allocN32Pixels.cpp
@@ -16,7 +16,7 @@
             uint32_t h = random.nextRangeU(4, 32);
             uint32_t cy = random.nextRangeU(0, 64 - h);
             bitmap.erase(color, SkIRect::MakeXYWH(cx, cy, w, h));
-            canvas->drawBitmap(bitmap, x, y);
+            canvas->drawImage(bitmap.asImage(), x, y);
         }
     }
 }
diff --git a/docs/examples/Bitmap_allocPixels.cpp b/docs/examples/Bitmap_allocPixels.cpp
index d1c585c..e9ba469 100644
--- a/docs/examples/Bitmap_allocPixels.cpp
+++ b/docs/examples/Bitmap_allocPixels.cpp
@@ -10,8 +10,8 @@
     SkCanvas offscreen(bitmap);
     offscreen.scale(.5f, .5f);
     for (int y : { 0, 64, 128, 192 } ) {
-        offscreen.drawBitmap(source, 0, -y);
-        canvas->drawBitmap(bitmap, 0, y);
+        offscreen.drawImage(source.asImage(), 0, -y);
+        canvas->drawImage(bitmap.asImage(), 0, y);
     }
 }
 }  // END FIDDLE
diff --git a/docs/examples/Bitmap_allocPixelsFlags.cpp b/docs/examples/Bitmap_allocPixelsFlags.cpp
index 78ffb99..027cadd 100644
--- a/docs/examples/Bitmap_allocPixelsFlags.cpp
+++ b/docs/examples/Bitmap_allocPixelsFlags.cpp
@@ -12,7 +12,7 @@
     SkFont font;
     offscreen.drawString("!@#$%", 0, 12, font, paint);
     canvas->scale(6, 6);
-    canvas->drawBitmap(bitmap, 0, 0);
-    canvas->drawBitmap(bitmap, 8, 8);
+    canvas->drawImage(bitmap.asImage(), 0, 0);
+    canvas->drawImage(bitmap.asImage(), 8, 8);
 }
 }  // END FIDDLE
diff --git a/docs/examples/Bitmap_allocPixels_2.cpp b/docs/examples/Bitmap_allocPixels_2.cpp
deleted file mode 100644
index 5c425ef..0000000
--- a/docs/examples/Bitmap_allocPixels_2.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2019 Google LLC.
-// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "tools/fiddle/examples.h"
-// HASH=91f474a11a2112cd5c88c40a9015048d
-REG_FIDDLE(Bitmap_allocPixels_2, 256, 256, false, 4) {
-void draw(SkCanvas* canvas) {
-    SkBitmap bitmap;
-    bitmap.allocPixels(SkImageInfo::Make(64, 64, kGray_8_SkColorType, kOpaque_SkAlphaType));
-    SkCanvas offscreen(bitmap);
-    offscreen.scale(.5f, .5f);
-    for (int y : { 0, 64, 128, 192 } ) {
-        offscreen.drawBitmap(source, -y, -y);
-        canvas->drawBitmap(bitmap, y, y);
-    }
-}
-}  // END FIDDLE
diff --git a/docs/examples/Bitmap_allocPixels_3.cpp b/docs/examples/Bitmap_allocPixels_3.cpp
deleted file mode 100644
index 20607a4..0000000
--- a/docs/examples/Bitmap_allocPixels_3.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2019 Google LLC.
-// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "tools/fiddle/examples.h"
-// HASH=1219b38c788bf270fb20f8cd2d78cff8
-REG_FIDDLE(Bitmap_allocPixels_3, 256, 50, false, 0) {
-void draw(SkCanvas* canvas) {
-    uint8_t set1[5] = { 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 };
-    uint8_t set2[5] = { 0xAC, 0xA8, 0x89, 0x47, 0x87 };
-    SkBitmap bitmap;
-    bitmap.installPixels(SkImageInfo::Make(5, 1, kGray_8_SkColorType, kOpaque_SkAlphaType), set1, 5);
-    canvas->scale(10, 50);
-    canvas->drawBitmap(bitmap, 0, 0);
-    bitmap.allocPixels();
-    bitmap.eraseColor(SK_ColorBLACK);
-    canvas->drawBitmap(bitmap, 8, 0);
-    bitmap.setPixels(set2);
-    canvas->drawBitmap(bitmap, 16, 0);
-}
-}  // END FIDDLE
diff --git a/docs/examples/Bitmap_allocPixels_4.cpp b/docs/examples/Bitmap_allocPixels_4.cpp
deleted file mode 100644
index e12e68e..0000000
--- a/docs/examples/Bitmap_allocPixels_4.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2019 Google LLC.
-// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "tools/fiddle/examples.h"
-// HASH=1b2800d23c9ea249b45c2c21a34b6d14
-REG_FIDDLE(Bitmap_allocPixels_4, 256, 32, false, 0) {
-class TinyAllocator : public SkBitmap::Allocator {
-public:
-    bool allocPixelRef(SkBitmap* bitmap) override {
-        const SkImageInfo& info = bitmap->info();
-        if (info.height() * info.minRowBytes() > sizeof(storage)) {
-            return false;
-        }
-        sk_sp<SkPixelRef> pr = sk_sp<SkPixelRef>(
-                new SkPixelRef(info.width(), info.height(), storage, info.minRowBytes()));
-        bitmap->setPixelRef(std::move(pr), 0, 0);
-        return true;
-    }
-    char storage[16];
-};
-
-void draw(SkCanvas* canvas) {
-   TinyAllocator tinyAllocator;
-   SkBitmap bitmap;
-   bitmap.setInfo(SkImageInfo::MakeN32(2, 2, kOpaque_SkAlphaType));
-   if (bitmap.tryAllocPixels(&tinyAllocator)) {
-       bitmap.eraseColor(0xff55aa33);
-       bitmap.erase(0xffaa3355, SkIRect::MakeXYWH(1, 1, 1, 1));
-       canvas->scale(16, 16);
-       canvas->drawBitmap(bitmap, 0, 0);
-   }
-}
-}  // END FIDDLE
diff --git a/docs/examples/Bitmap_bounds.cpp b/docs/examples/Bitmap_bounds.cpp
index 221b733..6edbf92 100644
--- a/docs/examples/Bitmap_bounds.cpp
+++ b/docs/examples/Bitmap_bounds.cpp
@@ -8,7 +8,7 @@
     SkIRect bounds = source.bounds();
     for (int x : { 0, bounds.width() } ) {
         for (int y : { 0, bounds.height() } ) {
-            canvas->drawBitmap(source, x, y);
+            canvas->drawImage(source.asImage(), x, y);
         }
     }
 }
diff --git a/docs/examples/Bitmap_erase.cpp b/docs/examples/Bitmap_erase.cpp
index 6af379e..faeba8b 100644
--- a/docs/examples/Bitmap_erase.cpp
+++ b/docs/examples/Bitmap_erase.cpp
@@ -11,7 +11,7 @@
     bitmap.erase(0x7f3fff7f, SkIRect::MakeXYWH(1, 0, 1, 1));
     bitmap.erase(0x7f1fbf5f, SkIRect::MakeXYWH(1, 1, 1, 1));
     canvas->scale(25, 25);
-    canvas->drawBitmap(bitmap, 0, 0);
-    canvas->drawBitmap(bitmap, .5f, .5f);
+    canvas->drawImage(bitmap.asImage(), 0, 0);
+    canvas->drawImage(bitmap.asImage(), .5f, .5f);
 }
 }  // END FIDDLE
diff --git a/docs/examples/Bitmap_eraseARGB.cpp b/docs/examples/Bitmap_eraseARGB.cpp
index 4351c4a..327326d 100644
--- a/docs/examples/Bitmap_eraseARGB.cpp
+++ b/docs/examples/Bitmap_eraseARGB.cpp
@@ -8,7 +8,7 @@
     bitmap.allocPixels(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType));
     bitmap.eraseARGB(0x7f, 0xff, 0x7f, 0x3f);
     canvas->scale(50, 50);
-    canvas->drawBitmap(bitmap, 0, 0);
-    canvas->drawBitmap(bitmap, .5f, .5f);
+    canvas->drawImage(bitmap.asImage(), 0, 0);
+    canvas->drawImage(bitmap.asImage(), .5f, .5f);
 }
 }  // END FIDDLE
diff --git a/gm/emboss.cpp b/gm/emboss.cpp
index 04c99fd..32b9cf6 100644
--- a/gm/emboss.cpp
+++ b/gm/emboss.cpp
@@ -18,20 +18,18 @@
 #include "include/core/SkShader.h"
 #include "include/core/SkSize.h"
 #include "include/core/SkString.h"
+#include "include/core/SkSurface.h"
 #include "include/core/SkTypeface.h"
 #include "src/core/SkBlurMask.h"
 #include "src/effects/SkEmbossMaskFilter.h"
 
-static SkBitmap make_bm() {
-    SkBitmap bm;
-    bm.allocN32Pixels(100, 100);
+static sk_sp<SkImage> make_bm() {
+    auto surf = SkSurface::MakeRasterN32Premul(100, 100);
 
-    SkCanvas canvas(bm);
-    canvas.clear(0);
     SkPaint paint;
     paint.setAntiAlias(true);
-    canvas.drawCircle(50, 50, 50, paint);
-    return bm;
+    surf->getCanvas()->drawCircle(50, 50, 50, paint);
+    return surf->makeImageSnapshot();
 }
 
 class EmbossGM : public skiagm::GM {
@@ -50,21 +48,21 @@
 
     void onDraw(SkCanvas* canvas) override {
         SkPaint paint;
-        SkBitmap bm = make_bm();
-        canvas->drawBitmap(bm, 10, 10, &paint);
-        canvas->translate(bm.width() + SkIntToScalar(10), 0);
+        auto img = make_bm();
+        canvas->drawImage(img, 10, 10, &paint);
+        canvas->translate(img->width() + SkIntToScalar(10), 0);
 
         paint.setMaskFilter(SkEmbossMaskFilter::Make(
             SkBlurMask::ConvertRadiusToSigma(3),
             { { SK_Scalar1, SK_Scalar1, SK_Scalar1 }, 0, 128, 16*2 }));
-        canvas->drawBitmap(bm, 10, 10, &paint);
-        canvas->translate(bm.width() + SkIntToScalar(10), 0);
+        canvas->drawImage(img, 10, 10, &paint);
+        canvas->translate(img->width() + SkIntToScalar(10), 0);
 
         // this combination of emboss+colorfilter used to crash -- so we exercise it to
         // confirm that we have a fix.
         paint.setColorFilter(SkColorFilters::Blend(0xFFFF0000, SkBlendMode::kSrcATop));
-        canvas->drawBitmap(bm, 10, 10, &paint);
-        canvas->translate(bm.width() + SkIntToScalar(10), 0);
+        canvas->drawImage(img, 10, 10, &paint);
+        canvas->translate(img->width() + SkIntToScalar(10), 0);
 
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
diff --git a/gm/image_pict.cpp b/gm/image_pict.cpp
index 75dcecf..d375b84 100644
--- a/gm/image_pict.cpp
+++ b/gm/image_pict.cpp
@@ -296,7 +296,7 @@
                                SkScalar x, SkScalar y) {
         SkBitmap bitmap;
         if (as_IB(image)->getROPixels(dContext, &bitmap)) {
-            canvas->drawBitmap(bitmap, x, y);
+            canvas->drawImage(bitmap.asImage(), x, y);
         } else {
             draw_placeholder(canvas, x, y, image->width(), image->height());
         }
diff --git a/gm/imagefiltersbase.cpp b/gm/imagefiltersbase.cpp
index 11923b4..12669d6 100644
--- a/gm/imagefiltersbase.cpp
+++ b/gm/imagefiltersbase.cpp
@@ -153,7 +153,7 @@
     SkCanvas c(bm);
     draw_path(&c, i, r, nullptr);
 
-    canvas->drawBitmap(bm, 0, 0, &paint);
+    canvas->drawImage(bm.asImage(), 0, 0, SkSamplingOptions(), &paint);
 }
 
 static void draw_patch(SkCanvas* canvas, SkImage*, const SkRect& r, sk_sp<SkImageFilter> imf) {
diff --git a/gm/matrixconvolution.cpp b/gm/matrixconvolution.cpp
index 582392e..a150057 100644
--- a/gm/matrixconvolution.cpp
+++ b/gm/matrixconvolution.cpp
@@ -52,9 +52,7 @@
 
     void makeBitmap() {
         // Draw our bitmap in N32, so legacy devices get "premul" values they understand
-        fBitmap.allocN32Pixels(80, 80);
-        SkCanvas canvas(fBitmap);
-        canvas.clear(0x00000000);
+        auto surf = SkSurface::MakeRasterN32Premul(80, 80);
         SkPaint paint;
         paint.setColor(0xFFFFFFFF);
         SkPoint pts[2] = { {0, 0},
@@ -63,7 +61,8 @@
         paint.setShader(SkGradientShader::MakeLinear(
             pts, fColors, pos, 2, SkTileMode::kClamp));
         SkFont font(ToolUtils::create_portable_typeface(), 180.0f);
-        canvas.drawString("e", -10.0f, 80.0f, font, paint);
+        surf->getCanvas()->drawString("e", -10.0f, 80.0f, font, paint);
+        fImage = surf->makeImageSnapshot();
     }
 
     SkISize onISize() override {
@@ -98,13 +97,13 @@
         paint.setImageFilter(this->makeFilter(kernelOffset, tileMode, convolveAlpha, cropRect));
         canvas->save();
         canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
-        const SkRect layerBounds = SkRect::MakeIWH(fBitmap.width(), fBitmap.height());
+        const SkRect layerBounds = SkRect::Make(fImage->bounds());
         canvas->clipRect(layerBounds);
         // This GM is, in part, intended to display the wrapping behavior of the
         // matrix image filter. The only (rational) way to achieve that for repeat mode
         // is to create a tight layer.
         canvas->saveLayer(layerBounds, &paint);
-            canvas->drawBitmap(fBitmap, 0, 0, nullptr);
+            canvas->drawImage(fImage, 0, 0);
         canvas->restore();
         canvas->restore();
     }
@@ -116,7 +115,7 @@
     void onDraw(SkCanvas* canvas) override {
         canvas->clear(SK_ColorBLACK);
         SkIPoint kernelOffset = SkIPoint::Make(1, 0);
-        SkIRect rect = fBitmap.bounds();
+        SkIRect rect = fImage->bounds();
         for (int x = 10; x < 310; x += 100) {
             this->draw(canvas, x, 10, kernelOffset, SkTileMode::kClamp, true, &rect);
             this->draw(canvas, x, 110, kernelOffset, SkTileMode::kDecal, true, &rect);
@@ -135,7 +134,7 @@
     }
 
 private:
-    SkBitmap fBitmap;
+    sk_sp<SkImage> fImage;
     SkColor fColors[2];
     const char* fNameSuffix;
     KernelFixture fKernelFixture;
diff --git a/gm/rasterhandleallocator.cpp b/gm/rasterhandleallocator.cpp
index 3e3b597..340b033 100644
--- a/gm/rasterhandleallocator.cpp
+++ b/gm/rasterhandleallocator.cpp
@@ -303,7 +303,5 @@
 
     SkPixmap pm;
     nativeCanvas->peekPixels(&pm);
-    SkBitmap bm;
-    bm.installPixels(pm);
-    canvas->drawBitmap(bm, 280, 0, nullptr);
+    canvas->drawImage(SkImage::MakeRasterCopy(pm), 280, 0);
 }
diff --git a/gm/recordopts.cpp b/gm/recordopts.cpp
index c427a86..5a873e7 100644
--- a/gm/recordopts.cpp
+++ b/gm/recordopts.cpp
@@ -96,7 +96,7 @@
     canvas->saveLayer(&targetRect, &layerPaint);
         SkPaint drawPaint;
         installDetector(&drawPaint);
-        canvas->drawBitmap(bitmap, SkIntToScalar(0), SkIntToScalar(0), &drawPaint);
+        canvas->drawImage(bitmap.asImage(), 0, 0, SkSamplingOptions(), &drawPaint);
     canvas->restore();
 }
 
diff --git a/gm/runtimeintrinsics.cpp b/gm/runtimeintrinsics.cpp
index 2e1f7c8..8127941 100644
--- a/gm/runtimeintrinsics.cpp
+++ b/gm/runtimeintrinsics.cpp
@@ -73,7 +73,7 @@
     bitmap.allocPixels(info);
     surface->readPixels(bitmap, 0, 0);
 
-    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawImage(bitmap.asImage(), 0, 0);
     return bitmap;
 }
 
diff --git a/gm/wacky_yuv_formats.cpp b/gm/wacky_yuv_formats.cpp
index 5222459..d87b628 100644
--- a/gm/wacky_yuv_formats.cpp
+++ b/gm/wacky_yuv_formats.cpp
@@ -934,7 +934,8 @@
 
                 draw_col_label(canvas, dstRect.fLeft + cellWidth / 2, cs, opaque);
 
-                canvas->drawBitmapRect(fOriginalBMs[opaque], srcRect, dstRect, nullptr, constraint);
+                canvas->drawImageRect(fOriginalBMs[opaque].asImage(), srcRect, dstRect,
+                                      SkSamplingOptions(), nullptr, constraint);
                 dstRect.offset(0.f, cellHeight + kPad);
 
                 for (int format = kP016_YUVFormat; format <= kLast_YUVFormat; ++format) {
@@ -1126,7 +1127,7 @@
                     SkBitmap readBack;
                     readBack.allocPixels(yuv->imageInfo());
                     SkAssertResult(yuv->readPixels(dContext, readBack.pixmap(), 0, 0));
-                    canvas->drawBitmap(readBack, x, y);
+                    canvas->drawImage(readBack.asImage(), x, y);
                 }
                 x += kTileWidthHeight + kPad;
             }
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp
index a3249a6..dab0144 100644
--- a/tests/PictureTest.cpp
+++ b/tests/PictureTest.cpp
@@ -633,8 +633,8 @@
     canvas->drawColor(0);
 
     canvas->saveLayer(nullptr, &semiTransparent);
-    canvas->drawBitmap(blueBM, 25, 25);
-    canvas->drawBitmap(redBM, 50, 50);
+    canvas->drawImage(blueBM.asImage(), 25, 25);
+    canvas->drawImage(redBM.asImage(), 50, 50);
     canvas->restore();
 
     sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
@@ -716,8 +716,8 @@
         // place it inside local braces.
         SkPictureRecorder rec;
         SkCanvas* canvas = rec.beginRecording(1920, 1200);
-            canvas->drawBitmap(mut, 0, 0);
-            canvas->drawBitmap(immut, 800, 600);
+            canvas->drawImage(mut.asImage(), 0, 0);
+            canvas->drawImage(immut.asImage(), 800, 600);
         pic = rec.finishRecordingAsPicture();
     }
 
diff --git a/tests/QuickRejectTest.cpp b/tests/QuickRejectTest.cpp
index c637c72..13e3d1e 100644
--- a/tests/QuickRejectTest.cpp
+++ b/tests/QuickRejectTest.cpp
@@ -23,13 +23,12 @@
     dst.eraseColor(SK_ColorTRANSPARENT);
 
     SkCanvas canvas(dst);
-    SkPaint  paint;
 
     // we are initially transparent
     REPORTER_ASSERT(reporter, 0 == *dst.getAddr32(5, 5));
 
     // we see the bitmap drawn
-    canvas.drawBitmap(src, 0, 0, &paint);
+    canvas.drawImage(src.asImage(), 0, 0);
     REPORTER_ASSERT(reporter, 0xFFFFFFFF == *dst.getAddr32(5, 5));
 
     // reverify we are clear again
@@ -37,7 +36,7 @@
     REPORTER_ASSERT(reporter, 0 == *dst.getAddr32(5, 5));
 
     // if the bitmap is clipped out, we don't draw it
-    canvas.drawBitmap(src, SkIntToScalar(-10), 0, &paint);
+    canvas.drawImage(src.asImage(), SkIntToScalar(-10), 0);
     REPORTER_ASSERT(reporter, 0 == *dst.getAddr32(5, 5));
 }
 
diff --git a/tests/ReadPixelsTest.cpp b/tests/ReadPixelsTest.cpp
index b5ecc39..3787a41 100644
--- a/tests/ReadPixelsTest.cpp
+++ b/tests/ReadPixelsTest.cpp
@@ -91,7 +91,7 @@
     return SkPackARGB32(a, r, g, b);
 }
 
-static SkBitmap make_src_bitmap() {
+static sk_sp<SkImage> make_src_image() {
     static SkBitmap bmp;
     if (bmp.isNull()) {
         bmp.allocN32Pixels(DEV_W, DEV_H);
@@ -102,8 +102,9 @@
                 *pixel = get_src_color(x, y);
             }
         }
+        bmp.setImmutable();
     }
-    return bmp;
+    return bmp.asImage();
 }
 
 static void fill_src_canvas(SkCanvas* canvas) {
@@ -112,7 +113,7 @@
     canvas->clipRect(DEV_RECT_S, SkClipOp::kIntersect);
     SkPaint paint;
     paint.setBlendMode(SkBlendMode::kSrc);
-    canvas->drawBitmap(make_src_bitmap(), 0, 0, &paint);
+    canvas->drawImage(make_src_image(), 0, 0, SkSamplingOptions(), &paint);
     canvas->restore();
 }
 
diff --git a/tests/RecordingXfermodeTest.cpp b/tests/RecordingXfermodeTest.cpp
index 16e63ea..9dad24e 100644
--- a/tests/RecordingXfermodeTest.cpp
+++ b/tests/RecordingXfermodeTest.cpp
@@ -13,6 +13,7 @@
 #include "include/core/SkPictureRecorder.h"
 #include "include/core/SkStream.h"
 #include "include/core/SkString.h"
+#include "include/core/SkSurface.h"
 #include "src/core/SkBlendModePriv.h"
 
 #include <cstring>
@@ -27,12 +28,12 @@
 class Drawer {
  public:
     explicit Drawer() : fImageInfo(SkImageInfo::MakeN32Premul(200, 100)) {
-        fCircleBM.allocPixels(SkImageInfo::MakeN32Premul(100, 100));
-        SkCanvas canvas(fCircleBM);
-        canvas.clear(0xffffffff);
+        auto surf = SkSurface::MakeRasterN32Premul(100, 100);
+        surf->getCanvas()->clear(0xffffffff);
         SkPaint circlePaint;
         circlePaint.setColor(0xff000000);
-        canvas.drawCircle(50, 50, 50, circlePaint);
+        surf->getCanvas()->drawCircle(50, 50, 50, circlePaint);
+        fCircleImage = surf->makeImageSnapshot();
     }
 
     const SkImageInfo& imageInfo() const { return fImageInfo; }
@@ -56,14 +57,15 @@
         canvas->saveLayer(nullptr, &blackPaint);
             canvas->drawRect(canvasRect, greenPaint);
             canvas->saveLayer(nullptr, &layerPaint);
-                canvas->drawBitmapRect(fCircleBM, SkRect::MakeXYWH(20,20,60,60), &blackPaint);
+                canvas->drawImageRect(fCircleImage, SkRect::MakeXYWH(20,20,60,60),
+                                      SkSamplingOptions(), &blackPaint);
             canvas->restore();
         canvas->restore();
     }
 
  private:
     const SkImageInfo fImageInfo;
-    SkBitmap fCircleBM;
+    sk_sp<SkImage> fCircleImage;
 };
 
 class RecordingStrategy {
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp
index f79a1ba..23d46f3 100644
--- a/tests/ResourceCacheTest.cpp
+++ b/tests/ResourceCacheTest.cpp
@@ -59,7 +59,7 @@
     readback.allocN32Pixels(size.width(), size.height());
 
     for (int i = 0; i < 100; ++i) {
-        canvas->drawBitmap(src, 0, 0);
+        canvas->drawImage(src.asImage(), 0, 0);
         surface->readPixels(readback, 0, 0);
 
         // "modify" the src texture
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index e13d3eb..fa516c1 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -294,7 +294,7 @@
         SkPaint paint;
         paint.setImageFilter(deserializedFilter);
         canvas.clipRect(SkRect::MakeXYWH(0, 0, SkIntToScalar(24), SkIntToScalar(24)));
-        canvas.drawBitmap(bitmap, 0, 0, &paint);
+        canvas.drawImage(bitmap.asImage(), 0, 0, &paint);
     }
 }
 
@@ -475,7 +475,8 @@
     bitmap->allocN32Pixels(kBitmapSize, kBitmapSize);
 }
 
-static void make_checkerboard_bitmap(SkBitmap& bitmap) {
+static sk_sp<SkImage> make_checkerboard_image() {
+    SkBitmap bitmap;
     setup_bitmap_for_canvas(&bitmap);
 
     SkCanvas canvas(bitmap);
@@ -497,20 +498,17 @@
             canvas.restore();
         }
     }
+    return bitmap.asImage();
 }
 
 static void draw_something(SkCanvas* canvas) {
-    SkPaint paint;
-    SkBitmap bitmap;
-    make_checkerboard_bitmap(bitmap);
-
     canvas->save();
     canvas->scale(0.5f, 0.5f);
-    canvas->drawBitmap(bitmap, 0, 0, nullptr);
+    canvas->drawImage(make_checkerboard_image(), 0, 0);
     canvas->restore();
 
+    SkPaint paint;
     paint.setAntiAlias(true);
-
     paint.setColor(SK_ColorRED);
     canvas->drawCircle(SkIntToScalar(kBitmapSize/2), SkIntToScalar(kBitmapSize/2), SkIntToScalar(kBitmapSize/3), paint);
     paint.setColor(SK_ColorBLACK);
diff --git a/tests/Skbug6653.cpp b/tests/Skbug6653.cpp
index 12cb629..769c177 100644
--- a/tests/Skbug6653.cpp
+++ b/tests/Skbug6653.cpp
@@ -65,8 +65,7 @@
 
         auto s3 = make_surface(dContext);
         s3->getCanvas()->clear(SK_ColorBLUE);
-        SkBitmap b3 = read_pixels(s3, SK_ColorBLACK);
-        s0->getCanvas()->drawBitmap(b3, 0, 0);
+        s0->getCanvas()->drawImage(read_pixels(s3, SK_ColorBLACK).asImage(), 0, 0);
         s3 = nullptr;
 
         auto s4 = make_surface(dContext);
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
index 27dfe0e..f99dc60 100644
--- a/tests/SurfaceTest.cpp
+++ b/tests/SurfaceTest.cpp
@@ -422,8 +422,8 @@
     EXPECT_COPY_ON_WRITE(drawRect(testRect, testPaint))
     EXPECT_COPY_ON_WRITE(drawRRect(testRRect, testPaint))
     EXPECT_COPY_ON_WRITE(drawPath(testPath, testPaint))
-    EXPECT_COPY_ON_WRITE(drawBitmap(testBitmap, 0, 0))
-    EXPECT_COPY_ON_WRITE(drawBitmapRect(testBitmap, testRect, nullptr))
+    EXPECT_COPY_ON_WRITE(drawImage(testBitmap.asImage(), 0, 0))
+    EXPECT_COPY_ON_WRITE(drawImageRect(testBitmap.asImage(), testRect, SkSamplingOptions()))
     EXPECT_COPY_ON_WRITE(drawString(testText, 0, 1, SkFont(), testPaint))
 }
 DEF_TEST(SurfaceCopyOnWrite, reporter) {
diff --git a/tools/fiddle/all_examples.cpp b/tools/fiddle/all_examples.cpp
index 6bcbea1..350b355 100644
--- a/tools/fiddle/all_examples.cpp
+++ b/tools/fiddle/all_examples.cpp
@@ -15,9 +15,6 @@
 #include "../../docs/examples/Bitmap_allocN32Pixels.cpp"
 #include "../../docs/examples/Bitmap_allocPixels.cpp"
 #include "../../docs/examples/Bitmap_allocPixelsFlags.cpp"
-#include "../../docs/examples/Bitmap_allocPixels_2.cpp"
-#include "../../docs/examples/Bitmap_allocPixels_3.cpp"
-#include "../../docs/examples/Bitmap_allocPixels_4.cpp"
 #include "../../docs/examples/Bitmap_bounds.cpp"
 #include "../../docs/examples/Bitmap_bytesPerPixel.cpp"
 #include "../../docs/examples/Bitmap_colorSpace.cpp"