| Index: src/core/SkPictureRecorder.cpp
|
| diff --git a/src/core/SkPictureRecorder.cpp b/src/core/SkPictureRecorder.cpp
|
| index 282e2c22dde20025b8d9e50da90cb32e6f1775cd..c110e0a2db3e9b8b9282a841224478fa74054850 100644
|
| --- a/src/core/SkPictureRecorder.cpp
|
| +++ b/src/core/SkPictureRecorder.cpp
|
| @@ -5,6 +5,7 @@
|
| * found in the LICENSE file.
|
| */
|
|
|
| +#include "SkBigPicture.h"
|
| #include "SkData.h"
|
| #include "SkDrawable.h"
|
| #include "SkLayerInfo.h"
|
| @@ -18,7 +19,7 @@
|
|
|
| SkPictureRecorder::SkPictureRecorder() {
|
| fActivelyRecording = false;
|
| - fRecorder.reset(SkNEW_ARGS(SkRecorder, (nullptr, SkRect::MakeWH(0,0))));
|
| + fRecorder.reset(SkNEW_ARGS(SkRecorder, (nullptr, SkRect::MakeWH(0,0), &fMiniRecorder)));
|
| }
|
|
|
| SkPictureRecorder::~SkPictureRecorder() {}
|
| @@ -34,8 +35,10 @@ SkCanvas* SkPictureRecorder::beginRecording(const SkRect& cullRect,
|
| SkASSERT(fBBH.get());
|
| }
|
|
|
| - fRecord.reset(SkNEW(SkRecord));
|
| - fRecorder->reset(fRecord.get(), cullRect);
|
| + if (!fRecord) {
|
| + fRecord.reset(SkNEW(SkRecord));
|
| + }
|
| + fRecorder->reset(fRecord.get(), cullRect, &fMiniRecorder);
|
| fActivelyRecording = true;
|
| return this->getRecordingCanvas();
|
| }
|
| @@ -47,19 +50,23 @@ SkCanvas* SkPictureRecorder::getRecordingCanvas() {
|
| SkPicture* SkPictureRecorder::endRecordingAsPicture() {
|
| fActivelyRecording = false;
|
| fRecorder->restoreToCount(1); // If we were missing any restores, add them now.
|
| +
|
| + if (fRecord->count() == 0) {
|
| + return fMiniRecorder.detachAsPicture(fCullRect);
|
| + }
|
| +
|
| // TODO: delay as much of this work until just before first playback?
|
| SkRecordOptimize(fRecord);
|
|
|
| SkAutoTUnref<SkLayerInfo> saveLayerData;
|
|
|
| if (fBBH && (fFlags & kComputeSaveLayerInfo_RecordFlag)) {
|
| - SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey();
|
| -
|
| - saveLayerData.reset(SkNEW_ARGS(SkLayerInfo, (key)));
|
| + saveLayerData.reset(SkNEW(SkLayerInfo));
|
| }
|
|
|
| SkDrawableList* drawableList = fRecorder->getDrawableList();
|
| - SkPicture::SnapshotArray* pictList = drawableList ? drawableList->newDrawableSnapshot() : NULL;
|
| + SkBigPicture::SnapshotArray* pictList =
|
| + drawableList ? drawableList->newDrawableSnapshot() : NULL;
|
|
|
| if (fBBH.get()) {
|
| if (saveLayerData) {
|
| @@ -77,12 +84,12 @@ SkPicture* SkPictureRecorder::endRecordingAsPicture() {
|
| for (int i = 0; pictList && i < pictList->count(); i++) {
|
| subPictureBytes += SkPictureUtils::ApproximateBytesUsed(pictList->begin()[i]);
|
| }
|
| - return SkNEW_ARGS(SkPicture, (fCullRect,
|
| - fRecord.detach(),
|
| - pictList,
|
| - fBBH.detach(),
|
| - saveLayerData.detach(),
|
| - subPictureBytes));
|
| + return SkNEW_ARGS(SkBigPicture, (fCullRect,
|
| + fRecord.detach(),
|
| + pictList,
|
| + fBBH.detach(),
|
| + saveLayerData.detach(),
|
| + subPictureBytes));
|
| }
|
|
|
| void SkPictureRecorder::partialReplay(SkCanvas* canvas) const {
|
| @@ -133,7 +140,7 @@ protected:
|
| }
|
|
|
| SkPicture* onNewPictureSnapshot() override {
|
| - SkPicture::SnapshotArray* pictList = NULL;
|
| + SkBigPicture::SnapshotArray* pictList = NULL;
|
| if (fDrawableList) {
|
| // TODO: should we plumb-down the BBHFactory and recordFlags from our host
|
| // PictureRecorder?
|
| @@ -143,9 +150,7 @@ protected:
|
| SkAutoTUnref<SkLayerInfo> saveLayerData;
|
|
|
| if (fBBH && fDoSaveLayerInfo) {
|
| - SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey();
|
| -
|
| - saveLayerData.reset(SkNEW_ARGS(SkLayerInfo, (key)));
|
| + saveLayerData.reset(SkNEW(SkLayerInfo));
|
|
|
| SkBBoxHierarchy* bbh = NULL; // we've already computed fBBH (received in constructor)
|
| // TODO: update saveLayer info computation to reuse the already computed
|
| @@ -157,20 +162,22 @@ protected:
|
| for (int i = 0; pictList && i < pictList->count(); i++) {
|
| subPictureBytes += SkPictureUtils::ApproximateBytesUsed(pictList->begin()[i]);
|
| }
|
| - // SkPicture will take ownership of a ref on both fRecord and fBBH.
|
| + // SkBigPicture will take ownership of a ref on both fRecord and fBBH.
|
| // We're not willing to give up our ownership, so we must ref them for SkPicture.
|
| - return SkNEW_ARGS(SkPicture, (fBounds,
|
| - SkRef(fRecord.get()),
|
| - pictList,
|
| - SkSafeRef(fBBH.get()),
|
| - saveLayerData.detach(),
|
| - subPictureBytes));
|
| + return SkNEW_ARGS(SkBigPicture, (fBounds,
|
| + SkRef(fRecord.get()),
|
| + pictList,
|
| + SkSafeRef(fBBH.get()),
|
| + saveLayerData.detach(),
|
| + subPictureBytes));
|
| }
|
| };
|
|
|
| SkDrawable* SkPictureRecorder::endRecordingAsDrawable() {
|
| fActivelyRecording = false;
|
| + fRecorder->flushMiniRecorder();
|
| fRecorder->restoreToCount(1); // If we were missing any restores, add them now.
|
| +
|
| // TODO: delay as much of this work until just before first playback?
|
| SkRecordOptimize(fRecord);
|
|
|
|
|