PdfMetafileSkia: start supporting more document types.
BUG=599185
Review-Url: https://codereview.chromium.org/2064843002
Cr-Commit-Position: refs/heads/master@{#399936}
diff --git a/printing/pdf_metafile_skia.cc b/printing/pdf_metafile_skia.cc
index aebd263..dd182ac 100644
--- a/printing/pdf_metafile_skia.cc
+++ b/printing/pdf_metafile_skia.cc
@@ -10,6 +10,9 @@
#include "third_party/skia/include/core/SkDocument.h"
#include "third_party/skia/include/core/SkPictureRecorder.h"
#include "third_party/skia/include/core/SkStream.h"
+// Note that headers in third_party/skia/src are fragile. This is
+// an experimental, fragile, and diagnostic-only document type.
+#include "third_party/skia/src/utils/SkMultiPictureDocument.h"
#include "ui/gfx/geometry/safe_integer_conversions.h"
#include "ui/gfx/skia_util.h"
@@ -92,6 +95,7 @@
// meaningful for a vector canvas as for a raster canvas.
float scale_factor_;
SkSize size_;
+ SkiaDocumentType type_;
#if defined(OS_MACOSX)
PdfMetafileCg pdf_cg_;
@@ -126,6 +130,7 @@
float inverse_scale = 1.0 / scale_factor;
SkCanvas* canvas = data_->recorder_.beginRecording(
inverse_scale * page_size.width(), inverse_scale * page_size.height());
+ // Recording canvas is owned by the data_->recorder_. No ref() necessary.
if (content_area != gfx::Rect(page_size)) {
canvas->scale(inverse_scale, inverse_scale);
SkRect sk_content_area = gfx::RectToSkRect(content_area);
@@ -140,7 +145,6 @@
// canvas->getTotalMatrix() returns a value that ignores the scale
// factor. We store the scale factor and re-apply it later.
// http://crbug.com/469656
- // Recording canvas is owned by the data_->recorder_. No ref() necessary.
}
SkCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage(
@@ -157,9 +161,8 @@
sk_sp<SkPicture> pic = data_->recorder_.finishRecordingAsPicture();
if (data_->scale_factor_ != 1.0f) {
- SkCanvas* canvas =
- data_->recorder_.beginRecording(data_->size_.width(),
- data_->size_.height());
+ SkCanvas* canvas = data_->recorder_.beginRecording(data_->size_.width(),
+ data_->size_.height());
canvas->scale(data_->scale_factor_, data_->scale_factor_);
canvas->drawPicture(pic);
pic = data_->recorder_.finishRecordingAsPicture();
@@ -177,9 +180,15 @@
FinishPage();
SkDynamicMemoryWStream stream;
- // TODO(halcanary): support more document types (XPS, a sequence of display
- // lists).
- sk_sp<SkDocument> doc = MakePdfDocument(&stream);
+ sk_sp<SkDocument> doc;
+ switch (data_->type_) {
+ case PDF_SKIA_DOCUMENT_TYPE:
+ doc = MakePdfDocument(&stream);
+ break;
+ case MSKP_SKIA_DOCUMENT_TYPE:
+ doc = SkMakeMultiPictureDocument(&stream);
+ break;
+ }
for (const Page& page : data_->pages_) {
SkCanvas* canvas = doc->beginPage(page.size_.width(), page.size_.height());
@@ -287,13 +296,16 @@
return true;
}
-PdfMetafileSkia::PdfMetafileSkia() : data_(new PdfMetafileSkiaData) {
+PdfMetafileSkia::PdfMetafileSkia(SkiaDocumentType type)
+ : data_(new PdfMetafileSkiaData) {
+ data_->type_ = type;
}
-std::unique_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage() {
+std::unique_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage(
+ SkiaDocumentType type) {
// If we only ever need the metafile for the last page, should we
// only keep a handle on one SkPicture?
- std::unique_ptr<PdfMetafileSkia> metafile(new PdfMetafileSkia);
+ std::unique_ptr<PdfMetafileSkia> metafile(new PdfMetafileSkia(type));
if (data_->pages_.size() == 0)
return metafile;