1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* libs/opengles/fp.cpp 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2006, The Android Open Source Project 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** you may not use this file except in compliance with the License. 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** You may obtain a copy of the License at 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** See the License for the specific language governing permissions and 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "fp.h" 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2281c6d66a1daf740109eaaa10953a592907087e96Duane Sand#if !(defined(__arm__) || (defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6)) 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGGLfixed gglFloatToFixed(float v) { 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return GGLfixed(floorf(v * 65536.0f + 0.5f)); 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl { 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat fixedToFloat(GLfixed x) 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if DEBUG_USE_FLOATS 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return x / 65536.0f; 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!x) return 0; 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t s = x & 0x80000000; 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project union { 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t i; 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float f; 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i = s ? -x : x; 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int c = gglClz(i) - 8; 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i = (c>=0) ? (i<<c) : (i>>-c); 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t e = 134 - c; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i &= ~0x800000; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i |= e<<23; 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i |= s; 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return f; 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat sinef(float x) 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const float A = 1.0f / (2.0f*M_PI); 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const float B = -16.0f; 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const float C = 8.0f; 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // scale angle for easy argument reduction 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project x *= A; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (fabsf(x) >= 0.5f) { 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Argument reduction 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project x = x - ceilf(x + 0.5f) + 1.0f; 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const float y = B*x*fabsf(x) + C*x; 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0.2215f * (y*fabsf(y) - y) + y; 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectfloat cosinef(float x) 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return sinef(x + float(M_PI/2)); 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid sincosf(GLfloat angle, GLfloat* s, GLfloat* c) { 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *s = sinef(angle); 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *c = cosinef(angle); 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace fp_utils 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 88