| Index: src/core/SkPictureRecorder.cpp
|
| diff --git a/src/core/SkPictureRecorder.cpp b/src/core/SkPictureRecorder.cpp
|
| index a157d0dfe0a5bd76b4159a853498d6f560e3e9ea..b6bb34d5b451d3ef87d7d169fff71d36f1ac0789 100644
|
| --- a/src/core/SkPictureRecorder.cpp
|
| +++ b/src/core/SkPictureRecorder.cpp
|
| @@ -14,7 +14,6 @@
|
| #include "SkRecord.h"
|
| #include "SkRecordDraw.h"
|
| #include "SkRecordOpts.h"
|
| -#include "SkRecordedDrawable.h"
|
| #include "SkRecorder.h"
|
| #include "SkTypes.h"
|
|
|
| @@ -118,6 +117,66 @@
|
| SkRecordDraw(*fRecord, canvas, nullptr, drawables, drawableCount, nullptr/*bbh*/, nullptr/*callback*/);
|
| }
|
|
|
| +///////////////////////////////////////////////////////////////////////////////////////////////////
|
| +
|
| +class SkRecordedDrawable : public SkDrawable {
|
| + SkAutoTUnref<SkRecord> fRecord;
|
| + SkAutoTUnref<SkBBoxHierarchy> fBBH;
|
| + SkAutoTDelete<SkDrawableList> fDrawableList;
|
| + const SkRect fBounds;
|
| + const bool fDoSaveLayerInfo;
|
| +
|
| +public:
|
| + SkRecordedDrawable(SkRecord* record, SkBBoxHierarchy* bbh, SkDrawableList* drawableList,
|
| + const SkRect& bounds, bool doSaveLayerInfo)
|
| + : fRecord(SkRef(record))
|
| + , fBBH(SkSafeRef(bbh))
|
| + , fDrawableList(drawableList) // we take ownership
|
| + , fBounds(bounds)
|
| + , fDoSaveLayerInfo(doSaveLayerInfo)
|
| + {}
|
| +
|
| +protected:
|
| + SkRect onGetBounds() override { return fBounds; }
|
| +
|
| + void onDraw(SkCanvas* canvas) override {
|
| + SkDrawable* const* drawables = nullptr;
|
| + int drawableCount = 0;
|
| + if (fDrawableList) {
|
| + drawables = fDrawableList->begin();
|
| + drawableCount = fDrawableList->count();
|
| + }
|
| + SkRecordDraw(*fRecord, canvas, nullptr, drawables, drawableCount, fBBH, nullptr/*callback*/);
|
| + }
|
| +
|
| + SkPicture* onNewPictureSnapshot() override {
|
| + SkBigPicture::SnapshotArray* pictList = nullptr;
|
| + if (fDrawableList) {
|
| + // TODO: should we plumb-down the BBHFactory and recordFlags from our host
|
| + // PictureRecorder?
|
| + pictList = fDrawableList->newDrawableSnapshot();
|
| + }
|
| +
|
| + SkAutoTUnref<SkLayerInfo> saveLayerData;
|
| + if (fBBH && fDoSaveLayerInfo) {
|
| + // TODO: can we avoid work by not allocating / filling these bounds?
|
| + SkAutoTMalloc<SkRect> scratchBounds(fRecord->count());
|
| + saveLayerData.reset(new SkLayerInfo);
|
| +
|
| + SkRecordComputeLayers(fBounds, *fRecord, scratchBounds, pictList, saveLayerData);
|
| + }
|
| +
|
| + size_t subPictureBytes = 0;
|
| + for (int i = 0; pictList && i < pictList->count(); i++) {
|
| + subPictureBytes += SkPictureUtils::ApproximateBytesUsed(pictList->begin()[i]);
|
| + }
|
| + // 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 new SkBigPicture(fBounds, SkRef(fRecord.get()), pictList, SkSafeRef(fBBH.get()),
|
| + saveLayerData.release(), subPictureBytes);
|
| + }
|
| +};
|
| +
|
| sk_sp<SkDrawable> SkPictureRecorder::finishRecordingAsDrawable() {
|
| fActivelyRecording = false;
|
| fRecorder->flushMiniRecorder();
|
|
|