SDL standard library

Dependents:   H261_encoder

Committer:
miruga27
Date:
Wed Sep 07 18:46:53 2016 +0000
Revision:
0:dda4f4550403
7/09/2016;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miruga27 0:dda4f4550403 1 /*
miruga27 0:dda4f4550403 2 Simple DirectMedia Layer
miruga27 0:dda4f4550403 3 Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
miruga27 0:dda4f4550403 4
miruga27 0:dda4f4550403 5 This software is provided 'as-is', without any express or implied
miruga27 0:dda4f4550403 6 warranty. In no event will the authors be held liable for any damages
miruga27 0:dda4f4550403 7 arising from the use of this software.
miruga27 0:dda4f4550403 8
miruga27 0:dda4f4550403 9 Permission is granted to anyone to use this software for any purpose,
miruga27 0:dda4f4550403 10 including commercial applications, and to alter it and redistribute it
miruga27 0:dda4f4550403 11 freely, subject to the following restrictions:
miruga27 0:dda4f4550403 12
miruga27 0:dda4f4550403 13 1. The origin of this software must not be misrepresented; you must not
miruga27 0:dda4f4550403 14 claim that you wrote the original software. If you use this software
miruga27 0:dda4f4550403 15 in a product, an acknowledgment in the product documentation would be
miruga27 0:dda4f4550403 16 appreciated but is not required.
miruga27 0:dda4f4550403 17 2. Altered source versions must be plainly marked as such, and must not be
miruga27 0:dda4f4550403 18 misrepresented as being the original software.
miruga27 0:dda4f4550403 19 3. This notice may not be removed or altered from any source distribution.
miruga27 0:dda4f4550403 20 */
miruga27 0:dda4f4550403 21
miruga27 0:dda4f4550403 22 /**
miruga27 0:dda4f4550403 23 * \file SDL_bits.h
miruga27 0:dda4f4550403 24 *
miruga27 0:dda4f4550403 25 * Functions for fiddling with bits and bitmasks.
miruga27 0:dda4f4550403 26 */
miruga27 0:dda4f4550403 27
miruga27 0:dda4f4550403 28 #ifndef _SDL_bits_h
miruga27 0:dda4f4550403 29 #define _SDL_bits_h
miruga27 0:dda4f4550403 30
miruga27 0:dda4f4550403 31 #include "SDL_stdinc.h"
miruga27 0:dda4f4550403 32
miruga27 0:dda4f4550403 33 #include "begin_code.h"
miruga27 0:dda4f4550403 34 /* Set up for C function definitions, even when using C++ */
miruga27 0:dda4f4550403 35 #ifdef __cplusplus
miruga27 0:dda4f4550403 36 extern "C" {
miruga27 0:dda4f4550403 37 #endif
miruga27 0:dda4f4550403 38
miruga27 0:dda4f4550403 39 /**
miruga27 0:dda4f4550403 40 * \file SDL_bits.h
miruga27 0:dda4f4550403 41 */
miruga27 0:dda4f4550403 42
miruga27 0:dda4f4550403 43 /**
miruga27 0:dda4f4550403 44 * Get the index of the most significant bit. Result is undefined when called
miruga27 0:dda4f4550403 45 * with 0. This operation can also be stated as "count leading zeroes" and
miruga27 0:dda4f4550403 46 * "log base 2".
miruga27 0:dda4f4550403 47 *
miruga27 0:dda4f4550403 48 * \return Index of the most significant bit, or -1 if the value is 0.
miruga27 0:dda4f4550403 49 */
miruga27 0:dda4f4550403 50 SDL_FORCE_INLINE int
miruga27 0:dda4f4550403 51 SDL_MostSignificantBitIndex32(Uint32 x)
miruga27 0:dda4f4550403 52 {
miruga27 0:dda4f4550403 53 #if defined(__GNUC__) && __GNUC__ >= 4
miruga27 0:dda4f4550403 54 /* Count Leading Zeroes builtin in GCC.
miruga27 0:dda4f4550403 55 * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html
miruga27 0:dda4f4550403 56 */
miruga27 0:dda4f4550403 57 if (x == 0) {
miruga27 0:dda4f4550403 58 return -1;
miruga27 0:dda4f4550403 59 }
miruga27 0:dda4f4550403 60 return 31 - __builtin_clz(x);
miruga27 0:dda4f4550403 61 #else
miruga27 0:dda4f4550403 62 /* Based off of Bit Twiddling Hacks by Sean Eron Anderson
miruga27 0:dda4f4550403 63 * <seander@cs.stanford.edu>, released in the public domain.
miruga27 0:dda4f4550403 64 * http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
miruga27 0:dda4f4550403 65 */
miruga27 0:dda4f4550403 66 const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
miruga27 0:dda4f4550403 67 const int S[] = {1, 2, 4, 8, 16};
miruga27 0:dda4f4550403 68
miruga27 0:dda4f4550403 69 int msbIndex = 0;
miruga27 0:dda4f4550403 70 int i;
miruga27 0:dda4f4550403 71
miruga27 0:dda4f4550403 72 if (x == 0) {
miruga27 0:dda4f4550403 73 return -1;
miruga27 0:dda4f4550403 74 }
miruga27 0:dda4f4550403 75
miruga27 0:dda4f4550403 76 for (i = 4; i >= 0; i--)
miruga27 0:dda4f4550403 77 {
miruga27 0:dda4f4550403 78 if (x & b[i])
miruga27 0:dda4f4550403 79 {
miruga27 0:dda4f4550403 80 x >>= S[i];
miruga27 0:dda4f4550403 81 msbIndex |= S[i];
miruga27 0:dda4f4550403 82 }
miruga27 0:dda4f4550403 83 }
miruga27 0:dda4f4550403 84
miruga27 0:dda4f4550403 85 return msbIndex;
miruga27 0:dda4f4550403 86 #endif
miruga27 0:dda4f4550403 87 }
miruga27 0:dda4f4550403 88
miruga27 0:dda4f4550403 89 /* Ends C function definitions when using C++ */
miruga27 0:dda4f4550403 90 #ifdef __cplusplus
miruga27 0:dda4f4550403 91 }
miruga27 0:dda4f4550403 92 #endif
miruga27 0:dda4f4550403 93 #include "close_code.h"
miruga27 0:dda4f4550403 94
miruga27 0:dda4f4550403 95 #endif /* _SDL_bits_h */
miruga27 0:dda4f4550403 96
miruga27 0:dda4f4550403 97 /* vi: set ts=4 sw=4 expandtab: */