Add SkOverdrawCanvas to detect overdraw

This is the first part of a multi-part change to detect and
display gpu overdraw on Android.

BUG:32370375

GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=4907

Change-Id: Ibba9d7343f2fd57397fa1168a5a5b1ef6ef91287
Reviewed-on: https://skia-review.googlesource.com/4907
Reviewed-by: Ben Wagner <bungeman@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Matt Sarett <msarett@google.com>
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
index 2ac8d29..e613e1d 100644
--- a/tests/SurfaceTest.cpp
+++ b/tests/SurfaceTest.cpp
@@ -1021,3 +1021,31 @@
     }
 }
 #endif
+
+static void test_overdraw_surface(skiatest::Reporter* r, SkSurface* surface) {
+    std::unique_ptr<SkCanvas> canvas = ((SkSurface_Base*) surface)->onMakeOverdrawCanvas();
+    canvas->drawPaint(SkPaint());
+    sk_sp<SkImage> image = surface->makeImageSnapshot();
+
+    SkBitmap bitmap;
+    image->asLegacyBitmap(&bitmap, SkImage::kRO_LegacyBitmapMode);
+    bitmap.lockPixels();
+    for (int y = 0; y < 10; y++) {
+        for (int x = 0; x < 10; x++) {
+            REPORTER_ASSERT(r, 1 == SkGetPackedA32(*bitmap.getAddr32(x, y)));
+        }
+    }
+}
+
+DEF_TEST(OverdrawSurface_Raster, r) {
+    sk_sp<SkSurface> surface = create_surface();
+    test_overdraw_surface(r, surface.get());
+}
+
+#if SK_SUPPORT_GPU
+DEF_GPUTEST_FOR_RENDERING_CONTEXTS(OverdrawSurface_Gpu, r, ctxInfo) {
+    GrContext* context = ctxInfo.grContext();
+    sk_sp<SkSurface> surface = create_gpu_surface(context);
+    test_overdraw_surface(r, surface.get());
+}
+#endif