Chromium Code Reviews| Index: printing/pdf_metafile_skia.cc |
| diff --git a/printing/pdf_metafile_skia.cc b/printing/pdf_metafile_skia.cc |
| index ef8e3750a6298d6f320de4a5c2017d1b62521fef..cf8a5eed4c45792d40fa7589233ac7db89cfb852 100644 |
| --- a/printing/pdf_metafile_skia.cc |
| +++ b/printing/pdf_metafile_skia.cc |
| @@ -36,12 +36,14 @@ namespace { |
| // This struct represents all the data we need to draw and redraw this |
| // page into a SkDocument. |
| struct Page { |
| - Page(const SkSize& page_size, const SkRect& content_area) |
| + Page(const SkSize& page_size, const SkRect& content_area, float scale) |
| : page_size_(page_size), |
| content_area_(content_area), |
| + scale_factor_(scale), |
| content_(/*NULL*/) {} |
| SkSize page_size_; |
| SkRect content_area_; |
| + float scale_factor_; |
| skia::RefPtr<SkPicture> content_; |
| }; |
| } // namespace |
| @@ -92,15 +94,17 @@ bool PdfMetafileSkia::StartPage(const gfx::Size& page_size, |
| this->FinishPage(); |
| DCHECK(!data_->recorder_.getRecordingCanvas()); |
| SkSize sk_page_size = gfx::SizeFToSkSize(gfx::SizeF(page_size)); |
| - data_->pages_.push_back(Page(sk_page_size, gfx::RectToSkRect(content_area))); |
| - |
| - SkCanvas* recordingCanvas = data_->recorder_.beginRecording( |
| - sk_page_size.width(), sk_page_size.height(), NULL, 0); |
| - // recordingCanvas is owned by the data_->recorder_. No ref() necessary. |
| - if (!recordingCanvas) |
| - return false; |
| - recordingCanvas->scale(scale_factor, scale_factor); |
| - return true; |
| + data_->pages_.push_back( |
| + Page(sk_page_size, gfx::RectToSkRect(content_area), scale_factor)); |
| + DCHECK_GT(scale_factor, 0.0f); |
|
Vitaly Buka (NO REVIEWS)
2015/04/03 20:51:39
DCHECK is unnecessary
crash on divided by 0 is ob
|
| + // We scale the recording canvas's size so that |
| + // canvas->getTotalMatrix() returns a value that ignores the scale |
| + // factor. We store the scale factor and re-apply it to the PDF |
| + // Canvas later. http://crbug.com/469656 |
| + // Recording canvas is owned by the data_->recorder_. No ref() necessary. |
| + return !!data_->recorder_.beginRecording(sk_page_size.width() / scale_factor, |
| + sk_page_size.height() / scale_factor, |
| + NULL, 0); |
| } |
| skia::PlatformCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage( |
| @@ -135,6 +139,8 @@ bool PdfMetafileSkia::FinishDocument() { |
| for (const auto& page : data_->pages_) { |
| SkCanvas* canvas = pdf_doc->beginPage( |
| page.page_size_.width(), page.page_size_.height(), &page.content_area_); |
| + // No need to save/restore, since this canvas is not reused after endPage() |
| + canvas->scale(page.scale_factor_, page.scale_factor_); |
| canvas->drawPicture(page.content_.get()); |
| pdf_doc->endPage(); |
| } |