Index: src/core/SkCanvas.cpp |
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
index 9dcbfdbc38891c65deb30feb8bf047dfc42022c4..1d087d79c8427685100c249ef46f12ce5735edfb 100644 |
--- a/src/core/SkCanvas.cpp |
+++ b/src/core/SkCanvas.cpp |
@@ -19,6 +19,7 @@ |
#include "SkPicture.h" |
#include "SkRasterClip.h" |
#include "SkRRect.h" |
+#include "SkSmallAllocator.h" |
#include "SkSurface_Base.h" |
#include "SkTemplates.h" |
#include "SkTextFormatParams.h" |
@@ -337,7 +338,6 @@ public: |
bool skipLayerForImageFilter = false, |
const SkRect* bounds = NULL) : fOrigPaint(paint) { |
fCanvas = canvas; |
- fLooper = paint.getLooper(); |
fFilter = canvas->getDrawFilter(); |
fPaint = NULL; |
fSaveCount = canvas->getSaveCount(); |
@@ -354,10 +354,13 @@ public: |
fDoClearImageFilter = true; |
} |
- if (fLooper) { |
- fLooper->init(canvas); |
+ if (SkDrawLooper* looper = paint.getLooper()) { |
+ void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Context>( |
+ looper->contextSize()); |
+ fLooperContext = looper->createContext(canvas, buffer); |
fIsSimple = false; |
} else { |
+ fLooperContext = NULL; |
// can we be marked as simple? |
fIsSimple = !fFilter && !fDoClearImageFilter; |
} |
@@ -391,13 +394,14 @@ private: |
SkLazyPaint fLazyPaint; |
SkCanvas* fCanvas; |
const SkPaint& fOrigPaint; |
- SkDrawLooper* fLooper; |
SkDrawFilter* fFilter; |
const SkPaint* fPaint; |
int fSaveCount; |
bool fDoClearImageFilter; |
bool fDone; |
bool fIsSimple; |
+ SkDrawLooper::Context* fLooperContext; |
+ SkSmallAllocator<1, 32> fLooperContextAllocator; |
bool doNext(SkDrawFilter::Type drawType); |
}; |
@@ -405,7 +409,7 @@ private: |
bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { |
fPaint = NULL; |
SkASSERT(!fIsSimple); |
- SkASSERT(fLooper || fFilter || fDoClearImageFilter); |
+ SkASSERT(fLooperContext || fFilter || fDoClearImageFilter); |
SkPaint* paint = fLazyPaint.set(fOrigPaint); |
@@ -413,7 +417,7 @@ bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { |
paint->setImageFilter(NULL); |
} |
- if (fLooper && !fLooper->next(fCanvas, paint)) { |
+ if (fLooperContext && !fLooperContext->next(fCanvas, paint)) { |
fDone = true; |
return false; |
} |
@@ -422,7 +426,7 @@ bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { |
fDone = true; |
return false; |
} |
- if (NULL == fLooper) { |
+ if (NULL == fLooperContext) { |
// no looper means we only draw once |
fDone = true; |
} |
@@ -430,7 +434,7 @@ bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { |
fPaint = paint; |
// if we only came in here for the imagefilter, mark us as done |
- if (!fLooper && !fFilter) { |
+ if (!fLooperContext && !fFilter) { |
fDone = true; |
} |