In SkLayerRasterizer::snapshotRasterizer() and ::detachRasterizer(),
if no layers have been added, do not attempt to create an
SkLayerRasterizer. Instead, return NULL.
This fixes an error when running tests on Android.
Update dox to state that NULL may be returned.
Add tests.
R=reed@google.com
Author: scroggo@google.com
Review URL: https://codereview.chromium.org/
313653006
/**
* Pass queue of layers on to newly created layer rasterizer and return it. The builder
- * *cannot* be used any more after calling this function.
+ * *cannot* be used any more after calling this function. If no layers have been added,
+ * returns NULL.
*
- * The caller is responsible for calling unref() on the returned object.
+ * The caller is responsible for calling unref() on the returned object, if non NULL.
*/
SkLayerRasterizer* detachRasterizer();
* *may* be used after calling this function. It will continue to hold any layers
* previously added, so consecutive calls to this function will return identical objects,
* and objects returned by future calls to this function contain all the layers in
- * previously returned objects.
+ * previously returned objects. If no layers have been added, returns NULL.
*
* Future calls to addLayer will not affect rasterizers previously returned by this call.
*
- * The caller is responsible for calling unref() on the returned object.
+ * The caller is responsible for calling unref() on the returned object, if non NULL.
*/
SkLayerRasterizer* snapshotRasterizer() const;
}
SkLayerRasterizer* SkLayerRasterizer::Builder::detachRasterizer() {
- SkLayerRasterizer* rasterizer = SkNEW_ARGS(SkLayerRasterizer, (fLayers));
+ SkLayerRasterizer* rasterizer;
+ if (0 == fLayers->count()) {
+ rasterizer = NULL;
+ SkDELETE(fLayers);
+ } else {
+ rasterizer = SkNEW_ARGS(SkLayerRasterizer, (fLayers));
+ }
fLayers = NULL;
return rasterizer;
}
SkLayerRasterizer* SkLayerRasterizer::Builder::snapshotRasterizer() const {
+ if (0 == fLayers->count()) {
+ return NULL;
+ }
SkDeque* layers = SkNEW_ARGS(SkDeque, (sizeof(SkLayerRasterizer_Rec), fLayers->count()));
SkDeque::F2BIter iter(*fLayers);
const SkLayerRasterizer_Rec* recOrig;
DEF_TEST(LayerRasterizer_copy, reporter) {
SkLayerRasterizer::Builder builder;
+ REPORTER_ASSERT(reporter, NULL == builder.snapshotRasterizer());
SkPaint paint;
// Create a bunch of paints with different flags.
for (uint32_t flags = 0x01; flags < SkPaint::kAllFlags; flags <<= 1) {
}
}
}
+
+DEF_TEST(LayerRasterizer_detachEmpty, reporter) {
+ SkLayerRasterizer::Builder builder;
+ REPORTER_ASSERT(reporter, NULL == builder.detachRasterizer());
+}