Properly handle extracted bitmaps in cross process/shared addr space SkGPipe.

Use the pixel ref which we have already copied and the appropriate pixel ref
offset.

Turn SampleDrawBitmap into a GM to test this functionality.

Review URL: https://codereview.appspot.com/6348059

git-svn-id: http://skia.googlecode.com/svn/trunk@4417 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp
index 6b48bca..066159f 100644
--- a/src/pipe/SkGPipeWrite.cpp
+++ b/src/pipe/SkGPipeWrite.cpp
@@ -81,10 +81,19 @@
      * @return void* Pointer to the heap's copy of the bitmap. If NULL,
      *               the bitmap could not be copied.
      */
-    const SkBitmap* addBitmap(const SkBitmap& bm) {
-        const uint32_t genID = bm.getGenerationID();
+    const SkBitmap* addBitmap(const SkBitmap& orig) {
+        const uint32_t genID = orig.getGenerationID();
+        SkPixelRef* sharedPixelRef = NULL;
         for (int i = fBitmaps.count() - 1; i >= 0; i--) {
             if (genID == fBitmaps[i].fGenID) {
+                if (orig.pixelRefOffset() != fBitmaps[i].fBitmap->pixelRefOffset()) {
+                    // In this case, the bitmaps share a pixelRef, but have
+                    // different offsets. Keep track of the other bitmap so that
+                    // instead of making another copy of the pixelRef we can use
+                    // the copy we already made.
+                    sharedPixelRef = fBitmaps[i].fBitmap->pixelRef();
+                    break;
+                }
                 return fBitmaps[i].fBitmap;
             }
         }
@@ -92,13 +101,21 @@
         // If the bitmap is mutable, we still need to do a deep copy, since the
         // caller may modify it afterwards. That said, if the bitmap is mutable,
         // but has no pixelRef, the copy constructor actually does a deep copy.
-        if (fCanDoShallowCopies && (bm.isImmutable() || !bm.pixelRef())) {
-            copy = new SkBitmap(bm);
+        if (fCanDoShallowCopies && (orig.isImmutable() || !orig.pixelRef())) {
+            copy = new SkBitmap(orig);
         } else {
-            copy = new SkBitmap();
-            if (!bm.copyTo(copy, bm.getConfig())) {
-                delete copy;
-                return NULL;
+            if (sharedPixelRef != NULL) {
+                // Do a shallow copy of the bitmap to get the width, height, etc
+                copy = new SkBitmap(orig);
+                // Replace the pixelRef with the copy that was already made, and
+                // use the appropriate offset.
+                copy->setPixelRef(sharedPixelRef, orig.pixelRefOffset());
+            } else {
+                copy = new SkBitmap();
+                if (!orig.copyTo(copy, orig.getConfig())) {
+                    delete copy;
+                    return NULL;
+                }
             }
         }
         BitmapInfo* info = fBitmaps.append();