Patch.h revision a5ef39a21683189e5906c9f252b997f0508e350d
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_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_PATCH_H
19f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
20f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#include <sys/types.h>
21f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
2203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#include <GLES2/gl2.h>
2303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
245b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#include <utils/Vector.h>
255b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#include "Rect.h"
27f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy#include "Vertex.h"
284bb942083a0d4db746adf95349108dd8ef842e32Romain Guy#include "utils/Compare.h"
29f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
30f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guynamespace android {
31f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guynamespace uirenderer {
32f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
334bb942083a0d4db746adf95349108dd8ef842e32Romain Guy///////////////////////////////////////////////////////////////////////////////
344bb942083a0d4db746adf95349108dd8ef842e32Romain Guy// 9-patch structures
354bb942083a0d4db746adf95349108dd8ef842e32Romain Guy///////////////////////////////////////////////////////////////////////////////
364bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
37f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy/**
38f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * An OpenGL patch. This contains an array of vertices and an array of
39f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * indices to render the vertices.
40f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy */
41f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guystruct Patch {
424bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    Patch(const uint32_t xCount, const uint32_t yCount, const int8_t emptyQuads = 0);
43fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy    ~Patch();
44f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
45759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy    void updateVertices(const float bitmapWidth, const float bitmapHeight,
466f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            float left, float top, float right, float bottom);
476f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
486f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    void updateColorKey(const uint32_t colorKey);
496f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    void copy(const int32_t* xDivs, const int32_t* yDivs);
506f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    bool matches(const int32_t* xDivs, const int32_t* yDivs, const uint32_t colorKey);
51f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
5203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    GLuint meshBuffer;
53f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    uint32_t verticesCount;
545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    bool hasEmptyQuads;
55a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy#if RENDER_LAYERS_AS_REGIONS
56a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy    Vector<Rect> quads;
57a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy#endif
58fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
59fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guyprivate:
6003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    TextureVertex* mVertices;
616f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    bool mUploaded;
626f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
636f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    int32_t* mXDivs;
646f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    int32_t* mYDivs;
656f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    uint32_t mColorKey;
666f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
67a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy    uint32_t mXCount;
68a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy    uint32_t mYCount;
69a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy    int8_t mEmptyQuads;
70a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy
716f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    void copy(const int32_t* yDivs);
7203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    void generateRow(TextureVertex*& vertex, float y1, float y2,
746f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            float v1, float v2, float stretchX, float width, float bitmapWidth,
756f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            uint32_t& quadCount);
765b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    void generateQuad(TextureVertex*& vertex,
77759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guy            float x1, float y1, float x2, float y2,
784bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            float u1, float v1, float u2, float v2,
796f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            uint32_t& quadCount);
80f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // struct Patch
81f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
82f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace uirenderer
83f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace android
84f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
855b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_PATCH_H
86