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

Side by Side Diff: printing/pdf_metafile_skia.cc

Issue 2064843002: PdfMetafileSkia: start supporting more document types. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 2016-06-15 (Wednesday) 10:43:48 EDT 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 unified diff | Download patch
« no previous file with comments | « printing/pdf_metafile_skia.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "printing/pdf_metafile_skia.h" 5 #include "printing/pdf_metafile_skia.h"
6 6
7 #include "base/files/file.h" 7 #include "base/files/file.h"
8 #include "base/time/time.h" 8 #include "base/time/time.h"
9 #include "printing/print_settings.h" 9 #include "printing/print_settings.h"
10 #include "third_party/skia/include/core/SkDocument.h" 10 #include "third_party/skia/include/core/SkDocument.h"
11 #include "third_party/skia/include/core/SkPictureRecorder.h" 11 #include "third_party/skia/include/core/SkPictureRecorder.h"
12 #include "third_party/skia/include/core/SkStream.h" 12 #include "third_party/skia/include/core/SkStream.h"
13 // Note that headers in third_party/skia/src are fragile. This is
14 // an experimental, fragile, and diagnostic-only document type.
15 #include "third_party/skia/src/utils/SkMultiPictureDocument.h"
13 #include "ui/gfx/geometry/safe_integer_conversions.h" 16 #include "ui/gfx/geometry/safe_integer_conversions.h"
14 #include "ui/gfx/skia_util.h" 17 #include "ui/gfx/skia_util.h"
15 18
16 #if defined(OS_MACOSX) 19 #if defined(OS_MACOSX)
17 #include "printing/pdf_metafile_cg_mac.h" 20 #include "printing/pdf_metafile_cg_mac.h"
18 #endif 21 #endif
19 22
20 #if defined(OS_POSIX) 23 #if defined(OS_POSIX)
21 #include "base/file_descriptor_posix.h" 24 #include "base/file_descriptor_posix.h"
22 #endif 25 #endif
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 SkPictureRecorder recorder_; // Current recording 88 SkPictureRecorder recorder_; // Current recording
86 89
87 std::vector<Page> pages_; 90 std::vector<Page> pages_;
88 std::unique_ptr<SkStreamAsset> pdf_data_; 91 std::unique_ptr<SkStreamAsset> pdf_data_;
89 92
90 // The scale factor is used because Blink occasionally calls 93 // The scale factor is used because Blink occasionally calls
91 // SkCanvas::getTotalMatrix() even though the total matrix is not as 94 // SkCanvas::getTotalMatrix() even though the total matrix is not as
92 // meaningful for a vector canvas as for a raster canvas. 95 // meaningful for a vector canvas as for a raster canvas.
93 float scale_factor_; 96 float scale_factor_;
94 SkSize size_; 97 SkSize size_;
98 SkiaDocumentType type_;
95 99
96 #if defined(OS_MACOSX) 100 #if defined(OS_MACOSX)
97 PdfMetafileCg pdf_cg_; 101 PdfMetafileCg pdf_cg_;
98 #endif 102 #endif
99 }; 103 };
100 104
101 PdfMetafileSkia::~PdfMetafileSkia() {} 105 PdfMetafileSkia::~PdfMetafileSkia() {}
102 106
103 bool PdfMetafileSkia::Init() { 107 bool PdfMetafileSkia::Init() {
104 return true; 108 return true;
(...skipping 14 matching lines...) Expand all
119 DCHECK_GT(page_size.width(), 0); 123 DCHECK_GT(page_size.width(), 0);
120 DCHECK_GT(page_size.height(), 0); 124 DCHECK_GT(page_size.height(), 0);
121 DCHECK_GT(scale_factor, 0.0f); 125 DCHECK_GT(scale_factor, 0.0f);
122 if (data_->recorder_.getRecordingCanvas()) 126 if (data_->recorder_.getRecordingCanvas())
123 FinishPage(); 127 FinishPage();
124 DCHECK(!data_->recorder_.getRecordingCanvas()); 128 DCHECK(!data_->recorder_.getRecordingCanvas());
125 129
126 float inverse_scale = 1.0 / scale_factor; 130 float inverse_scale = 1.0 / scale_factor;
127 SkCanvas* canvas = data_->recorder_.beginRecording( 131 SkCanvas* canvas = data_->recorder_.beginRecording(
128 inverse_scale * page_size.width(), inverse_scale * page_size.height()); 132 inverse_scale * page_size.width(), inverse_scale * page_size.height());
133 // Recording canvas is owned by the data_->recorder_. No ref() necessary.
129 if (content_area != gfx::Rect(page_size)) { 134 if (content_area != gfx::Rect(page_size)) {
130 canvas->scale(inverse_scale, inverse_scale); 135 canvas->scale(inverse_scale, inverse_scale);
131 SkRect sk_content_area = gfx::RectToSkRect(content_area); 136 SkRect sk_content_area = gfx::RectToSkRect(content_area);
132 canvas->clipRect(sk_content_area); 137 canvas->clipRect(sk_content_area);
133 canvas->translate(sk_content_area.x(), sk_content_area.y()); 138 canvas->translate(sk_content_area.x(), sk_content_area.y());
134 canvas->scale(scale_factor, scale_factor); 139 canvas->scale(scale_factor, scale_factor);
135 } 140 }
136 141
137 data_->size_ = gfx::SizeFToSkSize(gfx::SizeF(page_size)); 142 data_->size_ = gfx::SizeFToSkSize(gfx::SizeF(page_size));
138 data_->scale_factor_ = scale_factor; 143 data_->scale_factor_ = scale_factor;
139 // We scale the recording canvas's size so that 144 // We scale the recording canvas's size so that
140 // canvas->getTotalMatrix() returns a value that ignores the scale 145 // canvas->getTotalMatrix() returns a value that ignores the scale
141 // factor. We store the scale factor and re-apply it later. 146 // factor. We store the scale factor and re-apply it later.
142 // http://crbug.com/469656 147 // http://crbug.com/469656
143 // Recording canvas is owned by the data_->recorder_. No ref() necessary.
144 } 148 }
145 149
146 SkCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage( 150 SkCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage(
147 const gfx::Size& page_size, 151 const gfx::Size& page_size,
148 const gfx::Rect& content_area, 152 const gfx::Rect& content_area,
149 const float& scale_factor) { 153 const float& scale_factor) {
150 StartPage(page_size, content_area, scale_factor); 154 StartPage(page_size, content_area, scale_factor);
151 return data_->recorder_.getRecordingCanvas(); 155 return data_->recorder_.getRecordingCanvas();
152 } 156 }
153 157
154 bool PdfMetafileSkia::FinishPage() { 158 bool PdfMetafileSkia::FinishPage() {
155 if (!data_->recorder_.getRecordingCanvas()) 159 if (!data_->recorder_.getRecordingCanvas())
156 return false; 160 return false;
157 161
158 sk_sp<SkPicture> pic = data_->recorder_.finishRecordingAsPicture(); 162 sk_sp<SkPicture> pic = data_->recorder_.finishRecordingAsPicture();
159 if (data_->scale_factor_ != 1.0f) { 163 if (data_->scale_factor_ != 1.0f) {
160 SkCanvas* canvas = 164 SkCanvas* canvas = data_->recorder_.beginRecording(data_->size_.width(),
161 data_->recorder_.beginRecording(data_->size_.width(), 165 data_->size_.height());
162 data_->size_.height());
163 canvas->scale(data_->scale_factor_, data_->scale_factor_); 166 canvas->scale(data_->scale_factor_, data_->scale_factor_);
164 canvas->drawPicture(pic); 167 canvas->drawPicture(pic);
165 pic = data_->recorder_.finishRecordingAsPicture(); 168 pic = data_->recorder_.finishRecordingAsPicture();
166 } 169 }
167 data_->pages_.emplace_back(data_->size_, std::move(pic)); 170 data_->pages_.emplace_back(data_->size_, std::move(pic));
168 return true; 171 return true;
169 } 172 }
170 173
171 bool PdfMetafileSkia::FinishDocument() { 174 bool PdfMetafileSkia::FinishDocument() {
172 // If we've already set the data in InitFromData, leave it be. 175 // If we've already set the data in InitFromData, leave it be.
173 if (data_->pdf_data_) 176 if (data_->pdf_data_)
174 return false; 177 return false;
175 178
176 if (data_->recorder_.getRecordingCanvas()) 179 if (data_->recorder_.getRecordingCanvas())
177 FinishPage(); 180 FinishPage();
178 181
179 SkDynamicMemoryWStream stream; 182 SkDynamicMemoryWStream stream;
180 // TODO(halcanary): support more document types (XPS, a sequence of display 183 sk_sp<SkDocument> doc;
181 // lists). 184 switch (data_->type_) {
182 sk_sp<SkDocument> doc = MakePdfDocument(&stream); 185 case PDF_SKIA_DOCUMENT_TYPE:
186 doc = MakePdfDocument(&stream);
187 break;
188 case MSKP_SKIA_DOCUMENT_TYPE:
189 doc = SkMakeMultiPictureDocument(&stream);
190 break;
191 }
183 192
184 for (const Page& page : data_->pages_) { 193 for (const Page& page : data_->pages_) {
185 SkCanvas* canvas = doc->beginPage(page.size_.width(), page.size_.height()); 194 SkCanvas* canvas = doc->beginPage(page.size_.width(), page.size_.height());
186 canvas->drawPicture(page.content_); 195 canvas->drawPicture(page.content_);
187 doc->endPage(); 196 doc->endPage();
188 } 197 }
189 if (!doc->close()) 198 if (!doc->close())
190 return false; 199 return false;
191 200
192 data_->pdf_data_.reset(stream.detachAsStream()); 201 data_->pdf_data_.reset(stream.detachAsStream());
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 DCHECK_GE(buffer.size(), read_size); 289 DCHECK_GE(buffer.size(), read_size);
281 if (!file->WriteAtCurrentPos(&buffer[0], 290 if (!file->WriteAtCurrentPos(&buffer[0],
282 base::checked_cast<int>(read_size))) { 291 base::checked_cast<int>(read_size))) {
283 return false; 292 return false;
284 } 293 }
285 } while (!asset->isAtEnd()); 294 } while (!asset->isAtEnd());
286 295
287 return true; 296 return true;
288 } 297 }
289 298
290 PdfMetafileSkia::PdfMetafileSkia() : data_(new PdfMetafileSkiaData) { 299 PdfMetafileSkia::PdfMetafileSkia(SkiaDocumentType type)
300 : data_(new PdfMetafileSkiaData) {
301 data_->type_ = type;
291 } 302 }
292 303
293 std::unique_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage() { 304 std::unique_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage(
305 SkiaDocumentType type) {
294 // If we only ever need the metafile for the last page, should we 306 // If we only ever need the metafile for the last page, should we
295 // only keep a handle on one SkPicture? 307 // only keep a handle on one SkPicture?
296 std::unique_ptr<PdfMetafileSkia> metafile(new PdfMetafileSkia); 308 std::unique_ptr<PdfMetafileSkia> metafile(new PdfMetafileSkia(type));
297 309
298 if (data_->pages_.size() == 0) 310 if (data_->pages_.size() == 0)
299 return metafile; 311 return metafile;
300 312
301 if (data_->recorder_.getRecordingCanvas()) // page outstanding 313 if (data_->recorder_.getRecordingCanvas()) // page outstanding
302 return metafile; 314 return metafile;
303 315
304 metafile->data_->pages_.push_back(data_->pages_.back()); 316 metafile->data_->pages_.push_back(data_->pages_.back());
305 317
306 if (!metafile->FinishDocument()) // Generate PDF. 318 if (!metafile->FinishDocument()) // Generate PDF.
307 metafile.reset(); 319 metafile.reset();
308 320
309 return metafile; 321 return metafile;
310 } 322 }
311 323
312 } // namespace printing 324 } // namespace printing
OLDNEW
« no previous file with comments | « printing/pdf_metafile_skia.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698