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