1
2/*
3 * Copyright 2012 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#include "SkBitmap.h"
10#include "SkBitmapFactory.h"
11#include "SkCanvas.h"
12#include "SkColor.h"
13#include "SkData.h"
14#include "SkImageEncoder.h"
15#include "SkPaint.h"
16#include "SkStream.h"
17#include "SkTemplates.h"
18#include "Test.h"
19
20static SkBitmap* create_bitmap() {
21    SkBitmap* bm = SkNEW(SkBitmap);
22    const int W = 100, H = 100;
23    bm->setConfig(SkBitmap::kARGB_8888_Config, W, H);
24    bm->allocPixels();
25    bm->eraseColor(SK_ColorBLACK);
26    SkCanvas canvas(*bm);
27    SkPaint paint;
28    paint.setColor(SK_ColorBLUE);
29    canvas.drawRectCoords(0, 0, SkIntToScalar(W/2), SkIntToScalar(H/2), paint);
30    return bm;
31}
32
33static SkData* create_data_from_bitmap(const SkBitmap& bm) {
34    SkDynamicMemoryWStream stream;
35    if (SkImageEncoder::EncodeStream(&stream, bm, SkImageEncoder::kPNG_Type, 100)) {
36        return stream.copyToData();
37    }
38    return NULL;
39}
40
41static void assert_bounds_equal(skiatest::Reporter* reporter, const SkBitmap& bm1,
42                                const SkBitmap& bm2) {
43    REPORTER_ASSERT(reporter, bm1.width() == bm2.width());
44    REPORTER_ASSERT(reporter, bm1.height() == bm2.height());
45}
46
47static void TestBitmapFactory(skiatest::Reporter* reporter) {
48    SkAutoTDelete<SkBitmap> bitmap(create_bitmap());
49    SkASSERT(bitmap.get() != NULL);
50
51    SkAutoDataUnref encodedBitmap(create_data_from_bitmap(*bitmap.get()));
52    if (encodedBitmap.get() == NULL) {
53        // Encoding failed.
54        return;
55    }
56
57    SkBitmap bitmapFromFactory;
58    bool success = SkBitmapFactory::DecodeBitmap(&bitmapFromFactory, encodedBitmap);
59    // This assumes that if the encoder worked, the decoder should also work, so the above call
60    // should not fail.
61    REPORTER_ASSERT(reporter, success);
62    assert_bounds_equal(reporter, *bitmap.get(), bitmapFromFactory);
63    REPORTER_ASSERT(reporter, bitmapFromFactory.pixelRef() != NULL);
64
65    // When only requesting that the bounds be decoded, the bounds should be set properly while
66    // the pixels should be empty.
67    SkBitmap boundedBitmap;
68    success = SkBitmapFactory::DecodeBitmap(&boundedBitmap, encodedBitmap,
69                                            SkBitmapFactory::kDecodeBoundsOnly_Constraint);
70    REPORTER_ASSERT(reporter, success);
71    assert_bounds_equal(reporter, *bitmap.get(), boundedBitmap);
72    REPORTER_ASSERT(reporter, boundedBitmap.pixelRef() == NULL);
73}
74
75#include "TestClassDef.h"
76DEFINE_TESTCLASS("BitmapFactory", TestBitmapFactoryClass, TestBitmapFactory)
77