Make peekPixels() usable with raster surface snapshots

SkSurface_Raster snapshots do not lock their backing bitmaps when the
pixel ref is shared - they only lock on deep-copy.

But since for raster surfaces the pixels are always in memory, I think
it would be OK to also lock in the former case.

This allows for optimized (zero-copy) reads of raster surface snapshot
data.

R=reed@google.com

Review URL: https://codereview.chromium.org/1256993002
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp
index aac4995..41198c0 100644
--- a/src/image/SkImage_Raster.cpp
+++ b/src/image/SkImage_Raster.cpp
@@ -81,9 +81,13 @@
     bool isOpaque() const override;
     bool onAsLegacyBitmap(SkBitmap*, LegacyBitmapMode) const override;
 
-    SkImage_Raster(const SkBitmap& bm, const SkSurfaceProps* props)
+    SkImage_Raster(const SkBitmap& bm, const SkSurfaceProps* props, bool lockPixels = false)
         : INHERITED(bm.width(), bm.height(), props)
-        , fBitmap(bm) {}
+        , fBitmap(bm) {
+        if (lockPixels) {
+            fBitmap.lockPixels();
+        }
+    }
 
 private:
     SkImage_Raster() : INHERITED(0, 0, NULL) {}
@@ -229,7 +233,7 @@
 }
 
 SkImage* SkNewImageFromRasterBitmap(const SkBitmap& bm, bool forceSharePixelRef,
-                                    const SkSurfaceProps* props) {
+                                    const SkSurfaceProps* props, SharedPixelRefMode mode) {
     SkASSERT(NULL == bm.getTexture());
 
     if (!SkImage_Raster::ValidArgs(bm.info(), bm.rowBytes(), NULL, NULL)) {
@@ -238,7 +242,7 @@
 
     SkImage* image = NULL;
     if (forceSharePixelRef || bm.isImmutable()) {
-        image = SkNEW_ARGS(SkImage_Raster, (bm, props));
+        image = SkNEW_ARGS(SkImage_Raster, (bm, props, kLocked_SharedPixelRefMode == mode));
     } else {
         SkBitmap tmp(bm);
         tmp.lockPixels();