Patch.cpp revision 9db58c031f8ffa102a6d585cb585bed3bdb911a9
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 179db58c031f8ffa102a6d585cb585bed3bdb911a9Chris Craik#include "Patch.h" 184bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 1903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#include "Caches.h" 20a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy#include "Properties.h" 213b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include "UvMapper.h" 228820fd1d82acaefda98ae73ccf61413d5044f9f3Chris Craik#include "utils/MathUtils.h" 23fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 249db58c031f8ffa102a6d585cb585bed3bdb911a9Chris Craik#include <algorithm> 259db58c031f8ffa102a6d585cb585bed3bdb911a9Chris Craik#include <utils/Log.h> 269db58c031f8ffa102a6d585cb585bed3bdb911a9Chris Craik 27fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guynamespace android { 28fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guynamespace uirenderer { 29fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 30fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 313b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy// Vertices management 326f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy/////////////////////////////////////////////////////////////////////////////// 336f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 343b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyuint32_t Patch::getSize() const { 353b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy return verticesCount * sizeof(TextureVertex); 366f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy} 376f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 388820fd1d82acaefda98ae73ccf61413d5044f9f3Chris CraikPatch::Patch(const float bitmapWidth, const float bitmapHeight, 398820fd1d82acaefda98ae73ccf61413d5044f9f3Chris Craik float width, float height, const UvMapper& mapper, const Res_png_9patch* patch) 408820fd1d82acaefda98ae73ccf61413d5044f9f3Chris Craik : mColors(patch->getColors()) { 415341cead27070656458750a789ba211a505b57b5Romain Guy 423b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy int8_t emptyQuads = 0; 436cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy const int8_t numColors = patch->numColors; 443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy if (uint8_t(numColors) < sizeof(uint32_t) * 4) { 453b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (int8_t i = 0; i < numColors; i++) { 466cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy if (mColors[i] == 0x0) { 473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy emptyQuads++; 483b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 506f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy } 516f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 523b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy hasEmptyQuads = emptyQuads > 0; 536f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 543b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy uint32_t xCount = patch->numXDivs; 553b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy uint32_t yCount = patch->numYDivs; 566f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy 573b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy uint32_t maxVertices = ((xCount + 1) * (yCount + 1) - emptyQuads) * 4; 588820fd1d82acaefda98ae73ccf61413d5044f9f3Chris Craik if (maxVertices == 0) return; 59fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 6051d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik vertices.reset(new TextureVertex[maxVertices]); 6151d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik TextureVertex* vertex = vertices.get(); 62a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy 636381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath const int32_t* xDivs = patch->getXDivs(); 646381dd4ff212a95be30d2b445d40ff419ab076b4Narayan Kamath const int32_t* yDivs = patch->getYDivs(); 655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 663b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy const uint32_t xStretchCount = (xCount + 1) >> 1; 673b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy const uint32_t yStretchCount = (yCount + 1) >> 1; 68fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 696820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float stretchX = 0.0f; 7041d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy float stretchY = 0.0f; 7141d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy 7241d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy float rescaleX = 1.0f; 7341d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy float rescaleY = 1.0f; 74fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 75fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy if (xStretchCount > 0) { 76fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy uint32_t stretchSize = 0; 773b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (uint32_t i = 1; i < xCount; i += 2) { 783b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy stretchSize += xDivs[i] - xDivs[i - 1]; 79fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 806820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy const float xStretchTex = stretchSize; 81fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy const float fixed = bitmapWidth - stretchSize; 82df72b63928cc1492b72ba9a4e99d5e714f93ccc6Chris Craik const float xStretch = std::max(width - fixed, 0.0f); 836820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy stretchX = xStretch / xStretchTex; 84df72b63928cc1492b72ba9a4e99d5e714f93ccc6Chris Craik rescaleX = fixed == 0.0f ? 0.0f : std::min(std::max(width, 0.0f) / fixed, 1.0f); 85fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 86fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 87fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy if (yStretchCount > 0) { 88fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy uint32_t stretchSize = 0; 893b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (uint32_t i = 1; i < yCount; i += 2) { 903b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy stretchSize += yDivs[i] - yDivs[i - 1]; 91fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 926820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy const float yStretchTex = stretchSize; 93fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy const float fixed = bitmapHeight - stretchSize; 94df72b63928cc1492b72ba9a4e99d5e714f93ccc6Chris Craik const float yStretch = std::max(height - fixed, 0.0f); 956820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy stretchY = yStretch / yStretchTex; 96df72b63928cc1492b72ba9a4e99d5e714f93ccc6Chris Craik rescaleY = fixed == 0.0f ? 0.0f : std::min(std::max(height, 0.0f) / fixed, 1.0f); 97fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 98fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 994bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t quadCount = 0; 100fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1016820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float previousStepY = 0.0f; 102fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1036820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float y1 = 0.0f; 104f504a2fa144504ca1efd39a4ef9208e3d4d336c5Romain Guy float y2 = 0.0f; 1056820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float v1 = 0.0f; 1066820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1073b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy mUvMapper = mapper; 1083b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 1093b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (uint32_t i = 0; i < yCount; i++) { 1103b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy float stepY = yDivs[i]; 1115e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy const float segment = stepY - previousStepY; 1126820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1136820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy if (i & 1) { 1148ab4079ca27e36e5c584495bcd71b573598ac021Romain Guy y2 = y1 + floorf(segment * stretchY + 0.5f); 115fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } else { 11641d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy y2 = y1 + segment * rescaleY; 117fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 1185e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy 1195e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy float vOffset = y1 == y2 ? 0.0f : 0.5 - (0.5 * segment / (y2 - y1)); 120e6a15ee3d0c78eb3f2551d73a7d238c3d8d2f075Chris Craik float v2 = std::max(0.0f, stepY - vOffset) / bitmapHeight; 1215e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy v1 += vOffset / bitmapHeight; 1226820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 123eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy if (stepY > 0.0f) { 1243b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy generateRow(xDivs, xCount, vertex, y1, y2, v1, v2, stretchX, rescaleX, 12503c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy width, bitmapWidth, quadCount); 126eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy } 1276820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1286820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy y1 = y2; 1295e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy v1 = stepY / bitmapHeight; 1306820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1316820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy previousStepY = stepY; 132fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 133fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 134fdbec3e4828f93bfa5cde758ad0e77b89c5c2ecdRomain Guy if (previousStepY != bitmapHeight) { 13503c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy y2 = height; 1363b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy generateRow(xDivs, xCount, vertex, y1, y2, v1, 1.0f, stretchX, rescaleX, 13703c00b5a135e68d22ca5bb829b899ebda6ed7e9dRomain Guy width, bitmapWidth, quadCount); 1386f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy } 139a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy 14051d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik if (verticesCount != maxVertices) { 14151d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik std::unique_ptr<TextureVertex[]> reducedVertices(new TextureVertex[verticesCount]); 14251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik memcpy(reducedVertices.get(), vertices.get(), verticesCount * sizeof(TextureVertex)); 14351d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik vertices = std::move(reducedVertices); 144f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy } 145fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy} 146fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyvoid Patch::generateRow(const int32_t* xDivs, uint32_t xCount, TextureVertex*& vertex, 1483b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy float y1, float y2, float v1, float v2, float stretchX, float rescaleX, 1493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy float width, float bitmapWidth, uint32_t& quadCount) { 1506820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float previousStepX = 0.0f; 1516820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1526820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float x1 = 0.0f; 153f504a2fa144504ca1efd39a4ef9208e3d4d336c5Romain Guy float x2 = 0.0f; 1546820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy float u1 = 0.0f; 155fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1566820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy // Generate the row quad by quad 1573b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy for (uint32_t i = 0; i < xCount; i++) { 1583b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy float stepX = xDivs[i]; 1595e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy const float segment = stepX - previousStepX; 160fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1616820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy if (i & 1) { 1628ab4079ca27e36e5c584495bcd71b573598ac021Romain Guy x2 = x1 + floorf(segment * stretchX + 0.5f); 163fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } else { 16441d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy x2 = x1 + segment * rescaleX; 165fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 1665e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy 1675e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy float uOffset = x1 == x2 ? 0.0f : 0.5 - (0.5 * segment / (x2 - x1)); 168e6a15ee3d0c78eb3f2551d73a7d238c3d8d2f075Chris Craik float u2 = std::max(0.0f, stepX - uOffset) / bitmapWidth; 1695e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy u1 += uOffset / bitmapWidth; 170fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 171eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy if (stepX > 0.0f) { 172eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy generateQuad(vertex, x1, y1, x2, y2, u1, v1, u2, v2, quadCount); 173eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy } 1746820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1756820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy x1 = x2; 1765e7c469c7a3039af7696789a797f8d91a45227ebRomain Guy u1 = stepX / bitmapWidth; 1776820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy 1786820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy previousStepX = stepX; 179fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy } 180fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 181fdbec3e4828f93bfa5cde758ad0e77b89c5c2ecdRomain Guy if (previousStepX != bitmapWidth) { 182f504a2fa144504ca1efd39a4ef9208e3d4d336c5Romain Guy x2 = width; 183f504a2fa144504ca1efd39a4ef9208e3d4d336c5Romain Guy generateQuad(vertex, x1, y1, x2, y2, u1, v1, 1.0f, v2, quadCount); 184fdbec3e4828f93bfa5cde758ad0e77b89c5c2ecdRomain Guy } 185fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy} 186fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 1877444da512680df0c52af39ea521e35adbe0c167dRomain Guyvoid Patch::generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2, 188eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy float u1, float v1, float u2, float v2, uint32_t& quadCount) { 189a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy const uint32_t oldQuadCount = quadCount; 190eb6a4a17a07f1aa41bd58d418b2982cddb97685aRomain Guy quadCount++; 191bd41a11078e94b755c8b6f78e1e4242c715fccd4Romain Guy 1929db58c031f8ffa102a6d585cb585bed3bdb911a9Chris Craik x1 = std::max(x1, 0.0f); 1939db58c031f8ffa102a6d585cb585bed3bdb911a9Chris Craik x2 = std::max(x2, 0.0f); 1949db58c031f8ffa102a6d585cb585bed3bdb911a9Chris Craik y1 = std::max(y1, 0.0f); 1959db58c031f8ffa102a6d585cb585bed3bdb911a9Chris Craik y2 = std::max(y2, 0.0f); 19670561df470c31513056df181571632851fd0d081Romain Guy 197a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy // Skip degenerate and transparent (empty) quads 1986cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy if ((mColors[oldQuadCount] == 0) || x1 >= x2 || y1 >= y2) { 199fb13abd800cd610c7f46815848545feff83e5748Romain Guy#if DEBUG_PATCHES_EMPTY_VERTICES 200fb13abd800cd610c7f46815848545feff83e5748Romain Guy PATCH_LOGD(" quad %d (empty)", oldQuadCount); 2016cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy PATCH_LOGD(" left, top = %.2f, %.2f\t\tu1, v1 = %.8f, %.8f", x1, y1, u1, v1); 2026cad75744ed3b81cf2c96f545368067b62c726ecRomain Guy PATCH_LOGD(" right, bottom = %.2f, %.2f\t\tu2, v2 = %.8f, %.8f", x2, y2, u2, v2); 203fb13abd800cd610c7f46815848545feff83e5748Romain Guy#endif 2047444da512680df0c52af39ea521e35adbe0c167dRomain Guy return; 2054bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 2064bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 207a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy // Record all non empty quads 2085b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy if (hasEmptyQuads) { 209272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck quads.emplace_back(x1, y1, x2, y2); 2105b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy } 2115b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 2123b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy mUvMapper.map(u1, v1, u2, v2); 2133b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 2146820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy TextureVertex::set(vertex++, x1, y1, u1, v1); 2156820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy TextureVertex::set(vertex++, x2, y1, u2, v1); 2166820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy TextureVertex::set(vertex++, x1, y2, u1, v2); 2176820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy TextureVertex::set(vertex++, x2, y2, u2, v2); 218a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy 2193b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy verticesCount += 4; 2203b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy indexCount += 6; 221a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy 222a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy#if DEBUG_PATCHES_VERTICES 223a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy PATCH_LOGD(" quad %d", 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); 226a5ef39a21683189e5906c9f252b997f0508e350dRomain Guy#endif 227fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy} 228fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy 229fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}; // namespace uirenderer 230fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}; // namespace android 231