Index: src/effects/SkLayerRasterizer.cpp |
diff --git a/src/effects/SkLayerRasterizer.cpp b/src/effects/SkLayerRasterizer.cpp |
index e35c5e828fb253d5447e36cf281f21172bf4a8ac..7143a3b40e915839406efb9fa401cd59d7a50ae2 100644 |
--- a/src/effects/SkLayerRasterizer.cpp |
+++ b/src/effects/SkLayerRasterizer.cpp |
@@ -34,15 +34,20 @@ SkLayerRasterizer::SkLayerRasterizer(SkDeque* layers) : fLayers(layers) |
{ |
} |
-SkLayerRasterizer::~SkLayerRasterizer() { |
- SkASSERT(fLayers); |
- SkDeque::F2BIter iter(*fLayers); |
+// Helper function to call destructors on SkPaints held by layers and delete layers. |
+static void clean_up_layers(SkDeque* layers) { |
+ SkDeque::F2BIter iter(*layers); |
SkLayerRasterizer_Rec* rec; |
while ((rec = (SkLayerRasterizer_Rec*)iter.next()) != NULL) |
rec->fPaint.~SkPaint(); |
- SkDELETE(fLayers); |
+ SkDELETE(layers); |
+} |
+ |
+SkLayerRasterizer::~SkLayerRasterizer() { |
+ SkASSERT(fLayers); |
+ clean_up_layers(const_cast<SkDeque*>(fLayers)); |
} |
#ifdef SK_SUPPORT_LEGACY_LAYERRASTERIZER_API |
@@ -194,7 +199,9 @@ SkLayerRasterizer::Builder::Builder() |
SkLayerRasterizer::Builder::~Builder() |
{ |
- SkDELETE(fLayers); |
+ if (fLayers != NULL) { |
+ clean_up_layers(fLayers); |
+ } |
} |
void SkLayerRasterizer::Builder::addLayer(const SkPaint& paint, SkScalar dx, |
@@ -211,3 +218,20 @@ SkLayerRasterizer* SkLayerRasterizer::Builder::detachRasterizer() { |
fLayers = NULL; |
return rasterizer; |
} |
+ |
+SkLayerRasterizer* SkLayerRasterizer::Builder::snapshotRasterizer() const { |
+ SkDeque* layers = SkNEW_ARGS(SkDeque, (sizeof(SkLayerRasterizer_Rec), fLayers->count())); |
+ SkDeque::F2BIter iter(*fLayers); |
+ const SkLayerRasterizer_Rec* recOrig; |
+ SkDEBUGCODE(int count = 0;) |
+ while ((recOrig = static_cast<SkLayerRasterizer_Rec*>(iter.next())) != NULL) { |
+ SkDEBUGCODE(count++); |
+ SkLayerRasterizer_Rec* recCopy = static_cast<SkLayerRasterizer_Rec*>(layers->push_back()); |
+ SkNEW_PLACEMENT_ARGS(&recCopy->fPaint, SkPaint, (recOrig->fPaint)); |
+ recCopy->fOffset = recOrig->fOffset; |
+ } |
+ SkASSERT(fLayers->count() == count); |
+ SkASSERT(layers->count() == count); |
+ SkLayerRasterizer* rasterizer = SkNEW_ARGS(SkLayerRasterizer, (layers)); |
+ return rasterizer; |
+} |