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