diff --git a/cogl/cogl-sub-texture.c b/cogl/cogl-sub-texture.c index bd23c857f..318282397 100644 --- a/cogl/cogl-sub-texture.c +++ b/cogl/cogl-sub-texture.c @@ -124,7 +124,7 @@ _cogl_sub_texture_unmap_coord (gfloat t, /* 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 diff --git a/cogl/cogl-texture-2d.c b/cogl/cogl-texture-2d.c index a86f84408..40f7b3f72 100644 --- a/cogl/cogl-texture-2d.c +++ b/cogl/cogl-texture-2d.c @@ -64,7 +64,7 @@ _cogl_texture_2d_wrap_coords (float t_1, float t_2, modff (t_1 < t_2 ? t_1 : t_2, &int_part); t_1 -= int_part; t_2 -= int_part; - if (signbit (int_part)) + if (cogl_util_float_signbit (int_part)) { *out_t_1 = 1.0f + t_1; *out_t_2 = 1.0f + t_2; diff --git a/cogl/cogl-util.h b/cogl/cogl-util.h index 589ddd35a..a6602a5f5 100644 --- a/cogl/cogl-util.h +++ b/cogl/cogl-util.h @@ -3,7 +3,7 @@ * * 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 @@ -24,7 +24,32 @@ #ifndef __COGL_UTIL_H #define __COGL_UTIL_H +#include +#include + 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 */