TextureCache.h revision 9aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4
1ce0537b80087a6225273040a987414b1dd081aa0Romain Guy/* 2ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Copyright (C) 2010 The Android Open Source Project 3ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * 4ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * you may not use this file except in compliance with the License. 6ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * You may obtain a copy of the License at 7ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * 8ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * 10ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * Unless required by applicable law or agreed to in writing, software 11ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * See the License for the specific language governing permissions and 14ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * limitations under the License. 15ce0537b80087a6225273040a987414b1dd081aa0Romain Guy */ 16ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 17ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#ifndef ANDROID_UI_TEXTURE_CACHE_H 18ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#define ANDROID_UI_TEXTURE_CACHE_H 19ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 20ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include <SkBitmap.h> 21ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 22ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include "Texture.h" 23ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include "GenerationCache.h" 24ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 25ce0537b80087a6225273040a987414b1dd081aa0Romain Guynamespace android { 26ce0537b80087a6225273040a987414b1dd081aa0Romain Guynamespace uirenderer { 27ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 28121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy/** 29121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * A simple LRU texture cache. The cache has a maximum size expressed in bytes. 30121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Any texture added to the cache causing the cache to grow beyond the maximum 31121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * allowed size will also cause the oldest texture to be kicked out. 32121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 33ce0537b80087a6225273040a987414b1dd081aa0Romain Guyclass TextureCache: public OnEntryRemoved<SkBitmap*, Texture*> { 34ce0537b80087a6225273040a987414b1dd081aa0Romain Guypublic: 35fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy TextureCache(); 367d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy TextureCache(uint32_t maxByteSize); 37ce0537b80087a6225273040a987414b1dd081aa0Romain Guy ~TextureCache(); 38ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 39121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 40121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Used as a callback when an entry is removed from the cache. 41121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Do not invoke directly. 42121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 43dda570201ac851dd85af3861f7e575721d3345daRomain Guy void operator()(SkBitmap*& bitmap, Texture*& texture); 44ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 45121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 46121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the texture associated with the specified bitmap. If the texture 47121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * cannot be found in the cache, a new texture is generated. 48121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 49ce0537b80087a6225273040a987414b1dd081aa0Romain Guy Texture* get(SkBitmap* bitmap); 50121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 51121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Removes the texture associated with the specified bitmap. Returns NULL 52121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * if the texture cannot be found. Upon remove the texture is freed. 53121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 54121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy void remove(SkBitmap* bitmap); 55121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 56121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Clears the cache. This causes all textures to be deleted. 57121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 58ce0537b80087a6225273040a987414b1dd081aa0Romain Guy void clear(); 59ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 60121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 61121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Sets the maximum size of the cache in bytes. 62121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 637d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy void setMaxSize(uint32_t maxSize); 64121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 65121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the maximum size of the cache in bytes. 66121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 677d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t getMaxSize(); 68121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 69121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Returns the current size of the cache in bytes. 70121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 717d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t getSize(); 72121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy 73ce0537b80087a6225273040a987414b1dd081aa0Romain Guyprivate: 74121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy /** 75121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * Generates the texture from a bitmap into the specified texture structure. 76121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * 77121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * @param regenerate If true, the bitmap data is reuploaded into the texture, but 78121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy * no new texture is generated. 79121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy */ 80fe8809471a40cac8acc984adfa51c39e13e83947Romain Guy void generateTexture(SkBitmap* bitmap, Texture* texture, bool regenerate = false); 81ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 82fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy void init(); 83fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 846c81893c626499e58c8eeb20d6c35ec4e1ce808bRomain Guy GenerationCache<SkBitmap*, Texture*> mCache; 85121e2242565d5f09ad83a2d33ecd2225838802c5Romain Guy 867d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t mSize; 877d139ba2c331f11e9b485753cc727a0ff202f2a4Romain Guy uint32_t mMaxSize; 88163935113919a184122b8b3bd672ef08c8df65dcRomain Guy GLint mMaxTextureSize; 899aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy 909aaa8269a3e7291aab84d01c3fc9c744d8f2d2f4Romain Guy mutable Mutex mLock; 91ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // class TextureCache 92ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 93ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace uirenderer 94ce0537b80087a6225273040a987414b1dd081aa0Romain Guy}; // namespace android 95ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 96ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#endif // ANDROID_UI_TEXTURE_CACHE_H 97