1cfd74d65d832137e20e193c960802afba73b5d38sm/*
23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project
3cfd74d65d832137e20e193c960802afba73b5d38sm *
4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License");
5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License.
6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at
7cfd74d65d832137e20e193c960802afba73b5d38sm *
8cfd74d65d832137e20e193c960802afba73b5d38sm *      http://www.apache.org/licenses/LICENSE-2.0
9cfd74d65d832137e20e193c960802afba73b5d38sm *
10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software
11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS,
12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and
14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License.
15cfd74d65d832137e20e193c960802afba73b5d38sm */
16cfd74d65d832137e20e193c960802afba73b5d38sm
17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland;
18cfd74d65d832137e20e193c960802afba73b5d38sm
19cfd74d65d832137e20e193c960802afba73b5d38sm/** A collection of miscellaneous utility functions. */
20cfd74d65d832137e20e193c960802afba73b5d38smpublic class Utils {
21cfd74d65d832137e20e193c960802afba73b5d38sm    private static final float EPSILON = 0.0001f;
22cfd74d65d832137e20e193c960802afba73b5d38sm
23cfd74d65d832137e20e193c960802afba73b5d38sm    public final static boolean close(float a, float b) {
24cfd74d65d832137e20e193c960802afba73b5d38sm        return close(a, b, EPSILON);
25cfd74d65d832137e20e193c960802afba73b5d38sm    }
26cfd74d65d832137e20e193c960802afba73b5d38sm
27cfd74d65d832137e20e193c960802afba73b5d38sm    public final static boolean close(float a, float b, float epsilon) {
28cfd74d65d832137e20e193c960802afba73b5d38sm        return Math.abs(a - b) < epsilon;
29cfd74d65d832137e20e193c960802afba73b5d38sm    }
30cfd74d65d832137e20e193c960802afba73b5d38sm
31cfd74d65d832137e20e193c960802afba73b5d38sm    public final static int sign(float a) {
32cfd74d65d832137e20e193c960802afba73b5d38sm        if (a >= 0.0f) {
33cfd74d65d832137e20e193c960802afba73b5d38sm            return 1;
34cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
35cfd74d65d832137e20e193c960802afba73b5d38sm            return -1;
36cfd74d65d832137e20e193c960802afba73b5d38sm        }
37cfd74d65d832137e20e193c960802afba73b5d38sm    }
38cfd74d65d832137e20e193c960802afba73b5d38sm
39cfd74d65d832137e20e193c960802afba73b5d38sm    public final static int clamp(int value, int min, int max) {
40cfd74d65d832137e20e193c960802afba73b5d38sm        int result = value;
41cfd74d65d832137e20e193c960802afba73b5d38sm        if (min == max) {
42cfd74d65d832137e20e193c960802afba73b5d38sm            if (value != min) {
43cfd74d65d832137e20e193c960802afba73b5d38sm                result = min;
44cfd74d65d832137e20e193c960802afba73b5d38sm            }
45cfd74d65d832137e20e193c960802afba73b5d38sm        } else if (min < max) {
46cfd74d65d832137e20e193c960802afba73b5d38sm            if (value < min) {
47cfd74d65d832137e20e193c960802afba73b5d38sm                result = min;
48cfd74d65d832137e20e193c960802afba73b5d38sm            } else if (value > max) {
49cfd74d65d832137e20e193c960802afba73b5d38sm                result = max;
50cfd74d65d832137e20e193c960802afba73b5d38sm            }
51cfd74d65d832137e20e193c960802afba73b5d38sm        } else {
52cfd74d65d832137e20e193c960802afba73b5d38sm            result = clamp(value, max, min);
53cfd74d65d832137e20e193c960802afba73b5d38sm        }
54cfd74d65d832137e20e193c960802afba73b5d38sm
55cfd74d65d832137e20e193c960802afba73b5d38sm        return result;
56cfd74d65d832137e20e193c960802afba73b5d38sm    }
579d4cc2572d37983607df38b0f4216ed76ac51814sm
58cfd74d65d832137e20e193c960802afba73b5d38sm
59cfd74d65d832137e20e193c960802afba73b5d38sm    public final static int byteArrayToInt(byte[] b) {
60cfd74d65d832137e20e193c960802afba73b5d38sm        if (b.length != 4) {
61cfd74d65d832137e20e193c960802afba73b5d38sm            return 0;
62cfd74d65d832137e20e193c960802afba73b5d38sm        }
63cfd74d65d832137e20e193c960802afba73b5d38sm
64cfd74d65d832137e20e193c960802afba73b5d38sm        // Same as DataInputStream's 'readInt' method
65cfd74d65d832137e20e193c960802afba73b5d38sm        /*int i = (((b[0] & 0xff) << 24) | ((b[1] & 0xff) << 16) | ((b[2] & 0xff) << 8)
66cfd74d65d832137e20e193c960802afba73b5d38sm                | (b[3] & 0xff));*/
67cfd74d65d832137e20e193c960802afba73b5d38sm
68cfd74d65d832137e20e193c960802afba73b5d38sm        // little endian
69cfd74d65d832137e20e193c960802afba73b5d38sm        int i = (((b[3] & 0xff) << 24) | ((b[2] & 0xff) << 16) | ((b[1] & 0xff) << 8)
70cfd74d65d832137e20e193c960802afba73b5d38sm                | (b[0] & 0xff));
71cfd74d65d832137e20e193c960802afba73b5d38sm
72cfd74d65d832137e20e193c960802afba73b5d38sm        return i;
73cfd74d65d832137e20e193c960802afba73b5d38sm    }
74cfd74d65d832137e20e193c960802afba73b5d38sm
75cfd74d65d832137e20e193c960802afba73b5d38sm    public final static float byteArrayToFloat(byte[] b) {
76cfd74d65d832137e20e193c960802afba73b5d38sm
77cfd74d65d832137e20e193c960802afba73b5d38sm        // intBitsToFloat() converts bits as follows:
78cfd74d65d832137e20e193c960802afba73b5d38sm        /*
79cfd74d65d832137e20e193c960802afba73b5d38sm        int s = ((i >> 31) == 0) ? 1 : -1;
80cfd74d65d832137e20e193c960802afba73b5d38sm        int e = ((i >> 23) & 0xff);
81cfd74d65d832137e20e193c960802afba73b5d38sm        int m = (e == 0) ? (i & 0x7fffff) << 1 : (i & 0x7fffff) | 0x800000;
82cfd74d65d832137e20e193c960802afba73b5d38sm        */
83cfd74d65d832137e20e193c960802afba73b5d38sm
84cfd74d65d832137e20e193c960802afba73b5d38sm        return Float.intBitsToFloat(byteArrayToInt(b));
85cfd74d65d832137e20e193c960802afba73b5d38sm    }
86cfd74d65d832137e20e193c960802afba73b5d38sm
87cfd74d65d832137e20e193c960802afba73b5d38sm    public final static float framesToTime(int framesPerSecond, int frameCount) {
88cfd74d65d832137e20e193c960802afba73b5d38sm        return (1.0f / framesPerSecond) * frameCount;
89cfd74d65d832137e20e193c960802afba73b5d38sm    }
90cfd74d65d832137e20e193c960802afba73b5d38sm
91cfd74d65d832137e20e193c960802afba73b5d38sm}
92