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