MallocPixelRefTest.cpp revision 1bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9
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#include "TestClassDef.h" 121bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com 131bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.comstatic void delete_uint8_proc(void* ptr, void*) { 141bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com delete[] static_cast<uint8_t*>(ptr); 151bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com} 161bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com 171bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.comstatic void set_to_one_proc(void*, void* context) { 181bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com *(static_cast<int*>(context)) = 1; 191bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com} 201bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com 211bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com/** 221bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com * This test contains basic sanity checks concerning SkMallocPixelRef. 231bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com */ 241bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.comDEF_TEST(MallocPixelRef, reporter) { 251bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, true); 261bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkImageInfo info = {10, 13, kPMColor_SkColorType, kPremul_SkAlphaType}; 271bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 281bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 291bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewAllocate(info, info.minRowBytes() - 1, NULL)); 301bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com // rowbytes too small. 311bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, NULL == pr.get()); 321bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 331bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 341bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t rowBytes = info.minRowBytes() - 1; 351bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t size = info.getSafeSize(rowBytes); 361bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com void* addr = sk_malloc_throw(size); 371bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoDataUnref data(SkData::NewFromMalloc(addr, size)); 381bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 391bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithData(info, rowBytes, 401bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com NULL, data.get())); 411bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com // rowbytes too small. 421bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, NULL == pr.get()); 431bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 441bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 451bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t rowBytes = info.minRowBytes() + 2; 461bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t size = info.getSafeSize(rowBytes) - 1; 471bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com void* addr = sk_malloc_throw(size); 481bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoDataUnref data(SkData::NewFromMalloc(addr, size)); 491bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 501bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithData(info, rowBytes, NULL, 511bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com data.get())); 521bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com // data too small. 531bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, NULL == pr.get()); 541bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 551bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t rowBytes = info.minRowBytes() + 7; 561bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com size_t size = info.getSafeSize(rowBytes) + 9; 571bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 581bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoMalloc memory(size); 591bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 601bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewDirect(info, memory.get(), rowBytes, NULL)); 611bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, pr.get() != NULL); 621bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, memory.get() == pr->pixels()); 631bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 641bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 651bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 661bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewAllocate(info, rowBytes, NULL)); 671bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, pr.get() != NULL); 681bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, NULL != pr->pixels()); 691bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 701bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 711bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com void* addr = static_cast<void*>(new uint8_t[size]); 721bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 731bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithProc(info, rowBytes, NULL, addr, 741bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com delete_uint8_proc, NULL)); 751bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, pr.get() != NULL); 761bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, addr == pr->pixels()); 771bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 781bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 791bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com int x = 0; 801bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoMalloc memory(size); 811bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, memory.get() != NULL); 821bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 831bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithProc(info, rowBytes, NULL, 841bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com memory.get(), set_to_one_proc, 851bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com static_cast<void*>(&x))); 861bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, pr.get() != NULL); 871bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, memory.get() == pr->pixels()); 881bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, 0 == x); 891bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com pr.reset(NULL); 901bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com // make sure that set_to_one_proc was called. 911bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, 1 == x); 921bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 931bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 941bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com void* addr = static_cast<void*>(new uint8_t[size]); 951bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, addr != NULL); 961bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 971bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithProc(info, rowBytes, NULL, addr, 981bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com delete_uint8_proc, NULL)); 991bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, addr == pr->pixels()); 1001bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 1011bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com { 1021bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com void* addr = sk_malloc_throw(size); 1031bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoDataUnref data(SkData::NewFromMalloc(addr, size)); 1041bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, data.get() != NULL); 1051bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkData* dataPtr = data.get(); 1061bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, dataPtr->unique()); 1071bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkAutoTUnref<SkMallocPixelRef> pr( 1081bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com SkMallocPixelRef::NewWithData(info, rowBytes, NULL, data.get(), 4)); 1091bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, !(dataPtr->unique())); 1101bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com data.reset(NULL); 1111bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, dataPtr->unique()); 1121bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com REPORTER_ASSERT(reporter, 1131bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com static_cast<const void*>(dataPtr->bytes() + 4) == pr->pixels()); 1141bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com } 1151bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com} 1161bed687f6b8fc67336f0f5d6fb5a5b38dd0fdff9halcanary@google.com 117