1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #ifndef ANDROID_HWUI_UV_MAPPER_H 18*d57664e9SAndroid Build Coastguard Worker #define ANDROID_HWUI_UV_MAPPER_H 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include "Rect.h" 21*d57664e9SAndroid Build Coastguard Worker 22*d57664e9SAndroid Build Coastguard Worker namespace android { 23*d57664e9SAndroid Build Coastguard Worker namespace uirenderer { 24*d57664e9SAndroid Build Coastguard Worker 25*d57664e9SAndroid Build Coastguard Worker /** 26*d57664e9SAndroid Build Coastguard Worker * This class can be used to map UV coordinates from the [0..1] 27*d57664e9SAndroid Build Coastguard Worker * range to other arbitrary ranges. All the methods below assume 28*d57664e9SAndroid Build Coastguard Worker * that the input values lie in the [0..1] range already. 29*d57664e9SAndroid Build Coastguard Worker */ 30*d57664e9SAndroid Build Coastguard Worker class UvMapper { 31*d57664e9SAndroid Build Coastguard Worker public: 32*d57664e9SAndroid Build Coastguard Worker /** 33*d57664e9SAndroid Build Coastguard Worker * Using this constructor is equivalent to not using any mapping at all. 34*d57664e9SAndroid Build Coastguard Worker * UV coordinates in the [0..1] range remain in the [0..1] range. 35*d57664e9SAndroid Build Coastguard Worker */ UvMapper()36*d57664e9SAndroid Build Coastguard Worker UvMapper() : mIdentity(true), mMinU(0.0f), mMaxU(1.0f), mMinV(0.0f), mMaxV(1.0f) {} 37*d57664e9SAndroid Build Coastguard Worker 38*d57664e9SAndroid Build Coastguard Worker /** 39*d57664e9SAndroid Build Coastguard Worker * Creates a new mapper with the specified ranges for U and V coordinates. 40*d57664e9SAndroid Build Coastguard Worker * The parameter minU must be < maxU and minV must be < maxV. 41*d57664e9SAndroid Build Coastguard Worker */ UvMapper(float minU,float maxU,float minV,float maxV)42*d57664e9SAndroid Build Coastguard Worker UvMapper(float minU, float maxU, float minV, float maxV) 43*d57664e9SAndroid Build Coastguard Worker : mMinU(minU), mMaxU(maxU), mMinV(minV), mMaxV(maxV) { 44*d57664e9SAndroid Build Coastguard Worker checkIdentity(); 45*d57664e9SAndroid Build Coastguard Worker } 46*d57664e9SAndroid Build Coastguard Worker 47*d57664e9SAndroid Build Coastguard Worker /** 48*d57664e9SAndroid Build Coastguard Worker * Returns true if calling the map*() methods has no effect (that is, 49*d57664e9SAndroid Build Coastguard Worker * texture coordinates remain in the 0..1 range.) 50*d57664e9SAndroid Build Coastguard Worker */ isIdentity()51*d57664e9SAndroid Build Coastguard Worker bool isIdentity() const { return mIdentity; } 52*d57664e9SAndroid Build Coastguard Worker 53*d57664e9SAndroid Build Coastguard Worker /** 54*d57664e9SAndroid Build Coastguard Worker * Changes the U and V mapping ranges. 55*d57664e9SAndroid Build Coastguard Worker * The parameter minU must be < maxU and minV must be < maxV. 56*d57664e9SAndroid Build Coastguard Worker */ setMapping(float minU,float maxU,float minV,float maxV)57*d57664e9SAndroid Build Coastguard Worker void setMapping(float minU, float maxU, float minV, float maxV) { 58*d57664e9SAndroid Build Coastguard Worker mMinU = minU; 59*d57664e9SAndroid Build Coastguard Worker mMaxU = maxU; 60*d57664e9SAndroid Build Coastguard Worker mMinV = minV; 61*d57664e9SAndroid Build Coastguard Worker mMaxV = maxV; 62*d57664e9SAndroid Build Coastguard Worker checkIdentity(); 63*d57664e9SAndroid Build Coastguard Worker } 64*d57664e9SAndroid Build Coastguard Worker 65*d57664e9SAndroid Build Coastguard Worker /** 66*d57664e9SAndroid Build Coastguard Worker * Maps a single value in the U range. 67*d57664e9SAndroid Build Coastguard Worker */ mapU(float & u)68*d57664e9SAndroid Build Coastguard Worker void mapU(float& u) const { 69*d57664e9SAndroid Build Coastguard Worker if (!mIdentity) u = lerp(mMinU, mMaxU, u); 70*d57664e9SAndroid Build Coastguard Worker } 71*d57664e9SAndroid Build Coastguard Worker 72*d57664e9SAndroid Build Coastguard Worker /** 73*d57664e9SAndroid Build Coastguard Worker * Maps a single value in the V range. 74*d57664e9SAndroid Build Coastguard Worker */ mapV(float & v)75*d57664e9SAndroid Build Coastguard Worker void mapV(float& v) const { 76*d57664e9SAndroid Build Coastguard Worker if (!mIdentity) v = lerp(mMinV, mMaxV, v); 77*d57664e9SAndroid Build Coastguard Worker } 78*d57664e9SAndroid Build Coastguard Worker 79*d57664e9SAndroid Build Coastguard Worker /** 80*d57664e9SAndroid Build Coastguard Worker * Maps the specified rectangle in place. This method assumes: 81*d57664e9SAndroid Build Coastguard Worker * - left = min. U 82*d57664e9SAndroid Build Coastguard Worker * - top = min. V 83*d57664e9SAndroid Build Coastguard Worker * - right = max. U 84*d57664e9SAndroid Build Coastguard Worker * - bottom = max. V 85*d57664e9SAndroid Build Coastguard Worker */ map(Rect & texCoords)86*d57664e9SAndroid Build Coastguard Worker void map(Rect& texCoords) const { 87*d57664e9SAndroid Build Coastguard Worker if (!mIdentity) { 88*d57664e9SAndroid Build Coastguard Worker texCoords.left = lerp(mMinU, mMaxU, texCoords.left); 89*d57664e9SAndroid Build Coastguard Worker texCoords.right = lerp(mMinU, mMaxU, texCoords.right); 90*d57664e9SAndroid Build Coastguard Worker texCoords.top = lerp(mMinV, mMaxV, texCoords.top); 91*d57664e9SAndroid Build Coastguard Worker texCoords.bottom = lerp(mMinV, mMaxV, texCoords.bottom); 92*d57664e9SAndroid Build Coastguard Worker } 93*d57664e9SAndroid Build Coastguard Worker } 94*d57664e9SAndroid Build Coastguard Worker 95*d57664e9SAndroid Build Coastguard Worker /** 96*d57664e9SAndroid Build Coastguard Worker * Maps the specified UV coordinates in place. 97*d57664e9SAndroid Build Coastguard Worker */ map(float & u1,float & v1,float & u2,float & v2)98*d57664e9SAndroid Build Coastguard Worker void map(float& u1, float& v1, float& u2, float& v2) const { 99*d57664e9SAndroid Build Coastguard Worker if (!mIdentity) { 100*d57664e9SAndroid Build Coastguard Worker u1 = lerp(mMinU, mMaxU, u1); 101*d57664e9SAndroid Build Coastguard Worker u2 = lerp(mMinU, mMaxU, u2); 102*d57664e9SAndroid Build Coastguard Worker v1 = lerp(mMinV, mMaxV, v1); 103*d57664e9SAndroid Build Coastguard Worker v2 = lerp(mMinV, mMaxV, v2); 104*d57664e9SAndroid Build Coastguard Worker } 105*d57664e9SAndroid Build Coastguard Worker } 106*d57664e9SAndroid Build Coastguard Worker dump()107*d57664e9SAndroid Build Coastguard Worker void dump() const { 108*d57664e9SAndroid Build Coastguard Worker ALOGD("mapper[minU=%.2f maxU=%.2f minV=%.2f maxV=%.2f]", mMinU, mMaxU, mMinV, mMaxV); 109*d57664e9SAndroid Build Coastguard Worker } 110*d57664e9SAndroid Build Coastguard Worker 111*d57664e9SAndroid Build Coastguard Worker private: lerp(float start,float stop,float amount)112*d57664e9SAndroid Build Coastguard Worker static float lerp(float start, float stop, float amount) { 113*d57664e9SAndroid Build Coastguard Worker return start + (stop - start) * amount; 114*d57664e9SAndroid Build Coastguard Worker } 115*d57664e9SAndroid Build Coastguard Worker checkIdentity()116*d57664e9SAndroid Build Coastguard Worker void checkIdentity() { 117*d57664e9SAndroid Build Coastguard Worker mIdentity = mMinU == 0.0f && mMaxU == 1.0f && mMinV == 0.0f && mMaxV == 1.0f; 118*d57664e9SAndroid Build Coastguard Worker } 119*d57664e9SAndroid Build Coastguard Worker 120*d57664e9SAndroid Build Coastguard Worker bool mIdentity; 121*d57664e9SAndroid Build Coastguard Worker float mMinU; 122*d57664e9SAndroid Build Coastguard Worker float mMaxU; 123*d57664e9SAndroid Build Coastguard Worker float mMinV; 124*d57664e9SAndroid Build Coastguard Worker float mMaxV; 125*d57664e9SAndroid Build Coastguard Worker }; 126*d57664e9SAndroid Build Coastguard Worker 127*d57664e9SAndroid Build Coastguard Worker } // namespace uirenderer 128*d57664e9SAndroid Build Coastguard Worker } // namespace android 129*d57664e9SAndroid Build Coastguard Worker 130*d57664e9SAndroid Build Coastguard Worker #endif // ANDROID_HWUI_UV_MAPPER_H 131