15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/pdf_metafile_skia.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/numerics/safe_conversions.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/posix/eintr_wrapper.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "skia/ext/refptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/vector_platform_device_skia.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkData.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkRefCnt.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkScalar.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkStream.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkTypeface.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/pdf/SkPDFDevice.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/pdf/SkPDFDocument.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/pdf_metafile_cg_mac.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_POSIX) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/file_descriptor_posix.h" 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PdfMetafileSkiaData { 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) skia::RefPtr<SkPDFDevice> current_page_; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPDFDocument pdf_doc_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkDynamicMemoryWStream pdf_stream_; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PdfMetafileCg pdf_cg_; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PdfMetafileSkia::~PdfMetafileSkia() {} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PdfMetafileSkia::Init() { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PdfMetafileSkia::InitFromData(const void* src_buffer, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 src_buffer_size) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data_->pdf_stream_.write(src_buffer, src_buffer_size); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)SkBaseDevice* PdfMetafileSkia::StartPageForVectorCanvas( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& page_size, const gfx::Rect& content_area, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float& scale_factor) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!page_outstanding_); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_outstanding_ = true; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adjust for the margins and apply the scale factor. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkMatrix transform; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform.setTranslate(SkIntToScalar(content_area.x()), 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkIntToScalar(content_area.y())); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform.preScale(SkFloatToScalar(scale_factor), 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkFloatToScalar(scale_factor)); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkISize pdf_page_size = SkISize::Make(page_size.width(), page_size.height()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkISize pdf_content_size = 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkISize::Make(content_area.width(), content_area.height()); 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) skia::RefPtr<SkPDFDevice> pdf_device = 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) skia::AdoptRef(new skia::VectorPlatformDeviceSkia( 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) pdf_page_size, pdf_content_size, transform)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_->current_page_ = pdf_device; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pdf_device.get(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PdfMetafileSkia::StartPage(const gfx::Size& page_size, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& content_area, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float& scale_factor) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PdfMetafileSkia::FinishPage() { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(data_->current_page_.get()); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_->pdf_doc_.appendPage(data_->current_page_.get()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_outstanding_ = false; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PdfMetafileSkia::FinishDocument() { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't do anything if we've already set the data in InitFromData. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data_->pdf_stream_.getOffset()) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_outstanding_) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinishPage(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) data_->current_page_.clear(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int font_counts[SkAdvancedTypefaceMetrics::kOther_Font + 2]; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_->pdf_doc_.getCountOfFontTypes(font_counts); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int type = 0; 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) type <= SkAdvancedTypefaceMetrics::kOther_Font + 1; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type++) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int count = 0; count < font_counts[type]; count++) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "PrintPreview.FontType", type, 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkAdvancedTypefaceMetrics::kOther_Font + 2); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data_->pdf_doc_.emitPDF(&data_->pdf_stream_); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 PdfMetafileSkia::GetDataSize() const { 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::checked_cast<uint32>(data_->pdf_stream_.getOffset()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PdfMetafileSkia::GetData(void* dst_buffer, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 dst_buffer_size) const { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dst_buffer_size < GetDataSize()) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkAutoDataUnref data(data_->pdf_stream_.copyToData()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(dst_buffer, data->bytes(), dst_buffer_size); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect PdfMetafileSkia::GetPageBounds(unsigned int page_number) const { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(vandebo) add a method to get the page size for a given page to 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SkPDFDocument. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned int PdfMetafileSkia::GetPageCount() const { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(vandebo) add a method to get the number of pages to SkPDFDocument. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeDrawingContext PdfMetafileSkia::context() const { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PdfMetafileSkia::Playback(gfx::NativeDrawingContext hdc, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RECT* rect) const { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PdfMetafileSkia::SafePlayback(gfx::NativeDrawingContext hdc) const { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* TODO(caryclark): The set up of PluginInstance::PrintPDFOutput may result in 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rasterized output. Even if that flow uses PdfMetafileCg::RenderPage, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the drawing of the PDF into the canvas may result in a rasterized output. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PDFMetafileSkia::RenderPage should be not implemented as shown and instead 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should do something like the following CL in PluginInstance::PrintPDFOutput: 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)http://codereview.chromium.org/7200040/diff/1/webkit/plugins/ppapi/ppapi_plugin_instance.cc 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PdfMetafileSkia::RenderPage(unsigned int page_number, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CGContextRef context, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CGRect rect, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MacRenderPageParams& params) const { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(data_->pdf_stream_.getOffset(), 0U); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data_->pdf_cg_.GetDataSize() == 0) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkAutoDataUnref data(data_->pdf_stream_.copyToData()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_->pdf_cg_.InitFromData(data->bytes(), data->size()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return data_->pdf_cg_.RenderPage(page_number, context, rect, params); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_CHROMEOS) || defined(OS_ANDROID) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PdfMetafileSkia::SaveToFD(const base::FileDescriptor& fd) const { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GT(data_->pdf_stream_.getOffset(), 0U); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fd.fd < 0) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Invalid file descriptor!"; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::File file(fd.fd); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkAutoDataUnref data(data_->pdf_stream_.copyToData()); 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool result = 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file.WriteAtCurrentPos(reinterpret_cast<const char*>(data->data()), 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetDataSize()) == static_cast<int>(GetDataSize()); 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DLOG_IF(ERROR, !result) << "Failed to save file with fd " << fd.fd; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!fd.auto_close) 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file.TakePlatformFile(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PdfMetafileSkia::PdfMetafileSkia() 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : data_(new PdfMetafileSkiaData), 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_outstanding_(false) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<PdfMetafileSkia> PdfMetafileSkia::GetMetafileForCurrentPage() { 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<PdfMetafileSkia> metafile; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPDFDocument pdf_doc(SkPDFDocument::kDraftMode_Flags); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pdf_doc.appendPage(data_->current_page_.get())) 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return metafile.Pass(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SkDynamicMemoryWStream pdf_stream; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pdf_doc.emitPDF(&pdf_stream)) 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return metafile.Pass(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SkAutoDataUnref data_copy(pdf_stream.copyToData()); 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (data_copy->size() == 0) 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<PdfMetafileSkia>(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metafile.reset(new PdfMetafileSkia); 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!metafile->InitFromData(data_copy->bytes(), 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::checked_cast<uint32>(data_copy->size()))) { 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metafile.reset(); 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return metafile.Pass(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace printing 231