diff options
author | 2014-02-14 10:06:42 +0000 | |
---|---|---|
committer | 2014-02-14 10:06:42 +0000 | |
commit | 74ba2f62dce1998bd6555291ab0a5330c276301d (patch) | |
tree | 556057da3c66e8f07bae380572e3742154bf04a9 /src/effects/SkLayerDrawLooper.cpp | |
parent | 02d6f546161e2c98d69066373cec3f54f3c46252 (diff) |
Builder class for SkLayerDrawLooper.
SkLayerDrawLooper provides methods like addLayer() to build up a linked list
of layers. Working towards making this class immutable, this patch introduces
the SkLayerDrawLooperBuilder class which is used to accumulate all the layers
first. Once all layers are in place, it creates a new SkLayerDrawLooper object
and hands over the list of layers to that object.
For now we keep the addLayer methods in SkLayerDrawLooper so we don't break
Chrome and Blink when this is landed. Once we've updated all users, we can
remove the methods.
BUG=skia:2141
R=reed@google.com, scroggo@google.com, mtklein@google.com, reed@chromium.org
Author: dominikg@chromium.org
Review URL: https://codereview.chromium.org/133813005
git-svn-id: http://skia.googlecode.com/svn/trunk@13448 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/effects/SkLayerDrawLooper.cpp')
-rw-r--r-- | src/effects/SkLayerDrawLooper.cpp | 82 |
1 files changed, 73 insertions, 9 deletions
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp index 6c7c3cef0c..49263fbbb5 100644 --- a/src/effects/SkLayerDrawLooper.cpp +++ b/src/effects/SkLayerDrawLooper.cpp @@ -221,14 +221,10 @@ void SkLayerDrawLooper::flatten(SkWriteBuffer& buffer) const { } } -SkLayerDrawLooper::SkLayerDrawLooper(SkReadBuffer& buffer) - : INHERITED(buffer), - fRecs(NULL), - fTopRec(NULL), - fCount(0), - fCurrRec(NULL) { +SkFlattenable* SkLayerDrawLooper::CreateProc(SkReadBuffer& buffer) { int count = buffer.readInt(); + Builder builder; for (int i = 0; i < count; i++) { LayerInfo info; info.fFlagsMask = buffer.readInt(); @@ -236,13 +232,14 @@ SkLayerDrawLooper::SkLayerDrawLooper(SkReadBuffer& buffer) info.fColorMode = (SkXfermode::Mode)buffer.readInt(); buffer.readPoint(&info.fOffset); info.fPostTranslate = buffer.readBool(); - buffer.readPaint(this->addLayerOnTop(info)); + buffer.readPaint(builder.addLayerOnTop(info)); } - SkASSERT(count == fCount); + SkLayerDrawLooper* looper = builder.detachLooper(); + SkASSERT(count == looper->fCount); #ifdef SK_DEBUG { - Rec* rec = fRecs; + Rec* rec = looper->fRecs; int n = 0; while (rec) { rec = rec->fNext; @@ -251,6 +248,8 @@ SkLayerDrawLooper::SkLayerDrawLooper(SkReadBuffer& buffer) SkASSERT(count == n); } #endif + + return looper; } #ifdef SK_DEVELOPER @@ -347,3 +346,68 @@ void SkLayerDrawLooper::toString(SkString* str) const { } } #endif + +SkLayerDrawLooper::Builder::Builder() + : fRecs(NULL), + fTopRec(NULL), + fCount(0) { +} + +SkLayerDrawLooper::Builder::~Builder() { + Rec* rec = fRecs; + while (rec) { + Rec* next = rec->fNext; + SkDELETE(rec); + rec = next; + } +} + +SkPaint* SkLayerDrawLooper::Builder::addLayer(const LayerInfo& info) { + fCount += 1; + + Rec* rec = SkNEW(Rec); + rec->fNext = fRecs; + rec->fInfo = info; + fRecs = rec; + if (NULL == fTopRec) { + fTopRec = rec; + } + + return &rec->fPaint; +} + +void SkLayerDrawLooper::Builder::addLayer(SkScalar dx, SkScalar dy) { + LayerInfo info; + + info.fOffset.set(dx, dy); + (void)this->addLayer(info); +} + +SkPaint* SkLayerDrawLooper::Builder::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; +} + +SkLayerDrawLooper* SkLayerDrawLooper::Builder::detachLooper() { + SkLayerDrawLooper* looper = SkNEW(SkLayerDrawLooper); + looper->fCount = fCount; + looper->fRecs = fRecs; + + fCount = 0; + fRecs = NULL; + fTopRec = NULL; + + return looper; +} |