skia2/tools/PdfRenderer.cpp

74 lines
1.6 KiB
C++

/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "PdfRenderer.h"
#include "SkCanvas.h"
#include "SkDevice.h"
#include "SkPDFDevice.h"
#include "SkPDFDocument.h"
namespace sk_tools {
void PdfRenderer::init(SkPicture* pict) {
SkASSERT(NULL == fPicture);
SkASSERT(NULL == fCanvas.get());
if (fPicture != NULL || NULL != fCanvas.get()) {
return;
}
SkASSERT(pict != NULL);
if (NULL == pict) {
return;
}
fPicture = pict;
fCanvas.reset(this->setupCanvas());
}
SkCanvas* PdfRenderer::setupCanvas() {
return this->setupCanvas(fPicture->width(), fPicture->height());
}
SkCanvas* PdfRenderer::setupCanvas(int width, int height) {
SkISize pageSize = SkISize::Make(width, height);
fPDFDevice = SkNEW_ARGS(SkPDFDevice, (pageSize, pageSize, SkMatrix::I()));
return SkNEW_ARGS(SkCanvas, (fPDFDevice));
}
void PdfRenderer::end() {
fPicture = NULL;
fCanvas.reset(NULL);
if (fPDFDevice) {
SkDELETE(fPDFDevice);
fPDFDevice = NULL;
}
}
bool PdfRenderer::write(const SkString& path) const {
SkPDFDocument doc;
doc.appendPage(fPDFDevice);
SkFILEWStream stream(path.c_str());
if (stream.isValid()) {
doc.emitPDF(&stream);
return true;
}
return false;
}
void SimplePdfRenderer::render() {
SkASSERT(fCanvas.get() != NULL);
SkASSERT(fPicture != NULL);
if (NULL == fCanvas.get() || NULL == fPicture) {
return;
}
fCanvas->drawPicture(*fPicture);
fCanvas->flush();
}
}