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 #include "SkMallocPixelRef.h"
10 #include "Test.h"
11
12 // https://code.google.com/p/chromium/issues/detail?id=446164
test_bigalloc(skiatest::Reporter * reporter)13 static void test_bigalloc(skiatest::Reporter* reporter) {
14 const int width = 0x40000001;
15 const int height = 0x00000096;
16 const SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
17
18 SkBitmap bm;
19 REPORTER_ASSERT(reporter, !bm.tryAllocPixels(info));
20
21 SkPixelRef* pr = SkMallocPixelRef::NewAllocate(info, info.minRowBytes(), NULL);
22 REPORTER_ASSERT(reporter, !pr);
23 }
24
test_allocpixels(skiatest::Reporter * reporter)25 static void test_allocpixels(skiatest::Reporter* reporter) {
26 const int width = 10;
27 const int height = 10;
28 const SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
29 const size_t explicitRowBytes = info.minRowBytes() + 24;
30
31 SkBitmap bm;
32 bm.setInfo(info);
33 REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
34 bm.allocPixels();
35 REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
36 bm.reset();
37 bm.allocPixels(info);
38 REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
39
40 bm.setInfo(info, explicitRowBytes);
41 REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes());
42 bm.allocPixels();
43 REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes());
44 bm.reset();
45 bm.allocPixels(info, explicitRowBytes);
46 REPORTER_ASSERT(reporter, explicitRowBytes == bm.rowBytes());
47
48 bm.reset();
49 bm.setInfo(info, 0);
50 REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
51 bm.reset();
52 bm.allocPixels(info, 0);
53 REPORTER_ASSERT(reporter, info.minRowBytes() == bm.rowBytes());
54
55 bm.reset();
56 bool success = bm.setInfo(info, info.minRowBytes() - 1); // invalid for 32bit
57 REPORTER_ASSERT(reporter, !success);
58 REPORTER_ASSERT(reporter, bm.isNull());
59 }
60
test_bigwidth(skiatest::Reporter * reporter)61 static void test_bigwidth(skiatest::Reporter* reporter) {
62 SkBitmap bm;
63 int width = 1 << 29; // *4 will be the high-bit of 32bit int
64
65 SkImageInfo info = SkImageInfo::MakeA8(width, 1);
66 REPORTER_ASSERT(reporter, bm.setInfo(info));
67 REPORTER_ASSERT(reporter, bm.setInfo(info.makeColorType(kRGB_565_SkColorType)));
68
69 // for a 4-byte config, this width will compute a rowbytes of 0x80000000,
70 // which does not fit in a int32_t. setConfig should detect this, and fail.
71
72 // TODO: perhaps skia can relax this, and only require that rowBytes fit
73 // in a uint32_t (or larger), but for now this is the constraint.
74
75 REPORTER_ASSERT(reporter, !bm.setInfo(info.makeColorType(kN32_SkColorType)));
76 }
77
78 /**
79 * This test contains basic sanity checks concerning bitmaps.
80 */
DEF_TEST(Bitmap,reporter)81 DEF_TEST(Bitmap, reporter) {
82 // Zero-sized bitmaps are allowed
83 for (int width = 0; width < 2; ++width) {
84 for (int height = 0; height < 2; ++height) {
85 SkBitmap bm;
86 bool setConf = bm.setInfo(SkImageInfo::MakeN32Premul(width, height));
87 REPORTER_ASSERT(reporter, setConf);
88 if (setConf) {
89 bm.allocPixels();
90 }
91 REPORTER_ASSERT(reporter, SkToBool(width & height) != bm.empty());
92 }
93 }
94
95 test_bigwidth(reporter);
96 test_allocpixels(reporter);
97 test_bigalloc(reporter);
98 }
99