1d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao/* 2d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao * Copyright 2014 Google Inc. 3d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao * 4d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao * Use of this source code is governed by a BSD-style license that can be 5d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao * found in the LICENSE file. 6d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao */ 7d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 8d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao#include "SkCachedData.h" 9d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao#include "SkMaskCache.h" 10d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao#include "SkResourceCache.h" 11d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao#include "Test.h" 12d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 13d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miaoenum LockedState { 14d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao kUnlocked, 15d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao kLocked, 16d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao}; 17d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 18d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miaoenum CachedState { 19d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao kNotInCache, 20d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao kInCache, 21d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao}; 22d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 23d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miaostatic void check_data(skiatest::Reporter* reporter, SkCachedData* data, 24d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao int refcnt, CachedState cacheState, LockedState lockedState) { 25d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, data->testing_only_getRefCnt() == refcnt); 26d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, data->testing_only_isInCache() == (kInCache == cacheState)); 272880df2609eba09b555ca37be04b6ad89290c765Tom Hudson bool isLocked = (data->data() != nullptr); 28d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, isLocked == (lockedState == kLocked)); 29d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao} 30d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 31d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miaoDEF_TEST(RRectMaskCache, reporter) { 32d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkResourceCache cache(1024); 33d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 34d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkScalar sigma = 0.8f; 35d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkRect rect = SkRect::MakeWH(100, 100); 36d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkRRect rrect; 37d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao rrect.setRectXY(rect, 30, 30); 38d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkBlurStyle style = kNormal_SkBlurStyle; 39d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkBlurQuality quality = kLow_SkBlurQuality; 40d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkMask mask; 41d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 424dca7a829635b552be369186ff508a94aba6a903reed SkCachedData* data = SkMaskCache::FindAndRef(sigma, style, quality, rrect, &mask, &cache); 432880df2609eba09b555ca37be04b6ad89290c765Tom Hudson REPORTER_ASSERT(reporter, nullptr == data); 44d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 45d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao size_t size = 256; 46d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao data = cache.newCachedData(size); 47d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao memset(data->writable_data(), 0xff, size); 48d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao mask.fBounds.setXYWH(0, 0, 100, 100); 49d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao mask.fRowBytes = 100; 50d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao mask.fFormat = SkMask::kBW_Format; 514dca7a829635b552be369186ff508a94aba6a903reed SkMaskCache::Add(sigma, style, quality, rrect, mask, data, &cache); 52d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao check_data(reporter, data, 2, kInCache, kLocked); 53d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 54d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao data->unref(); 55d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao check_data(reporter, data, 1, kInCache, kUnlocked); 56d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 57d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao sk_bzero(&mask, sizeof(mask)); 584dca7a829635b552be369186ff508a94aba6a903reed data = SkMaskCache::FindAndRef(sigma, style, quality, rrect, &mask, &cache); 59d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, data); 60d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, data->size() == size); 61d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, mask.fBounds.top() == 0 && mask.fBounds.bottom() == 100); 62d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, data->data() == (const void*)mask.fImage); 63d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao check_data(reporter, data, 2, kInCache, kLocked); 64d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 65d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao cache.purgeAll(); 66d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao check_data(reporter, data, 1, kNotInCache, kLocked); 67d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao data->unref(); 68d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao} 69d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 70d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miaoDEF_TEST(RectsMaskCache, reporter) { 71d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkResourceCache cache(1024); 72d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 73d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkScalar sigma = 0.8f; 74d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkRect rect = SkRect::MakeWH(100, 100); 75d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkRect rects[2] = {rect}; 76d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkBlurStyle style = kNormal_SkBlurStyle; 774dca7a829635b552be369186ff508a94aba6a903reed SkBlurQuality quality = kLow_SkBlurQuality; 78d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao SkMask mask; 79d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 804dca7a829635b552be369186ff508a94aba6a903reed SkCachedData* data = SkMaskCache::FindAndRef(sigma, style, quality, rects, 1, &mask, &cache); 812880df2609eba09b555ca37be04b6ad89290c765Tom Hudson REPORTER_ASSERT(reporter, nullptr == data); 82d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 83d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao size_t size = 256; 84d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao data = cache.newCachedData(size); 85d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao memset(data->writable_data(), 0xff, size); 86d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao mask.fBounds.setXYWH(0, 0, 100, 100); 87d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao mask.fRowBytes = 100; 88d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao mask.fFormat = SkMask::kBW_Format; 894dca7a829635b552be369186ff508a94aba6a903reed SkMaskCache::Add(sigma, style, quality, rects, 1, mask, data, &cache); 90d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao check_data(reporter, data, 2, kInCache, kLocked); 91d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 92d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao data->unref(); 93d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao check_data(reporter, data, 1, kInCache, kUnlocked); 94d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 95d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao sk_bzero(&mask, sizeof(mask)); 964dca7a829635b552be369186ff508a94aba6a903reed data = SkMaskCache::FindAndRef(sigma, style, quality, rects, 1, &mask, &cache); 97d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, data); 98d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, data->size() == size); 99d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, mask.fBounds.top() == 0 && mask.fBounds.bottom() == 100); 100d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao REPORTER_ASSERT(reporter, data->data() == (const void*)mask.fImage); 101d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao check_data(reporter, data, 2, kInCache, kLocked); 102d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao 103d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao cache.purgeAll(); 104d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao check_data(reporter, data, 1, kNotInCache, kLocked); 105d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao data->unref(); 106d9aac34eceeb197c5551f38583670be7729dd00aqiankun.miao} 107