Index: src/effects/SkLayerDrawLooper.cpp |
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp |
index 6c7c3cef0cb04f2529fc3e21fd5688d3a7b19fed..6705060bf7919518925aac83c993cc1965a53bac 100644 |
--- a/src/effects/SkLayerDrawLooper.cpp |
+++ b/src/effects/SkLayerDrawLooper.cpp |
@@ -229,6 +229,7 @@ SkLayerDrawLooper::SkLayerDrawLooper(SkReadBuffer& buffer) |
fCurrRec(NULL) { |
int count = buffer.readInt(); |
+ Builder builder; |
for (int i = 0; i < count; i++) { |
LayerInfo info; |
info.fFlagsMask = buffer.readInt(); |
@@ -236,8 +237,9 @@ 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)); |
} |
+ builder.initLooperAndReset(this); |
scroggo
2014/02/11 14:48:37
I think the main place this will be called is read
|
SkASSERT(count == fCount); |
#ifdef SK_DEBUG |
@@ -347,3 +349,71 @@ 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); |
+ initLooperAndReset(looper); |
+ return looper; |
+} |
+ |
+void SkLayerDrawLooper::Builder::initLooperAndReset(SkLayerDrawLooper* looper) { |
+ looper->fCount = fCount; |
+ looper->fRecs = fRecs; |
+ |
+ fCount = 0; |
+ fRecs = NULL; |
+ fTopRec = NULL; |
+} |