Chromium Code Reviews| Index: src/effects/SkLayerDrawLooper.cpp |
| diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp |
| index 34aaad899ab1425a20d862cf84b0ee31cdaf6f71..401bea4e656e97cd4f7728454c5983f44ec2617b 100644 |
| --- a/src/effects/SkLayerDrawLooper.cpp |
| +++ b/src/effects/SkLayerDrawLooper.cpp |
| @@ -25,6 +25,7 @@ SkLayerDrawLooper::LayerInfo::LayerInfo() { |
| SkLayerDrawLooper::SkLayerDrawLooper() |
| : fRecs(NULL), |
| + fTopRec(NULL), |
| fCount(0), |
| fCurrRec(NULL) { |
| } |
| @@ -45,6 +46,9 @@ SkPaint* SkLayerDrawLooper::addLayer(const LayerInfo& info) { |
| rec->fNext = fRecs; |
| rec->fInfo = info; |
| fRecs = rec; |
| + if (NULL == fTopRec) { |
| + fTopRec = rec; |
| + } |
| return &rec->fPaint; |
| } |
| @@ -56,6 +60,23 @@ void SkLayerDrawLooper::addLayer(SkScalar dx, SkScalar dy) { |
| (void)this->addLayer(info); |
| } |
| +SkPaint* SkLayerDrawLooper::addLayerOnTop(const LayerInfo& info) { |
| + fCount += 1; |
| + |
| + Rec* rec = SkNEW(Rec); |
| + rec->fNext = NULL; |
| + rec->fInfo = info; |
| + if (NULL == fRecs) { |
| + fRecs = rec; |
| + } else { |
| + SkASSERT(NULL != fTopRec); |
| + fTopRec->fNext = rec; |
| + } |
| + fTopRec = rec; |
| + |
| + return &rec->fPaint; |
| +} |
| + |
| void SkLayerDrawLooper::init(SkCanvas* canvas) { |
| fCurrRec = fRecs; |
| canvas->save(SkCanvas::kMatrix_SaveFlag); |
| @@ -170,18 +191,6 @@ bool SkLayerDrawLooper::next(SkCanvas* canvas, SkPaint* paint) { |
| return true; |
| } |
| -SkLayerDrawLooper::Rec* SkLayerDrawLooper::Rec::Reverse(Rec* head) { |
|
Tom Hudson
2013/05/22 09:46:04
Getting rid of this looks like a win to me!
|
| - Rec* rec = head; |
| - Rec* prev = NULL; |
| - while (rec) { |
| - Rec* next = rec->fNext; |
| - rec->fNext = prev; |
| - prev = rec; |
| - rec = next; |
| - } |
| - return prev; |
| -} |
| - |
| /////////////////////////////////////////////////////////////////////////////// |
| void SkLayerDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) const { |
| @@ -216,6 +225,7 @@ void SkLayerDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) const { |
| SkLayerDrawLooper::SkLayerDrawLooper(SkFlattenableReadBuffer& buffer) |
| : INHERITED(buffer), |
| fRecs(NULL), |
| + fTopRec(NULL), |
| fCount(0), |
| fCurrRec(NULL) { |
| int count = buffer.readInt(); |
| @@ -227,13 +237,10 @@ SkLayerDrawLooper::SkLayerDrawLooper(SkFlattenableReadBuffer& buffer) |
| info.fColorMode = (SkXfermode::Mode)buffer.readInt(); |
| buffer.readPoint(&info.fOffset); |
| info.fPostTranslate = buffer.readBool(); |
| - buffer.readPaint(this->addLayer(info)); |
| + buffer.readPaint(this->addLayerOnTop(info)); |
| } |
| SkASSERT(count == fCount); |
| - // we're in reverse order, so fix it now |
| - fRecs = Rec::Reverse(fRecs); |
| - |
| #ifdef SK_DEBUG |
| { |
| Rec* rec = fRecs; |