| Index: src/core/SkRecordDraw.cpp
|
| diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp
|
| index 7e35d8a2c7da87867c84079fd19d72ef007c5cbb..5e1fe7f0aa955bff31955a5755861586df5ac79e 100644
|
| --- a/src/core/SkRecordDraw.cpp
|
| +++ b/src/core/SkRecordDraw.cpp
|
| @@ -11,7 +11,9 @@
|
|
|
| void SkRecordDraw(const SkRecord& record,
|
| SkCanvas* canvas,
|
| - SkPicture const* const drawablePicts[], int drawableCount,
|
| + SkPicture const* const drawablePicts[],
|
| + SkCanvasDrawable* const drawables[],
|
| + int drawableCount,
|
| const SkBBoxHierarchy* bbh,
|
| SkDrawPictureCallback* callback) {
|
| SkAutoCanvasRestore saveRestore(canvas, true /*save now, restore at exit*/);
|
| @@ -32,7 +34,7 @@ void SkRecordDraw(const SkRecord& record,
|
| SkTDArray<unsigned> ops;
|
| bbh->search(query, &ops);
|
|
|
| - SkRecords::Draw draw(canvas, drawablePicts, drawableCount);
|
| + SkRecords::Draw draw(canvas, drawablePicts, drawables, drawableCount);
|
| for (int i = 0; i < ops.count(); i++) {
|
| if (callback && callback->abortDrawing()) {
|
| return;
|
| @@ -44,7 +46,7 @@ void SkRecordDraw(const SkRecord& record,
|
| }
|
| } else {
|
| // Draw all ops.
|
| - SkRecords::Draw draw(canvas, drawablePicts, drawableCount);
|
| + SkRecords::Draw draw(canvas, drawablePicts, drawables, drawableCount);
|
| for (unsigned i = 0; i < record.count(); i++) {
|
| if (callback && callback->abortDrawing()) {
|
| return;
|
| @@ -133,7 +135,12 @@ DRAW(DrawData, drawData(r.data, r.length));
|
| template <> void Draw::draw(const DrawDrawable& r) {
|
| SkASSERT(r.index >= 0);
|
| SkASSERT(r.index < fDrawableCount);
|
| - fCanvas->drawPicture(fDrawablePicts[r.index]);
|
| + if (fDrawables) {
|
| + SkASSERT(NULL == fDrawablePicts);
|
| + fCanvas->EXPERIMENTAL_drawDrawable(fDrawables[r.index]);
|
| + } else {
|
| + fCanvas->drawPicture(fDrawablePicts[r.index]);
|
| + }
|
| }
|
|
|
| // This is an SkRecord visitor that fills an SkBBoxHierarchy.
|
| @@ -159,7 +166,8 @@ public:
|
| FillBounds(const SkRect& cullRect, const SkRecord& record)
|
| : fNumRecords(record.count())
|
| , fCullRect(cullRect)
|
| - , fBounds(record.count()) {
|
| + , fBounds(record.count())
|
| + {
|
| // Calculate bounds for all ops. This won't go quite in order, so we'll need
|
| // to store the bounds separately then feed them in to the BBH later in order.
|
| fCTM = &SkMatrix::I();
|
| @@ -591,11 +599,13 @@ private:
|
| // SkRecord visitor to gather saveLayer/restore information.
|
| class CollectLayers : SkNoncopyable {
|
| public:
|
| - CollectLayers(const SkRect& cullRect, const SkRecord& record, SkLayerInfo* accelData)
|
| + CollectLayers(const SkRect& cullRect, const SkRecord& record,
|
| + const SkPicture::SnapshotArray* pictList, SkLayerInfo* accelData)
|
| : fSaveLayersInStack(0)
|
| , fAccelData(accelData)
|
| - , fFillBounds(cullRect, record) {
|
| - }
|
| + , fPictList(pictList)
|
| + , fFillBounds(cullRect, record)
|
| + {}
|
|
|
| void setCurrentOp(unsigned currentOp) { fFillBounds.setCurrentOp(currentOp); }
|
|
|
| @@ -638,13 +648,13 @@ private:
|
| void trackSaveLayers(const SaveLayer& sl) { this->pushSaveLayerInfo(true, sl.paint); }
|
| void trackSaveLayers(const Restore& r) { this->popSaveLayerInfo(); }
|
|
|
| - void trackSaveLayers(const DrawPicture& dp) {
|
| + void trackSaveLayersForPicture(const SkPicture* picture, const SkPaint* paint) {
|
| // For sub-pictures, we wrap their layer information within the parent
|
| // picture's rendering hierarchy
|
| SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey();
|
|
|
| const SkLayerInfo* childData =
|
| - static_cast<const SkLayerInfo*>(dp.picture->EXPERIMENTAL_getAccelData(key));
|
| + static_cast<const SkLayerInfo*>(picture->EXPERIMENTAL_getAccelData(key));
|
| if (!childData) {
|
| // If the child layer hasn't been generated with saveLayer data we
|
| // assume the worst (i.e., that it does contain layers which nest
|
| @@ -658,7 +668,7 @@ private:
|
| for (int i = 0; i < childData->numBlocks(); ++i) {
|
| const SkLayerInfo::BlockInfo& src = childData->block(i);
|
|
|
| - FillBounds::Bounds newBound = fFillBounds.adjustAndMap(src.fBounds, dp.paint);
|
| + FillBounds::Bounds newBound = fFillBounds.adjustAndMap(src.fBounds, paint);
|
| if (newBound.isEmpty()) {
|
| continue;
|
| }
|
| @@ -669,7 +679,7 @@ private:
|
|
|
| // If src.fPicture is NULL the layer is in dp.picture; otherwise
|
| // it belongs to a sub-picture.
|
| - dst.fPicture = src.fPicture ? src.fPicture : static_cast<const SkPicture*>(dp.picture);
|
| + dst.fPicture = src.fPicture ? src.fPicture : picture;
|
| dst.fPicture->ref();
|
| dst.fBounds = newBound;
|
| dst.fLocalMat = src.fLocalMat;
|
| @@ -685,6 +695,17 @@ private:
|
| }
|
| }
|
|
|
| + void trackSaveLayers(const DrawPicture& dp) {
|
| + this->trackSaveLayersForPicture(dp.picture, dp.paint);
|
| + }
|
| +
|
| + void trackSaveLayers(const DrawDrawable& dp) {
|
| + SkASSERT(fPictList);
|
| + SkASSERT(dp.index >= 0 && dp.index < fPictList->count());
|
| + const SkPaint* paint = NULL; // drawables don't get a side-car paint
|
| + this->trackSaveLayersForPicture(fPictList->begin()[dp.index], paint);
|
| + }
|
| +
|
| // Inform all the saveLayers already on the stack that they now have a
|
| // nested saveLayer inside them
|
| void updateStackForSaveLayer() {
|
| @@ -743,6 +764,7 @@ private:
|
| int fSaveLayersInStack;
|
| SkTDArray<SaveLayerInfo> fSaveLayerStack;
|
| SkLayerInfo* fAccelData;
|
| + const SkPicture::SnapshotArray* fPictList;
|
|
|
| SkRecords::FillBounds fFillBounds;
|
| };
|
| @@ -761,8 +783,9 @@ void SkRecordFillBounds(const SkRect& cullRect, const SkRecord& record, SkBBoxHi
|
| }
|
|
|
| void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record,
|
| - SkBBoxHierarchy* bbh, SkLayerInfo* data) {
|
| - SkRecords::CollectLayers visitor(cullRect, record, data);
|
| + const SkPicture::SnapshotArray* pictList, SkBBoxHierarchy* bbh,
|
| + SkLayerInfo* data) {
|
| + SkRecords::CollectLayers visitor(cullRect, record, pictList, data);
|
|
|
| for (unsigned curOp = 0; curOp < record.count(); curOp++) {
|
| visitor.setCurrentOp(curOp);
|
|
|