Patch.h revision 03750a067e818ca7fbd0f590e2ff6a8fded21e6c
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
17f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#ifndef ANDROID_UI_PATCH_H
18f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#define ANDROID_UI_PATCH_H
19f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
20f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#include <sys/types.h>
21f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
2203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#include <GLES2/gl2.h>
2303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
24f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#include "Vertex.h"
254bb942083a0d4db746adf95349108dd8ef842e32Romain Guy#include "utils/Compare.h"
26f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
27f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guynamespace android {
28f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guynamespace uirenderer {
29f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
304bb942083a0d4db746adf95349108dd8ef842e32Romain Guy///////////////////////////////////////////////////////////////////////////////
314bb942083a0d4db746adf95349108dd8ef842e32Romain Guy// 9-patch structures
324bb942083a0d4db746adf95349108dd8ef842e32Romain Guy///////////////////////////////////////////////////////////////////////////////
334bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
34f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy/**
35f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * Description of a patch.
36f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy */
37f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guystruct PatchDescription {
384bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    PatchDescription(): bitmapWidth(0), bitmapHeight(0), pixelWidth(0), pixelHeight(0),
394bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            xCount(0), yCount(0), emptyCount(0), colorKey(0) { }
402728f961614a385df1f056fc24803a9f65c90fabRomain Guy    PatchDescription(const float bitmapWidth, const float bitmapHeight,
412728f961614a385df1f056fc24803a9f65c90fabRomain Guy            const float pixelWidth, const float pixelHeight,
424bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t xCount, const uint32_t yCount,
434bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const int8_t emptyCount, const uint32_t colorKey):
442728f961614a385df1f056fc24803a9f65c90fabRomain Guy            bitmapWidth(bitmapWidth), bitmapHeight(bitmapHeight),
452728f961614a385df1f056fc24803a9f65c90fabRomain Guy            pixelWidth(pixelWidth), pixelHeight(pixelHeight),
464bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            xCount(xCount), yCount(yCount),
474bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            emptyCount(emptyCount), colorKey(colorKey) { }
48f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    PatchDescription(const PatchDescription& description):
492728f961614a385df1f056fc24803a9f65c90fabRomain Guy            bitmapWidth(description.bitmapWidth), bitmapHeight(description.bitmapHeight),
502728f961614a385df1f056fc24803a9f65c90fabRomain Guy            pixelWidth(description.pixelWidth), pixelHeight(description.pixelHeight),
514bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            xCount(description.xCount), yCount(description.yCount),
524bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            emptyCount(description.emptyCount), colorKey(description.colorKey) { }
53f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
542728f961614a385df1f056fc24803a9f65c90fabRomain Guy    float bitmapWidth;
552728f961614a385df1f056fc24803a9f65c90fabRomain Guy    float bitmapHeight;
562728f961614a385df1f056fc24803a9f65c90fabRomain Guy    float pixelWidth;
572728f961614a385df1f056fc24803a9f65c90fabRomain Guy    float pixelHeight;
58f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    uint32_t xCount;
59f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    uint32_t yCount;
604bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    int8_t emptyCount;
614bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t colorKey;
62f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
63f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    bool operator<(const PatchDescription& rhs) const {
6403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FLOAT_COMPARE(bitmapWidth) {
6503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy            FLOAT_COMPARE(bitmapHeight) {
6603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy                FLOAT_COMPARE(pixelWidth) {
6703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy                    FLOAT_COMPARE(pixelHeight) {
6803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy                        INT_COMPARE(xCount) {
6903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy                            INT_COMPARE(yCount) {
7003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy                                INT_COMPARE(emptyCount) {
7103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy                                    INT_COMPARE(colorKey) return false;
724bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                                }
734bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                            }
744bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        }
754bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                    }
764bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                }
774bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            }
784bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
794bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return false;
80f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    }
81f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // struct PatchDescription
82f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
83f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy/**
84f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * An OpenGL patch. This contains an array of vertices and an array of
85f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * indices to render the vertices.
86f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy */
87f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guystruct Patch {
884bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    Patch(const uint32_t xCount, const uint32_t yCount, const int8_t emptyQuads = 0);
89fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy    ~Patch();
90f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
91759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    void updateVertices(const float bitmapWidth, const float bitmapHeight,
92759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy            float left, float top, float right, float bottom,
93759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy            const int32_t* xDivs, const int32_t* yDivs,
944bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t width, const uint32_t height,
954bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t colorKey = 0);
96f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
9703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    GLuint meshBuffer;
98f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    uint32_t verticesCount;
99fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
100fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guyprivate:
10103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    TextureVertex* mVertices;
10203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
1036820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    static inline void generateRow(TextureVertex*& vertex, float y1, float y2,
1046820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy            float v1, float v2, const int32_t xDivs[], uint32_t xCount,
1054bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            float stretchX, float width, float bitmapWidth,
1064bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            uint32_t& quadCount, const uint32_t colorKey);
107759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    static inline void generateQuad(TextureVertex*& vertex,
108759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy            float x1, float y1, float x2, float y2,
1094bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            float u1, float v1, float u2, float v2,
1104bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            uint32_t& quadCount, const uint32_t colorKey);
111f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // struct Patch
112f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
113f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace uirenderer
114f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace android
115f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
116f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#endif // ANDROID_UI_PATCH_H
117