Chromium Code Reviews| Index: dm/DMPDFTask.cpp |
| diff --git a/dm/DMPDFTask.cpp b/dm/DMPDFTask.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..270f4b4fef8bbfd1863e397acfc93a3f77efec32 |
| --- /dev/null |
| +++ b/dm/DMPDFTask.cpp |
| @@ -0,0 +1,83 @@ |
| +/* |
| + * Copyright 2014 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
| +#include "DMPDFTask.h" |
| +#include "DMExpectationsTask.h" |
| +#include "DMPDFRasterizeTask.h" |
| +#include "DMUtil.h" |
| +#include "DMWriteTask.h" |
| +#include "SkCommandLineFlags.h" |
| +#include "SkDocument.h" |
| + |
| +DEFINE_bool(pdf, true, "PDF backend master switch."); |
| + |
| +namespace DM { |
| + |
| +PDFTask::PDFTask(const char* suffix, |
| + Reporter* reporter, |
| + TaskRunner* taskRunner, |
| + const Expectations& expectations, |
| + skiagm::GMRegistry::Factory factory, |
| + RasterizePdfProc rasterizePdfProc) |
| + : CpuTask(reporter, taskRunner) |
| + , fGM(factory(NULL)) |
| + , fName(UnderJoin(fGM->getName(), suffix)) |
| + , fExpectations(expectations) |
| + , fRasterize(rasterizePdfProc) {} |
| + |
| +namespace { |
| + |
| +class SinglePagePDF { |
| +public: |
| + SinglePagePDF(SkScalar width, SkScalar height) |
| + : fDocument(SkDocument::CreatePDF(&fWriteStream)) |
| + , fCanvas(fDocument->beginPage(width, height)) {} |
| + |
| + SkCanvas* canvas() { return fCanvas; } |
| + |
| + SkData* end() { |
| + fCanvas->flush(); |
| + fDocument->endPage(); |
| + fDocument->close(); |
| + return fWriteStream.copyToData(); |
| + } |
| + |
| +private: |
| + SkDynamicMemoryWStream fWriteStream; |
| + SkAutoTUnref<SkDocument> fDocument; |
| + SkCanvas* fCanvas; |
| +}; |
| + |
| +} // namespace |
| + |
| +void PDFTask::draw() { |
| + SinglePagePDF pdf(fGM->width(), fGM->height()); |
| + //TODO(mtklein): GM doesn't do this. Why not? |
| + //pdf.canvas()->concat(fGM->getInitialTransform()); |
|
vandebo (ex-Chrome)
2014/06/03 20:39:56
Because it passes it into the PDF device: https://
|
| + fGM->draw(pdf.canvas()); |
| + |
| + SkAutoTUnref<SkData> pdfData(pdf.end()); |
| + SkASSERT(pdfData.get()); |
| + |
| + if (!(fGM->getFlags() & skiagm::GM::kSkipPDFRasterization_Flag)) { |
| + this->spawnChild(SkNEW_ARGS(PDFRasterizeTask, |
| + (*this, pdfData.get(), fExpectations, fRasterize))); |
| + } |
| + this->spawnChild(SkNEW_ARGS(WriteTask, (*this, pdfData.get(), ".pdf"))); |
| +} |
| + |
| +bool PDFTask::shouldSkip() const { |
| + if (!FLAGS_pdf) { |
| + return true; |
| + } |
| + if (fGM->getFlags() & skiagm::GM::kSkipPDF_Flag) { |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| +} // namespace DM |