/* libs/opengles/fp.cpp ** ** Copyright 2006, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ #include "fp.h" // ---------------------------------------------------------------------------- #if !(defined(__arm__) || (defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6)) GGLfixed gglFloatToFixed(float v) { return GGLfixed(floorf(v * 65536.0f + 0.5f)); } #endif // ---------------------------------------------------------------------------- namespace android { namespace gl { GLfloat fixedToFloat(GLfixed x) { #if DEBUG_USE_FLOATS return x / 65536.0f; #else if (!x) return 0; const uint32_t s = x & 0x80000000; union { uint32_t i; float f; }; i = s ? -x : x; const int c = gglClz(i) - 8; i = (c>=0) ? (i<<c) : (i>>-c); const uint32_t e = 134 - c; i &= ~0x800000; i |= e<<23; i |= s; return f; #endif } float sinef(float x) { const float A = 1.0f / (2.0f*M_PI); const float B = -16.0f; const float C = 8.0f; // scale angle for easy argument reduction x *= A; if (fabsf(x) >= 0.5f) { // Argument reduction x = x - ceilf(x + 0.5f) + 1.0f; } const float y = B*x*fabsf(x) + C*x; return 0.2215f * (y*fabsf(y) - y) + y; } float cosinef(float x) { return sinef(x + float(M_PI/2)); } void sincosf(GLfloat angle, GLfloat* s, GLfloat* c) { *s = sinef(angle); *c = cosinef(angle); } }; // namespace fp_utils // ---------------------------------------------------------------------------- }; // namespace android