add ability to specify the DPI at which to render the page

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

git-svn-id: http://skia.googlecode.com/svn/trunk@10009 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/PdfViewer/SkPdfRenderer.cpp b/experimental/PdfViewer/SkPdfRenderer.cpp
index c5fc8f5..8502ac5 100644
--- a/experimental/PdfViewer/SkPdfRenderer.cpp
+++ b/experimental/PdfViewer/SkPdfRenderer.cpp
@@ -1923,7 +1923,7 @@
 
 PdfContext* gPdfContext = NULL;
 
-bool SkPdfRenderer::renderPage(int page, SkCanvas* canvas) const {
+bool SkPdfRenderer::renderPage(int page, SkCanvas* canvas, const SkRect& dst) const {
     if (!fPdfDoc) {
         return false;
     }
@@ -1941,13 +1941,14 @@
     gPdfContext = &pdfContext;
 
     // TODO(edisonn): get matrix stuff right.
-    // TODO(edisonn): add DPI/scale/zoom.
     SkScalar z = SkIntToScalar(0);
-    SkRect rect = fPdfDoc->MediaBox(page);
-    SkScalar w = rect.width();
-    SkScalar h = rect.height();
+    SkScalar w = dst.width();
+    SkScalar h = dst.height();
 
-    SkPoint pdfSpace[4] = {SkPoint::Make(z, z), SkPoint::Make(w, z), SkPoint::Make(w, h), SkPoint::Make(z, h)};
+    SkScalar wp = fPdfDoc->MediaBox(page).width();
+    SkScalar hp = fPdfDoc->MediaBox(page).height();
+
+    SkPoint pdfSpace[4] = {SkPoint::Make(z, z), SkPoint::Make(wp, z), SkPoint::Make(wp, hp), SkPoint::Make(z, hp)};
 //                SkPoint skiaSpace[4] = {SkPoint::Make(z, h), SkPoint::Make(w, h), SkPoint::Make(w, z), SkPoint::Make(z, z)};
 
     // TODO(edisonn): add flag for this app to create sourunding buffer zone
@@ -1977,12 +1978,12 @@
     pdfContext.fGraphicsState.fMatrixTm = pdfContext.fGraphicsState.fMatrix;
     pdfContext.fGraphicsState.fMatrixTlm = pdfContext.fGraphicsState.fMatrix;
 
-    canvas->setMatrix(pdfContext.fOriginalMatrix);
-
 #ifndef PDF_DEBUG_NO_PAGE_CLIPING
-    canvas->clipRect(SkRect::MakeXYWH(z, z, w, h), SkRegion::kIntersect_Op, true);
+    canvas->clipRect(dst, SkRegion::kIntersect_Op, true);
 #endif
 
+    canvas->setMatrix(pdfContext.fOriginalMatrix);
+
 // erase with red before?
 //        SkPaint paint;
 //        paint.setColor(SK_ColorRED);
diff --git a/experimental/PdfViewer/SkPdfRenderer.h b/experimental/PdfViewer/SkPdfRenderer.h
index d0e3384..8bbc4f1 100644
--- a/experimental/PdfViewer/SkPdfRenderer.h
+++ b/experimental/PdfViewer/SkPdfRenderer.h
@@ -11,6 +11,7 @@
 
 class SkCanvas;
 class SkNativeParsedPDF;
+class SkRect;
 
 // TODO(edisonn): move in another file
 class SkPdfRenderer : public SkRefCnt {
@@ -20,7 +21,7 @@
     virtual ~SkPdfRenderer() {unload();}
 
     // TODO(edisonn): add options to render forms, or not
-    bool renderPage(int page, SkCanvas* canvas) const;
+    bool renderPage(int page, SkCanvas* canvas, const SkRect& dst) const;
 
     bool load(const SkString inputFileName);
     bool loaded() const {return fPdfDoc != NULL;}
diff --git a/experimental/PdfViewer/pdf_viewer_main.cpp b/experimental/PdfViewer/pdf_viewer_main.cpp
index a28e561..7bff14a 100644
--- a/experimental/PdfViewer/pdf_viewer_main.cpp
+++ b/experimental/PdfViewer/pdf_viewer_main.cpp
@@ -101,16 +101,21 @@
 extern "C" SkCanvas* gDumpCanvas;
 
 static bool render_page(const SkString& outputDir,
-                         const SkString& inputFilename,
-                         const SkPdfRenderer& renderer,
-                         int page) {
+                        const SkString& inputFilename,
+                        const SkPdfRenderer& renderer,
+                        int page) {
     SkRect rect = renderer.MediaBox(page < 0 ? 0 :page);
 
     SkBitmap bitmap;
+    SkScalar width = SkScalarMul(rect.width(),  SkDoubleToScalar(sqrt(FLAGS_DPI / 72.0)));
+    SkScalar height = SkScalarMul(rect.height(),  SkDoubleToScalar(sqrt(FLAGS_DPI / 72.0)));
+
+    rect = SkRect::MakeWH(width, height);
+
 #ifdef PDF_DEBUG_3X
-    setup_bitmap(&bitmap, 3 * (int)SkScalarToDouble(rect.width()), 3 * (int)SkScalarToDouble(rect.height()));
+    setup_bitmap(&bitmap, 3 * (int)SkScalarToDouble(width), 3 * (int)SkScalarToDouble(height));
 #else
-    setup_bitmap(&bitmap, (int)SkScalarToDouble(rect.width()), (int)SkScalarToDouble(rect.height()));
+    setup_bitmap(&bitmap, (int)SkScalarToDouble(width), (int)SkScalarToDouble(height));
 #endif
     SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (bitmap)));
     SkCanvas canvas(device);
@@ -118,7 +123,7 @@
     gDumpBitmap = &bitmap;
 
     gDumpCanvas = &canvas;
-    renderer.renderPage(page < 0 ? 0 : page, &canvas);
+    renderer.renderPage(page < 0 ? 0 : page, &canvas, rect);
 
     SkString outputPath;
     if (!make_output_filepath(&outputPath, outputDir, inputFilename, page)) {
diff --git a/samplecode/SamplePdfFileViewer.cpp b/samplecode/SamplePdfFileViewer.cpp
index fecc153..fc8b0f0 100644
--- a/samplecode/SamplePdfFileViewer.cpp
+++ b/samplecode/SamplePdfFileViewer.cpp
@@ -46,7 +46,7 @@
         if (renderer.loaded()) {
             pic = SkNEW(SkPicture);
             SkCanvas* canvas = pic->beginRecording((int)renderer.MediaBox(0).width(), (int)renderer.MediaBox(0).height());
-            renderer.renderPage(0, canvas);
+            renderer.renderPage(0, canvas, renderer.MediaBox(0));
             pic->endRecording();
         }
         return pic;