1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
2  *
3  * Copyright (C) 2011 Richard Hughes <richard@hughsie.com>
4  *
5  * Licensed under the GNU General Public License Version 2
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21 
22 #if !defined (__COLORHUG_H_INSIDE__) && !defined (CH_COMPILATION)
23 #error "Only <colorhug.h> can be included directly."
24 #endif
25 
26 #ifndef __CH_MATH_H
27 #define __CH_MATH_H
28 
29 #include <glib.h>
30 
31 #include "ch-common.h"
32 
33 G_BEGIN_DECLS
34 
35 /* a 32 bit struct to hold numbers from the range -32767 to +32768
36  * with a precision of at least 0.000015 */
37 typedef union {
38 	struct {
39 		guint8	bytes[4];
40 	};
41 	struct {
42 		guint16	fraction;
43 		gint16	offset;
44 	};
45 	struct {
46 		gint32	raw;
47 	};
48 } ChPackedFloat;
49 
50 gint32		 ch_packed_float_get_value	(const ChPackedFloat	*pf);
51 void		 ch_packed_float_set_value	(ChPackedFloat		*pf,
52 						 const gint32		 value);
53 
54 void		 ch_packed_float_to_double	(const ChPackedFloat	*pf,
55 						 gdouble		*value);
56 void		 ch_double_to_packed_float	(gdouble		 value,
57 						 ChPackedFloat		*pf);
58 
59 ChError		 ch_packed_float_add		(const ChPackedFloat	*pf1,
60 						 const ChPackedFloat	*pf2,
61 						 ChPackedFloat		*result);
62 ChError		 ch_packed_float_multiply	(const ChPackedFloat	*pf1,
63 						 const ChPackedFloat	*pf2,
64 						 ChPackedFloat		*result);
65 
66 G_END_DECLS
67 
68 #endif /* __CH_MATH_H */
69