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