mutter/cogl/cogl-util.h
Neil Roberts 1d54ecb8a1 cogl-clip-stack: Round the coords when clipping to a window rect
The size and position of the window rectangle for clipping in
try_pushing_rect_as_window_rect is calculated by projecting the
rectangle coordinates. Due to rounding errors, this can end up with
slightly off numbers like 34.999999. These were then being cast
directly to an integer so it could end up off by one.

This uses a new macro called COGL_UTIL_NEARBYINT which is a
replacement for the C99 nearbyint function.
2010-02-17 16:12:47 +00:00

64 lines
2.2 KiB
C

/*
* Cogl
*
* An object oriented GL/GLES Abstraction/Utility Layer
*
* 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
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#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
/* This is a replacement for the nearbyint function which always
rounds to the nearest integer. nearbyint is apparently a C99
function so it might not always be available but also it seems in
glibc it is defined as a function call so this macro could end up
faster anyway. We can't just add 0.5f because it will break for
negative numbers. */
#define COGL_UTIL_NEARBYINT(x) ((int) ((x) < 0.0f ? (x) - 0.5f : (x) + 0.5f))
#endif /* __COGL_UTIL_H */