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