Index: src/effects/SkLayerDrawLooper.cpp |
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp |
index 6c7c3cef0cb04f2529fc3e21fd5688d3a7b19fed..49263fbbb5d746c7ccca6b204998c3643e4d4b18 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; |
+} |