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 
delete_uint8_proc(void * ptr,void *)12 static void delete_uint8_proc(void* ptr, void*) {
13     delete[] static_cast<uint8_t*>(ptr);
14 }
15 
set_to_one_proc(void *,void * context)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  */
DEF_TEST(MallocPixelRef,reporter)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, NULL));
29         // rowbytes too small.
30         REPORTER_ASSERT(reporter, NULL == 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, NULL, data));
38         // rowbytes too small.
39         REPORTER_ASSERT(reporter, NULL == 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, NULL, data));
47         // data too small.
48         REPORTER_ASSERT(reporter, NULL == 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, NULL));
56         REPORTER_ASSERT(reporter, pr.get() != NULL);
57         REPORTER_ASSERT(reporter, memory.get() == pr->pixels());
58     }
59     {
60         SkAutoTUnref<SkMallocPixelRef> pr(
61             SkMallocPixelRef::NewAllocate(info, rowBytes, NULL));
62         REPORTER_ASSERT(reporter, pr.get() != NULL);
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, NULL, addr,
69                                           delete_uint8_proc, NULL));
70         REPORTER_ASSERT(reporter, pr.get() != NULL);
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, NULL,
78                                           memory.get(), set_to_one_proc,
79                                           static_cast<void*>(&x)));
80         REPORTER_ASSERT(reporter, pr.get() != NULL);
81         REPORTER_ASSERT(reporter, memory.get() == pr->pixels());
82         REPORTER_ASSERT(reporter, 0 == x);
83         pr.reset(NULL);
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 != NULL);
90         SkAutoTUnref<SkMallocPixelRef> pr(
91             SkMallocPixelRef::NewWithProc(info, rowBytes, NULL, addr,
92                                           delete_uint8_proc, NULL));
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, NULL, data.get()));
101         REPORTER_ASSERT(reporter, !(dataPtr->unique()));
102         data.reset(NULL);
103         REPORTER_ASSERT(reporter, dataPtr->unique());
104         REPORTER_ASSERT(reporter, dataPtr->data() == pr->pixels());
105     }
106 }
107