diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-04-10 20:42:53 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-04-10 20:42:53 +0000 |
commit | 6573ce70e609f19923cea401d4ca3ea1528a78f1 (patch) | |
tree | ebfc1b1acefb2e7e55540d947cc9007122bbd255 /src | |
parent | d0b890452164466ee1929c103ab85bd491a27f82 (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.cpp | 34 |
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; +} |