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