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" | |
16 #include "cc/paint/paint_record.h" | |
17 #include "cc/paint/paint_recorder.h" | |
15 #include "printing/print_settings.h" | 18 #include "printing/print_settings.h" |
16 #include "third_party/skia/include/core/SkDocument.h" | 19 #include "third_party/skia/include/core/SkDocument.h" |
17 #include "third_party/skia/include/core/SkPictureRecorder.h" | 20 #include "third_party/skia/include/core/SkPictureRecorder.h" |
18 #include "third_party/skia/include/core/SkStream.h" | 21 #include "third_party/skia/include/core/SkStream.h" |
19 // Note that headers in third_party/skia/src are fragile. This is | 22 // Note that headers in third_party/skia/src are fragile. This is |
20 // an experimental, fragile, and diagnostic-only document type. | 23 // an experimental, fragile, and diagnostic-only document type. |
21 #include "third_party/skia/src/utils/SkMultiPictureDocument.h" | 24 #include "third_party/skia/src/utils/SkMultiPictureDocument.h" |
22 #include "ui/gfx/geometry/safe_integer_conversions.h" | 25 #include "ui/gfx/geometry/safe_integer_conversions.h" |
23 #include "ui/gfx/skia_util.h" | 26 #include "ui/gfx/skia_util.h" |
24 | 27 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
70 : SkString(agent.c_str(), agent.size()); | 73 : SkString(agent.c_str(), agent.size()); |
71 return SkDocument::MakePDF(wStream, SK_ScalarDefaultRasterDPI, metadata, | 74 return SkDocument::MakePDF(wStream, SK_ScalarDefaultRasterDPI, metadata, |
72 nullptr, false); | 75 nullptr, false); |
73 } | 76 } |
74 | 77 |
75 } // namespace | 78 } // namespace |
76 | 79 |
77 namespace printing { | 80 namespace printing { |
78 | 81 |
79 struct Page { | 82 struct Page { |
80 Page(SkSize s, sk_sp<SkPicture> c) : size_(s), content_(std::move(c)) {} | 83 Page(SkSize s, sk_sp<cc::PaintRecord> c) : size_(s), content_(std::move(c)) {} |
81 Page(Page&& that) : size_(that.size_), content_(std::move(that.content_)) {} | 84 Page(Page&& that) : size_(that.size_), content_(std::move(that.content_)) {} |
82 Page(const Page&) = default; | 85 Page(const Page&) = default; |
83 Page& operator=(const Page&) = default; | 86 Page& operator=(const Page&) = default; |
84 Page& operator=(Page&& that) { | 87 Page& operator=(Page&& that) { |
85 size_ = that.size_; | 88 size_ = that.size_; |
86 content_ = std::move(that.content_); | 89 content_ = std::move(that.content_); |
87 return *this; | 90 return *this; |
88 } | 91 } |
89 SkSize size_; | 92 SkSize size_; |
90 sk_sp<SkPicture> content_; | 93 sk_sp<cc::PaintRecord> content_; |
91 }; | 94 }; |
92 | 95 |
93 struct PdfMetafileSkiaData { | 96 struct PdfMetafileSkiaData { |
94 SkPictureRecorder recorder_; // Current recording | 97 cc::PaintRecorder recorder_; // Current recording |
95 | 98 |
96 std::vector<Page> pages_; | 99 std::vector<Page> pages_; |
97 std::unique_ptr<SkStreamAsset> pdf_data_; | 100 std::unique_ptr<SkStreamAsset> pdf_data_; |
98 | 101 |
99 // The scale factor is used because Blink occasionally calls | 102 // The scale factor is used because Blink occasionally calls |
100 // SkCanvas::getTotalMatrix() even though the total matrix is not as | 103 // PaintCanvas::getTotalMatrix() even though the total matrix is not as |
101 // meaningful for a vector canvas as for a raster canvas. | 104 // meaningful for a vector canvas as for a raster canvas. |
102 float scale_factor_; | 105 float scale_factor_; |
103 SkSize size_; | 106 SkSize size_; |
104 SkiaDocumentType type_; | 107 SkiaDocumentType type_; |
105 | 108 |
106 #if defined(OS_MACOSX) | 109 #if defined(OS_MACOSX) |
107 PdfMetafileCg pdf_cg_; | 110 PdfMetafileCg pdf_cg_; |
108 #endif | 111 #endif |
109 }; | 112 }; |
110 | 113 |
(...skipping 17 matching lines...) Expand all Loading... | |
128 const gfx::Rect& content_area, | 131 const gfx::Rect& content_area, |
129 const float& scale_factor) { | 132 const float& scale_factor) { |
130 DCHECK_GT(page_size.width(), 0); | 133 DCHECK_GT(page_size.width(), 0); |
131 DCHECK_GT(page_size.height(), 0); | 134 DCHECK_GT(page_size.height(), 0); |
132 DCHECK_GT(scale_factor, 0.0f); | 135 DCHECK_GT(scale_factor, 0.0f); |
133 if (data_->recorder_.getRecordingCanvas()) | 136 if (data_->recorder_.getRecordingCanvas()) |
134 FinishPage(); | 137 FinishPage(); |
135 DCHECK(!data_->recorder_.getRecordingCanvas()); | 138 DCHECK(!data_->recorder_.getRecordingCanvas()); |
136 | 139 |
137 float inverse_scale = 1.0 / scale_factor; | 140 float inverse_scale = 1.0 / scale_factor; |
138 SkCanvas* canvas = data_->recorder_.beginRecording( | 141 cc::PaintCanvas* canvas = data_->recorder_.beginRecording( |
139 inverse_scale * page_size.width(), inverse_scale * page_size.height()); | 142 inverse_scale * page_size.width(), inverse_scale * page_size.height()); |
140 // Recording canvas is owned by the data_->recorder_. No ref() necessary. | 143 // Recording canvas is owned by the data_->recorder_. No ref() necessary. |
141 if (content_area != gfx::Rect(page_size)) { | 144 if (content_area != gfx::Rect(page_size)) { |
142 canvas->scale(inverse_scale, inverse_scale); | 145 canvas->scale(inverse_scale, inverse_scale); |
143 SkRect sk_content_area = gfx::RectToSkRect(content_area); | 146 SkRect sk_content_area = gfx::RectToSkRect(content_area); |
144 canvas->clipRect(sk_content_area); | 147 canvas->clipRect(sk_content_area); |
145 canvas->translate(sk_content_area.x(), sk_content_area.y()); | 148 canvas->translate(sk_content_area.x(), sk_content_area.y()); |
146 canvas->scale(scale_factor, scale_factor); | 149 canvas->scale(scale_factor, scale_factor); |
147 } | 150 } |
148 | 151 |
149 data_->size_ = gfx::SizeFToSkSize(gfx::SizeF(page_size)); | 152 data_->size_ = gfx::SizeFToSkSize(gfx::SizeF(page_size)); |
150 data_->scale_factor_ = scale_factor; | 153 data_->scale_factor_ = scale_factor; |
151 // We scale the recording canvas's size so that | 154 // We scale the recording canvas's size so that |
152 // canvas->getTotalMatrix() returns a value that ignores the scale | 155 // canvas->getTotalMatrix() returns a value that ignores the scale |
153 // factor. We store the scale factor and re-apply it later. | 156 // factor. We store the scale factor and re-apply it later. |
154 // http://crbug.com/469656 | 157 // http://crbug.com/469656 |
155 } | 158 } |
156 | 159 |
157 SkCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage( | 160 cc::PaintCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage( |
158 const gfx::Size& page_size, | 161 const gfx::Size& page_size, |
159 const gfx::Rect& content_area, | 162 const gfx::Rect& content_area, |
160 const float& scale_factor) { | 163 const float& scale_factor) { |
161 StartPage(page_size, content_area, scale_factor); | 164 StartPage(page_size, content_area, scale_factor); |
162 return data_->recorder_.getRecordingCanvas(); | 165 return data_->recorder_.getRecordingCanvas(); |
163 } | 166 } |
164 | 167 |
165 bool PdfMetafileSkia::FinishPage() { | 168 bool PdfMetafileSkia::FinishPage() { |
166 if (!data_->recorder_.getRecordingCanvas()) | 169 if (!data_->recorder_.getRecordingCanvas()) |
167 return false; | 170 return false; |
168 | 171 |
169 sk_sp<SkPicture> pic = data_->recorder_.finishRecordingAsPicture(); | 172 sk_sp<SkPicture> pic = data_->recorder_.finishRecordingAsPicture(); |
danakj
2017/02/09 23:05:22
PaintRecord record
| |
170 if (data_->scale_factor_ != 1.0f) { | 173 if (data_->scale_factor_ != 1.0f) { |
171 SkCanvas* canvas = data_->recorder_.beginRecording(data_->size_.width(), | 174 cc::PaintCanvas* canvas = data_->recorder_.beginRecording( |
172 data_->size_.height()); | 175 data_->size_.width(), data_->size_.height()); |
173 canvas->scale(data_->scale_factor_, data_->scale_factor_); | 176 canvas->scale(data_->scale_factor_, data_->scale_factor_); |
174 canvas->drawPicture(pic); | 177 canvas->drawPicture(pic); |
175 pic = data_->recorder_.finishRecordingAsPicture(); | 178 pic = data_->recorder_.finishRecordingAsPicture(); |
176 } | 179 } |
177 data_->pages_.emplace_back(data_->size_, std::move(pic)); | 180 data_->pages_.emplace_back(data_->size_, std::move(pic)); |
178 return true; | 181 return true; |
179 } | 182 } |
180 | 183 |
181 bool PdfMetafileSkia::FinishDocument() { | 184 bool PdfMetafileSkia::FinishDocument() { |
182 // If we've already set the data in InitFromData, leave it be. | 185 // If we've already set the data in InitFromData, leave it be. |
183 if (data_->pdf_data_) | 186 if (data_->pdf_data_) |
184 return false; | 187 return false; |
185 | 188 |
186 if (data_->recorder_.getRecordingCanvas()) | 189 if (data_->recorder_.getRecordingCanvas()) |
187 FinishPage(); | 190 FinishPage(); |
188 | 191 |
189 SkDynamicMemoryWStream stream; | 192 SkDynamicMemoryWStream stream; |
190 sk_sp<SkDocument> doc; | 193 sk_sp<SkDocument> doc; |
191 switch (data_->type_) { | 194 switch (data_->type_) { |
192 case PDF_SKIA_DOCUMENT_TYPE: | 195 case PDF_SKIA_DOCUMENT_TYPE: |
193 doc = MakePdfDocument(&stream); | 196 doc = MakePdfDocument(&stream); |
194 break; | 197 break; |
195 case MSKP_SKIA_DOCUMENT_TYPE: | 198 case MSKP_SKIA_DOCUMENT_TYPE: |
196 doc = SkMakeMultiPictureDocument(&stream); | 199 doc = SkMakeMultiPictureDocument(&stream); |
197 break; | 200 break; |
198 } | 201 } |
199 | 202 |
200 for (const Page& page : data_->pages_) { | 203 for (const Page& page : data_->pages_) { |
201 SkCanvas* canvas = doc->beginPage(page.size_.width(), page.size_.height()); | 204 cc::PaintCanvas* canvas( |
205 doc->beginPage(page.size_.width(), page.size_.height())); | |
202 canvas->drawPicture(page.content_); | 206 canvas->drawPicture(page.content_); |
203 doc->endPage(); | 207 doc->endPage(); |
204 } | 208 } |
205 doc->close(); | 209 doc->close(); |
206 | 210 |
207 data_->pdf_data_.reset(stream.detachAsStream()); | 211 data_->pdf_data_.reset(stream.detachAsStream()); |
208 return true; | 212 return true; |
209 } | 213 } |
210 | 214 |
211 uint32_t PdfMetafileSkia::GetDataSize() const { | 215 uint32_t PdfMetafileSkia::GetDataSize() const { |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
320 | 324 |
321 metafile->data_->pages_.push_back(data_->pages_.back()); | 325 metafile->data_->pages_.push_back(data_->pages_.back()); |
322 | 326 |
323 if (!metafile->FinishDocument()) // Generate PDF. | 327 if (!metafile->FinishDocument()) // Generate PDF. |
324 metafile.reset(); | 328 metafile.reset(); |
325 | 329 |
326 return metafile; | 330 return metafile; |
327 } | 331 } |
328 | 332 |
329 } // namespace printing | 333 } // namespace printing |
OLD | NEW |