OLD | NEW |
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 <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/files/file.h" | 12 #include "base/files/file.h" |
13 #include "base/memory/ptr_util.h" | 13 #include "base/memory/ptr_util.h" |
14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
15 #include "cc/paint/paint_canvas.h" | 15 #include "cc/paint/paint_canvas.h" |
16 #include "cc/paint/paint_record.h" | 16 #include "cc/paint/paint_record.h" |
17 #include "cc/paint/paint_recorder.h" | 17 #include "cc/paint/paint_recorder.h" |
18 #include "printing/print_settings.h" | 18 #include "printing/print_settings.h" |
19 #include "third_party/skia/include/core/SkDocument.h" | 19 #include "third_party/skia/include/core/SkDocument.h" |
20 #include "third_party/skia/include/core/SkStream.h" | 20 #include "third_party/skia/include/core/SkStream.h" |
21 // Note that headers in third_party/skia/src are fragile. This is | 21 // Note that headers in third_party/skia/src are fragile. This is |
22 // an experimental, fragile, and diagnostic-only document type. | 22 // an experimental, fragile, and diagnostic-only document type. |
23 #include "third_party/skia/src/utils/SkMultiPictureDocument.h" | 23 #include "third_party/skia/src/utils/SkMultiPictureDocument.h" |
24 #include "ui/gfx/geometry/safe_integer_conversions.h" | 24 #include "ui/gfx/geometry/safe_integer_conversions.h" |
25 #include "ui/gfx/skia_util.h" | 25 #include "ui/gfx/skia_util.h" |
26 | 26 |
27 #if defined(OS_MACOSX) | |
28 #include "printing/pdf_metafile_cg_mac.h" | |
29 #endif | |
30 | |
31 #if defined(OS_POSIX) | |
32 #include "base/file_descriptor_posix.h" | |
33 #endif | |
34 | |
35 namespace { | 27 namespace { |
36 | 28 |
37 bool WriteAssetToBuffer(const SkStreamAsset* asset, | 29 bool WriteAssetToBuffer(const SkStreamAsset* asset, |
38 void* buffer, | 30 void* buffer, |
39 size_t size) { | 31 size_t size) { |
40 // Calling duplicate() keeps original asset state unchanged. | 32 // Calling duplicate() keeps original asset state unchanged. |
41 std::unique_ptr<SkStreamAsset> assetCopy(asset->duplicate()); | 33 std::unique_ptr<SkStreamAsset> assetCopy(asset->duplicate()); |
42 size_t length = assetCopy->getLength(); | 34 size_t length = assetCopy->getLength(); |
43 if (length > size) | 35 if (length > size) |
44 return false; | 36 return false; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 | 89 |
98 std::vector<Page> pages_; | 90 std::vector<Page> pages_; |
99 std::unique_ptr<SkStreamAsset> pdf_data_; | 91 std::unique_ptr<SkStreamAsset> pdf_data_; |
100 | 92 |
101 // The scale factor is used because Blink occasionally calls | 93 // The scale factor is used because Blink occasionally calls |
102 // PaintCanvas::getTotalMatrix() even though the total matrix is not as | 94 // PaintCanvas::getTotalMatrix() even though the total matrix is not as |
103 // meaningful for a vector canvas as for a raster canvas. | 95 // meaningful for a vector canvas as for a raster canvas. |
104 float scale_factor_; | 96 float scale_factor_; |
105 SkSize size_; | 97 SkSize size_; |
106 SkiaDocumentType type_; | 98 SkiaDocumentType type_; |
107 | |
108 #if defined(OS_MACOSX) | |
109 PdfMetafileCg pdf_cg_; | |
110 #endif | |
111 }; | 99 }; |
112 | 100 |
113 PdfMetafileSkia::~PdfMetafileSkia() {} | 101 PdfMetafileSkia::~PdfMetafileSkia() {} |
114 | 102 |
115 bool PdfMetafileSkia::Init() { | 103 bool PdfMetafileSkia::Init() { |
116 return true; | 104 return true; |
117 } | 105 } |
118 | 106 |
119 // TODO(halcanary): Create a Metafile class that only stores data. | 107 // TODO(halcanary): Create a Metafile class that only stores data. |
120 // Metafile::InitFromData is orthogonal to what the rest of | 108 // Metafile::InitFromData is orthogonal to what the rest of |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 bool PdfMetafileSkia::Playback(skia::NativeDrawingContext hdc, | 236 bool PdfMetafileSkia::Playback(skia::NativeDrawingContext hdc, |
249 const RECT* rect) const { | 237 const RECT* rect) const { |
250 NOTREACHED(); | 238 NOTREACHED(); |
251 return false; | 239 return false; |
252 } | 240 } |
253 | 241 |
254 bool PdfMetafileSkia::SafePlayback(skia::NativeDrawingContext hdc) const { | 242 bool PdfMetafileSkia::SafePlayback(skia::NativeDrawingContext hdc) const { |
255 NOTREACHED(); | 243 NOTREACHED(); |
256 return false; | 244 return false; |
257 } | 245 } |
258 | |
259 #elif defined(OS_MACOSX) | |
260 /* TODO(caryclark): The set up of PluginInstance::PrintPDFOutput may result in | |
261 rasterized output. Even if that flow uses PdfMetafileCg::RenderPage, | |
262 the drawing of the PDF into the canvas may result in a rasterized output. | |
263 PDFMetafileSkia::RenderPage should be not implemented as shown and instead | |
264 should do something like the following CL in PluginInstance::PrintPDFOutput: | |
265 http://codereview.chromium.org/7200040/diff/1/webkit/plugins/ppapi/ppapi_plugin_
instance.cc | |
266 */ | |
267 bool PdfMetafileSkia::RenderPage(unsigned int page_number, | |
268 CGContextRef context, | |
269 const CGRect rect, | |
270 const MacRenderPageParams& params) const { | |
271 DCHECK_GT(GetDataSize(), 0U); | |
272 if (data_->pdf_cg_.GetDataSize() == 0) { | |
273 if (GetDataSize() == 0) | |
274 return false; | |
275 size_t length = data_->pdf_data_->getLength(); | |
276 std::vector<uint8_t> buffer(length); | |
277 (void)WriteAssetToBuffer(data_->pdf_data_.get(), &buffer[0], length); | |
278 data_->pdf_cg_.InitFromData(&buffer[0], length); | |
279 } | |
280 return data_->pdf_cg_.RenderPage(page_number, context, rect, params); | |
281 } | |
282 #endif | 246 #endif |
283 | 247 |
284 bool PdfMetafileSkia::SaveTo(base::File* file) const { | 248 bool PdfMetafileSkia::SaveTo(base::File* file) const { |
285 if (GetDataSize() == 0U) | 249 if (GetDataSize() == 0U) |
286 return false; | 250 return false; |
287 | 251 |
288 // Calling duplicate() keeps original asset state unchanged. | 252 // Calling duplicate() keeps original asset state unchanged. |
289 std::unique_ptr<SkStreamAsset> asset(data_->pdf_data_->duplicate()); | 253 std::unique_ptr<SkStreamAsset> asset(data_->pdf_data_->duplicate()); |
290 | 254 |
291 const size_t kMaximumBufferSize = 1024 * 1024; | 255 const size_t kMaximumBufferSize = 1024 * 1024; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 | 287 |
324 metafile->data_->pages_.push_back(data_->pages_.back()); | 288 metafile->data_->pages_.push_back(data_->pages_.back()); |
325 | 289 |
326 if (!metafile->FinishDocument()) // Generate PDF. | 290 if (!metafile->FinishDocument()) // Generate PDF. |
327 metafile.reset(); | 291 metafile.reset(); |
328 | 292 |
329 return metafile; | 293 return metafile; |
330 } | 294 } |
331 | 295 |
332 } // namespace printing | 296 } // namespace printing |
OLD | NEW |