17fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy/*
27fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * Copyright (C) 2010 The Android Open Source Project
37fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy *
47fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
57fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * you may not use this file except in compliance with the License.
67fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * You may obtain a copy of the License at
77fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy *
87fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
97fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy *
107fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * Unless required by applicable law or agreed to in writing, software
117fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
127fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * See the License for the specific language governing permissions and
147fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * limitations under the License.
157fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy */
167fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_PATH_CACHE_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_PATH_CACHE_H
197fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
20fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy#include <utils/Vector.h>
21fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy
22c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy#include "Debug.h"
23ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy#include "ShapeCache.h"
24ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy
254bb942083a0d4db746adf95349108dd8ef842e32Romain Guy#include "utils/Compare.h"
267fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
277fbcc0492fca03857e3c45064f4aa040af817d55Romain Guynamespace android {
287fbcc0492fca03857e3c45064f4aa040af817d55Romain Guynamespace uirenderer {
297fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
309e10841c27d973b930e1b49a099c69d866659505Romain Guy///////////////////////////////////////////////////////////////////////////////
319e10841c27d973b930e1b49a099c69d866659505Romain Guy// Classes
329e10841c27d973b930e1b49a099c69d866659505Romain Guy///////////////////////////////////////////////////////////////////////////////
339e10841c27d973b930e1b49a099c69d866659505Romain Guy
34ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guystruct PathCacheEntry: public ShapeCacheEntry {
35ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy    PathCacheEntry(SkPath* path, SkPaint* paint):
36ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy            ShapeCacheEntry(ShapeCacheEntry::kShapePath, paint) {
37ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy        this->path = path;
387fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    }
397fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
40ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy    PathCacheEntry(): ShapeCacheEntry() {
41ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy        path = NULL;
427fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    }
437fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
44ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy    bool lessThan(const ShapeCacheEntry& r) const {
45ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy        const PathCacheEntry& rhs = (const PathCacheEntry&) r;
462665b85b2bd08faabf7c520a622a0e4d3465245fRomain Guy        LTE_INT(path) {
47ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy            return false;
484bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
494bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return false;
507fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    }
5122158e139a3d6c6a9787ca0de224e9368f643284Romain Guy
52ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy    SkPath* path;
53b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy
54ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy}; // PathCacheEntry
557fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
567fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy/**
577fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * A simple LRU path cache. The cache has a maximum size expressed in bytes.
587fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * Any texture added to the cache causing the cache to grow beyond the maximum
597fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy * allowed size will also cause the oldest texture to be kicked out.
607fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy */
61ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guyclass PathCache: public ShapeCache<PathCacheEntry> {
627fbcc0492fca03857e3c45064f4aa040af817d55Romain Guypublic:
63fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    PathCache();
647fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
657fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    /**
667fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy     * Returns the texture associated with the specified path. If the texture
677fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy     * cannot be found in the cache, a new texture is generated.
687fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy     */
697fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    PathTexture* get(SkPath* path, SkPaint* paint);
707fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy    /**
71a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy     * Removes an entry.
72a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy     */
73a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy    void remove(SkPath* path);
74fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    /**
75fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * Removes the specified path. This is meant to be called from threads
76fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * that are not the EGL context thread.
77fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     */
78fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    void removeDeferred(SkPath* path);
79fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    /**
80fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * Process deferred removals.
81fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     */
82fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    void clearGarbage();
837fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
847fbcc0492fca03857e3c45064f4aa040af817d55Romain Guyprivate:
85fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    Vector<SkPath*> mGarbage;
86a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy    mutable Mutex mLock;
877fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy}; // class PathCache
887fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
897fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy}; // namespace uirenderer
907fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy}; // namespace android
917fbcc0492fca03857e3c45064f4aa040af817d55Romain Guy
925b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_PATH_CACHE_H
93