diff options
Diffstat (limited to 'gfx/skia/skia/src/core/SkBigPicture.h')
-rw-r--r-- | gfx/skia/skia/src/core/SkBigPicture.h | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/core/SkBigPicture.h b/gfx/skia/skia/src/core/SkBigPicture.h new file mode 100644 index 0000000000..09ae1e244f --- /dev/null +++ b/gfx/skia/skia/src/core/SkBigPicture.h @@ -0,0 +1,74 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkBigPicture_DEFINED +#define SkBigPicture_DEFINED + +#include "include/core/SkM44.h" +#include "include/core/SkPicture.h" +#include "include/core/SkRect.h" +#include "include/private/base/SkNoncopyable.h" +#include "include/private/base/SkOnce.h" +#include "include/private/base/SkTemplates.h" + +class SkBBoxHierarchy; +class SkMatrix; +class SkRecord; + +// An implementation of SkPicture supporting an arbitrary number of drawing commands. +// This is called "big" because there used to be a "mini" that only supported a subset of the +// calls as an optimization. +class SkBigPicture final : public SkPicture { +public: + // An array of refcounted const SkPicture pointers. + class SnapshotArray : ::SkNoncopyable { + public: + SnapshotArray(const SkPicture* pics[], int count) : fPics(pics), fCount(count) {} + ~SnapshotArray() { for (int i = 0; i < fCount; i++) { fPics[i]->unref(); } } + + const SkPicture* const* begin() const { return fPics; } + int count() const { return fCount; } + private: + skia_private::AutoTMalloc<const SkPicture*> fPics; + int fCount; + }; + + SkBigPicture(const SkRect& cull, + sk_sp<SkRecord>, + std::unique_ptr<SnapshotArray>, + sk_sp<SkBBoxHierarchy>, + size_t approxBytesUsedBySubPictures); + + +// SkPicture overrides + void playback(SkCanvas*, AbortCallback*) const override; + SkRect cullRect() const override; + int approximateOpCount(bool nested) const override; + size_t approximateBytesUsed() const override; + const SkBigPicture* asSkBigPicture() const override { return this; } + +// Used by GrLayerHoister + void partialPlayback(SkCanvas*, + int start, + int stop, + const SkM44& initialCTM) const; +// Used by GrRecordReplaceDraw + const SkBBoxHierarchy* bbh() const { return fBBH.get(); } + const SkRecord* record() const { return fRecord.get(); } + +private: + int drawableCount() const; + SkPicture const* const* drawablePicts() const; + + const SkRect fCullRect; + const size_t fApproxBytesUsedBySubPictures; + sk_sp<const SkRecord> fRecord; + std::unique_ptr<const SnapshotArray> fDrawablePicts; + sk_sp<const SkBBoxHierarchy> fBBH; +}; + +#endif//SkBigPicture_DEFINED |