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