diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/BitmapFactoryTest.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/BitmapFactoryTest.cpp b/tests/BitmapFactoryTest.cpp new file mode 100644 index 0000000000..b24fd258ca --- /dev/null +++ b/tests/BitmapFactoryTest.cpp @@ -0,0 +1,76 @@ + +/* + * 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 "SkBitmap.h" +#include "SkBitmapFactory.h" +#include "SkCanvas.h" +#include "SkColor.h" +#include "SkData.h" +#include "SkImageEncoder.h" +#include "SkPaint.h" +#include "SkStream.h" +#include "SkTemplates.h" +#include "Test.h" + +static SkBitmap* create_bitmap() { + SkBitmap* bm = SkNEW(SkBitmap); + const int W = 100, H = 100; + bm->setConfig(SkBitmap::kARGB_8888_Config, W, H); + bm->allocPixels(); + bm->eraseColor(SK_ColorBLACK); + SkCanvas canvas(*bm); + SkPaint paint; + paint.setColor(SK_ColorBLUE); + canvas.drawRectCoords(0, 0, SkIntToScalar(W/2), SkIntToScalar(H/2), paint); + return bm; +} + +static SkData* create_data_from_bitmap(const SkBitmap& bm) { + SkDynamicMemoryWStream stream; + if (SkImageEncoder::EncodeStream(&stream, bm, SkImageEncoder::kPNG_Type, 100)) { + return stream.copyToData(); + } + return NULL; +} + +static void assert_bounds_equal(skiatest::Reporter* reporter, const SkBitmap& bm1, + const SkBitmap& bm2) { + REPORTER_ASSERT(reporter, bm1.width() == bm2.width()); + REPORTER_ASSERT(reporter, bm1.height() == bm2.height()); +} + +static void TestBitmapFactory(skiatest::Reporter* reporter) { + SkAutoTDelete<SkBitmap> bitmap(create_bitmap()); + SkASSERT(bitmap.get() != NULL); + + SkAutoDataUnref encodedBitmap(create_data_from_bitmap(*bitmap.get())); + if (encodedBitmap.get() == NULL) { + // Encoding failed. + return; + } + + SkBitmap bitmapFromFactory; + bool success = SkBitmapFactory::DecodeBitmap(&bitmapFromFactory, encodedBitmap); + // This assumes that if the encoder worked, the decoder should also work, so the above call + // should not fail. + REPORTER_ASSERT(reporter, success); + assert_bounds_equal(reporter, *bitmap.get(), bitmapFromFactory); + REPORTER_ASSERT(reporter, bitmapFromFactory.pixelRef() != NULL); + + // When only requesting that the bounds be decoded, the bounds should be set properly while + // the pixels should be empty. + SkBitmap boundedBitmap; + success = SkBitmapFactory::DecodeBitmap(&boundedBitmap, encodedBitmap, + SkBitmapFactory::kDecodeBoundsOnly_Constraint); + REPORTER_ASSERT(reporter, success); + assert_bounds_equal(reporter, *bitmap.get(), boundedBitmap); + REPORTER_ASSERT(reporter, boundedBitmap.pixelRef() == NULL); +} + +#include "TestClassDef.h" +DEFINE_TESTCLASS("BitmapFactory", TestBitmapFactoryClass, TestBitmapFactory) |