GradientCache.h revision fe48f65922d4a3cc4aefe058cee5acec51504a20
1c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy/* 2c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Copyright (C) 2010 The Android Open Source Project 3c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * 4c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * you may not use this file except in compliance with the License. 6c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * You may obtain a copy of the License at 7c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * 8c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 9c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * 10c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Unless required by applicable law or agreed to in writing, software 11c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * See the License for the specific language governing permissions and 14c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * limitations under the License. 15c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 16c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_GRADIENT_CACHE_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_GRADIENT_CACHE_H 19c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 20c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy#include <SkShader.h> 21c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 22fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy#include <utils/Vector.h> 23fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 24c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy#include "Texture.h" 2521b028a44f3e0bd9b0f0432b8b92c45f661d22a4Romain Guy#include "utils/GenerationCache.h" 26c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 27c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guynamespace android { 28c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guynamespace uirenderer { 29c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 30c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy/** 31c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * A simple LRU gradient cache. The cache has a maximum size expressed in bytes. 32c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Any texture added to the cache causing the cache to grow beyond the maximum 33c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * allowed size will also cause the oldest texture to be kicked out. 34c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 35c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guyclass GradientCache: public OnEntryRemoved<SkShader*, Texture*> { 36c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guypublic: 37fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy GradientCache(); 38c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy GradientCache(uint32_t maxByteSize); 39c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy ~GradientCache(); 40c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 41c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 42c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Used as a callback when an entry is removed from the cache. 43c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Do not invoke directly. 44c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 45c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy void operator()(SkShader*& shader, Texture*& texture); 46c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 47c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 48c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Adds a new linear gradient to the cache. The generated texture is 49c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * returned. 50c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 51ee916f14cbd1fe1422c063ce2ef7b185e2bc5c6fRomain Guy Texture* addLinearGradient(SkShader* shader, uint32_t* colors, float* positions, 52ee916f14cbd1fe1422c063ce2ef7b185e2bc5c6fRomain Guy int count, SkShader::TileMode tileMode = SkShader::kClamp_TileMode); 53c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 54c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Returns the texture associated with the specified shader. 55c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 56c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy Texture* get(SkShader* shader); 57c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 58fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Removes the texture associated with the specified shader. 59fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Upon remove the texture is freed. 60c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 61c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy void remove(SkShader* shader); 62c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 63fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Removes the texture associated with the specified shader. This is meant 64fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * to be called from threads that are not the EGL context thread. 65fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 66fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void removeDeferred(SkShader* shader); 67fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 68fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Process deferred removals. 69fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 70fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void clearGarbage(); 71fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 72c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Clears the cache. This causes all textures to be deleted. 73c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 74c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy void clear(); 75c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 76c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 77c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Sets the maximum size of the cache in bytes. 78c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 79c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy void setMaxSize(uint32_t maxSize); 80c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 81c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Returns the maximum size of the cache in bytes. 82c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 83c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy uint32_t getMaxSize(); 84c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 85c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Returns the current size of the cache in bytes. 86c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 87c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy uint32_t getSize(); 88c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 89c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guyprivate: 90c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy void generateTexture(SkBitmap* bitmap, Texture* texture); 91c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 92c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy GenerationCache<SkShader*, Texture*> mCache; 93c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 94c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy uint32_t mSize; 95c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy uint32_t mMaxSize; 96a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy 97fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy Vector<SkShader*> mGarbage; 98a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy mutable Mutex mLock; 99c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy}; // class GradientCache 100c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 101c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy}; // namespace uirenderer 102c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy}; // namespace android 103c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 1045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_GRADIENT_CACHE_H 105