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
243b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <androidfw/ResourceTypes.h>
253b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#include "Rect.h"
273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include "UvMapper.h"
28f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
29272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck#include <vector>
30272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck
31f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guynamespace android {
32f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guynamespace uirenderer {
33f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
34e84a208317e0ed388fcdad1e6743c7849acb51b0Chris Craikstruct TextureVertex;
352dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson
364bb942083a0d4db746adf95349108dd8ef842e32Romain Guy///////////////////////////////////////////////////////////////////////////////
374bb942083a0d4db746adf95349108dd8ef842e32Romain Guy// 9-patch structures
384bb942083a0d4db746adf95349108dd8ef842e32Romain Guy///////////////////////////////////////////////////////////////////////////////
394bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
40564acf7c9bff822f608cda0d5df0a64a9f9aaefdChris Craikclass Patch {
41564acf7c9bff822f608cda0d5df0a64a9f9aaefdChris Craikpublic:
428820fd1d82acaefda98ae73ccf61413d5044f9f3Chris Craik    Patch(const float bitmapWidth, const float bitmapHeight,
438820fd1d82acaefda98ae73ccf61413d5044f9f3Chris Craik            float width, float height,
448820fd1d82acaefda98ae73ccf61413d5044f9f3Chris Craik            const UvMapper& mapper, const Res_png_9patch* patch);
45f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
463b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    /**
473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     * Returns the size of this patch's mesh in bytes.
483b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     */
493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    uint32_t getSize() const;
50f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
5151d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik    std::unique_ptr<TextureVertex[]> vertices;
52e5c6584a402fb3b1fe0507e4e00e601bec8f1bbcChris Craik    uint32_t verticesCount = 0;
53e5c6584a402fb3b1fe0507e4e00e601bec8f1bbcChris Craik    uint32_t indexCount = 0;
54e5c6584a402fb3b1fe0507e4e00e601bec8f1bbcChris Craik    bool hasEmptyQuads = false;
55272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck    std::vector<Rect> quads;
56fb5e23c327cd5f8f93d1eaa7c10f34d6fd3efb6cRomain Guy
578820fd1d82acaefda98ae73ccf61413d5044f9f3Chris Craik    GLintptr positionOffset = 0;
58e5c6584a402fb3b1fe0507e4e00e601bec8f1bbcChris Craik    GLintptr textureOffset = 0;
596f72bebe92a4db7b5dc83f4ac5b5fd02e3b4e2cdRomain Guy
603b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guyprivate:
613b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void generateRow(const int32_t* xDivs, uint32_t xCount, TextureVertex*& vertex,
623b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            float y1, float y2, float v1, float v2, float stretchX, float rescaleX,
6341d35aef06c2a570a45474a01ca95a6cb9c29d9eRomain Guy            float width, float bitmapWidth, uint32_t& quadCount);
643b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    void generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2,
653b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy            float u1, float v1, float u2, float v2, uint32_t& quadCount);
663b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
678820fd1d82acaefda98ae73ccf61413d5044f9f3Chris Craik    const uint32_t* mColors;
683b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    UvMapper mUvMapper;
69f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // struct Patch
70f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
71f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace uirenderer
72f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace android
73f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
745b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_PATCH_H
75