Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(594)

Unified Diff: printing/pdf_metafile_skia.cc

Issue 2062903002: PdfMetafileSkia: don't rely on SkPicture::cullRect (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: printing/pdf_metafile_skia.cc
diff --git a/printing/pdf_metafile_skia.cc b/printing/pdf_metafile_skia.cc
index 29f78b6d4c717e8540a283b5c554549793125def..aebd263025f66a4ce302d9b8a5fa327595eabacd 100644
--- a/printing/pdf_metafile_skia.cc
+++ b/printing/pdf_metafile_skia.cc
@@ -67,16 +67,31 @@ sk_sp<SkDocument> MakePdfDocument(SkWStream* wStream) {
namespace printing {
+struct Page {
+ Page(SkSize s, sk_sp<SkPicture> c) : size_(s), content_(std::move(c)) {}
+ Page(Page&& that) : size_(that.size_), content_(std::move(that.content_)) {}
+ Page(const Page&) = default;
+ Page& operator=(const Page&) = default;
+ Page& operator=(Page&& that) {
+ size_ = that.size_;
+ content_ = std::move(that.content_);
+ return *this;
+ }
+ SkSize size_;
+ sk_sp<SkPicture> content_;
+};
+
struct PdfMetafileSkiaData {
SkPictureRecorder recorder_; // Current recording
- std::vector<sk_sp<SkPicture>> pages_;
+ std::vector<Page> pages_;
std::unique_ptr<SkStreamAsset> pdf_data_;
// The scale factor is used because Blink occasionally calls
// SkCanvas::getTotalMatrix() even though the total matrix is not as
// meaningful for a vector canvas as for a raster canvas.
float scale_factor_;
+ SkSize size_;
#if defined(OS_MACOSX)
PdfMetafileCg pdf_cg_;
@@ -119,6 +134,7 @@ void PdfMetafileSkia::StartPage(const gfx::Size& page_size,
canvas->scale(scale_factor, scale_factor);
}
+ data_->size_ = gfx::SizeFToSkSize(gfx::SizeF(page_size));
data_->scale_factor_ = scale_factor;
// We scale the recording canvas's size so that
// canvas->getTotalMatrix() returns a value that ignores the scale
@@ -141,19 +157,14 @@ bool PdfMetafileSkia::FinishPage() {
sk_sp<SkPicture> pic = data_->recorder_.finishRecordingAsPicture();
if (data_->scale_factor_ != 1.0f) {
- SkRect rect = pic->cullRect();
- DCHECK_EQ(rect.x(), 0);
- DCHECK_EQ(rect.y(), 0);
- DCHECK_GT(rect.right(), 0);
- DCHECK_GT(rect.bottom(), 0);
SkCanvas* canvas =
- data_->recorder_.beginRecording(data_->scale_factor_ * rect.right(),
- data_->scale_factor_ * rect.bottom());
+ data_->recorder_.beginRecording(data_->size_.width(),
+ data_->size_.height());
canvas->scale(data_->scale_factor_, data_->scale_factor_);
canvas->drawPicture(pic);
pic = data_->recorder_.finishRecordingAsPicture();
}
- data_->pages_.push_back(std::move(pic));
+ data_->pages_.emplace_back(data_->size_, std::move(pic));
return true;
}
@@ -170,14 +181,9 @@ bool PdfMetafileSkia::FinishDocument() {
// lists).
sk_sp<SkDocument> doc = MakePdfDocument(&stream);
- for (const sk_sp<SkPicture>& page : data_->pages_) {
- SkRect rect = page->cullRect();
- DCHECK_EQ(rect.x(), 0);
- DCHECK_EQ(rect.y(), 0);
- DCHECK_GT(rect.right(), 0);
- DCHECK_GT(rect.bottom(), 0);
- SkCanvas* canvas = doc->beginPage(rect.right(), rect.bottom());
- canvas->drawPicture(page);
+ for (const Page& page : data_->pages_) {
+ SkCanvas* canvas = doc->beginPage(page.size_.width(), page.size_.height());
+ canvas->drawPicture(page.content_);
doc->endPage();
}
if (!doc->close())
@@ -203,14 +209,9 @@ bool PdfMetafileSkia::GetData(void* dst_buffer,
gfx::Rect PdfMetafileSkia::GetPageBounds(unsigned int page_number) const {
if (page_number < data_->pages_.size()) {
- const sk_sp<SkPicture>& page = data_->pages_[page_number];
- SkRect rect = page->cullRect();
- DCHECK_EQ(rect.x(), 0);
- DCHECK_EQ(rect.y(), 0);
- DCHECK_GT(rect.right(), 0);
- DCHECK_GT(rect.bottom(), 0);
- return gfx::Rect(gfx::ToRoundedInt(rect.right()),
- gfx::ToRoundedInt(rect.bottom()));
+ SkSize size = data_->pages_[page_number].size_;
+ return gfx::Rect(gfx::ToRoundedInt(size.width()),
+ gfx::ToRoundedInt(size.height()));
}
return gfx::Rect();
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698