Home | History | Annotate | Download | only in tests
      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
     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 
     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 
     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  */
     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