aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects/SkLayerDrawLooper.cpp
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-14 10:06:42 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-14 10:06:42 +0000
commit74ba2f62dce1998bd6555291ab0a5330c276301d (patch)
tree556057da3c66e8f07bae380572e3742154bf04a9 /src/effects/SkLayerDrawLooper.cpp
parent02d6f546161e2c98d69066373cec3f54f3c46252 (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.cpp82
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;
+}