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 "SkData.h"
      9 #include "SkMallocPixelRef.h"
     10 #include "Test.h"
     11 
     12 static void delete_uint8_proc(void* ptr, void*) {
     13     delete[] static_cast<uint8_t*>(ptr);
     14 }
     15 
     16 static void set_to_one_proc(void*, void* context) {
     17     *(static_cast<int*>(context)) = 1;
     18 }
     19 
     20 /**
     21  *  This test contains basic sanity checks concerning SkMallocPixelRef.
     22  */
     23 DEF_TEST(MallocPixelRef, reporter) {
     24     REPORTER_ASSERT(reporter, true);
     25     SkImageInfo info = SkImageInfo::MakeN32Premul(10, 13);
     26     {
     27         SkAutoTUnref<SkMallocPixelRef> pr(
     28             SkMallocPixelRef::NewAllocate(info, info.minRowBytes() - 1, nullptr));
     29         // rowbytes too small.
     30         REPORTER_ASSERT(reporter, nullptr == pr.get());
     31     }
     32     {
     33         size_t rowBytes = info.minRowBytes() - 1;
     34         size_t size = info.getSafeSize(rowBytes);
     35         SkAutoDataUnref data(SkData::NewUninitialized(size));
     36         SkAutoTUnref<SkMallocPixelRef> pr(
     37             SkMallocPixelRef::NewWithData(info, rowBytes, nullptr, data));
     38         // rowbytes too small.
     39         REPORTER_ASSERT(reporter, nullptr == pr.get());
     40     }
     41     {
     42         size_t rowBytes = info.minRowBytes() + 2;
     43         size_t size = info.getSafeSize(rowBytes) - 1;
     44         SkAutoDataUnref data(SkData::NewUninitialized(size));
     45         SkAutoTUnref<SkMallocPixelRef> pr(
     46             SkMallocPixelRef::NewWithData(info, rowBytes, nullptr, data));
     47         // data too small.
     48         REPORTER_ASSERT(reporter, nullptr == pr.get());
     49     }
     50     size_t rowBytes = info.minRowBytes() + 7;
     51     size_t size = info.getSafeSize(rowBytes) + 9;
     52     {
     53         SkAutoMalloc memory(size);
     54         SkAutoTUnref<SkMallocPixelRef> pr(
     55             SkMallocPixelRef::NewDirect(info, memory.get(), rowBytes, nullptr));
     56         REPORTER_ASSERT(reporter, pr.get() != nullptr);
     57         REPORTER_ASSERT(reporter, memory.get() == pr->pixels());
     58     }
     59     {
     60         SkAutoTUnref<SkMallocPixelRef> pr(
     61             SkMallocPixelRef::NewAllocate(info, rowBytes, nullptr));
     62         REPORTER_ASSERT(reporter, pr.get() != nullptr);
     63         REPORTER_ASSERT(reporter, pr->pixels());
     64     }
     65     {
     66         void* addr = static_cast<void*>(new uint8_t[size]);
     67         SkAutoTUnref<SkMallocPixelRef> pr(
     68             SkMallocPixelRef::NewWithProc(info, rowBytes, nullptr, addr,
     69                                           delete_uint8_proc, nullptr));
     70         REPORTER_ASSERT(reporter, pr.get() != nullptr);
     71         REPORTER_ASSERT(reporter, addr == pr->pixels());
     72     }
     73     {
     74         int x = 0;
     75         SkAutoMalloc memory(size);
     76         SkAutoTUnref<SkMallocPixelRef> pr(
     77             SkMallocPixelRef::NewWithProc(info, rowBytes, nullptr,
     78                                           memory.get(), set_to_one_proc,
     79                                           static_cast<void*>(&x)));
     80         REPORTER_ASSERT(reporter, pr.get() != nullptr);
     81         REPORTER_ASSERT(reporter, memory.get() == pr->pixels());
     82         REPORTER_ASSERT(reporter, 0 == x);
     83         pr.reset(nullptr);
     84         // make sure that set_to_one_proc was called.
     85         REPORTER_ASSERT(reporter, 1 == x);
     86     }
     87     {
     88         void* addr = static_cast<void*>(new uint8_t[size]);
     89         REPORTER_ASSERT(reporter, addr != nullptr);
     90         SkAutoTUnref<SkMallocPixelRef> pr(
     91             SkMallocPixelRef::NewWithProc(info, rowBytes, nullptr, addr,
     92                                           delete_uint8_proc, nullptr));
     93         REPORTER_ASSERT(reporter, addr == pr->pixels());
     94     }
     95     {
     96         SkAutoDataUnref data(SkData::NewUninitialized(size));
     97         SkData* dataPtr = data.get();
     98         REPORTER_ASSERT(reporter, dataPtr->unique());
     99         SkAutoTUnref<SkMallocPixelRef> pr(
    100             SkMallocPixelRef::NewWithData(info, rowBytes, nullptr, data.get()));
    101         REPORTER_ASSERT(reporter, !(dataPtr->unique()));
    102         data.reset(nullptr);
    103         REPORTER_ASSERT(reporter, dataPtr->unique());
    104         REPORTER_ASSERT(reporter, dataPtr->data() == pr->pixels());
    105     }
    106 }
    107