Patch.cpp revision 6381dd4ff212a95be30d2b445d40ff419ab076b4
1fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy/* 2fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * Copyright (C) 2010 The Android Open Source Project 3fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * 4fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * you may not use this file except in compliance with the License. 6fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * You may obtain a copy of the License at 7fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * 8fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 9fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * 10fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * Unless required by applicable law or agreed to in writing, software 11fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * See the License for the specific language governing permissions and 14fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy * limitations under the License. 15fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy */ 16fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 17fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy#define LOG_TAG "OpenGLRenderer" 18fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 196820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy#include <cmath> 20fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 214bb942083a0d4db746adf95349108dd8ef842e32Romain Guy#include <utils/Log.h> 224bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 2303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#include "Caches.h" 243b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include "Patch.h" 25a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy#include "Properties.h" 263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include "UvMapper.h" 27fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 28fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guynamespace android { 29fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guynamespace uirenderer { 30fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 31fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 32fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy// Constructors/destructor 33fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 34fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 3503c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain GuyPatch::Patch(): vertices(NULL), verticesCount(0), indexCount(0), hasEmptyQuads(false) { 36fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy} 37fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 38fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain GuyPatch::~Patch() { 39fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy} 40fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 41fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 423b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// Vertices management 436f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy/////////////////////////////////////////////////////////////////////////////// 446f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 453b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyuint32_t Patch::getSize() const { 463b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy return verticesCount * sizeof(TextureVertex); 476f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy} 486f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain GuyTextureVertex* Patch::createMesh(const float bitmapWidth, const float bitmapHeight, 5003c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy float width, float height, const Res_png_9patch* patch) { 513b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy UvMapper mapper; 5203c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy return createMesh(bitmapWidth, bitmapHeight, width, height, mapper, patch); 536f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy} 546f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 553b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain GuyTextureVertex* Patch::createMesh(const float bitmapWidth, const float bitmapHeight, 5603c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy float width, float height, const UvMapper& mapper, const Res_png_9patch* patch) { 5703c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy if (vertices) return vertices; 585341cead27070656458750a789ba211a505b57b5Romain Guy 593b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy int8_t emptyQuads = 0; 606381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath mColors = patch->getColors(); 613b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 626cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy const int8_t numColors = patch->numColors; 633b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy if (uint8_t(numColors) < sizeof(uint32_t) * 4) { 643b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (int8_t i = 0; i < numColors; i++) { 656cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy if (mColors[i] == 0x0) { 663b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy emptyQuads++; 673b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 683b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 696f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy } 706f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 713b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy hasEmptyQuads = emptyQuads > 0; 726f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 733b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy uint32_t xCount = patch->numXDivs; 743b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy uint32_t yCount = patch->numYDivs; 756f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 763b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy uint32_t maxVertices = ((xCount + 1) * (yCount + 1) - emptyQuads) * 4; 773b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy if (maxVertices == 0) return NULL; 78fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 79f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy TextureVertex* tempVertices = new TextureVertex[maxVertices]; 80f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy TextureVertex* vertex = tempVertices; 81a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy 826381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath const int32_t* xDivs = patch->getXDivs(); 836381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath const int32_t* yDivs = patch->getYDivs(); 845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 853b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy const uint32_t xStretchCount = (xCount + 1) >> 1; 863b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy const uint32_t yStretchCount = (yCount + 1) >> 1; 87fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 886820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float stretchX = 0.0f; 8941d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy float stretchY = 0.0f; 9041d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy 9141d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy float rescaleX = 1.0f; 9241d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy float rescaleY = 1.0f; 93fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 94fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy if (xStretchCount > 0) { 95fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy uint32_t stretchSize = 0; 963b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (uint32_t i = 1; i < xCount; i += 2) { 973b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy stretchSize += xDivs[i] - xDivs[i - 1]; 98fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 996820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy const float xStretchTex = stretchSize; 100fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy const float fixed = bitmapWidth - stretchSize; 10103c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy const float xStretch = fmaxf(width - fixed, 0.0f); 1026820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy stretchX = xStretch / xStretchTex; 10303c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy rescaleX = fixed == 0.0f ? 0.0f : fminf(fmaxf(width, 0.0f) / fixed, 1.0f); 104fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 105fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 106fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy if (yStretchCount > 0) { 107fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy uint32_t stretchSize = 0; 1083b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (uint32_t i = 1; i < yCount; i += 2) { 1093b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy stretchSize += yDivs[i] - yDivs[i - 1]; 110fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 1116820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy const float yStretchTex = stretchSize; 112fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy const float fixed = bitmapHeight - stretchSize; 11303c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy const float yStretch = fmaxf(height - fixed, 0.0f); 1146820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy stretchY = yStretch / yStretchTex; 11503c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy rescaleY = fixed == 0.0f ? 0.0f : fminf(fmaxf(height, 0.0f) / fixed, 1.0f); 116fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 117fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1184bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t quadCount = 0; 119fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1206820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float previousStepY = 0.0f; 121fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1226820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float y1 = 0.0f; 123f504a2fa144504ca1efd39a4ef9208e3d4d336c5Romain Guy float y2 = 0.0f; 1246820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float v1 = 0.0f; 1256820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy mUvMapper = mapper; 1273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 1283b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (uint32_t i = 0; i < yCount; i++) { 1293b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy float stepY = yDivs[i]; 1305e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy const float segment = stepY - previousStepY; 1316820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1326820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy if (i & 1) { 1338ab4079ca27e36e5c584495bcd71b573598ac021Romain Guy y2 = y1 + floorf(segment * stretchY + 0.5f); 134fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } else { 13541d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy y2 = y1 + segment * rescaleY; 136fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 1375e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy 1385e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy float vOffset = y1 == y2 ? 0.0f : 0.5 - (0.5 * segment / (y2 - y1)); 1395e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy float v2 = fmax(0.0f, stepY - vOffset) / bitmapHeight; 1405e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy v1 += vOffset / bitmapHeight; 1416820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 142eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy if (stepY > 0.0f) { 1433b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy generateRow(xDivs, xCount, vertex, y1, y2, v1, v2, stretchX, rescaleX, 14403c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy width, bitmapWidth, quadCount); 145eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy } 1466820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1476820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy y1 = y2; 1485e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy v1 = stepY / bitmapHeight; 1496820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1506820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy previousStepY = stepY; 151fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 152fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 153fdbec3e4828f93bfa5cde758ad0e77b89c5c2ecdRomain Guy if (previousStepY != bitmapHeight) { 15403c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy y2 = height; 1553b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy generateRow(xDivs, xCount, vertex, y1, y2, v1, 1.0f, stretchX, rescaleX, 15603c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy width, bitmapWidth, quadCount); 1576f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy } 158a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy 159f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy if (verticesCount == maxVertices) { 160f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy vertices = tempVertices; 161f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy } else { 162f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy vertices = new TextureVertex[verticesCount]; 163f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy memcpy(vertices, tempVertices, verticesCount * sizeof(TextureVertex)); 164f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy delete[] tempVertices; 165f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy } 166f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy 1673b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy return vertices; 168fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy} 169fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1703b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyvoid Patch::generateRow(const int32_t* xDivs, uint32_t xCount, TextureVertex*& vertex, 1713b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy float y1, float y2, float v1, float v2, float stretchX, float rescaleX, 1723b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy float width, float bitmapWidth, uint32_t& quadCount) { 1736820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float previousStepX = 0.0f; 1746820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1756820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float x1 = 0.0f; 176f504a2fa144504ca1efd39a4ef9208e3d4d336c5Romain Guy float x2 = 0.0f; 1776820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float u1 = 0.0f; 178fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1796820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy // Generate the row quad by quad 1803b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (uint32_t i = 0; i < xCount; i++) { 1813b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy float stepX = xDivs[i]; 1825e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy const float segment = stepX - previousStepX; 183fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1846820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy if (i & 1) { 1858ab4079ca27e36e5c584495bcd71b573598ac021Romain Guy x2 = x1 + floorf(segment * stretchX + 0.5f); 186fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } else { 18741d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy x2 = x1 + segment * rescaleX; 188fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 1895e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy 1905e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy float uOffset = x1 == x2 ? 0.0f : 0.5 - (0.5 * segment / (x2 - x1)); 1915e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy float u2 = fmax(0.0f, stepX - uOffset) / bitmapWidth; 1925e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy u1 += uOffset / bitmapWidth; 193fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 194eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy if (stepX > 0.0f) { 195eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy generateQuad(vertex, x1, y1, x2, y2, u1, v1, u2, v2, quadCount); 196eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy } 1976820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1986820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy x1 = x2; 1995e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy u1 = stepX / bitmapWidth; 2006820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 2016820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy previousStepX = stepX; 202fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 203fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 204fdbec3e4828f93bfa5cde758ad0e77b89c5c2ecdRomain Guy if (previousStepX != bitmapWidth) { 205f504a2fa144504ca1efd39a4ef9208e3d4d336c5Romain Guy x2 = width; 206f504a2fa144504ca1efd39a4ef9208e3d4d336c5Romain Guy generateQuad(vertex, x1, y1, x2, y2, u1, v1, 1.0f, v2, quadCount); 207fdbec3e4828f93bfa5cde758ad0e77b89c5c2ecdRomain Guy } 208fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy} 209fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 2107444da512680df0c52af39ea521e35adbe0c167dRomain Guyvoid Patch::generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2, 211eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy float u1, float v1, float u2, float v2, uint32_t& quadCount) { 212a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy const uint32_t oldQuadCount = quadCount; 213eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy quadCount++; 214bd41a11078e94b755c8b6f78e1e4242c715fccd4Romain Guy 21570561df470c31513056df181571632851fd0d081Romain Guy if (x1 < 0.0f) x1 = 0.0f; 21670561df470c31513056df181571632851fd0d081Romain Guy if (x2 < 0.0f) x2 = 0.0f; 21770561df470c31513056df181571632851fd0d081Romain Guy if (y1 < 0.0f) y1 = 0.0f; 21870561df470c31513056df181571632851fd0d081Romain Guy if (y2 < 0.0f) y2 = 0.0f; 21970561df470c31513056df181571632851fd0d081Romain Guy 220a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy // Skip degenerate and transparent (empty) quads 2216cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy if ((mColors[oldQuadCount] == 0) || x1 >= x2 || y1 >= y2) { 222fb13abd800cd610c7f46815848545feff83e5748Romain Guy#if DEBUG_PATCHES_EMPTY_VERTICES 223fb13abd800cd610c7f46815848545feff83e5748Romain Guy PATCH_LOGD(" quad %d (empty)", oldQuadCount); 2246cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy PATCH_LOGD(" left, top = %.2f, %.2f\t\tu1, v1 = %.8f, %.8f", x1, y1, u1, v1); 2256cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy PATCH_LOGD(" right, bottom = %.2f, %.2f\t\tu2, v2 = %.8f, %.8f", x2, y2, u2, v2); 226fb13abd800cd610c7f46815848545feff83e5748Romain Guy#endif 2277444da512680df0c52af39ea521e35adbe0c167dRomain Guy return; 2284bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 2294bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 230a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy // Record all non empty quads 2315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy if (hasEmptyQuads) { 2325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy Rect bounds(x1, y1, x2, y2); 2335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy quads.add(bounds); 2345b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy } 2355b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 2363b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy mUvMapper.map(u1, v1, u2, v2); 2373b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 2386820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy TextureVertex::set(vertex++, x1, y1, u1, v1); 2396820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy TextureVertex::set(vertex++, x2, y1, u2, v1); 2406820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy TextureVertex::set(vertex++, x1, y2, u1, v2); 2416820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy TextureVertex::set(vertex++, x2, y2, u2, v2); 242a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy 2433b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy verticesCount += 4; 2443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy indexCount += 6; 245a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy 246a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy#if DEBUG_PATCHES_VERTICES 247a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy PATCH_LOGD(" quad %d", oldQuadCount); 2486cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy PATCH_LOGD(" left, top = %.2f, %.2f\t\tu1, v1 = %.8f, %.8f", x1, y1, u1, v1); 2496cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy PATCH_LOGD(" right, bottom = %.2f, %.2f\t\tu2, v2 = %.8f, %.8f", x2, y2, u2, v2); 250a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy#endif 251fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy} 252fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 253fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}; // namespace uirenderer 254fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}; // namespace android 255