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