Use SkPicture::ExtractBitmap callback in pdf too, there is no need for a specialized function pointer for pdf only only to pass a rectangle, when we can use subseted bitmaps.

R=scroggo@google.com, reed@google.com, vandebo@chromium.org, bsalomon@google.com

Author: edisonn@google.com

Review URL: https://codereview.chromium.org/25054002

git-svn-id: http://skia.googlecode.com/svn/trunk@11591 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/PdfRenderer.h b/tools/PdfRenderer.h
index d2d1a5c..be338e9 100644
--- a/tools/PdfRenderer.h
+++ b/tools/PdfRenderer.h
@@ -33,7 +33,7 @@
     virtual void render() = 0;
     virtual void end();
 
-    PdfRenderer(EncodeToDCTStream encoder)
+    PdfRenderer(SkPicture::EncodeBitmap encoder)
         : fPicture(NULL)
         , fPDFDevice(NULL)
         , fEncoder(encoder)
@@ -48,7 +48,7 @@
     SkAutoTUnref<SkCanvas> fCanvas;
     SkPicture* fPicture;
     SkPDFDevice* fPDFDevice;
-    EncodeToDCTStream fEncoder;
+    SkPicture::EncodeBitmap fEncoder;
 
 private:
     typedef SkRefCnt INHERITED;
@@ -56,7 +56,7 @@
 
 class SimplePdfRenderer : public PdfRenderer {
 public:
-    SimplePdfRenderer(EncodeToDCTStream encoder)
+    SimplePdfRenderer(SkPicture::EncodeBitmap encoder)
         : PdfRenderer(encoder) {}
     virtual void render() SK_OVERRIDE;
 
diff --git a/tools/render_pdfs_main.cpp b/tools/render_pdfs_main.cpp
index f443502..a710064 100644
--- a/tools/render_pdfs_main.cpp
+++ b/tools/render_pdfs_main.cpp
@@ -12,6 +12,7 @@
 #include "SkImageEncoder.h"
 #include "SkOSFile.h"
 #include "SkPicture.h"
+#include "SkPixelRef.h"
 #include "SkStream.h"
 #include "SkTArray.h"
 #include "PdfRenderer.h"
@@ -81,30 +82,33 @@
 }
 
 int gJpegQuality = 100;
-static bool encode_to_dct_stream(SkWStream* stream, const SkBitmap& bitmap, const SkIRect& rect) {
-    if (gJpegQuality == -1) return false;
+static SkData* encode_to_dct_data(size_t* pixelRefOffset, const SkBitmap& bitmap) {
+    if (gJpegQuality == -1) {
+        return NULL;
+    }
 
-        SkIRect bitmapBounds;
-        SkBitmap subset;
-        const SkBitmap* bitmapToUse = &bitmap;
-        bitmap.getBounds(&bitmapBounds);
-        if (rect != bitmapBounds) {
-            SkAssertResult(bitmap.extractSubset(&subset, rect));
-            bitmapToUse = &subset;
-        }
-
+    SkBitmap bm = bitmap;
 #if defined(SK_BUILD_FOR_MAC)
-        // Workaround bug #1043 where bitmaps with referenced pixels cause
-        // CGImageDestinationFinalize to crash
-        SkBitmap copy;
-        bitmapToUse->deepCopyTo(&copy, bitmapToUse->config());
-        bitmapToUse = &copy;
+    // Workaround bug #1043 where bitmaps with referenced pixels cause
+    // CGImageDestinationFinalize to crash
+    SkBitmap copy;
+    bitmap.deepCopyTo(&copy, bitmap.config());
+    bm = copy;
 #endif
 
-    return SkImageEncoder::EncodeStream(stream,
-                                        *bitmapToUse,
-                                        SkImageEncoder::kJPEG_Type,
-                                        gJpegQuality);
+    SkPixelRef* pr = bm.pixelRef();
+    if (pr != NULL) {
+        SkData* data = pr->refEncodedData();
+        if (data != NULL) {
+            *pixelRefOffset = bm.pixelRefOffset();
+            return data;
+        }
+    }
+
+    *pixelRefOffset = 0;
+    return SkImageEncoder::EncodeData(bm,
+                                      SkImageEncoder::kJPEG_Type,
+                                      gJpegQuality);
 }
 
 /** Builds the output filename. path = dir/name, and it replaces expected
@@ -264,7 +268,7 @@
     SkTArray<SkString> inputs;
 
     SkAutoTUnref<sk_tools::PdfRenderer>
-        renderer(SkNEW_ARGS(sk_tools::SimplePdfRenderer, (encode_to_dct_stream)));
+        renderer(SkNEW_ARGS(sk_tools::SimplePdfRenderer, (encode_to_dct_data)));
     SkASSERT(renderer.get());
 
     SkString outputDir;