| /* 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 |