aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-05-22 12:35:50 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-05-22 12:35:50 +0000
commit8f838259ab65e44562902679fa88cb00575b99ce (patch)
treecb6224073c81152b0d00d693aae4e0b8ee2d4a8f /src/effects
parentb148aca07e7cd0150bd9c750b54584f7f4c38cfb (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.cpp39
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;