11bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com/* 21bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com * Copyright 2013 Google Inc. 31bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com * 41bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com * Use of this source code is governed by a BSD-style license that can be 51bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com * found in the LICENSE file. 61bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com */ 71bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com 81bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com#include "SkData.h" 91bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com#include "SkMallocPixelRef.h" 101bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com#include "Test.h" 111bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com 121bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.comstatic void delete_uint8_proc(void* ptr, void*) { 131bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com delete[] static_cast<uint8_t*>(ptr); 141bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com} 151bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com 161bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.comstatic void set_to_one_proc(void*, void* context) { 171bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com *(static_cast<int*>(context)) = 1; 181bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com} 191bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com 201bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com/** 211bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com * This test contains basic sanity checks concerning SkMallocPixelRef. 221bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com */ 231bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.comDEF_TEST(MallocPixelRef, reporter) { 241bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, true); 2532678d9a453e2c9fd26e92be429cdd84250b4d85commit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeN32Premul(10, 13); 261bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 271bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 281bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewAllocate(info, info.minRowBytes() - 1, NULL)); 291bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com // rowbytes too small. 301bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, NULL == pr.get()); 311bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 321bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 331bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t rowBytes = info.minRowBytes() - 1; 341bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t size = info.getSafeSize(rowBytes); 351bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com void* addr = sk_malloc_throw(size); 361bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoDataUnref data(SkData::NewFromMalloc(addr, size)); 371bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 381bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithData(info, rowBytes, 391bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com NULL, data.get())); 401bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com // rowbytes too small. 411bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, NULL == pr.get()); 421bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 431bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 441bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t rowBytes = info.minRowBytes() + 2; 451bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t size = info.getSafeSize(rowBytes) - 1; 461bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com void* addr = sk_malloc_throw(size); 471bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoDataUnref data(SkData::NewFromMalloc(addr, size)); 481bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 491bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithData(info, rowBytes, NULL, 501bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com data.get())); 511bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com // data too small. 521bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, NULL == pr.get()); 531bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 541bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t rowBytes = info.minRowBytes() + 7; 551bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t size = info.getSafeSize(rowBytes) + 9; 561bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 571bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoMalloc memory(size); 581bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 591bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewDirect(info, memory.get(), rowBytes, NULL)); 601bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, pr.get() != NULL); 611bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, memory.get() == pr->pixels()); 621bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 631bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 641bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 651bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewAllocate(info, rowBytes, NULL)); 661bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, pr.get() != NULL); 671bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, NULL != pr->pixels()); 681bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 691bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 701bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com void* addr = static_cast<void*>(new uint8_t[size]); 711bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 721bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithProc(info, rowBytes, NULL, addr, 731bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com delete_uint8_proc, NULL)); 741bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, pr.get() != NULL); 751bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, addr == pr->pixels()); 761bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 771bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 781bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com int x = 0; 791bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoMalloc memory(size); 801bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, memory.get() != NULL); 811bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 821bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithProc(info, rowBytes, NULL, 831bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com memory.get(), set_to_one_proc, 841bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com static_cast<void*>(&x))); 851bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, pr.get() != NULL); 861bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, memory.get() == pr->pixels()); 871bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, 0 == x); 881bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com pr.reset(NULL); 891bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com // make sure that set_to_one_proc was called. 901bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, 1 == x); 911bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 921bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 931bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com void* addr = static_cast<void*>(new uint8_t[size]); 941bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, addr != NULL); 951bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 961bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithProc(info, rowBytes, NULL, addr, 971bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com delete_uint8_proc, NULL)); 981bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, addr == pr->pixels()); 991bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 1001bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 1011bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com void* addr = sk_malloc_throw(size); 1021bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoDataUnref data(SkData::NewFromMalloc(addr, size)); 1031bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, data.get() != NULL); 1041bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkData* dataPtr = data.get(); 1051bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, dataPtr->unique()); 1061bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 1072c4e75cc3c0302e0e151d90c74b4c476bfa8a8b5commit-bot@chromium.org SkMallocPixelRef::NewWithData(info, rowBytes, NULL, data.get())); 1081bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, !(dataPtr->unique())); 1091bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com data.reset(NULL); 1101bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, dataPtr->unique()); 1112c4e75cc3c0302e0e151d90c74b4c476bfa8a8b5commit-bot@chromium.org REPORTER_ASSERT(reporter, dataPtr->data() == pr->pixels()); 1121bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 1131bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com} 114