Add test to ensure buildTileIndex stores SkStream.

PNG fails this test without https://codereview.chromium.org/19185006/

R=djsollen@google.com

Review URL: https://codereview.chromium.org/19555004

git-svn-id: http://skia.googlecode.com/svn/trunk@10163 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/ImageDecodingTest.cpp b/tests/ImageDecodingTest.cpp
index 76308c9..2cf3e52 100644
--- a/tests/ImageDecodingTest.cpp
+++ b/tests/ImageDecodingTest.cpp
@@ -6,10 +6,17 @@
  */
 
 #include "SkBitmap.h"
+#include "SkCanvas.h"
+#include "SkColor.h"
 #include "SkColorPriv.h"
+#include "SkData.h"
 #include "SkForceLinking.h"
+#include "SkGradientShader.h"
 #include "SkImageDecoder.h"
+#include "SkImageEncoder.h"
 #include "SkOSFile.h"
+#include "SkPoint.h"
+#include "SkShader.h"
 #include "SkStream.h"
 #include "SkString.h"
 #include "Test.h"
@@ -185,9 +192,79 @@
     }
 }
 
+#ifdef SK_DEBUG
+// Create a stream containing a bitmap encoded to Type type.
+static SkStream* create_image_stream(SkImageEncoder::Type type) {
+    SkBitmap bm;
+    const int size = 50;
+    bm.setConfig(SkBitmap::kARGB_8888_Config, size, size);
+    bm.allocPixels();
+    SkCanvas canvas(bm);
+    SkPoint points[2] = {
+        { SkIntToScalar(0), SkIntToScalar(0) },
+        { SkIntToScalar(size), SkIntToScalar(size) }
+    };
+    SkColor colors[2] = { SK_ColorWHITE, SK_ColorBLUE };
+    SkShader* shader = SkGradientShader::CreateLinear(points, colors, NULL,
+                                                      SK_ARRAY_COUNT(colors),
+                                                      SkShader::kClamp_TileMode);
+    SkPaint paint;
+    paint.setShader(shader)->unref();
+    canvas.drawPaint(paint);
+    // Now encode it to a stream.
+    SkAutoTUnref<SkData> data(SkImageEncoder::EncodeData(bm, type, 100));
+    if (NULL == data.get()) {
+        return NULL;
+    }
+    return SkNEW_ARGS(SkMemoryStream, (data.get()));
+}
+
+// For every format that supports tile based decoding, ensure that
+// calling decodeSubset will not fail if the caller has unreffed the
+// stream provided in buildTileIndex.
+// Only runs in debug mode since we are testing for a crash.
+static void test_stream_life() {
+    const SkImageEncoder::Type gTypes[] = {
+#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
+        SkImageEncoder::kJPEG_Type,
+#endif
+#ifdef SK_BUILD_FOR_ANDROID
+        SkImageEncoder::kPNG_Type,
+#endif
+        SkImageEncoder::kWEBP_Type,
+    };
+    for (size_t i = 0; i < SK_ARRAY_COUNT(gTypes); ++i) {
+        SkDebugf("encoding to %i\n", i);
+        SkAutoTUnref<SkStream> stream(create_image_stream(gTypes[i]));
+        if (NULL == stream.get()) {
+            SkDebugf("no stream\n");
+            continue;
+        }
+        SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(stream));
+        if (NULL == decoder.get()) {
+            SkDebugf("no decoder\n");
+            continue;
+        }
+        int width, height;
+        if (!decoder->buildTileIndex(stream.get(), &width, &height)) {
+            SkDebugf("could not build a tile index\n");
+            continue;
+        }
+        // Now unref the stream to make sure it survives
+        stream.reset(NULL);
+        SkBitmap bm;
+        decoder->decodeSubset(&bm, SkIRect::MakeWH(width, height),
+                              SkBitmap::kARGB_8888_Config);
+    }
+}
+#endif
+
 static void test_imageDecodingTests(skiatest::Reporter* reporter) {
     test_unpremul(reporter);
     test_pref_config_table(reporter);
+#ifdef SK_DEBUG
+    test_stream_life();
+#endif
 }
 
 #include "TestClassDef.h"