diff options
author | edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-11 15:20:50 +0000 |
---|---|---|
committer | edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-11 15:20:50 +0000 |
commit | 444e25a66b6a1547fa0903d0cf075a0885a76bb7 (patch) | |
tree | 825c3c61e56b9db4f571933b6714a89d182c39f6 /experimental | |
parent | 1310238d828c9fc9285875a7cc2185d5b53faa4b (diff) |
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
Diffstat (limited to 'experimental')
-rw-r--r-- | experimental/PdfViewer/SkPdfRenderer.cpp | 19 | ||||
-rw-r--r-- | experimental/PdfViewer/SkPdfRenderer.h | 3 | ||||
-rw-r--r-- | experimental/PdfViewer/pdf_viewer_main.cpp | 17 |
3 files changed, 23 insertions, 16 deletions
diff --git a/experimental/PdfViewer/SkPdfRenderer.cpp b/experimental/PdfViewer/SkPdfRenderer.cpp index c5fc8f5807..8502ac54b2 100644 --- a/experimental/PdfViewer/SkPdfRenderer.cpp +++ b/experimental/PdfViewer/SkPdfRenderer.cpp @@ -1923,7 +1923,7 @@ void PdfCompatibilitySectionLooper::loop() { 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 @@ bool SkPdfRenderer::renderPage(int page, SkCanvas* canvas) const { 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 @@ bool SkPdfRenderer::renderPage(int page, SkCanvas* canvas) const { 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 d0e3384202..8bbc4f1eb2 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 @@ public: 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 a28e56197f..7bff14a92e 100644 --- a/experimental/PdfViewer/pdf_viewer_main.cpp +++ b/experimental/PdfViewer/pdf_viewer_main.cpp @@ -101,16 +101,21 @@ extern "C" SkBitmap* gDumpBitmap; 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 @@ static bool render_page(const SkString& outputDir, 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)) { |