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     */
36564acf7c9bff822f608cda0d5df0a64a9f9aaefdChris Craik    static float GeometryFudgeFactor() { return 0.0656f; }
37564acf7c9bff822f608cda0d5df0a64a9f9aaefdChris Craik
3832f05e343c5ffb17f3235942bcda651bd3b9f1d6Chris Craik
393380cfdc77100e87aa8390386ccf390834dea171Romain Guy    float x, y;
405b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase
415b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    static inline void set(Vertex* vertex, float x, float y) {
423380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].x = x;
433380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].y = y;
445b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    }
456d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik
461aa5d2d7068147ff781cfe911a93f01593a68c79John Reck    static inline void set(Vertex* vertex, Vector2 val) {
476d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik        set(vertex, val.x, val.y);
486d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    }
496d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik
506d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    static inline void copyWithOffset(Vertex* vertex, const Vertex& src, float x, float y) {
513380cfdc77100e87aa8390386ccf390834dea171Romain Guy        set(vertex, src.x + x, src.y + y);
526d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    }
536d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik
545b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase}; // struct Vertex
555b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase
565b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase/**
57ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy * Simple structure to describe a vertex with a position and texture UV.
585b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase */
59f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guystruct TextureVertex {
603380cfdc77100e87aa8390386ccf390834dea171Romain Guy    float x, y;
613380cfdc77100e87aa8390386ccf390834dea171Romain Guy    float u, v;
62f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
63f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    static inline void set(TextureVertex* vertex, float x, float y, float u, float v) {
643380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].x = x;
653380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].y = y;
663380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].u = u;
673380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].v = v;
68f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy    }
6982ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy
7082ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy    static inline void setUV(TextureVertex* vertex, float u, float v) {
713380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].u = u;
723380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].v = v;
7382ba814ca0dea659be2cc6523bc0137679d961ceRomain Guy    }
74f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // struct TextureVertex
75f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
765b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase/**
77ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy * Simple structure to describe a vertex with a position, texture UV and ARGB color.
78ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy */
79ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guystruct ColorTextureVertex : TextureVertex {
803380cfdc77100e87aa8390386ccf390834dea171Romain Guy    float r, g, b, a;
81ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy
82ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy    static inline void set(ColorTextureVertex* vertex, float x, float y,
83ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy            float u, float v, int color) {
84ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy        TextureVertex::set(vertex, x, y, u, v);
85ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy
86ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy        const float a = ((color >> 24) & 0xff) / 255.0f;
873380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].r = a * ((color >> 16) & 0xff) / 255.0f;
883380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].g = a * ((color >>  8) & 0xff) / 255.0f;
893380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].b = a * ((color      ) & 0xff) / 255.0f;
903380cfdc77100e87aa8390386ccf390834dea171Romain Guy        vertex[0].a = a;
91ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy    }
92ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy}; // struct ColorTextureVertex
93ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy
94ff316ec7a76e52572a2e89b691e6b3bba0cafba3Romain Guy/**
955b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase * Simple structure to describe a vertex with a position and an alpha value.
965b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase */
975b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestruct AlphaVertex : Vertex {
985b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    float alpha;
995b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase
1005b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    static inline void set(AlphaVertex* vertex, float x, float y, float alpha) {
1015b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase        Vertex::set(vertex, x, y);
1025b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase        vertex[0].alpha = alpha;
1035b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    }
1045b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase
1056d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    static inline void copyWithOffset(AlphaVertex* vertex, const AlphaVertex& src,
1066d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik            float x, float y) {
1073380cfdc77100e87aa8390386ccf390834dea171Romain Guy        Vertex::set(vertex, src.x + x, src.y + y);
1086d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik        vertex[0].alpha = src.alpha;
1096d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik    }
1106d29c8d5218cac0fb35f3b7c253f2bdebd44f15aChris Craik
1115b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    static inline void setColor(AlphaVertex* vertex, float alpha) {
1125b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase        vertex[0].alpha = alpha;
1135b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase    }
1145b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase}; // struct AlphaVertex
1155b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haase
116f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace uirenderer
117f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy}; // namespace android
118f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
1195b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_VERTEX_H
120