jas_seq.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  * Sequence/Matrix Library
66  *
67  * $Id$
68  */
69 
70 #ifndef JAS_SEQ_H
71 #define JAS_SEQ_H
72 
73 /******************************************************************************\
74 * Includes.
75 \******************************************************************************/
76 
77 /* The configuration header file should be included first. */
78 #include <jasper/jas_config.h>
79 
80 #include <jasper/jas_stream.h>
81 #include <jasper/jas_types.h>
82 
83 #include <jasper/jas_math.h>
84 
85 #ifdef __cplusplus
86 extern "C" {
87 #endif
88 
89 /******************************************************************************\
90 * Constants.
91 \******************************************************************************/
92 
93 /* This matrix is a reference to another matrix. */
94 #define JAS_MATRIX_REF 0x0001
95 
96 /******************************************************************************\
97 * Types.
98 \******************************************************************************/
99 
100 /* An element in a sequence. */
101 typedef int_fast32_t jas_seqent_t;
102 
103 /* An element in a matrix. */
104 typedef int_fast32_t jas_matent_t;
105 
106 typedef int_fast32_t jas_matind_t;
107 
108 /* Matrix. */
109 
110 typedef struct {
111 
112  /* Additional state information. */
113  int flags_;
114 
115  /* The starting horizontal index. */
116  jas_matind_t xstart_;
117 
118  /* The starting vertical index. */
119  jas_matind_t ystart_;
120 
121  /* The ending horizontal index. */
122  jas_matind_t xend_;
123 
124  /* The ending vertical index. */
125  jas_matind_t yend_;
126 
127  /* The number of rows in the matrix. */
128  jas_matind_t numrows_;
129 
130  /* The number of columns in the matrix. */
131  jas_matind_t numcols_;
132 
133  /* Pointers to the start of each row. */
134  jas_seqent_t **rows_;
135 
136  /* The allocated size of the rows array. */
137  int_fast32_t maxrows_;
138 
139  /* The matrix data buffer. */
140  jas_seqent_t *data_;
141 
142  /* The allocated size of the data array. */
143  int_fast32_t datasize_;
144 
145 } jas_matrix_t;
146 
147 typedef jas_matrix_t jas_seq2d_t;
148 typedef jas_matrix_t jas_seq_t;
149 
150 /******************************************************************************\
151 * Functions/macros for matrix class.
152 \******************************************************************************/
153 
154 /* Get the number of rows. */
155 #define jas_matrix_numrows(matrix) \
156  ((matrix)->numrows_)
157 
158 /* Get the number of columns. */
159 #define jas_matrix_numcols(matrix) \
160  ((matrix)->numcols_)
161 
162 #define jas_matrix_size(matrix) \
163  (jas_matrix_width(matrix) * jas_matrix_height(matrix))
164 
165 /* Get a matrix element. */
166 #define jas_matrix_get(matrix, i, j) \
167  ((matrix)->rows_[i][j])
168 
169 /* Set a matrix element. */
170 #define jas_matrix_set(matrix, i, j, v) \
171  ((matrix)->rows_[i][j] = (v))
172 
173 /* Get an element from a matrix that is known to be a row or column vector. */
174 #define jas_matrix_getv(matrix, i) \
175  (((matrix)->numrows_ == 1) ? ((matrix)->rows_[0][i]) : \
176  ((matrix)->rows_[i][0]))
177 
178 /* Set an element in a matrix that is known to be a row or column vector. */
179 #define jas_matrix_setv(matrix, i, v) \
180  (((matrix)->numrows_ == 1) ? ((matrix)->rows_[0][i] = (v)) : \
181  ((matrix)->rows_[i][0] = (v)))
182 
183 /* Get the address of an element in a matrix. */
184 #define jas_matrix_getref(matrix, i, j) \
185  (&(matrix)->rows_[i][j])
186 
187 #define jas_matrix_getvref(matrix, i) \
188  (((matrix)->numrows_ > 1) ? jas_matrix_getref(matrix, i, 0) : \
189  jas_matrix_getref(matrix, 0, i))
190 
191 #define jas_matrix_length(matrix) \
192  (max((matrix)->numrows_, (matrix)->numcols_))
193 
194 /* Create a matrix with the specified dimensions. */
195 JAS_DLLEXPORT jas_matrix_t *jas_matrix_create(jas_matind_t numrows, jas_matind_t numcols);
196 
197 /* Destroy a matrix. */
198 JAS_DLLEXPORT void jas_matrix_destroy(jas_matrix_t *matrix);
199 
200 /* Resize a matrix. The previous contents of the matrix are lost. */
201 JAS_DLLEXPORT int jas_matrix_resize(jas_matrix_t *matrix, jas_matind_t numrows, jas_matind_t numcols);
202 
203 JAS_DLLEXPORT int jas_matrix_output(jas_matrix_t *matrix, FILE *out);
204 
205 /* Create a matrix that references part of another matrix. */
206 JAS_DLLEXPORT void jas_matrix_bindsub(jas_matrix_t *mat0, jas_matrix_t *mat1, jas_matind_t r0,
207  jas_matind_t c0, jas_matind_t r1, jas_matind_t c1);
208 
209 /* Create a matrix that is a reference to a row of another matrix. */
210 #define jas_matrix_bindrow(mat0, mat1, r) \
211  (jas_matrix_bindsub((mat0), (mat1), (r), 0, (r), (mat1)->numcols_ - 1))
212 
213 /* Create a matrix that is a reference to a column of another matrix. */
214 #define jas_matrix_bindcol(mat0, mat1, c) \
215  (jas_matrix_bindsub((mat0), (mat1), 0, (c), (mat1)->numrows_ - 1, (c)))
216 
217 /* Clip the values of matrix elements to the specified range. */
218 JAS_DLLEXPORT void jas_matrix_clip(jas_matrix_t *matrix, jas_seqent_t minval,
219  jas_seqent_t maxval);
220 
221 /* Arithmetic shift left of all elements in a matrix. */
222 JAS_DLLEXPORT void jas_matrix_asl(jas_matrix_t *matrix, int n);
223 
224 /* Arithmetic shift right of all elements in a matrix. */
225 JAS_DLLEXPORT void jas_matrix_asr(jas_matrix_t *matrix, int n);
226 
227 /* Almost-but-not-quite arithmetic shift right of all elements in a matrix. */
228 JAS_DLLEXPORT void jas_matrix_divpow2(jas_matrix_t *matrix, int n);
229 
230 /* Set all elements of a matrix to the specified value. */
231 JAS_DLLEXPORT void jas_matrix_setall(jas_matrix_t *matrix, jas_seqent_t val);
232 
233 /* The spacing between rows of a matrix. */
234 #define jas_matrix_rowstep(matrix) \
235  (((matrix)->numrows_ > 1) ? ((matrix)->rows_[1] - (matrix)->rows_[0]) : (0))
236 
237 /* The spacing between columns of a matrix. */
238 #define jas_matrix_step(matrix) \
239  (((matrix)->numrows_ > 1) ? (jas_matrix_rowstep(matrix)) : (1))
240 
241 /* Compare two matrices for equality. */
242 JAS_DLLEXPORT int jas_matrix_cmp(jas_matrix_t *mat0, jas_matrix_t *mat1);
243 
244 JAS_DLLEXPORT jas_matrix_t *jas_matrix_copy(jas_matrix_t *x);
245 
246 JAS_DLLEXPORT jas_matrix_t *jas_matrix_input(FILE *);
247 
248 #define jas_seqent_asl jas_fast32_asl
249 #define jas_seqent_asr jas_fast32_asr
250 
251 /******************************************************************************\
252 * Functions/macros for 2-D sequence class.
253 \******************************************************************************/
254 
255 JAS_DLLEXPORT jas_seq2d_t *jas_seq2d_copy(jas_seq2d_t *x);
256 
257 JAS_DLLEXPORT jas_matrix_t *jas_seq2d_create(jas_matind_t xstart, jas_matind_t ystart,
258  jas_matind_t xend, jas_matind_t yend);
259 
260 #define jas_seq2d_destroy(s) \
261  jas_matrix_destroy(s)
262 
263 #define jas_seq2d_xstart(s) \
264  ((s)->xstart_)
265 #define jas_seq2d_ystart(s) \
266  ((s)->ystart_)
267 #define jas_seq2d_xend(s) \
268  ((s)->xend_)
269 #define jas_seq2d_yend(s) \
270  ((s)->yend_)
271 #define jas_seq2d_getref(s, x, y) \
272  (jas_matrix_getref(s, (y) - (s)->ystart_, (x) - (s)->xstart_))
273 #define jas_seq2d_get(s, x, y) \
274  (jas_matrix_get(s, (y) - (s)->ystart_, (x) - (s)->xstart_))
275 #define jas_seq2d_rowstep(s) \
276  jas_matrix_rowstep(s)
277 #define jas_seq2d_width(s) \
278  ((s)->xend_ - (s)->xstart_)
279 #define jas_seq2d_height(s) \
280  ((s)->yend_ - (s)->ystart_)
281 #define jas_seq2d_setshift(s, x, y) \
282  ((s)->xstart_ = (x), (s)->ystart_ = (y), \
283  (s)->xend_ = (s)->xstart_ + (s)->numcols_, \
284  (s)->yend_ = (s)->ystart_ + (s)->numrows_)
285 #define jas_seq2d_size(s) \
286  (jas_seq2d_width(s) * jas_seq2d_height(s))
287 
288 JAS_DLLEXPORT void jas_seq2d_bindsub(jas_matrix_t *s, jas_matrix_t *s1, jas_matind_t xstart,
289  jas_matind_t ystart, jas_matind_t xend, jas_matind_t yend);
290 
291 /******************************************************************************\
292 * Functions/macros for 1-D sequence class.
293 \******************************************************************************/
294 
295 #define jas_seq_create(start, end) \
296  (jas_seq2d_create(start, 0, end, 1))
297 
298 #define jas_seq_destroy(seq) \
299  (jas_seq2d_destroy(seq))
300 
301 #define jas_seq_set(seq, i, v) \
302  ((seq)->rows_[0][(i) - (seq)->xstart_] = (v))
303 #define jas_seq_getref(seq, i) \
304  (&(seq)->rows_[0][(i) - (seq)->xstart_])
305 #define jas_seq_get(seq, i) \
306  ((seq)->rows_[0][(i) - (seq)->xstart_])
307 #define jas_seq_start(seq) \
308  ((seq)->xstart_)
309 #define jas_seq_end(seq) \
310  ((seq)->xend_)
311 
312 #ifdef __cplusplus
313 }
314 #endif
315 
316 #endif