1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2014 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 "src/core/SkCachedData.h" 9cb93a386Sopenharmony_ci#include "src/core/SkMaskCache.h" 10cb93a386Sopenharmony_ci#include "src/core/SkResourceCache.h" 11cb93a386Sopenharmony_ci#include "tests/Test.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_cienum LockedState { 14cb93a386Sopenharmony_ci kUnlocked, 15cb93a386Sopenharmony_ci kLocked, 16cb93a386Sopenharmony_ci}; 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_cienum CachedState { 19cb93a386Sopenharmony_ci kNotInCache, 20cb93a386Sopenharmony_ci kInCache, 21cb93a386Sopenharmony_ci}; 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_cistatic void check_data(skiatest::Reporter* reporter, SkCachedData* data, 24cb93a386Sopenharmony_ci int refcnt, CachedState cacheState, LockedState lockedState) { 25cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data->testing_only_getRefCnt() == refcnt); 26cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data->testing_only_isInCache() == (kInCache == cacheState)); 27cb93a386Sopenharmony_ci bool isLocked = (data->data() != nullptr); 28cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, isLocked == (lockedState == kLocked)); 29cb93a386Sopenharmony_ci} 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciDEF_TEST(RRectMaskCache, reporter) { 32cb93a386Sopenharmony_ci SkResourceCache cache(1024); 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci SkScalar sigma = 0.8f; 35cb93a386Sopenharmony_ci SkRect rect = SkRect::MakeWH(100, 100); 36cb93a386Sopenharmony_ci SkRRect rrect; 37cb93a386Sopenharmony_ci rrect.setRectXY(rect, 30, 30); 38cb93a386Sopenharmony_ci SkBlurStyle style = kNormal_SkBlurStyle; 39cb93a386Sopenharmony_ci SkMask mask; 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci SkCachedData* data = SkMaskCache::FindAndRef(sigma, style, rrect, &mask, &cache); 42cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, nullptr == data); 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci size_t size = 256; 45cb93a386Sopenharmony_ci data = cache.newCachedData(size); 46cb93a386Sopenharmony_ci memset(data->writable_data(), 0xff, size); 47cb93a386Sopenharmony_ci mask.fBounds.setXYWH(0, 0, 100, 100); 48cb93a386Sopenharmony_ci mask.fRowBytes = 100; 49cb93a386Sopenharmony_ci mask.fFormat = SkMask::kBW_Format; 50cb93a386Sopenharmony_ci SkMaskCache::Add(sigma, style, rrect, mask, data, &cache); 51cb93a386Sopenharmony_ci check_data(reporter, data, 2, kInCache, kLocked); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci data->unref(); 54cb93a386Sopenharmony_ci check_data(reporter, data, 1, kInCache, kUnlocked); 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci sk_bzero(&mask, sizeof(mask)); 57cb93a386Sopenharmony_ci data = SkMaskCache::FindAndRef(sigma, style, rrect, &mask, &cache); 58cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data); 59cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data->size() == size); 60cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, mask.fBounds.top() == 0 && mask.fBounds.bottom() == 100); 61cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data->data() == (const void*)mask.fImage); 62cb93a386Sopenharmony_ci check_data(reporter, data, 2, kInCache, kLocked); 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci cache.purgeAll(); 65cb93a386Sopenharmony_ci check_data(reporter, data, 1, kNotInCache, kLocked); 66cb93a386Sopenharmony_ci data->unref(); 67cb93a386Sopenharmony_ci} 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ciDEF_TEST(RectsMaskCache, reporter) { 70cb93a386Sopenharmony_ci SkResourceCache cache(1024); 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci SkScalar sigma = 0.8f; 73cb93a386Sopenharmony_ci SkRect rect = SkRect::MakeWH(100, 100); 74cb93a386Sopenharmony_ci SkRect rects[2] = {rect}; 75cb93a386Sopenharmony_ci SkBlurStyle style = kNormal_SkBlurStyle; 76cb93a386Sopenharmony_ci SkMask mask; 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci SkCachedData* data = SkMaskCache::FindAndRef(sigma, style, rects, 1, &mask, &cache); 79cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, nullptr == data); 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci size_t size = 256; 82cb93a386Sopenharmony_ci data = cache.newCachedData(size); 83cb93a386Sopenharmony_ci memset(data->writable_data(), 0xff, size); 84cb93a386Sopenharmony_ci mask.fBounds.setXYWH(0, 0, 100, 100); 85cb93a386Sopenharmony_ci mask.fRowBytes = 100; 86cb93a386Sopenharmony_ci mask.fFormat = SkMask::kBW_Format; 87cb93a386Sopenharmony_ci SkMaskCache::Add(sigma, style, rects, 1, mask, data, &cache); 88cb93a386Sopenharmony_ci check_data(reporter, data, 2, kInCache, kLocked); 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci data->unref(); 91cb93a386Sopenharmony_ci check_data(reporter, data, 1, kInCache, kUnlocked); 92cb93a386Sopenharmony_ci 93cb93a386Sopenharmony_ci sk_bzero(&mask, sizeof(mask)); 94cb93a386Sopenharmony_ci data = SkMaskCache::FindAndRef(sigma, style, rects, 1, &mask, &cache); 95cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data); 96cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data->size() == size); 97cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, mask.fBounds.top() == 0 && mask.fBounds.bottom() == 100); 98cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, data->data() == (const void*)mask.fImage); 99cb93a386Sopenharmony_ci check_data(reporter, data, 2, kInCache, kLocked); 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ci cache.purgeAll(); 102cb93a386Sopenharmony_ci check_data(reporter, data, 1, kNotInCache, kLocked); 103cb93a386Sopenharmony_ci data->unref(); 104cb93a386Sopenharmony_ci} 105