Update to 2.0.0 tree from current Fremantle build
[opencv] / 3rdparty / libjasper / jas_seq.c
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: jas_seq.c,v 1.2 2008-05-26 09:40:52 vp153 Exp $
68  */
69
70 /******************************************************************************\
71 * Includes.
72 \******************************************************************************/
73
74 #include <stdlib.h>
75 #include <assert.h>
76 #include <math.h>
77
78 #include "jasper/jas_seq.h"
79 #include "jasper/jas_malloc.h"
80 #include "jasper/jas_math.h"
81
82 /******************************************************************************\
83 * Constructors and destructors.
84 \******************************************************************************/
85
86 jas_matrix_t *jas_seq2d_create(int xstart, int ystart, int xend, int yend)
87 {
88         jas_matrix_t *matrix;
89         assert(xstart <= xend && ystart <= yend);
90         if (!(matrix = jas_matrix_create(yend - ystart, xend - xstart))) {
91                 return 0;
92         }
93         matrix->xstart_ = xstart;
94         matrix->ystart_ = ystart;
95         matrix->xend_ = xend;
96         matrix->yend_ = yend;
97         return matrix;
98 }
99
100 jas_matrix_t *jas_matrix_create(int numrows, int numcols)
101 {
102         jas_matrix_t *matrix;
103         int i;
104
105         if (!(matrix = jas_malloc(sizeof(jas_matrix_t)))) {
106                 return 0;
107         }
108         matrix->flags_ = 0;
109         matrix->numrows_ = numrows;
110         matrix->numcols_ = numcols;
111         matrix->rows_ = 0;
112         matrix->maxrows_ = numrows;
113         matrix->data_ = 0;
114         matrix->datasize_ = numrows * numcols;
115
116         if (matrix->maxrows_ > 0) {
117                 if (!(matrix->rows_ = jas_malloc(matrix->maxrows_ *
118                   sizeof(jas_seqent_t *)))) {
119                         jas_matrix_destroy(matrix);
120                         return 0;
121                 }
122         }
123
124         if (matrix->datasize_ > 0) {
125                 if (!(matrix->data_ = jas_malloc(matrix->datasize_ *
126                   sizeof(jas_seqent_t)))) {
127                         jas_matrix_destroy(matrix);
128                         return 0;
129                 }
130         }
131
132         for (i = 0; i < numrows; ++i) {
133                 matrix->rows_[i] = &matrix->data_[i * matrix->numcols_];
134         }
135
136         for (i = 0; i < matrix->datasize_; ++i) {
137                 matrix->data_[i] = 0;
138         }
139
140         matrix->xstart_ = 0;
141         matrix->ystart_ = 0;
142         matrix->xend_ = matrix->numcols_;
143         matrix->yend_ = matrix->numrows_;
144
145         return matrix;
146 }
147
148 void jas_matrix_destroy(jas_matrix_t *matrix)
149 {
150         if (matrix->data_) {
151                 assert(!(matrix->flags_ & JAS_MATRIX_REF));
152                 jas_free(matrix->data_);
153                 matrix->data_ = 0;
154         }
155         if (matrix->rows_) {
156                 jas_free(matrix->rows_);
157                 matrix->rows_ = 0;
158         }
159         jas_free(matrix);
160 }
161
162 jas_seq2d_t *jas_seq2d_copy(jas_seq2d_t *x)
163 {
164         jas_matrix_t *y;
165         int i;
166         int j;
167         y = jas_seq2d_create(jas_seq2d_xstart(x), jas_seq2d_ystart(x), jas_seq2d_xend(x),
168           jas_seq2d_yend(x));
169         assert(y);
170         for (i = 0; i < x->numrows_; ++i) {
171                 for (j = 0; j < x->numcols_; ++j) {
172                         *jas_matrix_getref(y, i, j) = jas_matrix_get(x, i, j);
173                 }
174         }
175         return y;
176 }
177
178 jas_matrix_t *jas_matrix_copy(jas_matrix_t *x)
179 {
180         jas_matrix_t *y;
181         int i;
182         int j;
183         y = jas_matrix_create(x->numrows_, x->numcols_);
184         for (i = 0; i < x->numrows_; ++i) {
185                 for (j = 0; j < x->numcols_; ++j) {
186                         *jas_matrix_getref(y, i, j) = jas_matrix_get(x, i, j);
187                 }
188         }
189         return y;
190 }
191
192 /******************************************************************************\
193 * Bind operations.
194 \******************************************************************************/
195
196 void jas_seq2d_bindsub(jas_matrix_t *s, jas_matrix_t *s1, int xstart, int ystart,
197   int xend, int yend)
198 {
199         jas_matrix_bindsub(s, s1, ystart - s1->ystart_, xstart - s1->xstart_,
200           yend - s1->ystart_ - 1, xend - s1->xstart_ - 1);
201 }
202
203 void jas_matrix_bindsub(jas_matrix_t *mat0, jas_matrix_t *mat1, int r0, int c0,
204   int r1, int c1)
205 {
206         int i;
207
208         if (mat0->data_) {
209                 if (!(mat0->flags_ & JAS_MATRIX_REF)) {
210                         jas_free(mat0->data_);
211                 }
212                 mat0->data_ = 0;
213                 mat0->datasize_ = 0;
214         }
215         if (mat0->rows_) {
216                 jas_free(mat0->rows_);
217                 mat0->rows_ = 0;
218         }
219         mat0->flags_ |= JAS_MATRIX_REF;
220         mat0->numrows_ = r1 - r0 + 1;
221         mat0->numcols_ = c1 - c0 + 1;
222         mat0->maxrows_ = mat0->numrows_;
223         mat0->rows_ = jas_malloc(mat0->maxrows_ * sizeof(jas_seqent_t *));
224         for (i = 0; i < mat0->numrows_; ++i) {
225                 mat0->rows_[i] = mat1->rows_[r0 + i] + c0;
226         }
227
228         mat0->xstart_ = mat1->xstart_ + c0;
229         mat0->ystart_ = mat1->ystart_ + r0;
230         mat0->xend_ = mat0->xstart_ + mat0->numcols_;
231         mat0->yend_ = mat0->ystart_ + mat0->numrows_;
232 }
233
234 /******************************************************************************\
235 * Arithmetic operations.
236 \******************************************************************************/
237
238 int jas_matrix_cmp(jas_matrix_t *mat0, jas_matrix_t *mat1)
239 {
240         int i;
241         int j;
242
243         if (mat0->numrows_ != mat1->numrows_ || mat0->numcols_ !=
244           mat1->numcols_) {
245                 return 1;
246         }
247         for (i = 0; i < mat0->numrows_; i++) {
248                 for (j = 0; j < mat0->numcols_; j++) {
249                         if (jas_matrix_get(mat0, i, j) != jas_matrix_get(mat1, i, j)) {
250                                 return 1;
251                         }
252                 }
253         }
254         return 0;
255 }
256
257 void jas_matrix_divpow2(jas_matrix_t *matrix, int n)
258 {
259         int i;
260         int j;
261         jas_seqent_t *rowstart;
262         int rowstep;
263         jas_seqent_t *data;
264
265         rowstep = jas_matrix_rowstep(matrix);
266         for (i = matrix->numrows_, rowstart = matrix->rows_[0]; i > 0; --i,
267           rowstart += rowstep) {
268                 for (j = matrix->numcols_, data = rowstart; j > 0; --j,
269                   ++data) {
270                         *data = (*data >= 0) ? ((*data) >> n) :
271                           (-((-(*data)) >> n));
272                 }
273         }
274 }
275
276 void jas_matrix_clip(jas_matrix_t *matrix, jas_seqent_t minval, jas_seqent_t maxval)
277 {
278         int i;
279         int j;
280         jas_seqent_t v;
281         jas_seqent_t *rowstart;
282         jas_seqent_t *data;
283         int rowstep;
284
285         rowstep = jas_matrix_rowstep(matrix);
286         for (i = matrix->numrows_, rowstart = matrix->rows_[0]; i > 0; --i,
287           rowstart += rowstep) {
288                 data = rowstart;
289                 for (j = matrix->numcols_, data = rowstart; j > 0; --j,
290                   ++data) {
291                         v = *data;
292                         if (v < minval) {
293                                 *data = minval;
294                         } else if (v > maxval) {
295                                 *data = maxval;
296                         }
297                 }
298         }
299 }
300
301 void jas_matrix_asr(jas_matrix_t *matrix, int n)
302 {
303         int i;
304         int j;
305         jas_seqent_t *rowstart;
306         int rowstep;
307         jas_seqent_t *data;
308
309         assert(n >= 0);
310         rowstep = jas_matrix_rowstep(matrix);
311         for (i = matrix->numrows_, rowstart = matrix->rows_[0]; i > 0; --i,
312           rowstart += rowstep) {
313                 for (j = matrix->numcols_, data = rowstart; j > 0; --j,
314                   ++data) {
315                         *data >>= n;
316                 }
317         }
318 }
319
320 void jas_matrix_asl(jas_matrix_t *matrix, int n)
321 {
322         int i;
323         int j;
324         jas_seqent_t *rowstart;
325         int rowstep;
326         jas_seqent_t *data;
327
328         rowstep = jas_matrix_rowstep(matrix);
329         for (i = matrix->numrows_, rowstart = matrix->rows_[0]; i > 0; --i,
330           rowstart += rowstep) {
331                 for (j = matrix->numcols_, data = rowstart; j > 0; --j,
332                   ++data) {
333                         *data <<= n;
334                 }
335         }
336 }
337
338 /******************************************************************************\
339 * Code.
340 \******************************************************************************/
341
342 int jas_matrix_resize(jas_matrix_t *matrix, int numrows, int numcols)
343 {
344         int size;
345         int i;
346
347         size = numrows * numcols;
348         if (size > matrix->datasize_ || numrows > matrix->maxrows_) {
349                 return -1;
350         }
351
352         matrix->numrows_ = numrows;
353         matrix->numcols_ = numcols;
354
355         for (i = 0; i < numrows; ++i) {
356                 matrix->rows_[i] = &matrix->data_[numcols * i];
357         }
358
359         return 0;
360 }
361
362 void jas_matrix_setall(jas_matrix_t *matrix, jas_seqent_t val)
363 {
364         int i;
365         int j;
366         jas_seqent_t *rowstart;
367         int rowstep;
368         jas_seqent_t *data;
369
370         rowstep = jas_matrix_rowstep(matrix);
371         for (i = matrix->numrows_, rowstart = matrix->rows_[0]; i > 0; --i,
372           rowstart += rowstep) {
373                 for (j = matrix->numcols_, data = rowstart; j > 0; --j,
374                   ++data) {
375                         *data = val;
376                 }
377         }
378 }
379
380 jas_matrix_t *jas_seq2d_input(FILE *in)
381 {
382         jas_matrix_t *matrix;
383         int i;
384         int j;
385         long x;
386         int numrows;
387         int numcols;
388         int xoff;
389         int yoff;
390
391         if (fscanf(in, "%d %d", &xoff, &yoff) != 2)
392                 return 0;
393         if (fscanf(in, "%d %d", &numcols, &numrows) != 2)
394                 return 0;
395         if (!(matrix = jas_seq2d_create(xoff, yoff, xoff + numcols, yoff + numrows)))
396                 return 0;
397
398         if (jas_matrix_numrows(matrix) != numrows || jas_matrix_numcols(matrix) != numcols) {
399                 abort();
400         }
401
402         /* Get matrix data. */
403         for (i = 0; i < jas_matrix_numrows(matrix); i++) {
404                 for (j = 0; j < jas_matrix_numcols(matrix); j++) {
405                         if (fscanf(in, "%ld", &x) != 1) {
406                                 jas_matrix_destroy(matrix);
407                                 return 0;
408                         }
409                         jas_matrix_set(matrix, i, j, JAS_CAST(jas_seqent_t, x));
410                 }
411         }
412
413         return matrix;
414 }
415
416 int jas_seq2d_output(jas_matrix_t *matrix, FILE *out)
417 {
418 #define MAXLINELEN      80
419         int i;
420         int j;
421         jas_seqent_t x;
422         char buf[MAXLINELEN + 1];
423         char sbuf[MAXLINELEN + 1];
424         int n;
425
426         fprintf(out, "%d %d\n", jas_seq2d_xstart(matrix),
427           jas_seq2d_ystart(matrix));
428         fprintf(out, "%d %d\n", jas_matrix_numcols(matrix),
429           jas_matrix_numrows(matrix));
430
431         buf[0] = '\0';
432         for (i = 0; i < jas_matrix_numrows(matrix); ++i) {
433                 for (j = 0; j < jas_matrix_numcols(matrix); ++j) {
434                         x = jas_matrix_get(matrix, i, j);
435                         sprintf(sbuf, "%s%4ld", (strlen(buf) > 0) ? " " : "",
436                           JAS_CAST(long, x));
437                         n = strlen(buf);
438                         if (n + strlen(sbuf) > MAXLINELEN) {
439                                 fputs(buf, out);
440                                 fputs("\n", out);
441                                 buf[0] = '\0';
442                         }
443                         strcat(buf, sbuf);
444                         if (j == jas_matrix_numcols(matrix) - 1) {
445                                 fputs(buf, out);
446                                 fputs("\n", out);
447                                 buf[0] = '\0';
448                         }
449                 }
450         }
451         fputs(buf, out);
452
453         return 0;
454 }