| Index: src/core/SkPicture.cpp
|
| diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp
|
| index e2514c67d6e858fa8fd4d6f4227a1df4d9f6031b..4c97cb71b93e9d76ab455f766582e03b2120c6e1 100644
|
| --- a/src/core/SkPicture.cpp
|
| +++ b/src/core/SkPicture.cpp
|
| @@ -257,6 +257,21 @@ bool SkPicture::Analysis::suitableForGpuRasterization(const char** reason,
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| +int SkPicture::drawableCount() const {
|
| + if (fDrawablePicts.get()) {
|
| + return SkToInt(fDrawablePicts->size() / sizeof(SkPicture*));
|
| + } else {
|
| + return 0;
|
| + }
|
| +}
|
| +
|
| +SkPicture const* const* SkPicture::drawablePicts() const {
|
| + if (fDrawablePicts) {
|
| + return reinterpret_cast<SkPicture* const*>(fDrawablePicts->data());
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| SkPicture::~SkPicture() {
|
| this->callDeletionListeners();
|
| }
|
| @@ -294,7 +309,8 @@ void SkPicture::playback(SkCanvas* canvas, SkDrawPictureCallback* callback) cons
|
| (void)canvas->getClipBounds(&clipBounds);
|
| const bool useBBH = !clipBounds.contains(this->cullRect());
|
|
|
| - SkRecordDraw(*fRecord, canvas, useBBH ? fBBH.get() : NULL, callback);
|
| + SkRecordDraw(*fRecord, canvas, this->drawablePicts(), this->drawableCount(),
|
| + useBBH ? fBBH.get() : NULL, callback);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -444,19 +460,20 @@ void SkPicture::createHeader(SkPictInfo* info) const {
|
| }
|
|
|
| // This for compatibility with serialization code only. This is not cheap.
|
| -SkPictureData* SkPicture::Backport(const SkRecord& src, const SkPictInfo& info) {
|
| +SkPictureData* SkPicture::Backport(const SkRecord& src, const SkPictInfo& info,
|
| + SkPicture const* const drawablePicts[], int drawableCount) {
|
| SkPictureRecord rec(SkISize::Make(info.fCullRect.width(), info.fCullRect.height()), 0/*flags*/);
|
| rec.beginRecording();
|
| - SkRecordDraw(src, &rec, NULL/*bbh*/, NULL/*callback*/);
|
| + SkRecordDraw(src, &rec, drawablePicts, drawableCount, NULL/*bbh*/, NULL/*callback*/);
|
| rec.endRecording();
|
| return SkNEW_ARGS(SkPictureData, (rec, info, false/*deep copy ops?*/));
|
| }
|
|
|
| -
|
| void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const {
|
| SkPictInfo info;
|
| this->createHeader(&info);
|
| - SkAutoTDelete<SkPictureData> data(Backport(*fRecord, info));
|
| + SkAutoTDelete<SkPictureData> data(Backport(*fRecord, info, this->drawablePicts(),
|
| + this->drawableCount()));
|
|
|
| stream->write(&info, sizeof(info));
|
| if (data) {
|
| @@ -470,7 +487,8 @@ void SkPicture::serialize(SkWStream* stream, EncodeBitmap encoder) const {
|
| void SkPicture::flatten(SkWriteBuffer& buffer) const {
|
| SkPictInfo info;
|
| this->createHeader(&info);
|
| - SkAutoTDelete<SkPictureData> data(Backport(*fRecord, info));
|
| + SkAutoTDelete<SkPictureData> data(Backport(*fRecord, info, this->drawablePicts(),
|
| + this->drawableCount()));
|
|
|
| buffer.writeByteArray(&info.fMagic, sizeof(info.fMagic));
|
| buffer.writeUInt(info.fVersion);
|
| @@ -512,11 +530,13 @@ uint32_t SkPicture::uniqueID() const {
|
| return fUniqueID;
|
| }
|
|
|
| -SkPicture::SkPicture(SkScalar width, SkScalar height, SkRecord* record, SkBBoxHierarchy* bbh)
|
| +SkPicture::SkPicture(SkScalar width, SkScalar height, SkRecord* record, SkData* drawablePicts,
|
| + SkBBoxHierarchy* bbh)
|
| : fCullWidth(width)
|
| , fCullHeight(height)
|
| , fRecord(record)
|
| , fBBH(SkSafeRef(bbh))
|
| + , fDrawablePicts(SkSafeRef(drawablePicts))
|
| , fAnalysis(*fRecord) {
|
| this->needsNewGenID();
|
| }
|
|
|