Patch.cpp revision 6f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cd
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
23fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy#include "Patch.h"
2403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#include "Caches.h"
25fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
26fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guynamespace android {
27fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guynamespace uirenderer {
28fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
29fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy///////////////////////////////////////////////////////////////////////////////
30fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy// Constructors/destructor
31fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy///////////////////////////////////////////////////////////////////////////////
32fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
336f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain GuyPatch::Patch(const uint32_t xCount, const uint32_t yCount, const int8_t emptyQuads):
346f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        mXCount(xCount), mYCount(yCount) {
35fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy    // 2 triangles per patch, 3 vertices per triangle
364bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    verticesCount = ((xCount + 1) * (yCount + 1) - emptyQuads) * 2 * 3;
3703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    mVertices = new TextureVertex[verticesCount];
385b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    hasEmptyQuads = emptyQuads > 0;
396f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    mUploaded = false;
406f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
416f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    mColorKey = 0;
426f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    mXDivs = new int32_t[mXCount];
436f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    mYDivs = new int32_t[mYCount];
4403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
4503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    glGenBuffers(1, &meshBuffer);
46fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}
47fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
48fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain GuyPatch::~Patch() {
4903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    delete[] mVertices;
506f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    delete[] mXDivs;
516f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    delete[] mYDivs;
5203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    glDeleteBuffers(1, &meshBuffer);
53fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}
54fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
55fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy///////////////////////////////////////////////////////////////////////////////
566f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy// Patch management
576f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy///////////////////////////////////////////////////////////////////////////////
586f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
596f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guyvoid Patch::copy(const int32_t* xDivs, const int32_t* yDivs) {
606f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    memcpy(mXDivs, xDivs, mXCount * sizeof(int32_t));
616f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    memcpy(mYDivs, yDivs, mYCount * sizeof(int32_t));
626f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy}
636f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
646f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guyvoid Patch::copy(const int32_t* yDivs) {
656f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    memcpy(mYDivs, yDivs, mYCount * sizeof(int32_t));
666f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy}
676f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
686f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guyvoid Patch::updateColorKey(const uint32_t colorKey) {
696f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    mColorKey = colorKey;
706f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy}
716f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
726f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guybool Patch::matches(const int32_t* xDivs, const int32_t* yDivs, const uint32_t colorKey) {
736f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    if (mColorKey != colorKey) {
746f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        updateColorKey(colorKey);
756f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        copy(xDivs, yDivs);
766f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        return false;
776f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    }
786f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
796f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    for (uint32_t i = 0; i < mXCount; i++) {
806f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        if (mXDivs[i] != xDivs[i]) {
816f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            // The Y divs may or may not match, copy everything
826f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            copy(xDivs, yDivs);
836f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            return false;
846f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        }
856f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    }
866f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
876f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    for (uint32_t i = 0; i < mYCount; i++) {
886f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        if (mYDivs[i] != yDivs[i]) {
896f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            // We know all the X divs match, copy only Y divs
906f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            copy(yDivs);
916f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            return false;
926f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        }
936f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    }
946f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
956f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    return true;
966f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy}
976f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
986f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy///////////////////////////////////////////////////////////////////////////////
99fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy// Vertices management
100fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy///////////////////////////////////////////////////////////////////////////////
101fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
102759ea80dca64ad652110a129e0d8bf93fea79f61Romain Guyvoid Patch::updateVertices(const float bitmapWidth, const float bitmapHeight,
1036f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        float left, float top, float right, float bottom) {
1045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    if (hasEmptyQuads) quads.clear();
1055b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
1066f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    const uint32_t xStretchCount = (mXCount + 1) >> 1;
1076f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    const uint32_t yStretchCount = (mYCount + 1) >> 1;
108fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
1096820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    float stretchX = 0.0f;
1106820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    float stretchY = 0.0;
111fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
112fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy    const float meshWidth = right - left;
113fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
114fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy    if (xStretchCount > 0) {
115fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy        uint32_t stretchSize = 0;
1166f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        for (uint32_t i = 1; i < mXCount; i += 2) {
1176f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            stretchSize += mXDivs[i] - mXDivs[i - 1];
118fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy        }
1196820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        const float xStretchTex = stretchSize;
120fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy        const float fixed = bitmapWidth - stretchSize;
1216820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        const float xStretch = right - left - fixed;
1226820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        stretchX = xStretch / xStretchTex;
123fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy    }
124fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
125fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy    if (yStretchCount > 0) {
126fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy        uint32_t stretchSize = 0;
1276f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        for (uint32_t i = 1; i < mYCount; i += 2) {
1286f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            stretchSize += mYDivs[i] - mYDivs[i - 1];
129fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy        }
1306820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        const float yStretchTex = stretchSize;
131fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy        const float fixed = bitmapHeight - stretchSize;
1326820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        const float yStretch = bottom - top - fixed;
1336820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        stretchY = yStretch / yStretchTex;
134fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy    }
135fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
13603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    TextureVertex* vertex = mVertices;
1374bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t quadCount = 0;
138fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
1396820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    float previousStepY = 0.0f;
140fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
1416820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    float y1 = 0.0f;
1426820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    float v1 = 0.0f;
1436820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy
1446f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    for (uint32_t i = 0; i < mYCount; i++) {
1456f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        float stepY = mYDivs[i];
1466820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy
1476820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        float y2 = 0.0f;
1486820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        if (i & 1) {
1496820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy            const float segment = stepY - previousStepY;
1506820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy            y2 = y1 + segment * stretchY;
151fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy        } else {
1526820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy            y2 = y1 + stepY - previousStepY;
153fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy        }
1546820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        float v2 = fmax(0.0f, stepY - 0.5f) / bitmapHeight;
1556820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy
1566f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        generateRow(vertex, y1, y2, v1, v2, stretchX, right - left, bitmapWidth, quadCount);
1576820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy
1586820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        y1 = y2;
1596820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        v1 = (stepY + 0.5f) / bitmapHeight;
1606820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy
1616820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        previousStepY = stepY;
162fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy    }
163fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
1646f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    generateRow(vertex, y1, bottom - top, v1, 1.0f, stretchX, right - left,
1656f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            bitmapWidth, quadCount);
16603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
16703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    Caches::getInstance().bindMeshBuffer(meshBuffer);
1686f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    if (!mUploaded) {
1696f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        glBufferData(GL_ARRAY_BUFFER, sizeof(TextureVertex) * verticesCount,
1706f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy                mVertices, GL_DYNAMIC_DRAW);
1716f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        mUploaded = true;
1726f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    } else {
1736f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        glBufferSubData(GL_ARRAY_BUFFER, 0,
1746f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy                sizeof(TextureVertex) * verticesCount, mVertices);
1756f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    }
176fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}
177fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
1785b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyvoid Patch::generateRow(TextureVertex*& vertex, float y1, float y2, float v1, float v2,
1796f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        float stretchX, float width, float bitmapWidth, uint32_t& quadCount) {
1806820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    float previousStepX = 0.0f;
1816820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy
1826820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    float x1 = 0.0f;
1836820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    float u1 = 0.0f;
184fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
1856820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    // Generate the row quad by quad
1866f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    for (uint32_t i = 0; i < mXCount; i++) {
1876f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        float stepX = mXDivs[i];
188fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
1896820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        float x2 = 0.0f;
1906820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        if (i & 1) {
1916820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy            const float segment = stepX - previousStepX;
1926820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy            x2 = x1 + segment * stretchX;
193fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy        } else {
1946820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy            x2 = x1 + stepX - previousStepX;
195fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy        }
1966820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        float u2 = fmax(0.0f, stepX - 0.5f) / bitmapWidth;
197fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
1986f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy        generateQuad(vertex, x1, y1, x2, y2, u1, v1, u2, v2, quadCount);
1996820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy
2006820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        x1 = x2;
2016820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        u1 = (stepX + 0.5f) / bitmapWidth;
2026820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy
2036820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy        previousStepX = stepX;
204fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy    }
205fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
2066f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    generateQuad(vertex, x1, y1, width, y2, u1, v1, 1.0f, v2, quadCount);
207fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}
208fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
2095b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyvoid Patch::generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2,
2106f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy            float u1, float v1, float u2, float v2, uint32_t& quadCount) {
2116f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy    if (((mColorKey >> quadCount++) & 0x1) == 1) {
2124bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return;
2134bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
2144bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
2155b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    if (hasEmptyQuads) {
2165b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        Rect bounds(x1, y1, x2, y2);
2175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        quads.add(bounds);
2185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    }
2195b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
2206820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    // Left triangle
2216820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    TextureVertex::set(vertex++, x1, y1, u1, v1);
2226820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    TextureVertex::set(vertex++, x2, y1, u2, v1);
2236820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    TextureVertex::set(vertex++, x1, y2, u1, v2);
2246820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy
2256820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    // Right triangle
2266820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    TextureVertex::set(vertex++, x1, y2, u1, v2);
2276820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    TextureVertex::set(vertex++, x2, y1, u2, v1);
2286820ac8b14b4558f5d8b833dde80895306a3e137Romain Guy    TextureVertex::set(vertex++, x2, y2, u2, v2);
229fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}
230fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
231fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}; // namespace uirenderer
232fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy}; // namespace android
233