aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-04-10 20:42:53 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-04-10 20:42:53 +0000
commit6573ce70e609f19923cea401d4ca3ea1528a78f1 (patch)
treeebfc1b1acefb2e7e55540d947cc9007122bbd255 /src
parentd0b890452164466ee1929c103ab85bd491a27f82 (diff)
Create SkLayerRasterizer w/o destroying Builder.
Add a new method to SkLayerRasterizer::Builder that creates a new SkLayerRasterizer without destroying the Builder. Necessary to continue to support Android's API. Also fix a bug where creating a Builder and never calling detachRasterizer results in not calling the destructor for any SkPaints in the Builder. Add tests. BUG=b/13729784 R=reed@google.com, dominikg@chromium.org Author: scroggo@google.com Review URL: https://codereview.chromium.org/233673002 git-svn-id: http://skia.googlecode.com/svn/trunk@14139 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r--src/effects/SkLayerRasterizer.cpp34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/effects/SkLayerRasterizer.cpp b/src/effects/SkLayerRasterizer.cpp
index e35c5e828f..7143a3b40e 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;
+}