78 #include <jasper/jas_config.h>
80 #include <jasper/jas_types.h>
81 #include <jasper/jas_math.h>
94 #define JAS_MATRIX_REF 0x0001
101 #ifdef JAS_ENABLE_32BIT
102 typedef int_least32_t jas_seqent_t;
103 #define PRIjas_seqent PRIiLEAST32
105 typedef int_fast32_t jas_seqent_t;
106 #define PRIjas_seqent PRIiFAST32
110 #ifdef JAS_ENABLE_32BIT
111 typedef int_least32_t jas_matent_t;
113 typedef int_fast32_t jas_matent_t;
116 #ifdef JAS_ENABLE_32BIT
117 typedef int_least32_t jas_matind_t;
119 typedef int_fast32_t jas_matind_t;
130 jas_matind_t xstart_;
133 jas_matind_t ystart_;
142 jas_matind_t numrows_;
145 jas_matind_t numcols_;
148 jas_seqent_t **rows_;
151 int_fast32_t maxrows_;
157 int_fast32_t datasize_;
161 typedef jas_matrix_t jas_seq2d_t;
162 typedef jas_matrix_t jas_seq_t;
170 static inline jas_matind_t jas_matrix_numrows(
const jas_matrix_t *matrix)
172 return matrix->numrows_;
177 static inline jas_matind_t jas_matrix_numcols(
const jas_matrix_t *matrix)
179 return matrix->numcols_;
183 static inline jas_matind_t jas_matrix_size(
const jas_matrix_t *matrix)
185 return jas_matrix_numcols(matrix) * jas_matrix_numrows(matrix);
190 static inline jas_seqent_t jas_matrix_get(
const jas_matrix_t *matrix, jas_matind_t i, jas_matind_t j)
192 return matrix->rows_[i][j];
196 static inline void jas_matrix_set(jas_matrix_t *matrix, jas_matind_t i, jas_matind_t j, jas_seqent_t v)
198 matrix->rows_[i][j] = v;
203 static inline jas_seqent_t jas_matrix_getv(
const jas_matrix_t *matrix, jas_matind_t i)
205 return matrix->numrows_ == 1
206 ? matrix->rows_[0][i]
207 : matrix->rows_[i][0];
211 static inline void jas_matrix_setv(jas_matrix_t *matrix, jas_matind_t i, jas_seqent_t v)
213 if (matrix->numrows_ == 1)
214 matrix->rows_[0][i] = v;
216 matrix->rows_[i][0] = v;
221 static inline jas_seqent_t *jas_matrix_getref(
const jas_matrix_t *matrix, jas_matind_t i, jas_matind_t j)
223 return &matrix->rows_[i][j];
227 static inline jas_seqent_t *jas_matrix_getvref(
const jas_matrix_t *matrix, jas_matind_t i)
229 return matrix->numrows_ > 1
230 ? jas_matrix_getref(matrix, i, 0)
231 : jas_matrix_getref(matrix, 0, i);
235 JAS_DLLEXPORT jas_matrix_t *jas_matrix_create(jas_matind_t numrows, jas_matind_t numcols);
238 JAS_DLLEXPORT
void jas_matrix_destroy(jas_matrix_t *matrix);
241 JAS_DLLEXPORT
int jas_matrix_resize(jas_matrix_t *matrix, jas_matind_t numrows, jas_matind_t numcols);
243 JAS_DLLEXPORT
int jas_matrix_output(jas_matrix_t *matrix, FILE *out);
246 JAS_DLLEXPORT
int jas_matrix_bindsub(jas_matrix_t *mat0, jas_matrix_t *mat1, jas_matind_t r0,
247 jas_matind_t c0, jas_matind_t r1, jas_matind_t c1);
250 static inline int jas_matrix_bindrow(jas_matrix_t *mat0, jas_matrix_t *mat1, jas_matind_t r)
252 return jas_matrix_bindsub(mat0, mat1, r, 0, r, mat1->numcols_ - 1);
256 static inline int jas_matrix_bindcol(jas_matrix_t *mat0, jas_matrix_t *mat1, jas_matind_t c)
258 return jas_matrix_bindsub(mat0, mat1, 0, c, mat1->numrows_ - 1, c);
262 JAS_DLLEXPORT
void jas_matrix_clip(jas_matrix_t *matrix, jas_seqent_t minval,
263 jas_seqent_t maxval);
266 JAS_DLLEXPORT
void jas_matrix_asl(jas_matrix_t *matrix,
int n);
269 JAS_DLLEXPORT
void jas_matrix_asr(jas_matrix_t *matrix,
int n);
272 JAS_DLLEXPORT
void jas_matrix_divpow2(jas_matrix_t *matrix,
int n);
275 JAS_DLLEXPORT
void jas_matrix_setall(jas_matrix_t *matrix, jas_seqent_t val);
279 static inline size_t jas_matrix_rowstep(
const jas_matrix_t *matrix)
281 return matrix->numrows_ > 1
282 ? matrix->rows_[1] - matrix->rows_[0]
288 static inline size_t jas_matrix_step(
const jas_matrix_t *matrix)
290 return matrix->numrows_ > 1
291 ? jas_matrix_rowstep(matrix)
296 JAS_DLLEXPORT
int jas_matrix_cmp(jas_matrix_t *mat0, jas_matrix_t *mat1);
298 JAS_DLLEXPORT jas_matrix_t *jas_matrix_copy(jas_matrix_t *x);
300 JAS_DLLEXPORT jas_matrix_t *jas_matrix_input(FILE *);
302 #define jas_seqent_asl jas_fast32_asl
303 #define jas_seqent_asr jas_fast32_asr
309 JAS_DLLEXPORT jas_seq2d_t *jas_seq2d_copy(jas_seq2d_t *x);
311 JAS_DLLEXPORT jas_matrix_t *jas_seq2d_create(jas_matind_t xstart, jas_matind_t ystart,
312 jas_matind_t xend, jas_matind_t yend);
314 static inline void jas_seq2d_destroy(jas_seq2d_t *s)
316 jas_matrix_destroy(s);
320 static inline jas_matind_t jas_seq2d_xstart(
const jas_seq2d_t *s)
326 static inline jas_matind_t jas_seq2d_ystart(
const jas_seq2d_t *s)
332 static inline jas_matind_t jas_seq2d_xend(
const jas_seq2d_t *s)
338 static inline jas_matind_t jas_seq2d_yend(
const jas_seq2d_t *s)
344 static inline jas_seqent_t *jas_seq2d_getref(
const jas_seq2d_t *s, jas_matind_t x, jas_matind_t y)
346 return jas_matrix_getref(s, y - s->ystart_, x - s->xstart_);
350 static inline jas_seqent_t jas_seq2d_get(
const jas_seq2d_t *s, jas_matind_t x, jas_matind_t y)
352 return jas_matrix_get(s, y - s->ystart_, x - s->xstart_);
356 static inline size_t jas_seq2d_rowstep(
const jas_seq2d_t *s)
358 return jas_matrix_rowstep(s);
362 static inline unsigned jas_seq2d_width(
const jas_seq2d_t *s)
364 return s->xend_ - s->xstart_;
368 static inline unsigned jas_seq2d_height(
const jas_seq2d_t *s)
370 return s->yend_ - s->ystart_;
373 static inline void jas_seq2d_setshift(jas_seq2d_t *s, jas_matind_t x, jas_matind_t y)
377 s->xend_ = s->xstart_ + s->numcols_;
378 s->yend_ = s->ystart_ + s->numrows_;
382 static inline jas_matind_t jas_seq2d_size(
const jas_seq2d_t *s)
384 return jas_seq2d_width(s) * jas_seq2d_height(s);
387 JAS_DLLEXPORT
int jas_seq2d_bindsub(jas_matrix_t *s, jas_matrix_t *s1, jas_matind_t xstart,
388 jas_matind_t ystart, jas_matind_t xend, jas_matind_t yend);
394 static inline jas_seq_t *jas_seq_create(jas_matind_t start, jas_matind_t end)
396 return jas_seq2d_create(start, 0, end, 1);
399 static inline void jas_seq_destroy(jas_seq_t *seq)
401 jas_seq2d_destroy(seq);
404 static inline void jas_seq_set(jas_seq_t *seq, jas_matind_t i, jas_seqent_t v)
406 seq->rows_[0][i - seq->xstart_] = v;
410 static inline jas_seqent_t *jas_seq_getref(
const jas_seq_t *seq, jas_matind_t i)
412 return &seq->rows_[0][i - seq->xstart_];
416 static inline jas_seqent_t jas_seq_get(
const jas_seq_t *seq, jas_matind_t i)
418 return seq->rows_[0][i - seq->xstart_];
422 static inline jas_matind_t jas_seq_start(
const jas_seq_t *seq)
428 static inline jas_matind_t jas_seq_end(
const jas_seq_t *seq)