1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMallocPixelRef.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPixelRef.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkAutoMalloc.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkPixelRefPriv.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
16*c8dee2aaSAndroid Build Coastguard Worker
17*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
18*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
19*c8dee2aaSAndroid Build Coastguard Worker
delete_uint8_proc(void * ptr,void *)20*c8dee2aaSAndroid Build Coastguard Worker static void delete_uint8_proc(void* ptr, void*) {
21*c8dee2aaSAndroid Build Coastguard Worker delete[] static_cast<uint8_t*>(ptr);
22*c8dee2aaSAndroid Build Coastguard Worker }
23*c8dee2aaSAndroid Build Coastguard Worker
set_to_one_proc(void *,void * context)24*c8dee2aaSAndroid Build Coastguard Worker static void set_to_one_proc(void*, void* context) {
25*c8dee2aaSAndroid Build Coastguard Worker *(static_cast<int*>(context)) = 1;
26*c8dee2aaSAndroid Build Coastguard Worker }
27*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(MallocPixelRef,reporter)28*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(MallocPixelRef, reporter) {
29*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, true);
30*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo info = SkImageInfo::MakeN32Premul(10, 13);
31*c8dee2aaSAndroid Build Coastguard Worker {
32*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPixelRef> pr(
33*c8dee2aaSAndroid Build Coastguard Worker SkMallocPixelRef::MakeAllocate(info, info.minRowBytes() - 1));
34*c8dee2aaSAndroid Build Coastguard Worker // rowbytes too small.
35*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, nullptr == pr.get());
36*c8dee2aaSAndroid Build Coastguard Worker }
37*c8dee2aaSAndroid Build Coastguard Worker {
38*c8dee2aaSAndroid Build Coastguard Worker size_t rowBytes = info.minRowBytes() - 1;
39*c8dee2aaSAndroid Build Coastguard Worker size_t size = info.computeByteSize(rowBytes);
40*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> data(SkData::MakeUninitialized(size));
41*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPixelRef> pr(
42*c8dee2aaSAndroid Build Coastguard Worker SkMallocPixelRef::MakeWithData(info, rowBytes, data));
43*c8dee2aaSAndroid Build Coastguard Worker // rowbytes too small.
44*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, nullptr == pr.get());
45*c8dee2aaSAndroid Build Coastguard Worker }
46*c8dee2aaSAndroid Build Coastguard Worker {
47*c8dee2aaSAndroid Build Coastguard Worker size_t rowBytes = info.minRowBytes() + info.bytesPerPixel();
48*c8dee2aaSAndroid Build Coastguard Worker size_t size = info.computeByteSize(rowBytes) - 1;
49*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> data(SkData::MakeUninitialized(size));
50*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPixelRef> pr(
51*c8dee2aaSAndroid Build Coastguard Worker SkMallocPixelRef::MakeWithData(info, rowBytes, data));
52*c8dee2aaSAndroid Build Coastguard Worker // data too small.
53*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, nullptr == pr.get());
54*c8dee2aaSAndroid Build Coastguard Worker }
55*c8dee2aaSAndroid Build Coastguard Worker size_t rowBytes = info.minRowBytes() + info.bytesPerPixel();
56*c8dee2aaSAndroid Build Coastguard Worker size_t size = info.computeByteSize(rowBytes) + 9;
57*c8dee2aaSAndroid Build Coastguard Worker {
58*c8dee2aaSAndroid Build Coastguard Worker SkAutoMalloc memory(size);
59*c8dee2aaSAndroid Build Coastguard Worker auto pr = sk_make_sp<SkPixelRef>(info.width(), info.height(), memory.get(), rowBytes);
60*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, pr.get() != nullptr);
61*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, memory.get() == pr->pixels());
62*c8dee2aaSAndroid Build Coastguard Worker }
63*c8dee2aaSAndroid Build Coastguard Worker {
64*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPixelRef> pr(
65*c8dee2aaSAndroid Build Coastguard Worker SkMallocPixelRef::MakeAllocate(info, rowBytes));
66*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, pr.get() != nullptr);
67*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, pr->pixels());
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker {
70*c8dee2aaSAndroid Build Coastguard Worker void* addr = static_cast<void*>(new uint8_t[size]);
71*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPixelRef> pr(
72*c8dee2aaSAndroid Build Coastguard Worker SkMakePixelRefWithProc(info.width(), info.height(), rowBytes, addr, delete_uint8_proc,
73*c8dee2aaSAndroid Build Coastguard Worker nullptr));
74*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, pr.get() != nullptr);
75*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, addr == pr->pixels());
76*c8dee2aaSAndroid Build Coastguard Worker }
77*c8dee2aaSAndroid Build Coastguard Worker {
78*c8dee2aaSAndroid Build Coastguard Worker int x = 0;
79*c8dee2aaSAndroid Build Coastguard Worker SkAutoMalloc memory(size);
80*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPixelRef> pr(
81*c8dee2aaSAndroid Build Coastguard Worker SkMakePixelRefWithProc(info.width(), info.height(), rowBytes, memory.get(),
82*c8dee2aaSAndroid Build Coastguard Worker set_to_one_proc, static_cast<void*>(&x)));
83*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, pr.get() != nullptr);
84*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, memory.get() == pr->pixels());
85*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, 0 == x);
86*c8dee2aaSAndroid Build Coastguard Worker pr.reset(nullptr);
87*c8dee2aaSAndroid Build Coastguard Worker // make sure that set_to_one_proc was called.
88*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, 1 == x);
89*c8dee2aaSAndroid Build Coastguard Worker }
90*c8dee2aaSAndroid Build Coastguard Worker {
91*c8dee2aaSAndroid Build Coastguard Worker void* addr = static_cast<void*>(new uint8_t[size]);
92*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, addr != nullptr);
93*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPixelRef> pr(
94*c8dee2aaSAndroid Build Coastguard Worker SkMakePixelRefWithProc(info.width(), info.height(), rowBytes, addr, delete_uint8_proc,
95*c8dee2aaSAndroid Build Coastguard Worker nullptr));
96*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, addr == pr->pixels());
97*c8dee2aaSAndroid Build Coastguard Worker }
98*c8dee2aaSAndroid Build Coastguard Worker {
99*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> data(SkData::MakeUninitialized(size));
100*c8dee2aaSAndroid Build Coastguard Worker SkData* dataPtr = data.get();
101*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, dataPtr->unique());
102*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPixelRef> pr = SkMallocPixelRef::MakeWithData(info, rowBytes, data);
103*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !(dataPtr->unique()));
104*c8dee2aaSAndroid Build Coastguard Worker data.reset(nullptr);
105*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, dataPtr->unique());
106*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, dataPtr->data() == pr->pixels());
107*c8dee2aaSAndroid Build Coastguard Worker }
108*c8dee2aaSAndroid Build Coastguard Worker }
109