Chromium Code Reviews| Index: tests/ImageDecodingTest.cpp |
| diff --git a/tests/ImageDecodingTest.cpp b/tests/ImageDecodingTest.cpp |
| index 76308c9d9782a92398ccf206c3f3fa0dff5b2de6..2cf3e527a58c12d3cb8468d78c0c4894ae6d99f1 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 @@ static void test_unpremul(skiatest::Reporter* reporter) { |
| } |
| } |
| +#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, |
|
djsollen
2013/07/17 19:52:17
not needed for this CL, but we should look into bu
|
| +#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" |