1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkBigPicture_DEFINED
9 #define SkBigPicture_DEFINED
10 
11 #include "include/core/SkM44.h"
12 #include "include/core/SkPicture.h"
13 #include "include/core/SkRect.h"
14 #include "include/private/SkNoncopyable.h"
15 #include "include/private/SkOnce.h"
16 #include "include/private/SkTemplates.h"
17 
18 class SkBBoxHierarchy;
19 class SkMatrix;
20 class SkRecord;
21 
22 // An implementation of SkPicture supporting an arbitrary number of drawing commands.
23 class SkBigPicture final : public SkPicture {
24 public:
25     // An array of refcounted const SkPicture pointers.
26     class SnapshotArray : ::SkNoncopyable {
27     public:
SnapshotArray(const SkPicture * pics[],int count)28         SnapshotArray(const SkPicture* pics[], int count) : fPics(pics), fCount(count) {}
~SnapshotArray()29         ~SnapshotArray() { for (int i = 0; i < fCount; i++) { fPics[i]->unref(); } }
30 
begin()31         const SkPicture* const* begin() const { return fPics; }
count()32         int count() const { return fCount; }
33     private:
34         SkAutoTMalloc<const SkPicture*> fPics;
35         int fCount;
36     };
37 
38     SkBigPicture(const SkRect& cull,
39                  sk_sp<SkRecord>,
40                  std::unique_ptr<SnapshotArray>,
41                  sk_sp<SkBBoxHierarchy>,
42                  size_t approxBytesUsedBySubPictures);
43 
44 
45 // SkPicture overrides
46     void playback(SkCanvas*, AbortCallback*) const override;
47     SkRect cullRect() const override;
48     int approximateOpCount(bool nested) const override;
49     size_t approximateBytesUsed() const override;
asSkBigPicture()50     const SkBigPicture* asSkBigPicture() const override { return this; }
51 
52 // Used by GrLayerHoister
53     void partialPlayback(SkCanvas*,
54                          int start,
55                          int stop,
56                          const SkM44& initialCTM) const;
57 // Used by GrRecordReplaceDraw
bbh()58     const SkBBoxHierarchy* bbh() const { return fBBH.get(); }
record()59     const SkRecord*     record() const { return fRecord.get(); }
60 
61 private:
62     int drawableCount() const;
63     SkPicture const* const* drawablePicts() const;
64 
65     const SkRect                         fCullRect;
66     const size_t                         fApproxBytesUsedBySubPictures;
67     sk_sp<const SkRecord>                fRecord;
68     std::unique_ptr<const SnapshotArray> fDrawablePicts;
69     sk_sp<const SkBBoxHierarchy>         fBBH;
70 };
71 
72 #endif//SkBigPicture_DEFINED
73