/* Convert the fractional part leaving the integer part in tact */
frac_part = modff (t, &int_part);
- if (signbit (frac_part))
+ if (cogl_util_float_signbit (frac_part))
frac_part = ((1.0f + frac_part) * full_size -
sub_offset - sub_size) / sub_size;
else
*
* An object oriented GL/GLES Abstraction/Utility Layer
*
- * Copyright (C) 2007,2008,2009 Intel Corporation.
+ * Copyright (C) 2007,2008,2009,2010 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
#ifndef __COGL_UTIL_H
#define __COGL_UTIL_H
+#include <glib.h>
+#include <math.h>
+
int
cogl_util_next_p2 (int a);
+/* The signbit macro is defined by ISO C99 so it should be available,
+ however if it's not we can fallback to an evil hack */
+#ifdef signbit
+#define cogl_util_float_signbit(x) signbit(x)
+#else
+/* This trick was stolen from here:
+ http://lists.boost.org/Archives/boost/2006/08/108731.php
+
+ It xors the integer reinterpretations of -1.0f and 1.0f. In theory
+ they should only differ by the signbit so that gives a mask for the
+ sign which we can just test against the value */
+static inline gboolean
+cogl_util_float_signbit (float x)
+{
+ static const union { float f; guint32 i; } negative_one = { -1.0f };
+ static const union { float f; guint32 i; } positive_one = { +1.0f };
+ union { float f; guint32 i; } value = { x };
+
+ return !!((negative_one.i ^ positive_one.i) & value.i);
+}
+#endif
+
#endif /* __COGL_UTIL_H */