diff options
author | halcanary <halcanary@google.com> | 2014-12-02 14:01:46 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-12-02 14:01:46 -0800 |
commit | 84bc52ad26e69c01a694a9d724944507acb64d38 (patch) | |
tree | 6f9654af2a05e4bc4b49ed38f0b4a83b47ccafd0 /experimental/tools | |
parent | e638d1c29b2895a4dcf41b5bc8868278192bf819 (diff) |
work in progress
Review URL: https://codereview.chromium.org/769423002
Diffstat (limited to 'experimental/tools')
-rw-r--r-- | experimental/tools/PageCachingDocument.cpp | 98 | ||||
-rw-r--r-- | experimental/tools/PageCachingDocument.h | 22 | ||||
-rw-r--r-- | experimental/tools/gmtoskp.cpp | 8 | ||||
-rw-r--r-- | experimental/tools/multipage_pdf_profiler.cpp | 19 |
4 files changed, 133 insertions, 14 deletions
diff --git a/experimental/tools/PageCachingDocument.cpp b/experimental/tools/PageCachingDocument.cpp new file mode 100644 index 0000000000..38e883e839 --- /dev/null +++ b/experimental/tools/PageCachingDocument.cpp @@ -0,0 +1,98 @@ +/* + * 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 "PageCachingDocument.h" +#include "SkCanvas.h" +#include "SkDocument.h" +#include "SkPictureRecorder.h" +#include "SkRect.h" +#include "SkTDArray.h" + +namespace { + +typedef void (*DoneProc)(SkWStream*, bool); +typedef SkData* (*Encoder)(size_t*, const SkBitmap&); + +// This class allows us to compare the relative memory consumption of +// the PDF and SkPicture backends. +class PageCachingDocument : public SkDocument { +public: + PageCachingDocument(SkWStream*, DoneProc, Encoder, SkScalar rasterDpi); + virtual ~PageCachingDocument(); + virtual SkCanvas* onBeginPage(SkScalar width, + SkScalar height, + const SkRect& content) SK_OVERRIDE; + virtual void onEndPage() SK_OVERRIDE; + virtual bool onClose(SkWStream*) SK_OVERRIDE; + virtual void onAbort() SK_OVERRIDE; + +private: + struct Page { + SkScalar fWidth; + SkScalar fHeight; + SkAutoTUnref<SkPicture> fPic; + }; + SkPictureRecorder fRecorder; + SkTDArray<Page> fPages; + Encoder fEncoder; + SkScalar fRasterDpi; +}; + +PageCachingDocument::PageCachingDocument(SkWStream* stream, + DoneProc done, + Encoder encoder, + SkScalar rasterDpi) + : SkDocument(stream, done), fEncoder(encoder), fRasterDpi(rasterDpi) { +} + +PageCachingDocument::~PageCachingDocument() { + for (Page* p = fPages.begin(); p != fPages.end(); ++p) { + p->~Page(); + } +} + +SkCanvas* PageCachingDocument::onBeginPage(SkScalar width, + SkScalar height, + const SkRect& content) { + Page* page = fPages.push(); + sk_bzero(page, sizeof(*page)); + page->fWidth = width; + page->fHeight = height; + SkASSERT(!page->fPic.get()); + SkCanvas* canvas = fRecorder.beginRecording(content); + return canvas; +} + +void PageCachingDocument::onEndPage() { + SkASSERT(fPages.count() > 0); + SkASSERT(!fPages[fPages.count() - 1].fPic); + fPages[fPages.count() - 1].fPic.reset(fRecorder.endRecording()); +} + +bool PageCachingDocument::onClose(SkWStream* stream) { + SkAutoTUnref<SkDocument> doc( + SkDocument::CreatePDF(stream, NULL, fEncoder, fRasterDpi)); + for (Page* page = fPages.begin(); page != fPages.end(); ++page) { + SkRect cullRect = page->fPic->cullRect(); + SkCanvas* canvas = + doc->beginPage(page->fWidth, page->fHeight, &cullRect); + canvas->drawPicture(page->fPic); + doc->endPage(); + } + return doc->close(); +} + +void PageCachingDocument::onAbort() { +} +} // namespace + +SkDocument* CreatePageCachingDocument(SkWStream* stream, + DoneProc done, + Encoder encoder, + SkScalar rasterDpi) { + return SkNEW_ARGS(PageCachingDocument, (stream, done, encoder, rasterDpi)); +} diff --git a/experimental/tools/PageCachingDocument.h b/experimental/tools/PageCachingDocument.h new file mode 100644 index 0000000000..19be1ae619 --- /dev/null +++ b/experimental/tools/PageCachingDocument.h @@ -0,0 +1,22 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#ifndef PageCachingDocument_DEFINED +#define PageCachingDocument_DEFINED + +#include "SkScalar.h" + +class SkBitmap; +class SkData; +class SkDocument; +class SkWStream; + +SkDocument* CreatePageCachingDocument( + SkWStream* stream, + void (*done)(SkWStream*, bool) = NULL, + SkData* (*encoder)(size_t*, const SkBitmap&) = NULL, + SkScalar rasterDpi = 72.0); +#endif // PageCachingDocument_DEFINED diff --git a/experimental/tools/gmtoskp.cpp b/experimental/tools/gmtoskp.cpp index bafd3d3679..124c7f6760 100644 --- a/experimental/tools/gmtoskp.cpp +++ b/experimental/tools/gmtoskp.cpp @@ -28,7 +28,7 @@ DEFINE_string2(match, "If a GM does not match any list entry,\n" "it is skipped unless some list entry starts with ~"); -DEFINE_string2(writePath, w, "", "Write output here as .skps."); +DEFINE_string2(writePath, w, "", "Write output in this directory as .skps."); __SK_FORCE_IMAGE_DECODER_LINKING; @@ -49,11 +49,13 @@ int main(int argc, char** argv) { SkCommandLineFlags::SetUsage(""); SkCommandLineFlags::Parse(argc, argv); if (FLAGS_writePath.isEmpty()) { + SkDebugf("You need to specify a --writePath option"); return 1; } const char* writePath = FLAGS_writePath[0]; if (!sk_mkdir(writePath)) { - return 1; + + return 2; } for (const skiagm::GMRegistry* reg = skiagm::GMRegistry::Head(); reg != NULL; @@ -69,7 +71,7 @@ int main(int argc, char** argv) { SkFILEWStream outputStream(path.c_str()); if (!outputStream.isValid()) { SkDebugf("Could not open file %s\n", path.c_str()); - return 1; + return 3; } gmtoskp(gm, &outputStream); } diff --git a/experimental/tools/multipage_pdf_profiler.cpp b/experimental/tools/multipage_pdf_profiler.cpp index 93c8df9fb4..4f8eae2fb6 100644 --- a/experimental/tools/multipage_pdf_profiler.cpp +++ b/experimental/tools/multipage_pdf_profiler.cpp @@ -12,19 +12,16 @@ #include "SkPicture.h" #include "SkStream.h" #include "SkTemplates.h" +#include "PageCachingDocument.h" #include "ProcStats.h" #include "flags/SkCommandLineFlags.h" -#ifdef SK_ENABLE_NEW_SKPDF_BACKEND -#include "skpdf.h" -#endif - DEFINE_string2(readPath, r, "", "(Required) The path to a .skp Skia Picture file."); DEFINE_string2(writePath, w, "", "If set, write PDF output to this file."); -DEFINE_bool(newPdf, false, "Use the new PDF backend."); +DEFINE_bool(cachePages, false, "Use a PageCachingDocument."); DEFINE_bool(nullCanvas, true, "Render to a SkNullCanvas as a control."); __SK_FORCE_IMAGE_DECODER_LINKING; @@ -45,12 +42,11 @@ public: }; SkDocument* CreatePDFDocument(SkWStream* out) { -#ifdef SK_ENABLE_NEW_SKPDF_BACKEND - if (FLAGS_newPdf) { - return skpdf::CreatePDFDocument(out); + if (FLAGS_cachePages) { + return CreatePageCachingDocument(out); + } else { + return SkDocument::CreatePDF(out); } -#endif - return SkDocument::CreatePDF(out); } } // namespace @@ -119,7 +115,8 @@ int main(int argc, char** argv) { canvas->clipRect(letterRect); canvas->translate(SkIntToScalar(-kLetterWidth * x), SkIntToScalar(-kLetterHeight * y)); - canvas->drawPicture(picture); + picture->playback(canvas); + //canvas->drawPicture(picture); } canvas->flush(); if (!FLAGS_nullCanvas) { |