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