GradientCache.h revision 5b3b35296e8b2c8d3f07d32bb645d5414db41a1d
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 22c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy#include "Texture.h" 2321b028a44f3e0bd9b0f0432b8b92c45f661d22a4Romain Guy#include "utils/GenerationCache.h" 24c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 25c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guynamespace android { 26c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guynamespace uirenderer { 27c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 28c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy/** 29c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * A simple LRU gradient cache. The cache has a maximum size expressed in bytes. 30c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Any texture added to the cache causing the cache to grow beyond the maximum 31c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * allowed size will also cause the oldest texture to be kicked out. 32c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 33c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guyclass GradientCache: public OnEntryRemoved<SkShader*, Texture*> { 34c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guypublic: 35fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy GradientCache(); 36c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy GradientCache(uint32_t maxByteSize); 37c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy ~GradientCache(); 38c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 39c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 40c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Used as a callback when an entry is removed from the cache. 41c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Do not invoke directly. 42c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 43c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy void operator()(SkShader*& shader, Texture*& texture); 44c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 45c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 46c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Adds a new linear gradient to the cache. The generated texture is 47c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * returned. 48c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 49ee916f14cbd1fe1422c063ce2ef7b185e2bc5c6fRomain Guy Texture* addLinearGradient(SkShader* shader, uint32_t* colors, float* positions, 50ee916f14cbd1fe1422c063ce2ef7b185e2bc5c6fRomain Guy int count, SkShader::TileMode tileMode = SkShader::kClamp_TileMode); 51c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 52c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Returns the texture associated with the specified shader. 53c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 54c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy Texture* get(SkShader* shader); 55c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 56c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Removes the texture associated with the specified shader. Returns NULL 57c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * if the texture cannot be found. Upon remove the texture is freed. 58c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 59c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy void remove(SkShader* shader); 60c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 61c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Clears the cache. This causes all textures to be deleted. 62c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 63c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy void clear(); 64c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 65c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 66c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Sets the maximum size of the cache in bytes. 67c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 68c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy void setMaxSize(uint32_t maxSize); 69c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 70c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Returns the maximum size of the cache in bytes. 71c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 72c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy uint32_t getMaxSize(); 73c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy /** 74c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy * Returns the current size of the cache in bytes. 75c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy */ 76c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy uint32_t getSize(); 77c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 78c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guyprivate: 79c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy void generateTexture(SkBitmap* bitmap, Texture* texture); 80c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 81c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy GenerationCache<SkShader*, Texture*> mCache; 82c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 83c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy uint32_t mSize; 84c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy uint32_t mMaxSize; 85a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy 86a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy /** 87a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy * Used to access mCache and mSize. All methods are accessed from a single 88a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy * thread except for remove(). 89a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy */ 90a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy mutable Mutex mLock; 91c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy}; // class GradientCache 92c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 93c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy}; // namespace uirenderer 94c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy}; // namespace android 95c0ac193b9415680f0a69e20a3f5f22d16f8053beRomain Guy 965b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_GRADIENT_CACHE_H 97