Coverage Report

Created: 2026-01-20 07:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/jasper/src/libjasper/base/jas_seq.c
Line
Count
Source
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
/******************************************************************************\
71
* Includes.
72
\******************************************************************************/
73
74
#define JAS_FOR_INTERNAL_USE_ONLY
75
76
#include "jasper/jas_seq.h"
77
#include "jasper/jas_malloc.h"
78
#include "jasper/jas_math.h"
79
#include "jasper/jas_debug.h"
80
81
#include <assert.h>
82
83
/******************************************************************************\
84
* Constructors and destructors.
85
\******************************************************************************/
86
87
jas_matrix_t *jas_seq2d_create(jas_matind_t xstart, jas_matind_t ystart,
88
  jas_matind_t xend, jas_matind_t yend)
89
79.7M
{
90
79.7M
  jas_matrix_t *matrix;
91
79.7M
  assert(xstart <= xend && ystart <= yend);
92
79.7M
  if (!(matrix = jas_matrix_create(yend - ystart, xend - xstart))) {
93
26
    return 0;
94
26
  }
95
79.7M
  matrix->xstart_ = xstart;
96
79.7M
  matrix->ystart_ = ystart;
97
79.7M
  matrix->xend_ = xend;
98
79.7M
  matrix->yend_ = yend;
99
79.7M
  return matrix;
100
79.7M
}
101
102
jas_matrix_t *jas_matrix_create(jas_matind_t numrows, jas_matind_t numcols)
103
89.3M
{
104
89.3M
  jas_matrix_t *matrix;
105
89.3M
  jas_matind_t i;
106
89.3M
  size_t size;
107
108
89.3M
  matrix = 0;
109
110
89.3M
  if (numrows < 0 || numcols < 0) {
111
0
    return NULL;
112
0
  }
113
114
  // matrix->datasize_ = numrows * numcols;
115
89.3M
  if (!jas_safe_size_mul(numrows, numcols, &size) ||
116
89.3M
      size > UINT_FAST32_MAX) {
117
0
    return NULL;
118
0
  }
119
120
89.3M
  if (!(matrix = jas_malloc(sizeof(jas_matrix_t)))) {
121
18
    return NULL;
122
18
  }
123
89.3M
  matrix->flags_ = 0;
124
89.3M
  matrix->numrows_ = numrows;
125
89.3M
  matrix->numcols_ = numcols;
126
89.3M
  matrix->rows_ = 0;
127
89.3M
  matrix->maxrows_ = numrows;
128
89.3M
  matrix->data_ = 0;
129
89.3M
  matrix->datasize_ = size;
130
131
89.3M
  if (matrix->maxrows_ > 0) {
132
9.65M
    if (!(matrix->rows_ = jas_alloc2(matrix->maxrows_,
133
9.65M
      sizeof(jas_seqent_t *)))) {
134
0
      goto error;
135
0
    }
136
9.65M
  }
137
138
89.3M
  if (matrix->datasize_ > 0) {
139
9.65M
    if (!(matrix->data_ = jas_alloc2(matrix->datasize_,
140
9.65M
      sizeof(jas_seqent_t)))) {
141
8
      goto error;
142
8
    }
143
9.65M
    memset(matrix->data_, 0, matrix->datasize_ * sizeof(jas_seqent_t));
144
9.65M
  }
145
146
194M
  for (i = 0; i < numrows; ++i) {
147
105M
    matrix->rows_[i] = &matrix->data_[i * matrix->numcols_];
148
105M
  }
149
150
89.3M
  matrix->xstart_ = 0;
151
89.3M
  matrix->ystart_ = 0;
152
89.3M
  matrix->xend_ = matrix->numcols_;
153
89.3M
  matrix->yend_ = matrix->numrows_;
154
155
89.3M
  return matrix;
156
157
8
error:
158
8
  jas_matrix_destroy(matrix);
159
8
  return 0;
160
89.3M
}
161
162
void jas_matrix_destroy(jas_matrix_t *matrix)
163
89.3M
{
164
89.3M
  if (matrix->data_) {
165
9.65M
    assert(!(matrix->flags_ & JAS_MATRIX_REF));
166
9.65M
  }
167
89.3M
  jas_free(matrix->data_);
168
89.3M
  jas_free(matrix->rows_);
169
89.3M
  jas_free(matrix);
170
89.3M
}
171
172
jas_seq2d_t *jas_seq2d_copy(jas_seq2d_t *x)
173
0
{
174
0
  jas_matrix_t *y;
175
0
  jas_matind_t i;
176
0
  jas_matind_t j;
177
0
  y = jas_seq2d_create(jas_seq2d_xstart(x), jas_seq2d_ystart(x),
178
0
    jas_seq2d_xend(x), jas_seq2d_yend(x));
179
0
  assert(y);
180
0
  for (i = 0; i < x->numrows_; ++i) {
181
0
    for (j = 0; j < x->numcols_; ++j) {
182
0
      *jas_matrix_getref(y, i, j) = jas_matrix_get(x, i, j);
183
0
    }
184
0
  }
185
0
  return y;
186
0
}
187
188
jas_matrix_t *jas_matrix_copy(jas_matrix_t *x)
189
0
{
190
0
  jas_matrix_t *y;
191
0
  jas_matind_t i;
192
0
  jas_matind_t j;
193
0
  y = jas_matrix_create(x->numrows_, x->numcols_);
194
0
  for (i = 0; i < x->numrows_; ++i) {
195
0
    for (j = 0; j < x->numcols_; ++j) {
196
0
      *jas_matrix_getref(y, i, j) = jas_matrix_get(x, i, j);
197
0
    }
198
0
  }
199
0
  return y;
200
0
}
201
202
/******************************************************************************\
203
* Bind operations.
204
\******************************************************************************/
205
206
int jas_seq2d_bindsub(jas_matrix_t *s, jas_matrix_t *s1, jas_matind_t xstart,
207
  jas_matind_t ystart, jas_matind_t xend, jas_matind_t yend)
208
79.7M
{
209
79.7M
  if (xstart < s1->xstart_ || ystart < s1->ystart_ ||
210
79.7M
      xend > s1->xend_ || yend > s1->yend_) {
211
0
    return -1;
212
0
  }
213
79.7M
  return jas_matrix_bindsub(s, s1, ystart - s1->ystart_,
214
79.7M
    xstart - s1->xstart_, yend - s1->ystart_ - 1, xend - s1->xstart_ - 1);
215
79.7M
}
216
217
int jas_matrix_bindsub(jas_matrix_t *mat0, jas_matrix_t *mat1,
218
  jas_matind_t r0, jas_matind_t c0, jas_matind_t r1, jas_matind_t c1)
219
79.7M
{
220
79.7M
  jas_matind_t i;
221
222
79.7M
  if (mat0->data_) {
223
0
    if (!(mat0->flags_ & JAS_MATRIX_REF)) {
224
0
      jas_free(mat0->data_);
225
0
    }
226
0
    mat0->data_ = 0;
227
0
    mat0->datasize_ = 0;
228
0
  }
229
79.7M
  if (mat0->rows_) {
230
0
    jas_free(mat0->rows_);
231
0
    mat0->rows_ = 0;
232
0
  }
233
79.7M
  mat0->flags_ |= JAS_MATRIX_REF;
234
79.7M
  mat0->numrows_ = r1 - r0 + 1;
235
79.7M
  mat0->numcols_ = c1 - c0 + 1;
236
79.7M
  mat0->maxrows_ = mat0->numrows_;
237
79.7M
  if (!(mat0->rows_ = jas_alloc2(mat0->maxrows_, sizeof(jas_seqent_t *)))) {
238
12
    return -1;
239
12
  }
240
241
314M
  for (i = 0; i < mat0->numrows_; ++i) {
242
235M
    mat0->rows_[i] = mat1->rows_[r0 + i] + c0;
243
235M
  }
244
245
79.7M
  mat0->xstart_ = mat1->xstart_ + c0;
246
79.7M
  mat0->ystart_ = mat1->ystart_ + r0;
247
79.7M
  mat0->xend_ = mat0->xstart_ + mat0->numcols_;
248
79.7M
  mat0->yend_ = mat0->ystart_ + mat0->numrows_;
249
250
79.7M
  return 0;
251
79.7M
}
252
253
/******************************************************************************\
254
* Arithmetic operations.
255
\******************************************************************************/
256
257
int jas_matrix_cmp(jas_matrix_t *mat0, jas_matrix_t *mat1)
258
0
{
259
0
  jas_matind_t i;
260
0
  jas_matind_t j;
261
262
0
  if (mat0->numrows_ != mat1->numrows_ || mat0->numcols_ !=
263
0
    mat1->numcols_) {
264
0
    return 1;
265
0
  }
266
0
  for (i = 0; i < mat0->numrows_; i++) {
267
0
    for (j = 0; j < mat0->numcols_; j++) {
268
0
      if (jas_matrix_get(mat0, i, j) != jas_matrix_get(mat1, i, j)) {
269
0
        return 1;
270
0
      }
271
0
    }
272
0
  }
273
0
  return 0;
274
0
}
275
276
void jas_matrix_divpow2(jas_matrix_t *matrix, unsigned n)
277
0
{
278
0
  jas_matind_t i;
279
0
  jas_matind_t j;
280
0
  jas_seqent_t *rowstart;
281
0
  jas_matind_t rowstep;
282
0
  jas_seqent_t *data;
283
284
0
  if (jas_matrix_numrows(matrix) > 0 && jas_matrix_numcols(matrix) > 0) {
285
0
    assert(matrix->rows_);
286
0
    rowstep = jas_matrix_rowstep(matrix);
287
0
    for (i = matrix->numrows_, rowstart = matrix->rows_[0]; i > 0; --i,
288
0
      rowstart += rowstep) {
289
0
      for (j = matrix->numcols_, data = rowstart; j > 0; --j,
290
0
        ++data) {
291
0
        *data = (*data >= 0) ? ((*data) >> n) :
292
0
          (-((-(*data)) >> n));
293
0
      }
294
0
    }
295
0
  }
296
0
}
297
298
void jas_matrix_clip(jas_matrix_t *matrix, jas_seqent_t minval,
299
  jas_seqent_t maxval)
300
20.3k
{
301
20.3k
  jas_matind_t i;
302
20.3k
  jas_matind_t j;
303
20.3k
  jas_seqent_t v;
304
20.3k
  jas_seqent_t *rowstart;
305
20.3k
  jas_seqent_t *data;
306
20.3k
  jas_matind_t rowstep;
307
308
20.3k
  if (jas_matrix_numrows(matrix) > 0 && jas_matrix_numcols(matrix) > 0) {
309
19.2k
    assert(matrix->rows_);
310
19.2k
    rowstep = jas_matrix_rowstep(matrix);
311
6.47M
    for (i = matrix->numrows_, rowstart = matrix->rows_[0]; i > 0; --i,
312
6.45M
      rowstart += rowstep) {
313
6.45M
      data = rowstart;
314
551M
      for (j = matrix->numcols_, data = rowstart; j > 0; --j,
315
544M
        ++data) {
316
544M
        v = *data;
317
544M
        if (v < minval) {
318
51.9M
          *data = minval;
319
492M
        } else if (v > maxval) {
320
49.8M
          *data = maxval;
321
49.8M
        }
322
544M
      }
323
6.45M
    }
324
19.2k
  }
325
20.3k
}
326
327
void jas_matrix_asr(jas_matrix_t *matrix, unsigned n)
328
0
{
329
0
  jas_matind_t i;
330
0
  jas_matind_t j;
331
0
  jas_seqent_t *rowstart;
332
0
  jas_matind_t rowstep;
333
0
  jas_seqent_t *data;
334
335
0
  if (jas_matrix_numrows(matrix) > 0 && jas_matrix_numcols(matrix) > 0) {
336
0
    assert(matrix->rows_);
337
0
    rowstep = jas_matrix_rowstep(matrix);
338
0
    for (i = matrix->numrows_, rowstart = matrix->rows_[0]; i > 0; --i,
339
0
      rowstart += rowstep) {
340
0
      for (j = matrix->numcols_, data = rowstart; j > 0; --j,
341
0
        ++data) {
342
        //*data >>= n;
343
0
        *data = jas_seqent_asr(*data, n);
344
0
      }
345
0
    }
346
0
  }
347
0
}
348
349
void jas_matrix_asl(jas_matrix_t *matrix, unsigned n)
350
122k
{
351
122k
  jas_matind_t i;
352
122k
  jas_matind_t j;
353
122k
  jas_seqent_t *rowstart;
354
122k
  jas_matind_t rowstep;
355
122k
  jas_seqent_t *data;
356
357
122k
  if (jas_matrix_numrows(matrix) > 0 && jas_matrix_numcols(matrix) > 0) {
358
122k
    assert(matrix->rows_);
359
122k
    rowstep = jas_matrix_rowstep(matrix);
360
7.72M
    for (i = matrix->numrows_, rowstart = matrix->rows_[0]; i > 0; --i,
361
7.60M
      rowstart += rowstep) {
362
1.88G
      for (j = matrix->numcols_, data = rowstart; j > 0; --j,
363
1.87G
        ++data) {
364
        //*data <<= n;
365
1.87G
        *data = jas_seqent_asl(*data, n);
366
1.87G
      }
367
7.60M
    }
368
122k
  }
369
122k
}
370
371
/******************************************************************************\
372
* Code.
373
\******************************************************************************/
374
375
int jas_matrix_resize(jas_matrix_t *matrix, jas_matind_t numrows,
376
  jas_matind_t numcols)
377
0
{
378
0
  jas_matind_t size;
379
0
  jas_matind_t i;
380
381
0
  size = numrows * numcols;
382
0
  if (size > matrix->datasize_ || numrows > matrix->maxrows_) {
383
0
    return -1;
384
0
  }
385
386
0
  matrix->numrows_ = numrows;
387
0
  matrix->numcols_ = numcols;
388
389
0
  for (i = 0; i < numrows; ++i) {
390
0
    matrix->rows_[i] = &matrix->data_[numcols * i];
391
0
  }
392
393
0
  return 0;
394
0
}
395
396
void jas_matrix_setall(jas_matrix_t *matrix, jas_seqent_t val)
397
0
{
398
0
  jas_matind_t i;
399
0
  jas_matind_t j;
400
0
  jas_seqent_t *rowstart;
401
0
  jas_matind_t rowstep;
402
0
  jas_seqent_t *data;
403
404
0
  if (jas_matrix_numrows(matrix) > 0 && jas_matrix_numcols(matrix) > 0) {
405
0
    assert(matrix->rows_);
406
0
    rowstep = jas_matrix_rowstep(matrix);
407
0
    for (i = matrix->numrows_, rowstart = matrix->rows_[0]; i > 0; --i,
408
0
      rowstart += rowstep) {
409
0
      for (j = matrix->numcols_, data = rowstart; j > 0; --j,
410
0
        ++data) {
411
0
        *data = val;
412
0
      }
413
0
    }
414
0
  }
415
0
}