diff --git a/tests/ApplyGammaTest.cpp b/tests/ApplyGammaTest.cpp
index 83b5968..f2049e7 100644
--- a/tests/ApplyGammaTest.cpp
+++ b/tests/ApplyGammaTest.cpp
@@ -129,7 +129,7 @@
         dstCanvas->flush();
 
         sk_memset32(read.get(), 0, kW * kH);
-        if (!dstCanvas->readPixels(ii, read.get(), kRowBytes, 0, 0)) {
+        if (!dst->readPixels(ii, read.get(), kRowBytes, 0, 0)) {
             ERRORF(reporter, "Error calling readPixels");
             continue;
         }
diff --git a/tests/BlurTest.cpp b/tests/BlurTest.cpp
index 5d95718..d287642 100644
--- a/tests/BlurTest.cpp
+++ b/tests/BlurTest.cpp
@@ -236,12 +236,14 @@
 }
 
 // Readback the blurred draw results from the canvas
-static void readback(SkCanvas* canvas, int* result, int resultCount) {
+static void readback(const SkBitmap& src, int* result, int resultCount) {
     SkBitmap readback;
     readback.allocN32Pixels(resultCount, 30);
-    canvas->readPixels(readback, 0, 0);
+    SkPixmap pm;
+    readback.peekPixels(&pm);
+    src.readPixels(pm, 0, 0);
 
-    SkPMColor* pixels = (SkPMColor*) readback.getAddr32(0, 15);
+    const SkPMColor* pixels = pm.addr32(0, 15);
 
     for (int i = 0; i < resultCount; ++i) {
         result[i] = SkColorGetR(pixels[i]);
@@ -258,33 +260,9 @@
     SkCanvas canvas(bitmap);
 
     blur_path(&canvas, path, gaussianSigma);
-    readback(&canvas, result, resultCount);
+    readback(bitmap, result, resultCount);
 }
 
-#if SK_SUPPORT_GPU
-#if 0
-// temporary disable; see below for explanation
-static bool gpu_blur_path(GrContext* context, const SkPath& path,
-                          SkScalar gaussianSigma,
-                          int* result, int resultCount) {
-    GrSurfaceDesc desc;
-    desc.fConfig = kSkia8888_GrPixelConfig;
-    desc.fFlags = kRenderTarget_GrSurfaceFlag;
-    desc.fWidth = resultCount;
-    desc.fHeight = 30;
-    desc.fSampleCnt = 0;
-
-    sk_sp<GrTexture> texture(grContext->createTexture(desc, false, nullptr, 0));
-    sk_sp<SkGpuDevice> device(new SkGpuDevice(grContext, texture.get()));
-    SkCanvas canvas(device.get());
-
-    blur_path(&canvas, path, gaussianSigma);
-    readback(&canvas, result, resultCount);
-    return true;
-}
-#endif
-#endif
-
 #if WRITE_CSV
 static void write_as_csv(const char* label, SkScalar scale, int* data, int count) {
     SkDebugf("%s_%.2f,", label, scale);
@@ -343,18 +321,6 @@
 
         REPORTER_ASSERT(reporter, match(rectSpecialCaseResult, bruteForce1DResult, kSize, 5));
         REPORTER_ASSERT(reporter, match(generalCaseResult, bruteForce1DResult, kSize, 15));
-#if SK_SUPPORT_GPU
-#if 0
-        int gpuResult[kSize];
-        bool haveGPUResult = gpu_blur_path(context, rectPath, sigma, gpuResult, kSize);
-        // Disabling this test for now -- I don't think it's a legit comparison.
-        // Will continue to investigate this.
-        if (haveGPUResult) {
-            // 1 works everywhere but: Ubuntu13 & Nexus4
-            REPORTER_ASSERT(reporter, match(gpuResult, bruteForce1DResult, kSize, 10));
-        }
-#endif
-#endif
         REPORTER_ASSERT(reporter, match(groundTruthResult, bruteForce1DResult, kSize, 1));
 
 #if WRITE_CSV
diff --git a/tests/DrawPathTest.cpp b/tests/DrawPathTest.cpp
index 2434bdf..3893981 100644
--- a/tests/DrawPathTest.cpp
+++ b/tests/DrawPathTest.cpp
@@ -26,7 +26,7 @@
     int y = SkScalarRoundToInt(r.top());
 
     // check that the pixel in question starts as transparent (by the surface)
-    if (canvas->readPixels(output, x, y)) {
+    if (surf->readPixels(output, x, y)) {
         REPORTER_ASSERT(reporter, 0 == pixel[0]);
     } else {
         REPORTER_ASSERT_MESSAGE(reporter, false, "readPixels failed");
@@ -39,7 +39,7 @@
     canvas->drawRect(r, paint);
 
     // Now check that it is BLACK
-    if (canvas->readPixels(output, x, y)) {
+    if (surf->readPixels(output, x, y)) {
         // don't know what swizzling PMColor did, but white should always
         // appear the same.
         REPORTER_ASSERT(reporter, 0xFFFFFFFF == pixel[0]);
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 69b31f1..93389b3 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -1413,7 +1413,8 @@
     REPORTER_ASSERT(reporter, nullptr == conv.get());
 }
 
-static void test_xfermode_cropped_input(SkCanvas* canvas, skiatest::Reporter* reporter) {
+static void test_xfermode_cropped_input(SkSurface* surf, skiatest::Reporter* reporter) {
+    auto canvas = surf->getCanvas();
     canvas->clear(0);
 
     SkBitmap bitmap;
@@ -1442,17 +1443,17 @@
 
     uint32_t pixel;
     SkImageInfo info = SkImageInfo::Make(1, 1, kBGRA_8888_SkColorType, kUnpremul_SkAlphaType);
-    canvas->readPixels(info, &pixel, 4, 0, 0);
+    surf->readPixels(info, &pixel, 4, 0, 0);
     REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN);
 
     paint.setImageFilter(std::move(xfermodeNoBg));
     canvas->drawBitmap(bitmap, 0, 0, &paint);   // drawSprite
-    canvas->readPixels(info, &pixel, 4, 0, 0);
+    surf->readPixels(info, &pixel, 4, 0, 0);
     REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN);
 
     paint.setImageFilter(std::move(xfermodeNoFgNoBg));
     canvas->drawBitmap(bitmap, 0, 0, &paint);   // drawSprite
-    canvas->readPixels(info, &pixel, 4, 0, 0);
+    surf->readPixels(info, &pixel, 4, 0, 0);
     REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN);
 }
 
@@ -1491,26 +1492,23 @@
 
     SkImageInfo info = SkImageInfo::Make(1, 1, kBGRA_8888_SkColorType, kUnpremul_SkAlphaType);
     uint32_t pixel;
-    canvas.readPixels(info, &pixel, 4, 25, 25);
+    temp.readPixels(info, &pixel, 4, 25, 25);
     REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN);
 
     // Test that drawSprite() with a filter nested inside a saveLayer() applies the
     // correct offset to the filter matrix.
     canvas.clear(0x0);
-    canvas.readPixels(info, &pixel, 4, 25, 25);
+    temp.readPixels(info, &pixel, 4, 25, 25);
     canvas.saveLayer(&bounds1, nullptr);
     canvas.drawBitmap(bitmap, 20, 20, &filterPaint);    // drawSprite
     canvas.restore();
 
-    canvas.readPixels(info, &pixel, 4, 25, 25);
+    temp.readPixels(info, &pixel, 4, 25, 25);
     REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN);
 }
 
 DEF_TEST(XfermodeImageFilterCroppedInput, reporter) {
-    SkBitmap temp;
-    temp.allocN32Pixels(100, 100);
-    SkCanvas canvas(temp);
-    test_xfermode_cropped_input(&canvas, reporter);
+    test_xfermode_cropped_input(SkSurface::MakeRasterN32Premul(100, 100).get(), reporter);
 }
 
 static void test_composed_imagefilter_offset(skiatest::Reporter* reporter, GrContext* context) {
@@ -1834,9 +1832,7 @@
             SkBudgeted::kNo,
             SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kPremul_SkAlphaType)));
 
-    SkCanvas* canvas = surf->getCanvas();
-
-    test_xfermode_cropped_input(canvas, reporter);
+    test_xfermode_cropped_input(surf.get(), reporter);
 }
 
 DEF_GPUTEST_FOR_ALL_CONTEXTS(ImageFilterBlurLargeImage_Gpu, reporter, ctxInfo) {
diff --git a/tests/ImageNewShaderTest.cpp b/tests/ImageNewShaderTest.cpp
index fe01f04..638fa07 100644
--- a/tests/ImageNewShaderTest.cpp
+++ b/tests/ImageNewShaderTest.cpp
@@ -56,12 +56,12 @@
 
     SkBitmap bmOrig;
     bmOrig.allocN32Pixels(info.width(), info.height());
-    sourceSurface->getCanvas()->readPixels(bmOrig, 0, 0);
+    sourceSurface->readPixels(bmOrig, 0, 0);
 
 
     SkBitmap bm;
     bm.allocN32Pixels(info.width(), info.height());
-    destinationCanvas->readPixels(bm, 0, 0);
+    destinationSurface->readPixels(bm, 0, 0);
 
     test_bitmap_equality(reporter, bmOrig, bm);
 
@@ -83,7 +83,7 @@
 
     SkBitmap bmt;
     bmt.allocN32Pixels(info.width(), info.height());
-    destinationCanvas->readPixels(bmt, 0, 0);
+    destinationSurface->readPixels(bmt, 0, 0);
 
     //  Test correctness
     {
diff --git a/tests/PremulAlphaRoundTripTest.cpp b/tests/PremulAlphaRoundTripTest.cpp
index 7719ad8..2c3cb00 100644
--- a/tests/PremulAlphaRoundTripTest.cpp
+++ b/tests/PremulAlphaRoundTripTest.cpp
@@ -76,10 +76,10 @@
         readBmp1.eraseColor(0);
         readBmp2.eraseColor(0);
 
-        canvas->readPixels(readBmp1, 0, 0);
+        surf->readPixels(readBmp1, 0, 0);
         sk_tool_utils::write_pixels(canvas, readBmp1, 0, 0, gUnpremul[upmaIdx].fColorType,
                                     kUnpremul_SkAlphaType);
-        canvas->readPixels(readBmp2, 0, 0);
+        surf->readPixels(readBmp2, 0, 0);
 
         bool success = true;
         for (int y = 0; y < 256 && success; ++y) {
diff --git a/tests/ReadPixelsTest.cpp b/tests/ReadPixelsTest.cpp
index f426e5f..ce01004 100644
--- a/tests/ReadPixelsTest.cpp
+++ b/tests/ReadPixelsTest.cpp
@@ -359,7 +359,7 @@
                     fill_dst_bmp_with_init_data(&bmp);
                 }
                 uint32_t idBefore = surface->generationID();
-                bool success = canvas->readPixels(bmp, srcRect.fLeft, srcRect.fTop);
+                bool success = surface->readPixels(bmp, srcRect.fLeft, srcRect.fTop);
                 uint32_t idAfter = surface->generationID();
 
                 // we expect to succeed when the read isn't fully clipped
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp
index 3cfa157..b018b8f 100644
--- a/tests/ResourceCacheTest.cpp
+++ b/tests/ResourceCacheTest.cpp
@@ -67,7 +67,7 @@
 
     for (int i = 0; i < 100; ++i) {
         canvas->drawBitmap(src, 0, 0);
-        canvas->readPixels(readback, 0, 0);
+        surface->readPixels(readback, 0, 0);
 
         // "modify" the src texture
         src.notifyPixelsChanged();
diff --git a/tests/SkImageTest.cpp b/tests/SkImageTest.cpp
index 4a05b44..426883b 100644
--- a/tests/SkImageTest.cpp
+++ b/tests/SkImageTest.cpp
@@ -37,11 +37,11 @@
 
     uint32_t pixel = 0;
     SkImageInfo info = SkImageInfo::Make(1, 1, kBGRA_8888_SkColorType, kUnpremul_SkAlphaType);
-    canvas.readPixels(info, &pixel, 4, 0, 0);
+    tgt.readPixels(info, &pixel, 4, 0, 0);
     REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN);
-    canvas.readPixels(info, &pixel, 4, gWidth - 6, gWidth - 6);
+    tgt.readPixels(info, &pixel, 4, gWidth - 6, gWidth - 6);
     REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN);
 
-    canvas.readPixels(info, &pixel, 4, gWidth - 5, gWidth - 5);
+    tgt.readPixels(info, &pixel, 4, gWidth - 5, gWidth - 5);
     REPORTER_ASSERT(reporter, pixel == SK_ColorTRANSPARENT);
 }
diff --git a/tests/SurfaceSemaphoreTest.cpp b/tests/SurfaceSemaphoreTest.cpp
index b13c5d9..cd3b8e5 100644
--- a/tests/SurfaceSemaphoreTest.cpp
+++ b/tests/SurfaceSemaphoreTest.cpp
@@ -100,7 +100,7 @@
     // read pixels
     SkBitmap bitmap;
     bitmap.allocPixels(childII);
-    childCanvas->readPixels(bitmap, 0, 0);
+    childSurface->readPixels(bitmap, 0, 0);
 
     check_pixels(reporter, bitmap);
 }
diff --git a/tests/WritePixelsTest.cpp b/tests/WritePixelsTest.cpp
index e876c8f..6e8b7d6 100644
--- a/tests/WritePixelsTest.cpp
+++ b/tests/WritePixelsTest.cpp
@@ -184,9 +184,8 @@
            SkAbs32(aB - bB) <= 1;
 }
 
-static bool check_write(skiatest::Reporter* reporter, SkCanvas* canvas, const SkBitmap& bitmap,
+static bool check_write(skiatest::Reporter* reporter, SkSurface* surf, const SkBitmap& bitmap,
                        int writeX, int writeY) {
-    const SkImageInfo canvasInfo = canvas->imageInfo();
     size_t canvasRowBytes;
     const uint32_t* canvasPixels;
 
@@ -194,8 +193,8 @@
     // At some point this will be unsupported, as we won't allow accessBitmap() to magically call
     // readPixels for the client.
     SkBitmap secretDevBitmap;
-    secretDevBitmap.allocN32Pixels(canvasInfo.width(), canvasInfo.height());
-    if (!canvas->readPixels(secretDevBitmap, 0, 0)) {
+    secretDevBitmap.allocN32Pixels(surf->width(), surf->height());
+    if (!surf->readPixels(secretDevBitmap, 0, 0)) {
         return false;
     }
 
@@ -206,9 +205,7 @@
         return false;
     }
 
-    if (canvasInfo.width() != DEV_W ||
-        canvasInfo.height() != DEV_H ||
-        canvasInfo.colorType() != kN32_SkColorType) {
+    if (surf->width() != DEV_W || surf->height() != DEV_H) {
         return false;
     }
 
@@ -352,7 +349,7 @@
         SkIRect::MakeLTRB(3 * DEV_W / 4, -10, DEV_W + 10, DEV_H + 10),
     };
 
-    SkCanvas& canvas = *surface->getCanvas();
+    SkCanvas* canvas = surface->getCanvas();
 
     static const struct {
         SkColorType fColorType;
@@ -370,21 +367,21 @@
                 const SkColorType ct = gSrcConfigs[c].fColorType;
                 const SkAlphaType at = gSrcConfigs[c].fAlphaType;
 
-                fill_canvas(&canvas);
+                fill_canvas(canvas);
                 SkBitmap bmp;
                 REPORTER_ASSERT(reporter, setup_bitmap(&bmp, ct, at, rect.width(),
                                                        rect.height(), SkToBool(tightBmp)));
                 uint32_t idBefore = surface->generationID();
 
                 // sk_tool_utils::write_pixels(&canvas, bmp, rect.fLeft, rect.fTop, ct, at);
-                canvas.writePixels(bmp, rect.fLeft, rect.fTop);
+                canvas->writePixels(bmp, rect.fLeft, rect.fTop);
 
                 uint32_t idAfter = surface->generationID();
-                REPORTER_ASSERT(reporter, check_write(reporter, &canvas, bmp,
+                REPORTER_ASSERT(reporter, check_write(reporter, surface, bmp,
                                                       rect.fLeft, rect.fTop));
 
                 // we should change the genID iff pixels were actually written.
-                SkIRect canvasRect = SkIRect::MakeSize(canvas.getBaseLayerSize());
+                SkIRect canvasRect = SkIRect::MakeSize(canvas->getBaseLayerSize());
                 SkIRect writeRect = SkIRect::MakeXYWH(rect.fLeft, rect.fTop,
                                                       bmp.width(), bmp.height());
                 bool intersects = SkIRect::Intersects(canvasRect, writeRect) ;
diff --git a/tests/skbug6653.cpp b/tests/skbug6653.cpp
index d200e14..dbd288e 100644
--- a/tests/skbug6653.cpp
+++ b/tests/skbug6653.cpp
@@ -19,7 +19,7 @@
 static SkBitmap read_pixels(sk_sp<SkSurface> surface) {
     SkBitmap bmp;
     bmp.allocN32Pixels(surface->width(), surface->height());
-    if (!surface->getCanvas()->readPixels(bmp, 0, 0)) {
+    if (!surface->readPixels(bmp, 0, 0)) {
         SkDebugf("readPixels failed\n");
     }
     return bmp;
