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