SkPDF: Re-use Jpeg Image Shaders

Also, de-dup shader better.

  - SkBitmapKeyFromImage function factors out image de-dup code.
  - SkPDFUtils::ToBitmap funtion factors out to-bitmap code
  - make_image_shader function now takes Image rather than Bitmap.

All tests render the same.  Some are significantly smaller PDFs.

Change-Id: Id8dd36b31c8e573f44a5e9f6058d5a1d622b6385
Reviewed-on: https://skia-review.googlesource.com/24081
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Hal Canary <halcanary@google.com>
diff --git a/src/pdf/SkKeyedImage.cpp b/src/pdf/SkKeyedImage.cpp
index bf19632..bcf7d70 100644
--- a/src/pdf/SkKeyedImage.cpp
+++ b/src/pdf/SkKeyedImage.cpp
@@ -9,15 +9,19 @@
 
 #include "SkImage_Base.h"
 
-SkKeyedImage::SkKeyedImage(sk_sp<SkImage> i) : fImage(std::move(i)) {
-    if (fImage) {
-        if (const SkBitmap* bm = as_IB(fImage.get())->onPeekBitmap()) {
-            SkIPoint o = bm->pixelRefOrigin();
-            fKey = {fImage->bounds().makeOffset(o.fX, o.fY), bm->getGenerationID()};
-        } else {
-            fKey = {fImage->bounds(), fImage->uniqueID()};
-        }
+SkBitmapKey SkBitmapKeyFromImage(const SkImage* image) {
+    if (!image) {
+        return {{0, 0, 0, 0}, 0};
     }
+    if (const SkBitmap* bm = as_IB(image)->onPeekBitmap()) {
+        SkIPoint o = bm->pixelRefOrigin();
+        return {image->bounds().makeOffset(o.x(), o.y()), bm->getGenerationID()};
+    }
+    return {image->bounds(), image->uniqueID()};
+}
+
+SkKeyedImage::SkKeyedImage(sk_sp<SkImage> i) : fImage(std::move(i)) {
+    fKey = SkBitmapKeyFromImage(fImage.get());
 }
 
 SkKeyedImage::SkKeyedImage(const SkBitmap& bm) : fImage(SkImage::MakeFromBitmap(bm)) {