PatchCache.cpp revision 5341cead27070656458750a789ba211a505b57b5
1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Copyright (C) 2010 The Android Open Source Project 3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * 4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Licensed under the Apache License, Version 2.0 (the "License"); 5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * you may not use this file except in compliance with the License. 6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * You may obtain a copy of the License at 7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * 8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * http://www.apache.org/licenses/LICENSE-2.0 9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * 10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Unless required by applicable law or agreed to in writing, software 11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * distributed under the License is distributed on an "AS IS" BASIS, 12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * See the License for the specific language governing permissions and 14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * limitations under the License. 15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */ 16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define LOG_TAG "OpenGLRenderer" 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <utils/Log.h> 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "PatchCache.h" 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "Properties.h" 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardnamespace android { 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardnamespace uirenderer { 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/////////////////////////////////////////////////////////////////////////////// 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// Constructors/destructor 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/////////////////////////////////////////////////////////////////////////////// 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 31e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardPatchCache::PatchCache(): mMaxEntries(DEFAULT_PATCH_CACHE_SIZE) { 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 34e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardPatchCache::PatchCache(uint32_t maxEntries): mMaxEntries(maxEntries) { 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 37e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardPatchCache::~PatchCache() { 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard clear(); 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/////////////////////////////////////////////////////////////////////////////// 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard// Caching 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/////////////////////////////////////////////////////////////////////////////// 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid PatchCache::clear() { 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard size_t count = mCache.size(); 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (size_t i = 0; i < count; i++) { 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard delete mCache.valueAt(i); 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard mCache.clear(); 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 53e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardPatch* PatchCache::get(const float bitmapWidth, const float bitmapHeight, 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard const float pixelWidth, const float pixelHeight, 55b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard const int32_t* xDivs, const int32_t* yDivs, const uint32_t* colors, 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard const uint32_t width, const uint32_t height, const int8_t numColors) { 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard int8_t transparentQuads = 0; 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard uint32_t colorKey = 0; 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (uint8_t(numColors) < sizeof(uint32_t) * 4) { 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (int8_t i = 0; i < numColors; i++) { 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (colors[i] == 0x0) { 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard transparentQuads++; 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard colorKey |= 0x1 << i; 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard // If the 9patch is made of only transparent quads 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (transparentQuads == int8_t((width + 1) * (height + 1))) { 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return NULL; 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard const PatchDescription description(bitmapWidth, bitmapHeight, 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pixelWidth, pixelHeight, width, height, transparentQuads, colorKey); 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ssize_t index = mCache.indexOfKey(description); 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Patch* mesh = NULL; 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (index >= 0) { 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard mesh = mCache.valueAt(index); 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (!mesh) { 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard PATCH_LOGD("New patch mesh " 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard "xCount=%d yCount=%d, w=%.2f h=%.2f, bw=%.2f bh=%.2f", 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard width, height, pixelWidth, pixelHeight, bitmapWidth, bitmapHeight); 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard mesh = new Patch(width, height, transparentQuads); 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard mesh->updateColorKey(colorKey); 91b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard mesh->copy(xDivs, yDivs); 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard mesh->updateVertices(bitmapWidth, bitmapHeight, 0.0f, 0.0f, pixelWidth, pixelHeight); 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (mCache.size() >= mMaxEntries) { 95b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard delete mCache.valueAt(mCache.size() - 1); 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard mCache.removeItemsAt(mCache.size() - 1, 1); 97b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard } 98b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard mCache.add(description, mesh); 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else if (!mesh->matches(xDivs, yDivs, colorKey, transparentQuads)) { 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard PATCH_LOGD("Patch mesh does not match, refreshing vertices"); 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard mesh->updateVertices(bitmapWidth, bitmapHeight, 0.0f, 0.0f, pixelWidth, pixelHeight); 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return mesh; 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}; // namespace uirenderer 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}; // namespace android 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard