TextureCache.cpp revision 364703c6fa4aa1a7d2ef5b0c048ea2a0d57a4c40
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <GLES2/gl2.h> 18 19#include "TextureCache.h" 20 21namespace android { 22namespace uirenderer { 23 24TextureCache::TextureCache(unsigned int maxEntries): mCache(maxEntries) { 25 mCache.setOnEntryRemovedListener(this); 26} 27 28TextureCache::~TextureCache() { 29 mCache.clear(); 30} 31 32void TextureCache::operator()(SkBitmap* key, Texture* value) { 33 LOGD("Entry removed"); 34 if (value) { 35 glDeleteTextures(1, &value->id); 36 delete value; 37 } 38} 39 40Texture* TextureCache::get(SkBitmap* bitmap) { 41 Texture* texture = mCache.get(bitmap); 42 if (!texture) { 43 texture = new Texture; 44 generateTexture(bitmap, texture); 45 mCache.put(bitmap, texture); 46 } 47 return texture; 48} 49 50Texture* TextureCache::remove(SkBitmap* bitmap) { 51 return mCache.remove(bitmap); 52} 53 54void TextureCache::clear() { 55 mCache.clear(); 56} 57 58void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture) { 59 texture->width = bitmap->width(); 60 texture->height = bitmap->height(); 61 62 glGenTextures(1, &texture->id); 63 glBindTexture(GL_TEXTURE_2D, texture->id); 64 65 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 66 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 67 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 68 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 69 70 switch (bitmap->getConfig()) { 71 case SkBitmap::kRGB_565_Config: 72 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB565, texture->width, texture->height, 73 0, GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, bitmap->getPixels()); 74 break; 75 case SkBitmap::kARGB_8888_Config: 76 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->width, texture->height, 77 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmap->getPixels()); 78 break; 79 default: 80 break; 81 } 82 83 return texture; 84} 85 86}; // namespace uirenderer 87}; // namespace android 88