77#include <jasper/jas_config.h>
93#define JAS_MATRIX_REF 0x0001
100#ifdef JAS_ENABLE_32BIT
101typedef int_least32_t jas_seqent_t;
102#define PRIjas_seqent PRIiLEAST32
104typedef int_fast32_t jas_seqent_t;
105#define PRIjas_seqent PRIiFAST32
109#ifdef JAS_ENABLE_32BIT
110typedef int_least32_t jas_matent_t;
112typedef int_fast32_t jas_matent_t;
115#ifdef JAS_ENABLE_32BIT
116typedef int_least32_t jas_matind_t;
118typedef 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_;
160typedef jas_matrix_t jas_seq2d_t;
161typedef jas_matrix_t jas_seq_t;
169static inline jas_matind_t jas_matrix_numrows(
const jas_matrix_t *matrix)
171 return matrix->numrows_;
176static inline jas_matind_t jas_matrix_numcols(
const jas_matrix_t *matrix)
178 return matrix->numcols_;
182static inline jas_matind_t jas_matrix_size(
const jas_matrix_t *matrix)
184 return jas_matrix_numcols(matrix) * jas_matrix_numrows(matrix);
188static inline bool jas_matrix_empty(
const jas_matrix_t *matrix)
190 return jas_matrix_numcols(matrix) == 0 || jas_matrix_numrows(matrix) == 0;
195static 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];
201static 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;
208static 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];
216static 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;
226static 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];
232static 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);
240JAS_DLLEXPORT jas_matrix_t *jas_matrix_create(jas_matind_t numrows, jas_matind_t numcols);
243JAS_DLLEXPORT
void jas_matrix_destroy(jas_matrix_t *matrix);
246JAS_DLLEXPORT
int jas_matrix_resize(jas_matrix_t *matrix, jas_matind_t numrows, jas_matind_t numcols);
248JAS_DLLEXPORT
int jas_matrix_output(jas_matrix_t *matrix, FILE *out);
251JAS_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);
255static 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);
261static 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);
267JAS_DLLEXPORT
void jas_matrix_clip(jas_matrix_t *matrix, jas_seqent_t minval,
268 jas_seqent_t maxval);
271JAS_DLLEXPORT
void jas_matrix_asl(jas_matrix_t *matrix,
unsigned n);
274JAS_DLLEXPORT
void jas_matrix_asr(jas_matrix_t *matrix,
unsigned n);
277JAS_DLLEXPORT
void jas_matrix_divpow2(jas_matrix_t *matrix,
unsigned n);
280JAS_DLLEXPORT
void jas_matrix_setall(jas_matrix_t *matrix, jas_seqent_t val);
284static 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])
293static inline size_t jas_matrix_step(
const jas_matrix_t *matrix)
295 return matrix->numrows_ > 1
296 ? jas_matrix_rowstep(matrix)
301JAS_DLLEXPORT
int jas_matrix_cmp(jas_matrix_t *mat0, jas_matrix_t *mat1);
303JAS_DLLEXPORT jas_matrix_t *jas_matrix_copy(jas_matrix_t *x);
305JAS_DLLEXPORT jas_matrix_t *jas_matrix_input(FILE *);
308static 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);
318static 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);
331JAS_DLLEXPORT jas_seq2d_t *jas_seq2d_copy(jas_seq2d_t *x);
333JAS_DLLEXPORT jas_matrix_t *jas_seq2d_create(jas_matind_t xstart, jas_matind_t ystart,
334 jas_matind_t xend, jas_matind_t yend);
336static inline void jas_seq2d_destroy(jas_seq2d_t *s)
338 jas_matrix_destroy(s);
342static inline jas_matind_t jas_seq2d_xstart(
const jas_seq2d_t *s)
348static inline jas_matind_t jas_seq2d_ystart(
const jas_seq2d_t *s)
354static inline jas_matind_t jas_seq2d_xend(
const jas_seq2d_t *s)
360static inline jas_matind_t jas_seq2d_yend(
const jas_seq2d_t *s)
366static 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_);
372static 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_);
378static inline size_t jas_seq2d_rowstep(
const jas_seq2d_t *s)
380 return jas_matrix_rowstep(s);
384static inline unsigned jas_seq2d_width(
const jas_seq2d_t *s)
386 return (
unsigned)(s->xend_ - s->xstart_);
390static inline unsigned jas_seq2d_height(
const jas_seq2d_t *s)
392 return (
unsigned)(s->yend_ - s->ystart_);
395static 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_;
404static inline jas_matind_t jas_seq2d_size(
const jas_seq2d_t *s)
406 return jas_seq2d_width(s) * jas_seq2d_height(s);
410static inline bool jas_seq2d_empty(
const jas_seq2d_t *s)
412 return jas_seq2d_width(s) == 0 || jas_seq2d_height(s) == 0;
415JAS_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);
422static inline jas_seq_t *jas_seq_create(jas_matind_t start, jas_matind_t end)
424 return jas_seq2d_create(start, 0, end, 1);
427static inline void jas_seq_destroy(jas_seq_t *seq)
429 jas_seq2d_destroy(seq);
432static 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;
438static inline jas_seqent_t *jas_seq_getref(
const jas_seq_t *seq, jas_matind_t i)
440 return &seq->rows_[0][i - seq->xstart_];
444static inline jas_seqent_t jas_seq_get(
const jas_seq_t *seq, jas_matind_t i)
446 return seq->rows_[0][i - seq->xstart_];
450static inline jas_matind_t jas_seq_start(
const jas_seq_t *seq)
456static inline jas_matind_t jas_seq_end(
const jas_seq_t *seq)