PatchCache.h revision 13ba0054846ce630ca31e8f26169fd9388faee02
1f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy/*
2f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * Copyright (C) 2010 The Android Open Source Project
3f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy *
4f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * you may not use this file except in compliance with the License.
6f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * You may obtain a copy of the License at
7f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy *
8f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy *
10f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * Unless required by applicable law or agreed to in writing, software
11f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * See the License for the specific language governing permissions and
14f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * limitations under the License.
15f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy */
16f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_PATCH_CACHE_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_PATCH_CACHE_H
19f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
202728f961614a385df1f056fc24803a9f65c90fabRomain Guy#include <utils/KeyedVector.h>
212728f961614a385df1f056fc24803a9f65c90fabRomain Guy
22c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy#include "Debug.h"
23f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#include "Patch.h"
24f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
25f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guynamespace android {
26f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guynamespace uirenderer {
27f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
28f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy///////////////////////////////////////////////////////////////////////////////
29f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy// Defines
30f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy///////////////////////////////////////////////////////////////////////////////
31f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
32f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy// Debug
33f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#if DEBUG_PATCHES
345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define PATCH_LOGD(...) ALOGD(__VA_ARGS__)
35f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#else
36f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    #define PATCH_LOGD(...)
37f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#endif
38f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
39f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy///////////////////////////////////////////////////////////////////////////////
40f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy// Cache
41f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy///////////////////////////////////////////////////////////////////////////////
42f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
432728f961614a385df1f056fc24803a9f65c90fabRomain Guyclass PatchCache {
44f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guypublic:
45fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    PatchCache();
46f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    PatchCache(uint32_t maxCapacity);
47f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    ~PatchCache();
48f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
4913ba0054846ce630ca31e8f26169fd9388faee02Romain Guy    Patch* get(const uint32_t bitmapWidth, const uint32_t bitmapHeight,
502728f961614a385df1f056fc24803a9f65c90fabRomain Guy            const float pixelWidth, const float pixelHeight,
514bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const int32_t* xDivs, const int32_t* yDivs, const uint32_t* colors,
524bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t width, const uint32_t height, const int8_t numColors);
53f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    void clear();
54f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
55c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    uint32_t getSize() const {
56c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy        return mCache.size();
57c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    }
58c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
59c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    uint32_t getMaxSize() const {
60c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy        return mMaxEntries;
61c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    }
62c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
63f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guyprivate:
646f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    /**
656f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy     * Description of a patch.
666f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy     */
676f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    struct PatchDescription {
686f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        PatchDescription(): bitmapWidth(0), bitmapHeight(0), pixelWidth(0), pixelHeight(0),
696f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy                xCount(0), yCount(0), emptyCount(0), colorKey(0) {
706f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        }
716f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
7213ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        PatchDescription(const uint32_t bitmapWidth, const uint32_t bitmapHeight,
736f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy                const float pixelWidth, const float pixelHeight,
746f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy                const uint32_t xCount, const uint32_t yCount,
756f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy                const int8_t emptyCount, const uint32_t colorKey):
766f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy                bitmapWidth(bitmapWidth), bitmapHeight(bitmapHeight),
776f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy                pixelWidth(pixelWidth), pixelHeight(pixelHeight),
786f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy                xCount(xCount), yCount(yCount),
796f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy                emptyCount(emptyCount), colorKey(colorKey) {
806f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        }
816f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
8213ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        static int compare(const PatchDescription& lhs, const PatchDescription& rhs);
8313ba0054846ce630ca31e8f26169fd9388faee02Romain Guy
8413ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        bool operator==(const PatchDescription& other) const {
8513ba0054846ce630ca31e8f26169fd9388faee02Romain Guy            return compare(*this, other) == 0;
8613ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        }
8713ba0054846ce630ca31e8f26169fd9388faee02Romain Guy
8813ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        bool operator!=(const PatchDescription& other) const {
8913ba0054846ce630ca31e8f26169fd9388faee02Romain Guy            return compare(*this, other) != 0;
9013ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        }
9113ba0054846ce630ca31e8f26169fd9388faee02Romain Guy
9213ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        friend inline int strictly_order_type(const PatchDescription& lhs,
9313ba0054846ce630ca31e8f26169fd9388faee02Romain Guy                const PatchDescription& rhs) {
9413ba0054846ce630ca31e8f26169fd9388faee02Romain Guy            return PatchDescription::compare(lhs, rhs) < 0;
9513ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        }
9613ba0054846ce630ca31e8f26169fd9388faee02Romain Guy
9713ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        friend inline int compare_type(const PatchDescription& lhs,
9813ba0054846ce630ca31e8f26169fd9388faee02Romain Guy                const PatchDescription& rhs) {
9913ba0054846ce630ca31e8f26169fd9388faee02Romain Guy            return PatchDescription::compare(lhs, rhs);
1006f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        }
1016f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
1026f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    private:
10313ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        uint32_t bitmapWidth;
10413ba0054846ce630ca31e8f26169fd9388faee02Romain Guy        uint32_t bitmapHeight;
1056f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        float pixelWidth;
1066f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        float pixelHeight;
1076f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        uint32_t xCount;
1086f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        uint32_t yCount;
1096f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        int8_t emptyCount;
1106f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        uint32_t colorKey;
1116f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
1126f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    }; // struct PatchDescription
1136f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
1142728f961614a385df1f056fc24803a9f65c90fabRomain Guy    uint32_t mMaxEntries;
1152728f961614a385df1f056fc24803a9f65c90fabRomain Guy    KeyedVector<PatchDescription, Patch*> mCache;
1166f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
117f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // class PatchCache
118f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
119f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace uirenderer
120f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace android
121f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
1225b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_PATCH_CACHE_H
123