xref: /aosp_15_r20/external/skia/src/core/SkBigPicture.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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 #include "src/core/SkBigPicture.h"
9 
10 #include "include/core/SkBBHFactory.h"
11 #include "include/core/SkCanvas.h"
12 #include "include/private/base/SkAssert.h"
13 #include "src/core/SkRecord.h"
14 #include "src/core/SkRecordDraw.h"
15 #include "src/core/SkRecords.h"
16 
17 #include <utility>
18 
SkBigPicture(const SkRect & cull,sk_sp<SkRecord> record,std::unique_ptr<SnapshotArray> drawablePicts,sk_sp<SkBBoxHierarchy> bbh,size_t approxBytesUsedBySubPictures)19 SkBigPicture::SkBigPicture(const SkRect& cull,
20                            sk_sp<SkRecord> record,
21                            std::unique_ptr<SnapshotArray> drawablePicts,
22                            sk_sp<SkBBoxHierarchy> bbh,
23                            size_t approxBytesUsedBySubPictures)
24     : fCullRect(cull)
25     , fApproxBytesUsedBySubPictures(approxBytesUsedBySubPictures)
26     , fRecord(std::move(record))
27     , fDrawablePicts(std::move(drawablePicts))
28     , fBBH(std::move(bbh))
29 {}
30 
playback(SkCanvas * canvas,AbortCallback * callback) const31 void SkBigPicture::playback(SkCanvas* canvas, AbortCallback* callback) const {
32     SkASSERT(canvas);
33 
34     // If the query contains the whole picture, don't bother with the BBH.
35     const bool useBBH = !canvas->getLocalClipBounds().contains(this->cullRect());
36 
37     SkRecordDraw(*fRecord,
38                  canvas,
39                  this->drawablePicts(),
40                  nullptr,
41                  this->drawableCount(),
42                  useBBH ? fBBH.get() : nullptr,
43                  callback);
44 }
45 
46 struct NestedApproxOpCounter {
47     int fCount = 0;
48 
operator ()NestedApproxOpCounter49     template <typename T> void operator()(const T& op) {
50         fCount += 1;
51     }
operator ()NestedApproxOpCounter52     void operator()(const SkRecords::DrawPicture& op) {
53         fCount += op.picture->approximateOpCount(true);
54     }
55 };
56 
cullRect() const57 SkRect SkBigPicture::cullRect()            const { return fCullRect; }
approximateOpCount(bool nested) const58 int SkBigPicture::approximateOpCount(bool nested) const {
59     if (nested) {
60         NestedApproxOpCounter visitor;
61         for (int i = 0; i < fRecord->count(); i++) {
62             fRecord->visit(i, visitor);
63         }
64         return visitor.fCount;
65     } else {
66         return fRecord->count();
67     }
68 }
approximateBytesUsed() const69 size_t SkBigPicture::approximateBytesUsed() const {
70     size_t bytes = sizeof(*this) + fRecord->bytesUsed() + fApproxBytesUsedBySubPictures;
71     if (fBBH) { bytes += fBBH->bytesUsed(); }
72     return bytes;
73 }
74 
drawableCount() const75 int SkBigPicture::drawableCount() const {
76     return fDrawablePicts ? fDrawablePicts->count() : 0;
77 }
78 
drawablePicts() const79 SkPicture const* const* SkBigPicture::drawablePicts() const {
80     return fDrawablePicts ? fDrawablePicts->begin() : nullptr;
81 }
82 
83