15c13d89c1332fcc499379b9064b891187b75ca32Chet Haase/* 25c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * Copyright (C) 2010 The Android Open Source Project 35c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * 45c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 55c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * you may not use this file except in compliance with the License. 65c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * You may obtain a copy of the License at 75c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * 85c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 95c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * 105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * Unless required by applicable law or agreed to in writing, software 115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * See the License for the specific language governing permissions and 145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * limitations under the License. 155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase */ 165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_RESOURCE_CACHE_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_RESOURCE_CACHE_H 195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 207953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 217953745dd565167113f8cbfc461bc0521d32d870Romain Guy 225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include <SkBitmap.h> 233d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger#include <SkPixelRef.h> 24e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include <utils/KeyedVector.h> 26a35778c799e8073a42b9e22191bde9d838327ab7John Reck#include <utils/Singleton.h> 27e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 28e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy#include <androidfw/ResourceTypes.h> 29e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 305c13d89c1332fcc499379b9064b891187b75ca32Chet Haasenamespace android { 315c13d89c1332fcc499379b9064b891187b75ca32Chet Haasenamespace uirenderer { 325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 332dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudsonclass Layer; 342dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson 355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase/** 365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase * Type of Resource being cached 375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase */ 385c13d89c1332fcc499379b9064b891187b75ca32Chet Haaseenum ResourceType { 39e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy kNinePatch, 405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; 415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 425c13d89c1332fcc499379b9064b891187b75ca32Chet Haaseclass ResourceReference { 435c13d89c1332fcc499379b9064b891187b75ca32Chet Haasepublic: 445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 45faecb78a6b11c780db47bc940ca7662899ab5d5eChih-Hung Hsieh explicit ResourceReference(ResourceType type) { 463d4eed7f1aa99401dabe2e45b82f98fb4fc2d754Derek Sollenberger refCount = 0; destroyed = false; resourceType = type; 475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase int refCount; 505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase bool destroyed; 515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ResourceType resourceType; 525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; 535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 54a35778c799e8073a42b9e22191bde9d838327ab7John Reckclass ANDROID_API ResourceCache: public Singleton<ResourceCache> { 555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ResourceCache(); 565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ~ResourceCache(); 5758ecc204fbcacef34806290492384677a330d4d4Romain Guy 58a35778c799e8073a42b9e22191bde9d838327ab7John Reck friend class Singleton<ResourceCache>; 59a35778c799e8073a42b9e22191bde9d838327ab7John Reck 60a35778c799e8073a42b9e22191bde9d838327ab7John Reckpublic: 61a35778c799e8073a42b9e22191bde9d838327ab7John Reck 6258ecc204fbcacef34806290492384677a330d4d4Romain Guy /** 6358ecc204fbcacef34806290492384677a330d4d4Romain Guy * When using these two methods, make sure to only invoke the *Locked() 6458ecc204fbcacef34806290492384677a330d4d4Romain Guy * variants of increment/decrementRefcount(), recyle() and destructor() 6558ecc204fbcacef34806290492384677a330d4d4Romain Guy */ 6658ecc204fbcacef34806290492384677a330d4d4Romain Guy void lock(); 6758ecc204fbcacef34806290492384677a330d4d4Romain Guy void unlock(); 6858ecc204fbcacef34806290492384677a330d4d4Romain Guy 69d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void incrementRefcount(const Res_png_9patch* resource); 7058ecc204fbcacef34806290492384677a330d4d4Romain Guy 71d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void decrementRefcount(const Res_png_9patch* resource); 7258ecc204fbcacef34806290492384677a330d4d4Romain Guy 73d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void decrementRefcountLocked(const Res_png_9patch* resource); 7458ecc204fbcacef34806290492384677a330d4d4Romain Guy 75e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy void destructor(Res_png_9patch* resource); 7658ecc204fbcacef34806290492384677a330d4d4Romain Guy 77e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy void destructorLocked(Res_png_9patch* resource); 7858ecc204fbcacef34806290492384677a330d4d4Romain Guy 795c13d89c1332fcc499379b9064b891187b75ca32Chet Haaseprivate: 80d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik void deleteResourceReferenceLocked(const void* resource, ResourceReference* ref); 8158ecc204fbcacef34806290492384677a330d4d4Romain Guy 825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void incrementRefcount(void* resource, ResourceType resourceType); 8358ecc204fbcacef34806290492384677a330d4d4Romain Guy void incrementRefcountLocked(void* resource, ResourceType resourceType); 8458ecc204fbcacef34806290492384677a330d4d4Romain Guy 8558ecc204fbcacef34806290492384677a330d4d4Romain Guy void decrementRefcount(void* resource); 8658ecc204fbcacef34806290492384677a330d4d4Romain Guy void decrementRefcountLocked(void* resource); 8758ecc204fbcacef34806290492384677a330d4d4Romain Guy 885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase void logCache(); 89e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase 90e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase /** 91e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase * Used to increment, decrement, and destroy. Incrementing is generally accessed on the UI 92e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase * thread, but destroying resources may be called from the GC thread, the finalizer thread, 93e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase * or a reference queue finalization thread. 94e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase */ 95e7d2295c06ef9b9df6336cbff23007a13fb3f6e4Chet Haase mutable Mutex mLock; 9658ecc204fbcacef34806290492384677a330d4d4Romain Guy 97d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik KeyedVector<const void*, ResourceReference*>* mCache; 985c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; 995c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 1005c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; // namespace uirenderer 1015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase}; // namespace android 1025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 1035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_RESOURCE_CACHE_H 104