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 "SkBBoxHierarchy.h" 9#include "SkBigPicture.h" 10#include "SkPictureCommon.h" 11#include "SkRecord.h" 12#include "SkRecordDraw.h" 13#include "SkTraceEvent.h" 14 15SkBigPicture::SkBigPicture(const SkRect& cull, 16 SkRecord* record, 17 SnapshotArray* drawablePicts, 18 SkBBoxHierarchy* bbh, 19 size_t approxBytesUsedBySubPictures) 20 : fCullRect(cull) 21 , fApproxBytesUsedBySubPictures(approxBytesUsedBySubPictures) 22 , fRecord(record) // Take ownership of caller's ref. 23 , fDrawablePicts(drawablePicts) // Take ownership. 24 , fBBH(bbh) // Take ownership of caller's ref. 25{} 26 27void SkBigPicture::playback(SkCanvas* canvas, AbortCallback* callback) const { 28 SkASSERT(canvas); 29 30 // If the query contains the whole picture, don't bother with the BBH. 31 const bool useBBH = !canvas->getLocalClipBounds().contains(this->cullRect()); 32 33 SkRecordDraw(*fRecord, 34 canvas, 35 this->drawablePicts(), 36 nullptr, 37 this->drawableCount(), 38 useBBH ? fBBH.get() : nullptr, 39 callback); 40} 41 42void SkBigPicture::partialPlayback(SkCanvas* canvas, 43 int start, 44 int stop, 45 const SkMatrix& initialCTM) const { 46 SkASSERT(canvas); 47 SkRecordPartialDraw(*fRecord, 48 canvas, 49 this->drawablePicts(), 50 this->drawableCount(), 51 start, 52 stop, 53 initialCTM); 54} 55 56const SkBigPicture::Analysis& SkBigPicture::analysis() const { 57 fAnalysisOnce([this] { fAnalysis.init(*fRecord); }); 58 return fAnalysis; 59} 60 61SkRect SkBigPicture::cullRect() const { return fCullRect; } 62bool SkBigPicture::willPlayBackBitmaps() const { return this->analysis().fWillPlaybackBitmaps; } 63int SkBigPicture::numSlowPaths() const { return this->analysis().fNumSlowPathsAndDashEffects; } 64int SkBigPicture::approximateOpCount() const { return fRecord->count(); } 65size_t SkBigPicture::approximateBytesUsed() const { 66 size_t bytes = sizeof(*this) + fRecord->bytesUsed() + fApproxBytesUsedBySubPictures; 67 if (fBBH) { bytes += fBBH->bytesUsed(); } 68 return bytes; 69} 70 71int SkBigPicture::drawableCount() const { 72 return fDrawablePicts ? fDrawablePicts->count() : 0; 73} 74 75SkPicture const* const* SkBigPicture::drawablePicts() const { 76 return fDrawablePicts ? fDrawablePicts->begin() : nullptr; 77} 78 79void SkBigPicture::Analysis::init(const SkRecord& record) { 80 TRACE_EVENT0("disabled-by-default-skia", "SkBigPicture::Analysis::init()"); 81 SkBitmapHunter bitmap; 82 SkPathCounter path; 83 84 bool hasBitmap = false; 85 for (int i = 0; i < record.count(); i++) { 86 hasBitmap = hasBitmap || record.visit(i, bitmap); 87 record.visit(i, path); 88 } 89 90 fWillPlaybackBitmaps = hasBitmap; 91 fNumSlowPathsAndDashEffects = SkTMin<int>(path.fNumSlowPathsAndDashEffects, 255); 92} 93