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