diff options
author | 2013-05-22 12:35:50 +0000 | |
---|---|---|
committer | 2013-05-22 12:35:50 +0000 | |
commit | 8f838259ab65e44562902679fa88cb00575b99ce (patch) | |
tree | cb6224073c81152b0d00d693aae4e0b8ee2d4a8f /src/effects | |
parent | b148aca07e7cd0150bd9c750b54584f7f4c38cfb (diff) |
Add methods to SkLayerDrawLooper to allow adding layers on top
as well as on the bottom.
This is more convenient for some callers who generate layers
from a data structure in bottom-to-top, rather than top-to-bottom,
order.
BUG=242529
R=tomhudson@chromium.org
Author: jbroman@chromium.org
Review URL: https://chromiumcodereview.appspot.com/15314003
git-svn-id: http://skia.googlecode.com/svn/trunk@9233 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/SkLayerDrawLooper.cpp | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp index 34aaad899a..401bea4e65 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) { - 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; |