Begin to hide drawBitmap

... now that bitmap
- converts to image with just bitmap.asImage()
- canvas *always* converts bitmaps to images before they are drawn

Bug: skia:10037
Change-Id: I24292f62e0fd072b3b810d974d0fe5c6d9b9a68d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/353582
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/gm/all_bitmap_configs.cpp b/gm/all_bitmap_configs.cpp
index a82887f..12563ce 100644
--- a/gm/all_bitmap_configs.cpp
+++ b/gm/all_bitmap_configs.cpp
@@ -121,7 +121,7 @@
                  SkColorType colorType,
                  const char text[]) {
     SkASSERT(src.colorType() == colorType);
-    canvas->drawBitmap(src, 0.0f, 0.0f);
+    canvas->drawImage(src.asImage(), 0.0f, 0.0f);
     canvas->drawSimpleText(text, strlen(text), SkTextEncoding::kUTF8, 0.0f, 12.0f, font, p);
 }
 
diff --git a/gm/androidblendmodes.cpp b/gm/androidblendmodes.cpp
index 0b7172b..8ff7a6d 100644
--- a/gm/androidblendmodes.cpp
+++ b/gm/androidblendmodes.cpp
@@ -71,9 +71,9 @@
         canvas->saveLayer(nullptr, nullptr);
 
         SkPaint p;
-        canvas->drawBitmap(fCompositeDst, 0, 0, &p);
+        canvas->drawImage(fCompositeDst.asImage(), 0, 0, &p);
         p.setBlendMode(mode);
-        canvas->drawBitmap(fCompositeSrc, 0, 0, &p);
+        canvas->drawImage(fCompositeSrc.asImage(), 0, 0, &p);
     }
 
     void onDraw(SkCanvas* canvas) override {
diff --git a/gm/anisotropic.cpp b/gm/anisotropic.cpp
index 5699fe6..6f7dd6b 100644
--- a/gm/anisotropic.cpp
+++ b/gm/anisotropic.cpp
@@ -10,6 +10,7 @@
 #include "include/core/SkCanvas.h"
 #include "include/core/SkColor.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"
@@ -66,7 +67,7 @@
                                     SkIntToScalar(xSize), SkIntToScalar(ySize));
         SkPaint p;
         p.setFilterQuality(fFilterQuality);
-        canvas->drawBitmapRect(fBM, r, &p);
+        canvas->drawImageRect(fBM.asImage(), r, &p);
     }
 
     void onDraw(SkCanvas* canvas) override {
diff --git a/gm/bitmappremul.cpp b/gm/bitmappremul.cpp
index 3cd9c9a..35c9eb1 100644
--- a/gm/bitmappremul.cpp
+++ b/gm/bitmappremul.cpp
@@ -11,6 +11,7 @@
 #include "include/core/SkCanvas.h"
 #include "include/core/SkColor.h"
 #include "include/core/SkColorPriv.h"
+#include "include/core/SkImage.h"
 #include "include/core/SkImageInfo.h"
 #include "include/core/SkPaint.h"
 #include "include/core/SkScalar.h"
@@ -34,7 +35,7 @@
     bitmap->eraseColor(SK_ColorWHITE);
 }
 
-static SkBitmap make_argb8888_gradient() {
+static sk_sp<SkImage> make_argb8888_gradient() {
     SkBitmap bitmap;
     init_bitmap(kN32_SkColorType, &bitmap);
     for (int y = 0; y < SLIDE_SIZE; y++) {
@@ -43,20 +44,20 @@
             dst[x] = SkPackARGB32(y, y, y, y);
         }
     }
-    return bitmap;
+    return bitmap.asImage();
 }
 
-static SkBitmap make_argb4444_gradient() {
+static sk_sp<SkImage> make_argb4444_gradient() {
     SkBitmap bitmap;
     init_bitmap(kARGB_4444_SkColorType, &bitmap);
     // Using draw rather than readPixels to suppress dither
     SkPaint paint;
     paint.setBlendMode(SkBlendMode::kSrc);
-    SkCanvas{ bitmap }.drawBitmap(make_argb8888_gradient(), 0, 0, &paint);
-    return bitmap;
+    SkCanvas{ bitmap }.drawImage(make_argb8888_gradient(), 0, 0, &paint);
+    return bitmap.asImage();
 }
 
-static SkBitmap make_argb8888_stripes() {
+static sk_sp<SkImage> make_argb8888_stripes() {
     SkBitmap bitmap;
     init_bitmap(kN32_SkColorType, &bitmap);
     uint8_t rowColor = 0;
@@ -72,17 +73,17 @@
             rowColor = 0;
         }
     }
-    return bitmap;
+    return bitmap.asImage();
 }
 
-static SkBitmap make_argb4444_stripes() {
+static sk_sp<SkImage> make_argb4444_stripes() {
     SkBitmap bitmap;
     init_bitmap(kARGB_4444_SkColorType, &bitmap);
     // Using draw rather than readPixels to suppress dither
     SkPaint paint;
     paint.setBlendMode(SkBlendMode::kSrc);
-    SkCanvas{ bitmap }.drawBitmap(make_argb8888_stripes(), 0, 0, &paint);
-    return bitmap;
+    SkCanvas{ bitmap }.drawImage(make_argb8888_stripes(), 0, 0, &paint);
+    return bitmap.asImage();
 }
 
 namespace skiagm {
@@ -104,10 +105,10 @@
 
     void onDraw(SkCanvas* canvas) override {
         SkScalar slideSize = SkIntToScalar(SLIDE_SIZE);
-        canvas->drawBitmap(make_argb8888_gradient(), 0, 0);
-        canvas->drawBitmap(make_argb4444_gradient(), slideSize, 0);
-        canvas->drawBitmap(make_argb8888_stripes(), 0, slideSize);
-        canvas->drawBitmap(make_argb4444_stripes(), slideSize, slideSize);
+        canvas->drawImage(make_argb8888_gradient(), 0, 0);
+        canvas->drawImage(make_argb4444_gradient(), slideSize, 0);
+        canvas->drawImage(make_argb8888_stripes(), 0, slideSize);
+        canvas->drawImage(make_argb4444_stripes(), slideSize, slideSize);
     }
 
 private:
diff --git a/gm/bitmaprect.cpp b/gm/bitmaprect.cpp
index e840b81..474c8c5 100644
--- a/gm/bitmaprect.cpp
+++ b/gm/bitmaprect.cpp
@@ -16,22 +16,24 @@
 #include "include/core/SkShader.h"
 #include "include/core/SkSize.h"
 #include "include/core/SkString.h"
+#include "include/core/SkSurface.h"
 #include "include/core/SkTileMode.h"
 #include "include/core/SkTypes.h"
 #include "include/effects/SkGradientShader.h"
 
-static void make_bitmap(SkBitmap* bitmap) {
-    bitmap->allocN32Pixels(64, 64);
+static sk_sp<SkImage> make_image() {
+    auto surf = SkSurface::MakeRasterN32Premul(64, 64);
+    auto canvas = surf->getCanvas();
 
-    SkCanvas canvas(*bitmap);
-
-    canvas.drawColor(SK_ColorRED);
+    canvas->drawColor(SK_ColorRED);
     SkPaint paint;
     paint.setAntiAlias(true);
     const SkPoint pts[] = { { 0, 0 }, { 64, 64 } };
     const SkColor colors[] = { SK_ColorWHITE, SK_ColorBLUE };
     paint.setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkTileMode::kClamp));
-    canvas.drawCircle(32, 32, 32, paint);
+    canvas->drawCircle(32, 32, 32, paint);
+
+    return surf->makeImageSnapshot();
 }
 
 class DrawBitmapRect2 : public skiagm::GM {
@@ -64,8 +66,7 @@
         SkPaint paint;
         paint.setStyle(SkPaint::kStroke_Style);
 
-        SkBitmap bitmap;
-        make_bitmap(&bitmap);
+        auto image = make_image();
 
         SkRect dstR = { 0, 200, 128, 380 };
 
@@ -74,12 +75,12 @@
             SkRect srcR;
             srcR.set(src[i]);
 
-            canvas->drawBitmap(bitmap, 0, 0, &paint);
+            canvas->drawImage(image, 0, 0, &paint);
             if (!fUseIRect) {
-                canvas->drawBitmapRect(bitmap, srcR, dstR, &paint,
-                                       SkCanvas::kStrict_SrcRectConstraint);
+                canvas->drawImageRect(image, srcR, dstR, &paint,
+                                      SkCanvas::kStrict_SrcRectConstraint);
             } else {
-                canvas->drawBitmapRect(bitmap, src[i], dstR, &paint);
+                canvas->drawImageRect(image, src[i], dstR, &paint);
             }
 
             canvas->drawRect(dstR, paint);
diff --git a/gm/colorfilteralpha8.cpp b/gm/colorfilteralpha8.cpp
index 2c38143..59c16df 100644
--- a/gm/colorfilteralpha8.cpp
+++ b/gm/colorfilteralpha8.cpp
@@ -10,6 +10,7 @@
 #include "include/core/SkCanvas.h"
 #include "include/core/SkColor.h"
 #include "include/core/SkColorFilter.h"
+#include "include/core/SkImage.h"
 #include "include/core/SkImageInfo.h"
 #include "include/core/SkPaint.h"
 #include "include/core/SkSize.h"
@@ -45,7 +46,7 @@
         };
         paint.setColorFilter(SkColorFilters::Matrix(opaqueGrayMatrix));
 
-        canvas->drawBitmap(bitmap, 100.0f, 100.0f, &paint);
+        canvas->drawImage(bitmap.asImage(), 100.0f, 100.0f, &paint);
     }
 
 private:
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
index e78c108..4cfe6b9 100644
--- a/include/core/SkCanvas.h
+++ b/include/core/SkCanvas.h
@@ -36,6 +36,7 @@
 // Working on allow this to be undefined
 #define SK_SUPPORT_LEGACY_GETTOTALMATRIX
 //#define SK_SUPPORT_LEGACY_ONDRAWIMAGERECT
+#define SK_SUPPORT_LEGACY_DRAWBITMAP
 
 class GrBackendRenderTarget;
 class GrRecordingContext;
@@ -1647,6 +1648,8 @@
                    const SkPaint* = nullptr);
     void drawImageRect(const SkImage*, const SkRect& src, const SkRect& dst,
                        const SkSamplingOptions&, const SkPaint*, SrcRectConstraint);
+    void drawImageRect(const SkImage*, const SkRect& dst, const SkSamplingOptions&,
+                       const SkPaint*, SrcRectConstraint);
 
     /** Draws SkImage image stretched proportionally to fit into SkRect dst.
         SkIRect center divides the image into nine sections: four sides, four corners, and
@@ -1684,6 +1687,11 @@
         this->drawImageNine(image.get(), center, dst, paint);
     }
 
+#ifdef SK_SUPPORT_LEGACY_DRAWBITMAP
+public:
+#else
+private:
+#endif
     /** Draws SkBitmap bitmap, with its top-left corner at (left, top),
         using clip, SkMatrix, and optional SkPaint paint.
 
@@ -1785,6 +1793,7 @@
     */
     void drawBitmapRect(const SkBitmap& bitmap, const SkRect& dst, const SkPaint* paint,
                         SrcRectConstraint constraint = kStrict_SrcRectConstraint);
+public:
 
     /** \struct SkCanvas::Lattice
         SkCanvas::Lattice divides SkBitmap or SkImage into a rectangular grid.
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 0141671..c92432d 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -2571,6 +2571,14 @@
     this->onDrawImageRect2(image, src, dst, sampling, paint, constraint);
 }
 
+void SkCanvas::drawImageRect(const SkImage* image, const SkRect& dst,
+                             const SkSamplingOptions& sampling, const SkPaint* paint,
+                             SrcRectConstraint constraint) {
+    RETURN_ON_NULL(image);
+    this->drawImageRect(image, SkRect::MakeIWH(image->width(), image->height()), dst, sampling,
+                        paint, constraint);
+}
+
 void SkCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
                               const SkPaint& paint) {
     const SkRect bounds = blob->bounds().makeOffset(x, y);
diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp
index 5399991..b48a2a4 100644
--- a/src/core/SkPixmap.cpp
+++ b/src/core/SkPixmap.cpp
@@ -571,7 +571,7 @@
     SkPaint p;
     p.setBlendMode(SkBlendMode::kSrc);
     surf->getCanvas()->concat(m);
-    surf->getCanvas()->drawBitmap(bm, 0, 0, &p);
+    surf->getCanvas()->drawImage(SkImage::MakeFromBitmap(bm), 0, 0, &p);
     return true;
 }
 
diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp
index 682dbf4..f94ab71 100644
--- a/src/core/SkSpecialImage.cpp
+++ b/src/core/SkSpecialImage.cpp
@@ -195,8 +195,8 @@
         SkRect dst = SkRect::MakeXYWH(x, y,
                                       this->subset().width(), this->subset().height());
 
-        canvas->drawBitmapRect(fBitmap, this->subset(),
-                               dst, paint, SkCanvas::kStrict_SrcRectConstraint);
+        canvas->drawImageRect(fBitmap.asImage(), this->subset(), dst, paint,
+                              SkCanvas::kStrict_SrcRectConstraint);
     }
 
     bool onGetROPixels(SkBitmap* bm) const override {
diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp
index 0e20b62..72bda1f 100644
--- a/src/pdf/SkPDFShader.cpp
+++ b/src/pdf/SkPDFShader.cpp
@@ -49,7 +49,7 @@
     SkAutoCanvasRestore acr(canvas, true);
     canvas->concat(matrix);
     SkPaint paint(paintColor);
-    canvas->drawBitmap(bm, 0, 0, &paint);
+    canvas->drawImage(SkImage::MakeFromBitmap(bm), 0, 0, &paint);
 }
 
 static void fill_color_from_bitmap(SkCanvas* canvas,
diff --git a/tests/DrawBitmapRectTest.cpp b/tests/DrawBitmapRectTest.cpp
index 7c99428..afe8615 100644
--- a/tests/DrawBitmapRectTest.cpp
+++ b/tests/DrawBitmapRectTest.cpp
@@ -8,6 +8,7 @@
 #include "include/core/SkBitmap.h"
 #include "include/core/SkCanvas.h"
 #include "include/core/SkColor.h"
+#include "include/core/SkImage.h"
 #include "include/core/SkMatrix.h"
 #include "include/core/SkPaint.h"
 #include "include/core/SkPath.h"
@@ -250,7 +251,7 @@
     SkIRect srcR = { gWidth, 0, gWidth + 16, 16 };
     SkRect  dstR = { 0, 0, SkIntToScalar(16), SkIntToScalar(16) };
 
-    canvas.drawBitmapRect(src, srcR, dstR, nullptr);
+    canvas.drawImageRect(src.asImage(), srcR, dstR, nullptr);
 
     // ensure that we draw nothing if srcR does not intersect the bitmap
     REPORTER_ASSERT(reporter, check_for_all_zeros(dst));