1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_HWUI_PATH_CACHE_H
18#define ANDROID_HWUI_PATH_CACHE_H
19
20#include <utils/Vector.h>
21
22#include "Debug.h"
23#include "ShapeCache.h"
24
25#include "utils/Compare.h"
26
27namespace android {
28namespace uirenderer {
29
30///////////////////////////////////////////////////////////////////////////////
31// Classes
32///////////////////////////////////////////////////////////////////////////////
33
34struct PathCacheEntry: public ShapeCacheEntry {
35    PathCacheEntry(SkPath* path, SkPaint* paint):
36            ShapeCacheEntry(ShapeCacheEntry::kShapePath, paint) {
37        this->path = path;
38    }
39
40    PathCacheEntry(): ShapeCacheEntry() {
41        path = NULL;
42    }
43
44    bool lessThan(const ShapeCacheEntry& r) const {
45        const PathCacheEntry& rhs = (const PathCacheEntry&) r;
46        LTE_INT(path) {
47            return false;
48        }
49        return false;
50    }
51
52    SkPath* path;
53
54}; // PathCacheEntry
55
56/**
57 * A simple LRU path cache. The cache has a maximum size expressed in bytes.
58 * Any texture added to the cache causing the cache to grow beyond the maximum
59 * allowed size will also cause the oldest texture to be kicked out.
60 */
61class PathCache: public ShapeCache<PathCacheEntry> {
62public:
63    PathCache();
64
65    /**
66     * Returns the texture associated with the specified path. If the texture
67     * cannot be found in the cache, a new texture is generated.
68     */
69    PathTexture* get(SkPath* path, SkPaint* paint);
70    /**
71     * Removes an entry.
72     */
73    void remove(SkPath* path);
74    /**
75     * Removes the specified path. This is meant to be called from threads
76     * that are not the EGL context thread.
77     */
78    void removeDeferred(SkPath* path);
79    /**
80     * Process deferred removals.
81     */
82    void clearGarbage();
83
84private:
85    Vector<SkPath*> mGarbage;
86    mutable Mutex mLock;
87}; // class PathCache
88
89}; // namespace uirenderer
90}; // namespace android
91
92#endif // ANDROID_HWUI_PATH_CACHE_H
93