TextureCache.cpp revision c1396e93b6a5286a5183c00c781b62e940a12c1f
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, false); 45 mCache.put(bitmap, texture); 46 } else if (bitmap->getGenerationID() != texture->generation) { 47 generateTexture(bitmap, texture, true); 48 } 49 return texture; 50} 51 52Texture* TextureCache::remove(SkBitmap* bitmap) { 53 return mCache.remove(bitmap); 54} 55 56void TextureCache::clear() { 57 mCache.clear(); 58} 59 60void TextureCache::generateTexture(SkBitmap* bitmap, Texture* texture, bool regenerate) { 61 SkAutoLockPixels alp(*bitmap); 62 if (!bitmap->readyToDraw()) { 63 LOGE("Cannot generate texture from bitmap"); 64 return; 65 } 66 67 if (!regenerate) { 68 texture->generation = bitmap->getGenerationID(); 69 texture->width = bitmap->width(); 70 texture->height = bitmap->height(); 71 72 glGenTextures(1, &texture->id); 73 } 74 75 glBindTexture(GL_TEXTURE_2D, texture->id); 76 glPixelStorei(GL_UNPACK_ALIGNMENT, bitmap->bytesPerPixel()); 77 78 switch (bitmap->getConfig()) { 79 case SkBitmap::kRGB_565_Config: 80 texture->blend = false; 81 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bitmap->rowBytesAsPixels(), texture->height, 0, 82 GL_RGB, GL_UNSIGNED_SHORT_5_6_5, bitmap->getPixels()); 83 break; 84 case SkBitmap::kARGB_8888_Config: 85 texture->blend = true; 86 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap->rowBytesAsPixels(), texture->height, 0, 87 GL_RGBA, GL_UNSIGNED_BYTE, bitmap->getPixels()); 88 break; 89 default: 90 break; 91 } 92 93 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 94 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 95 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 96 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 97 98 glBindTexture(GL_TEXTURE_2D, 0); 99} 100 101}; // namespace uirenderer 102}; // namespace android 103