Chromium Code Reviews| 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 "base/file_descriptor_posix.h" | 7 #include "base/file_descriptor_posix.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/hash_tables.h" | 9 #include "base/hash_tables.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| 11 #include "base/posix/eintr_wrapper.h" | 11 #include "base/posix/eintr_wrapper.h" |
| 12 #include "base/safe_numerics.h" | 12 #include "base/safe_numerics.h" |
| 13 #include "skia/ext/refptr.h" | |
| 13 #include "skia/ext/vector_platform_device_skia.h" | 14 #include "skia/ext/vector_platform_device_skia.h" |
| 14 #include "third_party/skia/include/core/SkData.h" | 15 #include "third_party/skia/include/core/SkData.h" |
| 15 #include "third_party/skia/include/core/SkRefCnt.h" | 16 #include "third_party/skia/include/core/SkRefCnt.h" |
| 16 #include "third_party/skia/include/core/SkScalar.h" | 17 #include "third_party/skia/include/core/SkScalar.h" |
| 17 #include "third_party/skia/include/core/SkStream.h" | 18 #include "third_party/skia/include/core/SkStream.h" |
| 18 #include "third_party/skia/include/core/SkTypeface.h" | 19 #include "third_party/skia/include/core/SkTypeface.h" |
| 19 #include "third_party/skia/include/pdf/SkPDFDevice.h" | 20 #include "third_party/skia/include/pdf/SkPDFDevice.h" |
| 20 #include "third_party/skia/include/pdf/SkPDFDocument.h" | 21 #include "third_party/skia/include/pdf/SkPDFDocument.h" |
| 21 #include "ui/gfx/point.h" | 22 #include "ui/gfx/point.h" |
| 22 #include "ui/gfx/rect.h" | 23 #include "ui/gfx/rect.h" |
| 23 #include "ui/gfx/size.h" | 24 #include "ui/gfx/size.h" |
| 24 | 25 |
| 25 #if defined(OS_MACOSX) | 26 #if defined(OS_MACOSX) |
| 26 #include "printing/pdf_metafile_cg_mac.h" | 27 #include "printing/pdf_metafile_cg_mac.h" |
| 27 #endif | 28 #endif |
| 28 | 29 |
| 29 namespace printing { | 30 namespace printing { |
| 30 | 31 |
| 31 struct PdfMetafileSkiaData { | 32 struct PdfMetafileSkiaData { |
| 32 SkRefPtr<SkPDFDevice> current_page_; | 33 skia::RefPtr<SkPDFDevice> current_page_; |
|
vandebo (ex-Chrome)
2013/05/17 01:12:31
SkAutoTUnref would also work here.
| |
| 33 SkPDFDocument pdf_doc_; | 34 SkPDFDocument pdf_doc_; |
| 34 SkDynamicMemoryWStream pdf_stream_; | 35 SkDynamicMemoryWStream pdf_stream_; |
| 35 #if defined(OS_MACOSX) | 36 #if defined(OS_MACOSX) |
| 36 PdfMetafileCg pdf_cg_; | 37 PdfMetafileCg pdf_cg_; |
| 37 #endif | 38 #endif |
| 38 }; | 39 }; |
| 39 | 40 |
| 40 PdfMetafileSkia::~PdfMetafileSkia() {} | 41 PdfMetafileSkia::~PdfMetafileSkia() {} |
| 41 | 42 |
| 42 bool PdfMetafileSkia::Init() { | 43 bool PdfMetafileSkia::Init() { |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 56 // Adjust for the margins and apply the scale factor. | 57 // Adjust for the margins and apply the scale factor. |
| 57 SkMatrix transform; | 58 SkMatrix transform; |
| 58 transform.setTranslate(SkIntToScalar(content_area.x()), | 59 transform.setTranslate(SkIntToScalar(content_area.x()), |
| 59 SkIntToScalar(content_area.y())); | 60 SkIntToScalar(content_area.y())); |
| 60 transform.preScale(SkFloatToScalar(scale_factor), | 61 transform.preScale(SkFloatToScalar(scale_factor), |
| 61 SkFloatToScalar(scale_factor)); | 62 SkFloatToScalar(scale_factor)); |
| 62 | 63 |
| 63 SkISize pdf_page_size = SkISize::Make(page_size.width(), page_size.height()); | 64 SkISize pdf_page_size = SkISize::Make(page_size.width(), page_size.height()); |
| 64 SkISize pdf_content_size = | 65 SkISize pdf_content_size = |
| 65 SkISize::Make(content_area.width(), content_area.height()); | 66 SkISize::Make(content_area.width(), content_area.height()); |
| 66 SkRefPtr<SkPDFDevice> pdf_device = | 67 skia::RefPtr<SkPDFDevice> pdf_device = |
| 67 new skia::VectorPlatformDeviceSkia(pdf_page_size, pdf_content_size, | 68 skia::AdoptRef(new skia::VectorPlatformDeviceSkia( |
| 68 transform); | 69 pdf_page_size, pdf_content_size, transform)); |
| 69 data_->current_page_ = pdf_device; | 70 data_->current_page_ = pdf_device; |
| 70 return pdf_device.get(); | 71 return pdf_device.get(); |
| 71 } | 72 } |
| 72 | 73 |
| 73 bool PdfMetafileSkia::StartPage(const gfx::Size& page_size, | 74 bool PdfMetafileSkia::StartPage(const gfx::Size& page_size, |
| 74 const gfx::Rect& content_area, | 75 const gfx::Rect& content_area, |
| 75 const float& scale_factor) { | 76 const float& scale_factor) { |
| 76 NOTREACHED(); | 77 NOTREACHED(); |
| 77 return false; | 78 return false; |
| 78 } | 79 } |
| 79 | 80 |
| 80 bool PdfMetafileSkia::FinishPage() { | 81 bool PdfMetafileSkia::FinishPage() { |
| 81 DCHECK(data_->current_page_.get()); | 82 DCHECK(data_->current_page_.get()); |
| 82 | 83 |
| 83 data_->pdf_doc_.appendPage(data_->current_page_.get()); | 84 data_->pdf_doc_.appendPage(data_->current_page_.get()); |
| 84 page_outstanding_ = false; | 85 page_outstanding_ = false; |
| 85 return true; | 86 return true; |
| 86 } | 87 } |
| 87 | 88 |
| 88 bool PdfMetafileSkia::FinishDocument() { | 89 bool PdfMetafileSkia::FinishDocument() { |
| 89 // Don't do anything if we've already set the data in InitFromData. | 90 // Don't do anything if we've already set the data in InitFromData. |
| 90 if (data_->pdf_stream_.getOffset()) | 91 if (data_->pdf_stream_.getOffset()) |
| 91 return true; | 92 return true; |
| 92 | 93 |
| 93 if (page_outstanding_) | 94 if (page_outstanding_) |
| 94 FinishPage(); | 95 FinishPage(); |
| 95 | 96 |
| 96 data_->current_page_ = NULL; | 97 data_->current_page_.clear(); |
| 97 | 98 |
| 98 int font_counts[SkAdvancedTypefaceMetrics::kNotEmbeddable_Font + 1]; | 99 int font_counts[SkAdvancedTypefaceMetrics::kNotEmbeddable_Font + 1]; |
| 99 data_->pdf_doc_.getCountOfFontTypes(font_counts); | 100 data_->pdf_doc_.getCountOfFontTypes(font_counts); |
| 100 for (int type = 0; | 101 for (int type = 0; |
| 101 type <= SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; | 102 type <= SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; |
| 102 type++) { | 103 type++) { |
| 103 for (int count = 0; count < font_counts[type]; count++) { | 104 for (int count = 0; count < font_counts[type]; count++) { |
| 104 UMA_HISTOGRAM_ENUMERATION( | 105 UMA_HISTOGRAM_ENUMERATION( |
| 105 "PrintPreview.FontType", type, | 106 "PrintPreview.FontType", type, |
| 106 SkAdvancedTypefaceMetrics::kNotEmbeddable_Font + 1); | 107 SkAdvancedTypefaceMetrics::kNotEmbeddable_Font + 1); |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 238 if (data->size() == 0) | 239 if (data->size() == 0) |
| 239 return NULL; | 240 return NULL; |
| 240 | 241 |
| 241 PdfMetafileSkia* metafile = new PdfMetafileSkia; | 242 PdfMetafileSkia* metafile = new PdfMetafileSkia; |
| 242 metafile->InitFromData(data->bytes(), | 243 metafile->InitFromData(data->bytes(), |
| 243 base::checked_numeric_cast<uint32>(data->size())); | 244 base::checked_numeric_cast<uint32>(data->size())); |
| 244 return metafile; | 245 return metafile; |
| 245 } | 246 } |
| 246 | 247 |
| 247 } // namespace printing | 248 } // namespace printing |
| OLD | NEW |