JasPer  4.0.0
jpc_fix.h
1 /*
2  * Copyright (c) 1999-2000 Image Power, Inc. and the University of
3  * British Columbia.
4  * Copyright (c) 2001-2002 Michael David Adams.
5  * All rights reserved.
6  */
7 
8 /* __START_OF_JASPER_LICENSE__
9  *
10  * JasPer License Version 2.0
11  *
12  * Copyright (c) 2001-2006 Michael David Adams
13  * Copyright (c) 1999-2000 Image Power, Inc.
14  * Copyright (c) 1999-2000 The University of British Columbia
15  *
16  * All rights reserved.
17  *
18  * Permission is hereby granted, free of charge, to any person (the
19  * "User") obtaining a copy of this software and associated documentation
20  * files (the "Software"), to deal in the Software without restriction,
21  * including without limitation the rights to use, copy, modify, merge,
22  * publish, distribute, and/or sell copies of the Software, and to permit
23  * persons to whom the Software is furnished to do so, subject to the
24  * following conditions:
25  *
26  * 1. The above copyright notices and this permission notice (which
27  * includes the disclaimer below) shall be included in all copies or
28  * substantial portions of the Software.
29  *
30  * 2. The name of a copyright holder shall not be used to endorse or
31  * promote products derived from the Software without specific prior
32  * written permission.
33  *
34  * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
35  * LICENSE. NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
36  * THIS DISCLAIMER. THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
37  * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
38  * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
39  * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO
40  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
41  * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
42  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
43  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
44  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. NO ASSURANCES ARE
45  * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
46  * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
47  * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
48  * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
49  * PROPERTY RIGHTS OR OTHERWISE. AS A CONDITION TO EXERCISING THE RIGHTS
50  * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
51  * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY. THE SOFTWARE
52  * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
53  * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
54  * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
55  * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
56  * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
57  * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
58  * RISK ACTIVITIES"). THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
59  * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
60  *
61  * __END_OF_JASPER_LICENSE__
62  */
63 
64 /*
65  * Fixed-Point Number Class
66  *
67  * $Id$
68  */
69 
70 #ifndef JPC_FIX_H
71 #define JPC_FIX_H
72 
73 /******************************************************************************\
74 * Includes.
75 \******************************************************************************/
76 
77 #include "jasper/jas_config.h"
78 #include "jasper/jas_types.h"
79 #include "jasper/jas_fix.h"
80 #include "jasper/jas_math.h"
81 
82 /******************************************************************************\
83 * Basic parameters of the fixed-point type.
84 \******************************************************************************/
85 
86 /*
87 jpc_fix_t.
88 The integral type used to represent a fixed-point number. This
89 type must be capable of representing values from -(2^31) to 2^31-1
90 (inclusive).
91 
92 jpc_fix_big_t.
93 The integral type used to respresent higher-precision intermediate results.
94 This type should be capable of representing values from -(2^63) to 2^63-1
95 (inclusive).
96 
97 JPC_FIX_FRACBITS.
98 The number of bits used for the fractional part of a fixed-point number.
99 */
100 
101 typedef jas_fix_t jpc_fix_t;
102 typedef jas_fix_big_t jpc_fix_big_t;
103 
104 #if defined(JAS_ENABLE_32BIT)
105 #define JPC_FIX_FRACBITS 13
106 #else
107 #define JPC_FIX_FRACBITS 18
108 #endif
109 
110 /******************************************************************************\
111 * Instantiations of the generic fixed-point number macros for the
112 * parameters given above. (Too bad C does not support templates, eh?)
113 * The purpose of these macros is self-evident if one examines the
114 * corresponding macros in the jasper/jas_fix.h header file.
115 \******************************************************************************/
116 
117 #define JPC_FIX_ZERO JAS_FIX_ZERO(jpc_fix_t, JPC_FIX_FRACBITS)
118 #define JPC_FIX_ONE JAS_FIX_ONE(jpc_fix_t, JPC_FIX_FRACBITS)
119 #define JPC_FIX_HALF JAS_FIX_HALF(jpc_fix_t, JPC_FIX_FRACBITS)
120 
121 JAS_ATTRIBUTE_CONST
122 static inline jpc_fix_t jpc_inttofix(int x)
123 {
124  return JAS_INTTOFIX(jpc_fix_t, JPC_FIX_FRACBITS, x);
125 }
126 
127 JAS_ATTRIBUTE_CONST
128 static inline int jpc_fixtoint(jpc_fix_t x)
129 {
130  return JAS_FIXTOINT(jpc_fix_t, JPC_FIX_FRACBITS, x);
131 }
132 
133 JAS_ATTRIBUTE_CONST
134 static inline double jpc_fixtodbl(jpc_fix_t x)
135 {
136  return JAS_FIXTODBL(jpc_fix_t, JPC_FIX_FRACBITS, x);
137 }
138 
139 JAS_ATTRIBUTE_CONST
140 static inline jpc_fix_t jpc_dbltofix(double x)
141 {
142  return JAS_DBLTOFIX(jpc_fix_t, JPC_FIX_FRACBITS, x);
143 }
144 
145 JAS_ATTRIBUTE_CONST
146 static inline jpc_fix_t jpc_fix_add(jpc_fix_t x, jpc_fix_t y)
147 {
148  return JAS_FIX_ADD(jpc_fix_t, JPC_FIX_FRACBITS, x, y);
149 }
150 
151 JAS_ATTRIBUTE_CONST
152 static inline jpc_fix_t jpc_fix_sub(jpc_fix_t x, jpc_fix_t y)
153 {
154  return JAS_FIX_SUB(jpc_fix_t, JPC_FIX_FRACBITS, x, y);
155 }
156 
157 JAS_ATTRIBUTE_CONST
158 static inline jpc_fix_t jpc_fix_mul(jpc_fix_big_t x, jpc_fix_big_t y)
159 {
160  return JAS_FIX_MUL(jpc_fix_t, JPC_FIX_FRACBITS, jpc_fix_big_t, x, y);
161 }
162 
163 JAS_ATTRIBUTE_CONST
164 static inline jpc_fix_big_t jpc_fix_mulbyint(jpc_fix_big_t x, int y)
165 {
166  return JAS_FIX_MUL(jpc_fix_t, JPC_FIX_FRACBITS, jpc_fix_big_t, x, y);
167 }
168 
169 JAS_ATTRIBUTE_CONST
170 static inline jpc_fix_t jpc_fix_div(jpc_fix_big_t x, jpc_fix_t y)
171 {
172  return JAS_FIX_DIV(jpc_fix_t, JPC_FIX_FRACBITS, jpc_fix_big_t, x, y);
173 }
174 
175 JAS_ATTRIBUTE_CONST
176 static inline jpc_fix_t jpc_fix_neg(jpc_fix_t x)
177 {
178  return JAS_FIX_NEG(jpc_fix_t, JPC_FIX_FRACBITS, x);
179 }
180 
181 //#define jpc_fix_asl(x, n) JAS_FIX_ASL(jpc_fix_t, JPC_FIX_FRACBITS, x, n)
182 //#define jpc_fix_asr(x, n) JAS_FIX_ASR(jpc_fix_t, JPC_FIX_FRACBITS, x, n)
183 
184 #if 0
185 #ifdef JAS_ENABLE_32BIT
186 #define jpc_fix_asl jas_least32_asl
187 #define jpc_fix_asr jas_least32_asr
188 #else
189 #define jpc_fix_asl jas_fast32_asl
190 #define jpc_fix_asr jas_fast32_asr
191 #endif
192 #endif
193 #define jpc_fix_asl jas_fix_asl
194 #define jpc_fix_asr jas_fix_asr
195 
196 #define jpc_fix_pluseq(x, y) \
197  JAS_FIX_PLUSEQ(jpc_fix_t, JPC_FIX_FRACBITS, x, y)
198 #define jpc_fix_minuseq(x, y) \
199  JAS_FIX_MINUSEQ(jpc_fix_t, JPC_FIX_FRACBITS, x, y)
200 #define jpc_fix_muleq(x, y) \
201  JAS_FIX_MULEQ(jpc_fix_t, JPC_FIX_FRACBITS, jpc_fix_big_t, x, y)
202 
203 JAS_ATTRIBUTE_CONST
204 static inline jpc_fix_t jpc_fix_abs(jpc_fix_t x)
205 {
206  return JAS_FIX_ABS(jpc_fix_t, JPC_FIX_FRACBITS, x);
207 }
208 
209 JAS_ATTRIBUTE_CONST
210 static inline bool jpc_fix_isint(jpc_fix_t x)
211 {
212  return JAS_FIX_ISINT(jpc_fix_t, JPC_FIX_FRACBITS, x);
213 }
214 
215 JAS_ATTRIBUTE_CONST
216 static inline int jpc_fix_sgn(jpc_fix_t x)
217 {
218  return JAS_FIX_SGN(jpc_fix_t, JPC_FIX_FRACBITS, x);
219 }
220 
221 JAS_ATTRIBUTE_CONST
222 static inline jpc_fix_t jpc_fix_round(jpc_fix_t x)
223 {
224  return JAS_FIX_ROUND(jpc_fix_t, JPC_FIX_FRACBITS, x);
225 }
226 
227 JAS_ATTRIBUTE_CONST
228 static inline jpc_fix_t jpc_fix_floor(jpc_fix_t x)
229 {
230  return JAS_FIX_FLOOR(jpc_fix_t, JPC_FIX_FRACBITS, x);
231 }
232 
233 /******************************************************************************\
234 * Extra macros for convenience.
235 \******************************************************************************/
236 
237 /* Compute the sum of three fixed-point numbers. */
238 JAS_ATTRIBUTE_CONST
239 static inline jpc_fix_t jpc_fix_add3(jpc_fix_t x, jpc_fix_t y, jpc_fix_t z)
240 {
241  return jpc_fix_add(jpc_fix_add(x, y), z);
242 }
243 
244 #endif
#define JAS_FIX_DIV
Definition: jas_fix.h:223
#define JAS_FIX_MUL
Definition: jas_fix.h:184
Math-Related Code.
#define JAS_FIX_SGN(fix_t, fracbits, x)
Definition: jas_fix.h:322
#define JAS_FIXTOINT(fix_t, fracbits, x)
Definition: jas_fix.h:143
#define JAS_FIX_ROUND(fix_t, fracbits, x)
Definition: jas_fix.h:354
int_least64_t jas_fix_t
Definition: jas_fix.h:101
#define JAS_INTTOFIX(fix_t, fracbits, x)
Definition: jas_fix.h:139
#define JAS_FIX_ADD
Definition: jas_fix.h:166
JasPer Fixed-Point Number Class.
#define JAS_FIX_FLOOR(fix_t, fracbits, x)
Definition: jas_fix.h:362
#define JAS_DBLTOFIX(fix_t, fracbits, x)
Definition: jas_fix.h:151
#define JAS_FIX_ABS(fix_t, fracbits, x)
Definition: jas_fix.h:314
#define JAS_FIX_ISINT(fix_t, fracbits, x)
Definition: jas_fix.h:318
#define JAS_FIXTODBL(fix_t, fracbits, x)
Definition: jas_fix.h:147
Primitive Types.
#define JAS_FIX_NEG
Definition: jas_fix.h:240
#define JAS_FIX_SUB(fix_t, fracbits, x, y)
Definition: jas_fix.h:294