Index: src/core/SkBigPicture.cpp |
diff --git a/src/core/SkBigPicture.cpp b/src/core/SkBigPicture.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6609586ca2a4907849e63988436cd1366f159f18 |
--- /dev/null |
+++ b/src/core/SkBigPicture.cpp |
@@ -0,0 +1,98 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkBBoxHierarchy.h" |
+#include "SkBigPicture.h" |
+#include "SkPictureCommon.h" |
+#include "SkRecord.h" |
+#include "SkRecordDraw.h" |
+ |
+SkBigPicture::SkBigPicture(const SkRect& cull, |
+ SkRecord* record, |
+ SnapshotArray* drawablePicts, |
+ SkBBoxHierarchy* bbh, |
+ AccelData* accelData, |
+ size_t approxBytesUsedBySubPictures) |
+ : fCullRect(cull) |
+ , fApproxBytesUsedBySubPictures(approxBytesUsedBySubPictures) |
+ , fRecord(record) // Take ownership of caller's ref. |
+ , fDrawablePicts(drawablePicts) // Take ownership. |
+ , fBBH(bbh) // Take ownership of caller's ref. |
+ , fAccelData(accelData) // Take ownership of caller's ref. |
+{} |
+ |
+void SkBigPicture::playback(SkCanvas* canvas, AbortCallback* callback) const { |
+ SkASSERT(canvas); |
+ |
+ // If the query contains the whole picture, don't bother with the BBH. |
+ SkRect clipBounds = { 0, 0, 0, 0 }; |
+ (void)canvas->getClipBounds(&clipBounds); |
+ const bool useBBH = !clipBounds.contains(this->cullRect()); |
+ |
+ SkRecordDraw(*fRecord, |
+ canvas, |
+ this->drawablePicts(), |
+ nullptr, |
+ this->drawableCount(), |
+ useBBH ? fBBH.get() : nullptr, |
+ callback); |
+} |
+ |
+void SkBigPicture::partialPlayback(SkCanvas* canvas, |
+ unsigned start, |
+ unsigned stop, |
+ const SkMatrix& initialCTM) const { |
+ SkASSERT(canvas); |
+ SkRecordPartialDraw(*fRecord, |
+ canvas, |
+ this->drawablePicts(), |
+ this->drawableCount(), |
+ start, |
+ stop, |
+ initialCTM); |
+} |
+ |
+const SkBigPicture::Analysis& SkBigPicture::analysis() const { |
+ auto create = [&]() { return SkNEW_ARGS(Analysis, (*fRecord)); }; |
+ return *fAnalysis.get(create); |
+} |
+ |
+SkRect SkBigPicture::cullRect() const { return fCullRect; } |
+bool SkBigPicture::hasText() const { return this->analysis().fHasText; } |
+bool SkBigPicture::willPlayBackBitmaps() const { return this->analysis().fWillPlaybackBitmaps; } |
+int SkBigPicture::numSlowPaths() const { return this->analysis().fNumSlowPathsAndDashEffects; } |
+int SkBigPicture::approximateOpCount() const { return fRecord->count(); } |
+size_t SkBigPicture::approximateBytesUsed() const { |
+ size_t bytes = sizeof(*this) + fRecord->bytesUsed() + fApproxBytesUsedBySubPictures; |
+ if (fBBH) { bytes += fBBH->bytesUsed(); } |
+ return bytes; |
+} |
+ |
+int SkBigPicture::drawableCount() const { |
+ return fDrawablePicts ? fDrawablePicts->count() : 0; |
+} |
+ |
+SkPicture const* const* SkBigPicture::drawablePicts() const { |
+ return fDrawablePicts ? fDrawablePicts->begin() : nullptr; |
+} |
+ |
+SkBigPicture::Analysis::Analysis(const SkRecord& record) { |
+ SkTextHunter text; |
+ SkBitmapHunter bitmap; |
+ SkPathCounter path; |
+ |
+ bool hasText = false, hasBitmap = false; |
+ for (unsigned i = 0; i < record.count(); i++) { |
+ hasText = hasText || record.visit<bool>(i, text); |
+ hasBitmap = hasBitmap || record.visit<bool>(i, bitmap); |
+ record.visit<void>(i, path); |
+ } |
+ |
+ fHasText = hasText; |
+ fWillPlaybackBitmaps = hasBitmap; |
+ fNumSlowPathsAndDashEffects = SkTMin<int>(path.fNumSlowPathsAndDashEffects, 255); |
+} |