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

Side by Side Diff: printing/pdf_metafile_skia.cc

Issue 2686033005: Move metafile printing code from platform canvas to PaintCanvas (Closed)
Patch Set: Created 3 years, 10 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
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 <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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698