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_VERTEX_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_VERTEX_H
19f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
206d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik#include "Vector.h"
216d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik
22f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guynamespace android {
23f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guynamespace uirenderer {
24f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
25f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy/**
26f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy * Simple structure to describe a vertex with a position and a texture.
27f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy */
285b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestruct Vertex {
2932f05e343c5ffb17f3235942bcda651bd3b9f1d6Chris Craik    /**
3032f05e343c5ffb17f3235942bcda651bd3b9f1d6Chris Craik     * Fudge-factor used to disambiguate geometry pixel positioning.
3132f05e343c5ffb17f3235942bcda651bd3b9f1d6Chris Craik     *
3232f05e343c5ffb17f3235942bcda651bd3b9f1d6Chris Craik     * Used to offset lines and points to avoid ambiguous intersection with pixel centers (see
3332f05e343c5ffb17f3235942bcda651bd3b9f1d6Chris Craik     * Program::set()), and used to make geometry damage rect calculation conservative (see
3432f05e343c5ffb17f3235942bcda651bd3b9f1d6Chris Craik     * Rect::snapGeometryToPixelBoundaries())
3532f05e343c5ffb17f3235942bcda651bd3b9f1d6Chris Craik     */
3632f05e343c5ffb17f3235942bcda651bd3b9f1d6Chris Craik    static const float gGeometryFudgeFactor = 0.0656f;
3732f05e343c5ffb17f3235942bcda651bd3b9f1d6Chris Craik
385b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    float position[2];
395b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase
405b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    static inline void set(Vertex* vertex, float x, float y) {
415b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase        vertex[0].position[0] = x;
425b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase        vertex[0].position[1] = y;
435b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    }
446d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik
456d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    static inline void set(Vertex* vertex, vec2 val) {
466d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik        set(vertex, val.x, val.y);
476d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    }
486d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik
496d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    static inline void copyWithOffset(Vertex* vertex, const Vertex& src, float x, float y) {
506d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik        set(vertex, src.position[0] + x, src.position[1] + y);
516d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    }
526d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik
535b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase}; // struct Vertex
545b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase
555b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase/**
56ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy * Simple structure to describe a vertex with a position and texture UV.
575b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase */
58f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guystruct TextureVertex {
59f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    float position[2];
60f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    float texture[2];
61f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
62f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    static inline void set(TextureVertex* vertex, float x, float y, float u, float v) {
63f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy        vertex[0].position[0] = x;
64f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy        vertex[0].position[1] = y;
65f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy        vertex[0].texture[0] = u;
66f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy        vertex[0].texture[1] = v;
67f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    }
6882ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy
6982ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy    static inline void setUV(TextureVertex* vertex, float u, float v) {
7082ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy        vertex[0].texture[0] = u;
7182ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy        vertex[0].texture[1] = v;
7282ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy    }
73f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // struct TextureVertex
74f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
755b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase/**
76ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy * Simple structure to describe a vertex with a position, texture UV and ARGB color.
77ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy */
78ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guystruct ColorTextureVertex : TextureVertex {
79ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy    float color[4];
80ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy
81ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy    static inline void set(ColorTextureVertex* vertex, float x, float y,
82ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy            float u, float v, int color) {
83ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy        TextureVertex::set(vertex, x, y, u, v);
84ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy
85ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy        const float a = ((color >> 24) & 0xff) / 255.0f;
86ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy        vertex[0].color[0] = a * ((color >> 16) & 0xff) / 255.0f;
87ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy        vertex[0].color[1] = a * ((color >>  8) & 0xff) / 255.0f;
88ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy        vertex[0].color[2] = a * ((color      ) & 0xff) / 255.0f;
89ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy        vertex[0].color[3] = a;
90ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy    }
91ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy}; // struct ColorTextureVertex
92ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy
93ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy/**
945b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase * Simple structure to describe a vertex with a position and an alpha value.
955b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase */
965b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestruct AlphaVertex : Vertex {
975b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    float alpha;
985b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase
995b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    static inline void set(AlphaVertex* vertex, float x, float y, float alpha) {
1005b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase        Vertex::set(vertex, x, y);
1015b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase        vertex[0].alpha = alpha;
1025b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    }
1035b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase
1046d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    static inline void copyWithOffset(AlphaVertex* vertex, const AlphaVertex& src,
1056d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik            float x, float y) {
1066d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik        Vertex::set(vertex, src.position[0] + x, src.position[1] + y);
1076d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik        vertex[0].alpha = src.alpha;
1086d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    }
1096d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik
1105b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    static inline void setColor(AlphaVertex* vertex, float alpha) {
1115b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase        vertex[0].alpha = alpha;
1125b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    }
1135b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase}; // struct AlphaVertex
1145b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase
115f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace uirenderer
116f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace android
117f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
1185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_VERTEX_H
119