| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 SkSize page_size_; | 51 SkSize page_size_; |
| 52 SkRect content_area_; | 52 SkRect content_area_; |
| 53 float scale_factor_; | 53 float scale_factor_; |
| 54 sk_sp<SkPicture> content_; | 54 sk_sp<SkPicture> content_; |
| 55 }; | 55 }; |
| 56 | 56 |
| 57 bool WriteAssetToBuffer(const SkStreamAsset* asset, | 57 bool WriteAssetToBuffer(const SkStreamAsset* asset, |
| 58 void* buffer, | 58 void* buffer, |
| 59 size_t size) { | 59 size_t size) { |
| 60 // Calling duplicate() keeps original asset state unchanged. | 60 // Calling duplicate() keeps original asset state unchanged. |
| 61 scoped_ptr<SkStreamAsset> assetCopy(asset->duplicate()); | 61 std::unique_ptr<SkStreamAsset> assetCopy(asset->duplicate()); |
| 62 size_t length = assetCopy->getLength(); | 62 size_t length = assetCopy->getLength(); |
| 63 if (length > size) | 63 if (length > size) |
| 64 return false; | 64 return false; |
| 65 return (length == assetCopy->read(buffer, length)); | 65 return (length == assetCopy->read(buffer, length)); |
| 66 } | 66 } |
| 67 | 67 |
| 68 SkTime::DateTime TimeToSkTime(base::Time time) { | 68 SkTime::DateTime TimeToSkTime(base::Time time) { |
| 69 base::Time::Exploded exploded; | 69 base::Time::Exploded exploded; |
| 70 time.UTCExplode(&exploded); | 70 time.UTCExplode(&exploded); |
| 71 SkTime::DateTime skdate; | 71 SkTime::DateTime skdate; |
| 72 skdate.fTimeZoneMinutes = 0; | 72 skdate.fTimeZoneMinutes = 0; |
| 73 skdate.fYear = exploded.year; | 73 skdate.fYear = exploded.year; |
| 74 skdate.fMonth = exploded.month; | 74 skdate.fMonth = exploded.month; |
| 75 skdate.fDayOfWeek = exploded.day_of_week; | 75 skdate.fDayOfWeek = exploded.day_of_week; |
| 76 skdate.fDay = exploded.day_of_month; | 76 skdate.fDay = exploded.day_of_month; |
| 77 skdate.fHour = exploded.hour; | 77 skdate.fHour = exploded.hour; |
| 78 skdate.fMinute = exploded.minute; | 78 skdate.fMinute = exploded.minute; |
| 79 skdate.fSecond = exploded.second; | 79 skdate.fSecond = exploded.second; |
| 80 return skdate; | 80 return skdate; |
| 81 } | 81 } |
| 82 | 82 |
| 83 } // namespace | 83 } // namespace |
| 84 | 84 |
| 85 namespace printing { | 85 namespace printing { |
| 86 | 86 |
| 87 struct PdfMetafileSkiaData { | 87 struct PdfMetafileSkiaData { |
| 88 SkPictureRecorder recorder_; // Current recording | 88 SkPictureRecorder recorder_; // Current recording |
| 89 | 89 |
| 90 std::vector<Page> pages_; | 90 std::vector<Page> pages_; |
| 91 scoped_ptr<SkStreamAsset> pdf_data_; | 91 std::unique_ptr<SkStreamAsset> pdf_data_; |
| 92 | 92 |
| 93 #if defined(OS_MACOSX) | 93 #if defined(OS_MACOSX) |
| 94 PdfMetafileCg pdf_cg_; | 94 PdfMetafileCg pdf_cg_; |
| 95 #endif | 95 #endif |
| 96 }; | 96 }; |
| 97 | 97 |
| 98 PdfMetafileSkia::~PdfMetafileSkia() {} | 98 PdfMetafileSkia::~PdfMetafileSkia() {} |
| 99 | 99 |
| 100 bool PdfMetafileSkia::Init() { | 100 bool PdfMetafileSkia::Init() { |
| 101 return true; | 101 return true; |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 } | 250 } |
| 251 return data_->pdf_cg_.RenderPage(page_number, context, rect, params); | 251 return data_->pdf_cg_.RenderPage(page_number, context, rect, params); |
| 252 } | 252 } |
| 253 #endif | 253 #endif |
| 254 | 254 |
| 255 bool PdfMetafileSkia::SaveTo(base::File* file) const { | 255 bool PdfMetafileSkia::SaveTo(base::File* file) const { |
| 256 if (GetDataSize() == 0U) | 256 if (GetDataSize() == 0U) |
| 257 return false; | 257 return false; |
| 258 | 258 |
| 259 // Calling duplicate() keeps original asset state unchanged. | 259 // Calling duplicate() keeps original asset state unchanged. |
| 260 scoped_ptr<SkStreamAsset> asset(data_->pdf_data_->duplicate()); | 260 std::unique_ptr<SkStreamAsset> asset(data_->pdf_data_->duplicate()); |
| 261 | 261 |
| 262 const size_t maximum_buffer_size = 1024 * 1024; | 262 const size_t maximum_buffer_size = 1024 * 1024; |
| 263 std::vector<char> buffer(std::min(maximum_buffer_size, asset->getLength())); | 263 std::vector<char> buffer(std::min(maximum_buffer_size, asset->getLength())); |
| 264 do { | 264 do { |
| 265 size_t read_size = asset->read(&buffer[0], buffer.size()); | 265 size_t read_size = asset->read(&buffer[0], buffer.size()); |
| 266 if (read_size == 0) | 266 if (read_size == 0) |
| 267 break; | 267 break; |
| 268 DCHECK_GE(buffer.size(), read_size); | 268 DCHECK_GE(buffer.size(), read_size); |
| 269 if (!file->WriteAtCurrentPos(&buffer[0], | 269 if (!file->WriteAtCurrentPos(&buffer[0], |
| 270 base::checked_cast<int>(read_size))) { | 270 base::checked_cast<int>(read_size))) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 289 | 289 |
| 290 if (!fd.auto_close) | 290 if (!fd.auto_close) |
| 291 file.TakePlatformFile(); | 291 file.TakePlatformFile(); |
| 292 return result; | 292 return result; |
| 293 } | 293 } |
| 294 #endif | 294 #endif |
| 295 | 295 |
| 296 PdfMetafileSkia::PdfMetafileSkia() : data_(new PdfMetafileSkiaData) { | 296 PdfMetafileSkia::PdfMetafileSkia() : data_(new PdfMetafileSkiaData) { |
| 297 } | 297 } |
| 298 | 298 |
| 299 scoped_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage() { | 299 std::unique_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage() { |
| 300 // If we only ever need the metafile for the last page, should we | 300 // If we only ever need the metafile for the last page, should we |
| 301 // only keep a handle on one SkPicture? | 301 // only keep a handle on one SkPicture? |
| 302 scoped_ptr<PdfMetafileSkia> metafile(new PdfMetafileSkia); | 302 std::unique_ptr<PdfMetafileSkia> metafile(new PdfMetafileSkia); |
| 303 | 303 |
| 304 if (data_->pages_.size() == 0) | 304 if (data_->pages_.size() == 0) |
| 305 return metafile; | 305 return metafile; |
| 306 | 306 |
| 307 if (data_->recorder_.getRecordingCanvas()) // page outstanding | 307 if (data_->recorder_.getRecordingCanvas()) // page outstanding |
| 308 return metafile; | 308 return metafile; |
| 309 | 309 |
| 310 const Page& page = data_->pages_.back(); | 310 const Page& page = data_->pages_.back(); |
| 311 | 311 |
| 312 metafile->data_->pages_.push_back(page); | 312 metafile->data_->pages_.push_back(page); |
| 313 | 313 |
| 314 if (!metafile->FinishDocument()) // Generate PDF. | 314 if (!metafile->FinishDocument()) // Generate PDF. |
| 315 metafile.reset(); | 315 metafile.reset(); |
| 316 | 316 |
| 317 return metafile; | 317 return metafile; |
| 318 } | 318 } |
| 319 | 319 |
| 320 } // namespace printing | 320 } // namespace printing |
| OLD | NEW |