For a picture playback with nothing written, use an empty SkData.
This prevents crashing when attempting to access fOpData.
BUG=https://code.google.com/p/skia/issues/detail?id=870
Review URL: https://codereview.appspot.com/6499108
git-svn-id: http://skia.googlecode.com/svn/trunk@5550 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gyp/tests.gyp b/gyp/tests.gyp
index 7154638..dcfd1b4 100644
--- a/gyp/tests.gyp
+++ b/gyp/tests.gyp
@@ -64,8 +64,9 @@
'../tests/PathMeasureTest.cpp',
'../tests/PathTest.cpp',
'../tests/PDFPrimitivesTest.cpp',
- '../tests/PipeTest.cpp',
+ '../tests/PictureTest.cpp',
'../tests/PictureUtilsTest.cpp',
+ '../tests/PipeTest.cpp',
'../tests/PointTest.cpp',
'../tests/PremulAlphaRoundTripTest.cpp',
'../tests/QuickRejectTest.cpp',
diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp
index cb4a838..e3181d0 100644
--- a/src/core/SkPicturePlayback.cpp
+++ b/src/core/SkPicturePlayback.cpp
@@ -69,8 +69,10 @@
record.validate();
const SkWriter32& writer = record.writeStream();
init();
- if (writer.size() == 0)
+ if (writer.size() == 0) {
+ fOpData = SkData::NewEmpty();
return;
+ }
fBoundingHierarchy = record.fBoundingHierarchy;
fStateTree = record.fStateTree;
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp
new file mode 100644
index 0000000..34d7832
--- /dev/null
+++ b/tests/PictureTest.cpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "Test.h"
+#include "SkPicture.h"
+#include "SkStream.h"
+
+#ifdef SK_DEBUG
+// Ensure that deleting SkPicturePlayback does not assert. Asserts only fire in debug mode, so only
+// run in debug mode.
+static void test_deleting_empty_playback() {
+ SkPicture picture;
+ // Creates an SkPictureRecord
+ picture.beginRecording(0, 0);
+ // Turns that into an SkPicturePlayback
+ picture.endRecording();
+ // Deletes the old SkPicturePlayback, and creates a new SkPictureRecord
+ picture.beginRecording(0, 0);
+}
+
+// Ensure that serializing an empty picture does not assert. Likewise only runs in debug mode.
+static void test_serializing_empty_picture() {
+ SkPicture picture;
+ picture.beginRecording(0, 0);
+ picture.endRecording();
+ SkDynamicMemoryWStream stream;
+ picture.serialize(&stream);
+}
+#endif
+
+static void TestPicture(skiatest::Reporter* reporter) {
+#ifdef SK_DEBUG
+ test_deleting_empty_playback();
+ test_serializing_empty_picture();
+#endif
+}
+
+#include "TestClassDef.h"
+DEFINE_TESTCLASS("Picture", PictureTestClass, TestPicture)