• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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