1a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
2a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Use of this source code is governed by a BSD-style license that can be
4a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// found in the LICENSE file.
5a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block//
6a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
7a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// mathutil.h: Math and bit manipulation functions.
8a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
9a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#ifndef LIBGLESV2_MATHUTIL_H_
10a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#define LIBGLESV2_MATHUTIL_H_
11a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
12a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include <math.h>
13a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
14a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocknamespace gl
15a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
16a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockinline bool isPow2(int x)
17a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
18a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return (x & (x - 1)) == 0 && (x != 0);
19a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
20a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
21a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockinline int log2(int x)
22a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
23a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    int r = 0;
24a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    while ((x >> r) > 1) r++;
25a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return r;
26a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
27a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
28a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockinline unsigned int ceilPow2(unsigned int x)
29a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
30a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    if (x != 0) x--;
31a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    x |= x >> 1;
32a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    x |= x >> 2;
33a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    x |= x >> 4;
34a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    x |= x >> 8;
35a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    x |= x >> 16;
36a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    x++;
37a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
38a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return x;
39a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
40a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
41a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockinline float clamp01(float x)
42a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
43a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    return x < 0 ? 0 : (x > 1 ? 1 : x);
44a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
45a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
46a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocktemplate<const int n>
47a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockinline unsigned int unorm(float x)
48a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{
49a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    const unsigned int max = 0xFFFFFFFF >> (32 - n);
50a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
51a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    if (x > 1)
52a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
53a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return max;
54a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
55a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    else if (x < 0)
56a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
57a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return 0;
58a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
59a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    else
60a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    {
61a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block        return (unsigned int)(max * x + 0.5f);
62a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block    }
63a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
64a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block}
65a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block
66a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#endif   // LIBGLESV2_MATHUTIL_H_
67