diff options
-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 | ||||
-rw-r--r-- | samplecode/SamplePdfFileViewer.cpp | 2 |
4 files changed, 24 insertions, 17 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)) { diff --git a/samplecode/SamplePdfFileViewer.cpp b/samplecode/SamplePdfFileViewer.cpp index fecc153dd1..fc8b0f0acd 100644 --- a/samplecode/SamplePdfFileViewer.cpp +++ b/samplecode/SamplePdfFileViewer.cpp @@ -46,7 +46,7 @@ private: 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; |