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