1/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkBitmap.h"
9
10#include "Test.h"
11
12static void test_allocpixels(skiatest::Reporter* reporter) {
13    const int width = 10;
14    const int height = 10;
15    const SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
16    const size_t explicitRowBytes = info.minRowBytes() + 24;
17
18    SkBitmap bm;
19    bm.setInfo(info);
20    REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
21    bm.allocPixels();
22    REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
23    bm.reset();
24    bm.allocPixels(info);
25    REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
26
27    bm.setInfo(info, explicitRowBytes);
28    REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes());
29    bm.allocPixels();
30    REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes());
31    bm.reset();
32    bm.allocPixels(info, explicitRowBytes);
33    REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes());
34
35    bm.reset();
36    bm.setInfo(info, 0);
37    REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
38    bm.reset();
39    bm.allocPixels(info, 0);
40    REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
41
42    bm.reset();
43    bool success = bm.setInfo(info, info.minRowBytes() - 1);   // invalid for 32bit
44    REPORTER_ASSERT(reporter, !success);
45    REPORTER_ASSERT(reporter, bm.isNull());
46}
47
48static void test_bigwidth(skiatest::Reporter* reporter) {
49    SkBitmap bm;
50    int width = 1 << 29;    // *4 will be the high-bit of 32bit int
51
52    SkImageInfo info = SkImageInfo::MakeA8(width, 1);
53    REPORTER_ASSERT(reporter, bm.setInfo(info));
54    REPORTER_ASSERT(reporter, bm.setInfo(info.makeColorType(kRGB_565_SkColorType)));
55
56    // for a 4-byte config, this width will compute a rowbytes of 0x80000000,
57    // which does not fit in a int32_t. setConfig should detect this, and fail.
58
59    // TODO: perhaps skia can relax this, and only require that rowBytes fit
60    //       in a uint32_t (or larger), but for now this is the constraint.
61
62    REPORTER_ASSERT(reporter, !bm.setInfo(info.makeColorType(kN32_SkColorType)));
63}
64
65/**
66 *  This test contains basic sanity checks concerning bitmaps.
67 */
68DEF_TEST(Bitmap, reporter) {
69    // Zero-sized bitmaps are allowed
70    for (int width = 0; width < 2; ++width) {
71        for (int height = 0; height < 2; ++height) {
72            SkBitmap bm;
73            bool setConf = bm.setInfo(SkImageInfo::MakeN32Premul(width, height));
74            REPORTER_ASSERT(reporter, setConf);
75            if (setConf) {
76                bm.allocPixels();
77            }
78            REPORTER_ASSERT(reporter, SkToBool(width & height) != bm.empty());
79        }
80    }
81
82    test_bigwidth(reporter);
83    test_allocpixels(reporter);
84}
85