PdfRenderer.cpp revision 2a827e81b3334f33b0f8ff05b6a39a11d532568f
1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright 2012 Google Inc. 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Use of this source code is governed by a BSD-style license that can be 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * found in the LICENSE file. 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "PdfRenderer.h" 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "SkCanvas.h" 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "SkDevice.h" 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "SkPDFDevice.h" 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "SkPDFDocument.h" 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottnamespace sk_tools { 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid PdfRenderer::init(SkPicture* pict) { 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott SkASSERT(NULL == fPicture); 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott SkASSERT(NULL == fCanvas.get()); 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (fPicture != NULL || NULL != fCanvas.get()) { 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return; 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott SkASSERT(pict != NULL); 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (NULL == pict) { 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return; 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fPicture = pict; 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fCanvas.reset(this->setupCanvas()); 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottSkCanvas* PdfRenderer::setupCanvas() { 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return this->setupCanvas(fPicture->width(), fPicture->height()); 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottSkCanvas* PdfRenderer::setupCanvas(int width, int height) { 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott SkISize pageSize = SkISize::Make(width, height); 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fPDFDevice = SkNEW_ARGS(SkPDFDevice, (pageSize, pageSize, SkMatrix::I())); 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return SkNEW_ARGS(SkCanvas, (fPDFDevice)); 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid PdfRenderer::end() { 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fPicture = NULL; 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fCanvas.reset(NULL); 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (fPDFDevice) { 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott SkDELETE(fPDFDevice); 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fPDFDevice = NULL; 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool PdfRenderer::write(const SkString& path) const { 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott SkPDFDocument doc; 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott doc.appendPage(fPDFDevice); 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott SkFILEWStream stream(path.c_str()); 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (stream.isValid()) { 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott doc.emitPDF(&stream); 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return true; 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return false; 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid SimplePdfRenderer::render() { 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott SkASSERT(fCanvas.get() != NULL); 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott SkASSERT(fPicture != NULL); 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (NULL == fCanvas.get() || NULL == fPicture) { 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return; 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fCanvas->drawPicture(*fPicture); 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott fCanvas->flush(); 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott