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