| Index: experimental/tools/PageCachingDocument.cpp
|
| diff --git a/experimental/tools/PageCachingDocument.cpp b/experimental/tools/PageCachingDocument.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..38e883e839acb7735a7198cb842d8ca21fb0f0cc
|
| --- /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));
|
| +}
|
|
|