77 #include <jasper/jas_config.h>
93 #define JAS_MATRIX_REF 0x0001
100 #ifdef JAS_ENABLE_32BIT
101 typedef int_least32_t jas_seqent_t;
102 #define PRIjas_seqent PRIiLEAST32
104 typedef int_fast32_t jas_seqent_t;
105 #define PRIjas_seqent PRIiFAST32
109 #ifdef JAS_ENABLE_32BIT
110 typedef int_least32_t jas_matent_t;
112 typedef int_fast32_t jas_matent_t;
115 #ifdef JAS_ENABLE_32BIT
116 typedef int_least32_t jas_matind_t;
118 typedef int_fast32_t jas_matind_t;
129 jas_matind_t xstart_;
132 jas_matind_t ystart_;
141 jas_matind_t numrows_;
144 jas_matind_t numcols_;
147 jas_seqent_t **rows_;
150 int_fast32_t maxrows_;
156 int_fast32_t datasize_;
160 typedef jas_matrix_t jas_seq2d_t;
161 typedef jas_matrix_t jas_seq_t;
169 static inline jas_matind_t jas_matrix_numrows(
const jas_matrix_t *matrix)
171 return matrix->numrows_;
176 static inline jas_matind_t jas_matrix_numcols(
const jas_matrix_t *matrix)
178 return matrix->numcols_;
182 static inline jas_matind_t jas_matrix_size(
const jas_matrix_t *matrix)
184 return jas_matrix_numcols(matrix) * jas_matrix_numrows(matrix);
188 static inline bool jas_matrix_empty(
const jas_matrix_t *matrix)
190 return jas_matrix_numcols(matrix) == 0 || jas_matrix_numrows(matrix) == 0;
195 static inline jas_seqent_t jas_matrix_get(
const jas_matrix_t *matrix, jas_matind_t i, jas_matind_t j)
197 return matrix->rows_[i][j];
201 static inline void jas_matrix_set(jas_matrix_t *matrix, jas_matind_t i, jas_matind_t j, jas_seqent_t v)
203 matrix->rows_[i][j] = v;
208 static inline jas_seqent_t jas_matrix_getv(
const jas_matrix_t *matrix, jas_matind_t i)
210 return matrix->numrows_ == 1
211 ? matrix->rows_[0][i]
212 : matrix->rows_[i][0];
216 static inline void jas_matrix_setv(jas_matrix_t *matrix, jas_matind_t i, jas_seqent_t v)
218 if (matrix->numrows_ == 1)
219 matrix->rows_[0][i] = v;
221 matrix->rows_[i][0] = v;
226 static inline jas_seqent_t *jas_matrix_getref(
const jas_matrix_t *matrix, jas_matind_t i, jas_matind_t j)
228 return &matrix->rows_[i][j];
232 static inline jas_seqent_t *jas_matrix_getvref(
const jas_matrix_t *matrix, jas_matind_t i)
234 return matrix->numrows_ > 1
235 ? jas_matrix_getref(matrix, i, 0)
236 : jas_matrix_getref(matrix, 0, i);
240 JAS_DLLEXPORT jas_matrix_t *jas_matrix_create(jas_matind_t numrows, jas_matind_t numcols);
243 JAS_DLLEXPORT
void jas_matrix_destroy(jas_matrix_t *matrix);
246 JAS_DLLEXPORT
int jas_matrix_resize(jas_matrix_t *matrix, jas_matind_t numrows, jas_matind_t numcols);
248 JAS_DLLEXPORT
int jas_matrix_output(jas_matrix_t *matrix, FILE *out);
251 JAS_DLLEXPORT
int jas_matrix_bindsub(jas_matrix_t *mat0, jas_matrix_t *mat1, jas_matind_t r0,
252 jas_matind_t c0, jas_matind_t r1, jas_matind_t c1);
255 static inline int jas_matrix_bindrow(jas_matrix_t *mat0, jas_matrix_t *mat1, jas_matind_t r)
257 return jas_matrix_bindsub(mat0, mat1, r, 0, r, mat1->numcols_ - 1);
261 static inline int jas_matrix_bindcol(jas_matrix_t *mat0, jas_matrix_t *mat1, jas_matind_t c)
263 return jas_matrix_bindsub(mat0, mat1, 0, c, mat1->numrows_ - 1, c);
267 JAS_DLLEXPORT
void jas_matrix_clip(jas_matrix_t *matrix, jas_seqent_t minval,
268 jas_seqent_t maxval);
271 JAS_DLLEXPORT
void jas_matrix_asl(jas_matrix_t *matrix,
unsigned n);
274 JAS_DLLEXPORT
void jas_matrix_asr(jas_matrix_t *matrix,
unsigned n);
277 JAS_DLLEXPORT
void jas_matrix_divpow2(jas_matrix_t *matrix,
unsigned n);
280 JAS_DLLEXPORT
void jas_matrix_setall(jas_matrix_t *matrix, jas_seqent_t val);
284 static inline size_t jas_matrix_rowstep(
const jas_matrix_t *matrix)
286 return matrix->numrows_ > 1
287 ? (size_t)(matrix->rows_[1] - matrix->rows_[0])
293 static inline size_t jas_matrix_step(
const jas_matrix_t *matrix)
295 return matrix->numrows_ > 1
296 ? jas_matrix_rowstep(matrix)
301 JAS_DLLEXPORT
int jas_matrix_cmp(jas_matrix_t *mat0, jas_matrix_t *mat1);
303 JAS_DLLEXPORT jas_matrix_t *jas_matrix_copy(jas_matrix_t *x);
305 JAS_DLLEXPORT jas_matrix_t *jas_matrix_input(FILE *);
308 static inline jas_seqent_t jas_seqent_asl(jas_seqent_t x,
unsigned n)
310 #ifdef JAS_ENABLE_32BIT
311 return jas_least32_asl(x, n);
313 return jas_fast32_asl(x, n);
318 static inline jas_seqent_t jas_seqent_asr(jas_seqent_t x,
unsigned n)
320 #ifdef JAS_ENABLE_32BIT
321 return jas_least32_asr(x, n);
323 return jas_fast32_asr(x, n);
331 JAS_DLLEXPORT jas_seq2d_t *jas_seq2d_copy(jas_seq2d_t *x);
333 JAS_DLLEXPORT jas_matrix_t *jas_seq2d_create(jas_matind_t xstart, jas_matind_t ystart,
334 jas_matind_t xend, jas_matind_t yend);
336 static inline void jas_seq2d_destroy(jas_seq2d_t *s)
338 jas_matrix_destroy(s);
342 static inline jas_matind_t jas_seq2d_xstart(
const jas_seq2d_t *s)
348 static inline jas_matind_t jas_seq2d_ystart(
const jas_seq2d_t *s)
354 static inline jas_matind_t jas_seq2d_xend(
const jas_seq2d_t *s)
360 static inline jas_matind_t jas_seq2d_yend(
const jas_seq2d_t *s)
366 static inline jas_seqent_t *jas_seq2d_getref(
const jas_seq2d_t *s, jas_matind_t x, jas_matind_t y)
368 return jas_matrix_getref(s, y - s->ystart_, x - s->xstart_);
372 static inline jas_seqent_t jas_seq2d_get(
const jas_seq2d_t *s, jas_matind_t x, jas_matind_t y)
374 return jas_matrix_get(s, y - s->ystart_, x - s->xstart_);
378 static inline size_t jas_seq2d_rowstep(
const jas_seq2d_t *s)
380 return jas_matrix_rowstep(s);
384 static inline unsigned jas_seq2d_width(
const jas_seq2d_t *s)
386 return (
unsigned)(s->xend_ - s->xstart_);
390 static inline unsigned jas_seq2d_height(
const jas_seq2d_t *s)
392 return (
unsigned)(s->yend_ - s->ystart_);
395 static inline void jas_seq2d_setshift(jas_seq2d_t *s, jas_matind_t x, jas_matind_t y)
399 s->xend_ = s->xstart_ + s->numcols_;
400 s->yend_ = s->ystart_ + s->numrows_;
404 static inline jas_matind_t jas_seq2d_size(
const jas_seq2d_t *s)
406 return jas_seq2d_width(s) * jas_seq2d_height(s);
410 static inline bool jas_seq2d_empty(
const jas_seq2d_t *s)
412 return jas_seq2d_width(s) == 0 || jas_seq2d_height(s) == 0;
415 JAS_DLLEXPORT
int jas_seq2d_bindsub(jas_matrix_t *s, jas_matrix_t *s1, jas_matind_t xstart,
416 jas_matind_t ystart, jas_matind_t xend, jas_matind_t yend);
422 static inline jas_seq_t *jas_seq_create(jas_matind_t start, jas_matind_t end)
424 return jas_seq2d_create(start, 0, end, 1);
427 static inline void jas_seq_destroy(jas_seq_t *seq)
429 jas_seq2d_destroy(seq);
432 static inline void jas_seq_set(jas_seq_t *seq, jas_matind_t i, jas_seqent_t v)
434 seq->rows_[0][i - seq->xstart_] = v;
438 static inline jas_seqent_t *jas_seq_getref(
const jas_seq_t *seq, jas_matind_t i)
440 return &seq->rows_[0][i - seq->xstart_];
444 static inline jas_seqent_t jas_seq_get(
const jas_seq_t *seq, jas_matind_t i)
446 return seq->rows_[0][i - seq->xstart_];
450 static inline jas_matind_t jas_seq_start(
const jas_seq_t *seq)
456 static inline jas_matind_t jas_seq_end(
const jas_seq_t *seq)