1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkBBHFactory.h" 9cb93a386Sopenharmony_ci#include "src/core/SkBigPicture.h" 10cb93a386Sopenharmony_ci#include "src/core/SkPictureCommon.h" 11cb93a386Sopenharmony_ci#include "src/core/SkRecord.h" 12cb93a386Sopenharmony_ci#include "src/core/SkRecordDraw.h" 13cb93a386Sopenharmony_ci#include "src/core/SkTraceEvent.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ciSkBigPicture::SkBigPicture(const SkRect& cull, 16cb93a386Sopenharmony_ci sk_sp<SkRecord> record, 17cb93a386Sopenharmony_ci std::unique_ptr<SnapshotArray> drawablePicts, 18cb93a386Sopenharmony_ci sk_sp<SkBBoxHierarchy> bbh, 19cb93a386Sopenharmony_ci size_t approxBytesUsedBySubPictures) 20cb93a386Sopenharmony_ci : fCullRect(cull) 21cb93a386Sopenharmony_ci , fApproxBytesUsedBySubPictures(approxBytesUsedBySubPictures) 22cb93a386Sopenharmony_ci , fRecord(std::move(record)) 23cb93a386Sopenharmony_ci , fDrawablePicts(std::move(drawablePicts)) 24cb93a386Sopenharmony_ci , fBBH(std::move(bbh)) 25cb93a386Sopenharmony_ci{} 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_civoid SkBigPicture::playback(SkCanvas* canvas, AbortCallback* callback) const { 28cb93a386Sopenharmony_ci SkASSERT(canvas); 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci // If the query contains the whole picture, don't bother with the BBH. 31cb93a386Sopenharmony_ci const bool useBBH = !canvas->getLocalClipBounds().contains(this->cullRect()); 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci SkRecordDraw(*fRecord, 34cb93a386Sopenharmony_ci canvas, 35cb93a386Sopenharmony_ci this->drawablePicts(), 36cb93a386Sopenharmony_ci nullptr, 37cb93a386Sopenharmony_ci this->drawableCount(), 38cb93a386Sopenharmony_ci useBBH ? fBBH.get() : nullptr, 39cb93a386Sopenharmony_ci callback); 40cb93a386Sopenharmony_ci} 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_civoid SkBigPicture::partialPlayback(SkCanvas* canvas, 43cb93a386Sopenharmony_ci int start, 44cb93a386Sopenharmony_ci int stop, 45cb93a386Sopenharmony_ci const SkM44& initialCTM) const { 46cb93a386Sopenharmony_ci SkASSERT(canvas); 47cb93a386Sopenharmony_ci SkRecordPartialDraw(*fRecord, 48cb93a386Sopenharmony_ci canvas, 49cb93a386Sopenharmony_ci this->drawablePicts(), 50cb93a386Sopenharmony_ci this->drawableCount(), 51cb93a386Sopenharmony_ci start, 52cb93a386Sopenharmony_ci stop, 53cb93a386Sopenharmony_ci initialCTM); 54cb93a386Sopenharmony_ci} 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_cistruct NestedApproxOpCounter { 57cb93a386Sopenharmony_ci int fCount = 0; 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci template <typename T> void operator()(const T& op) { 60cb93a386Sopenharmony_ci fCount += 1; 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci void operator()(const SkRecords::DrawPicture& op) { 63cb93a386Sopenharmony_ci fCount += op.picture->approximateOpCount(true); 64cb93a386Sopenharmony_ci } 65cb93a386Sopenharmony_ci}; 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ciSkRect SkBigPicture::cullRect() const { return fCullRect; } 68cb93a386Sopenharmony_ciint SkBigPicture::approximateOpCount(bool nested) const { 69cb93a386Sopenharmony_ci if (nested) { 70cb93a386Sopenharmony_ci NestedApproxOpCounter visitor; 71cb93a386Sopenharmony_ci for (int i = 0; i < fRecord->count(); i++) { 72cb93a386Sopenharmony_ci fRecord->visit(i, visitor); 73cb93a386Sopenharmony_ci } 74cb93a386Sopenharmony_ci return visitor.fCount; 75cb93a386Sopenharmony_ci } else { 76cb93a386Sopenharmony_ci return fRecord->count(); 77cb93a386Sopenharmony_ci } 78cb93a386Sopenharmony_ci} 79cb93a386Sopenharmony_cisize_t SkBigPicture::approximateBytesUsed() const { 80cb93a386Sopenharmony_ci size_t bytes = sizeof(*this) + fRecord->bytesUsed() + fApproxBytesUsedBySubPictures; 81cb93a386Sopenharmony_ci if (fBBH) { bytes += fBBH->bytesUsed(); } 82cb93a386Sopenharmony_ci return bytes; 83cb93a386Sopenharmony_ci} 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ciint SkBigPicture::drawableCount() const { 86cb93a386Sopenharmony_ci return fDrawablePicts ? fDrawablePicts->count() : 0; 87cb93a386Sopenharmony_ci} 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ciSkPicture const* const* SkBigPicture::drawablePicts() const { 90cb93a386Sopenharmony_ci return fDrawablePicts ? fDrawablePicts->begin() : nullptr; 91cb93a386Sopenharmony_ci} 92cb93a386Sopenharmony_ci 93