pdfviewer: remove dependency on picture_utils. add utility function to render SkStream into bitmap.

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

git-svn-id: http://skia.googlecode.com/svn/trunk@10314 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/PdfViewer/SkPdfRenderer.cpp b/experimental/PdfViewer/SkPdfRenderer.cpp
index 33798cb..c51c239 100644
--- a/experimental/PdfViewer/SkPdfRenderer.cpp
+++ b/experimental/PdfViewer/SkPdfRenderer.cpp
@@ -2030,6 +2030,20 @@
     return fPdfDoc != NULL;
 }
 
+bool SkPdfRenderer::load(SkStream* stream) {
+    unload();
+
+    // TODO(edisonn): create static function that could return NULL if there are errors
+    fPdfDoc = new SkNativeParsedPDF(stream);
+    if (fPdfDoc->pages() == 0) {
+        delete fPdfDoc;
+        fPdfDoc = NULL;
+    }
+
+    return fPdfDoc != NULL;
+}
+
+
 int SkPdfRenderer::pages() const {
     return fPdfDoc != NULL ? fPdfDoc->pages() : 0;
 }
@@ -2047,3 +2061,30 @@
 size_t SkPdfRenderer::bytesUsed() const {
     return fPdfDoc ? fPdfDoc->bytesUsed() : 0;
 }
+
+bool SkPDFNativeRenderToBitmap(SkStream* stream,
+                               SkBitmap* output,
+                               int page,
+                               SkPdfContent content,
+                               double dpi) {
+    SkASSERT(page >= 0);
+    SkPdfRenderer renderer;
+    renderer.load(stream);
+    if (!renderer.loaded() || page >= renderer.pages() || page < 0) {
+        return false;
+    }
+
+    SkRect rect = renderer.MediaBox(page < 0 ? 0 :page);
+
+    SkScalar width = SkScalarMul(rect.width(),  SkDoubleToScalar(sqrt(dpi / 72.0)));
+    SkScalar height = SkScalarMul(rect.height(),  SkDoubleToScalar(sqrt(dpi / 72.0)));
+
+    rect = SkRect::MakeWH(width, height);
+
+    setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(height));
+
+    SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output)));
+    SkCanvas canvas(device);
+
+    return renderer.renderPage(page, &canvas, rect);
+}