jas_seq.h (10139B)
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) 1999-2000 Image Power, Inc. 13 * Copyright (c) 1999-2000 The University of British Columbia 14 * Copyright (c) 2001-2003 Michael David Adams 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.h 1918 2005-07-24 14:12:08Z baford $ 68 */ 69 70 #ifndef JAS_SEQ_H 71 #define JAS_SEQ_H 72 73 /******************************************************************************\ 74 * Includes. 75 \******************************************************************************/ 76 77 #include <jasper/jas_config.h> 78 79 #include <jasper/jas_stream.h> 80 #include <jasper/jas_types.h> 81 82 #ifdef __cplusplus 83 extern "C" { 84 #endif 85 86 /******************************************************************************\ 87 * Constants. 88 \******************************************************************************/ 89 90 /* This matrix is a reference to another matrix. */ 91 #define JAS_MATRIX_REF 0x0001 92 93 /******************************************************************************\ 94 * Types. 95 \******************************************************************************/ 96 97 /* An element in a sequence. */ 98 typedef int32_t jas_seqent_t; 99 100 /* An element in a matrix. */ 101 typedef int32_t jas_matent_t; 102 103 /* Matrix. */ 104 105 typedef struct { 106 107 /* Additional state information. */ 108 int flags_; 109 110 /* The starting horizontal index. */ 111 int32_t xstart_; 112 113 /* The starting vertical index. */ 114 int32_t ystart_; 115 116 /* The ending horizontal index. */ 117 int32_t xend_; 118 119 /* The ending vertical index. */ 120 int32_t yend_; 121 122 /* The number of rows in the matrix. */ 123 int32_t numrows_; 124 125 /* The number of columns in the matrix. */ 126 int32_t numcols_; 127 128 /* Pointers to the start of each row. */ 129 jas_seqent_t **rows_; 130 131 /* The allocated size of the rows array. */ 132 int32_t maxrows_; 133 134 /* The matrix data buffer. */ 135 jas_seqent_t *data_; 136 137 /* The allocated size of the data array. */ 138 int32_t datasize_; 139 140 } jas_matrix_t; 141 142 typedef jas_matrix_t jas_seq2d_t; 143 typedef jas_matrix_t jas_seq_t; 144 145 /******************************************************************************\ 146 * Functions/macros for matrix class. 147 \******************************************************************************/ 148 149 /* Get the number of rows. */ 150 #define jas_matrix_numrows(matrix) \ 151 ((matrix)->numrows_) 152 153 /* Get the number of columns. */ 154 #define jas_matrix_numcols(matrix) \ 155 ((matrix)->numcols_) 156 157 /* Get a matrix element. */ 158 #define jas_matrix_get(matrix, i, j) \ 159 ((matrix)->rows_[i][j]) 160 161 /* Set a matrix element. */ 162 #define jas_matrix_set(matrix, i, j, v) \ 163 ((matrix)->rows_[i][j] = (v)) 164 165 /* Get an element from a matrix that is known to be a row or column vector. */ 166 #define jas_matrix_getv(matrix, i) \ 167 (((matrix)->numrows_ == 1) ? ((matrix)->rows_[0][i]) : \ 168 ((matrix)->rows_[i][0])) 169 170 /* Set an element in a matrix that is known to be a row or column vector. */ 171 #define jas_matrix_setv(matrix, i, v) \ 172 (((matrix)->numrows_ == 1) ? ((matrix)->rows_[0][i] = (v)) : \ 173 ((matrix)->rows_[i][0] = (v))) 174 175 /* Get the address of an element in a matrix. */ 176 #define jas_matrix_getref(matrix, i, j) \ 177 (&(matrix)->rows_[i][j]) 178 179 #define jas_matrix_getvref(matrix, i) \ 180 (((matrix)->numrows_ > 1) ? jas_matrix_getref(matrix, i, 0) : jas_matrix_getref(matrix, 0, i)) 181 182 #define jas_matrix_length(matrix) \ 183 (max((matrix)->numrows_, (matrix)->numcols_)) 184 185 /* Create a matrix with the specified dimensions. */ 186 jas_matrix_t *jas_matrix_create(int numrows, int numcols); 187 188 /* Destroy a matrix. */ 189 void jas_matrix_destroy(jas_matrix_t *matrix); 190 191 /* Resize a matrix. The previous contents of the matrix are lost. */ 192 int jas_matrix_resize(jas_matrix_t *matrix, int numrows, int numcols); 193 194 int jas_matrix_output(jas_matrix_t *matrix, FILE *out); 195 196 /* Create a matrix that references part of another matrix. */ 197 void jas_matrix_bindsub(jas_matrix_t *mat0, jas_matrix_t *mat1, int r0, int c0, 198 int r1, int c1); 199 200 /* Create a matrix that is a reference to a row of another matrix. */ 201 #define jas_matrix_bindrow(mat0, mat1, r) \ 202 (jas_matrix_bindsub((mat0), (mat1), (r), 0, (r), (mat1)->numcols_ - 1)) 203 204 /* Create a matrix that is a reference to a column of another matrix. */ 205 #define jas_matrix_bindcol(mat0, mat1, c) \ 206 (jas_matrix_bindsub((mat0), (mat1), 0, (c), (mat1)->numrows_ - 1, (c))) 207 208 /* Clip the values of matrix elements to the specified range. */ 209 void jas_matrix_clip(jas_matrix_t *matrix, jas_seqent_t minval, 210 jas_seqent_t maxval); 211 212 /* Arithmetic shift left of all elements in a matrix. */ 213 void jas_matrix_asl(jas_matrix_t *matrix, int n); 214 215 /* Arithmetic shift right of all elements in a matrix. */ 216 void jas_matrix_asr(jas_matrix_t *matrix, int n); 217 218 /* Almost-but-not-quite arithmetic shift right of all elements in a matrix. */ 219 void jas_matrix_divpow2(jas_matrix_t *matrix, int n); 220 221 /* Set all elements of a matrix to the specified value. */ 222 void jas_matrix_setall(jas_matrix_t *matrix, jas_seqent_t val); 223 224 /* The spacing between rows of a matrix. */ 225 #define jas_matrix_rowstep(matrix) \ 226 (((matrix)->numrows_ > 1) ? ((matrix)->rows_[1] - (matrix)->rows_[0]) : (0)) 227 228 /* The spacing between columns of a matrix. */ 229 #define jas_matrix_step(matrix) \ 230 (((matrix)->numrows_ > 1) ? (jas_matrix_rowstep(matrix)) : (1)) 231 232 /* Compare two matrices for equality. */ 233 int jas_matrix_cmp(jas_matrix_t *mat0, jas_matrix_t *mat1); 234 235 jas_matrix_t *jas_matrix_copy(jas_matrix_t *x); 236 237 /******************************************************************************\ 238 * Functions/macros for 2-D sequence class. 239 \******************************************************************************/ 240 241 jas_seq2d_t *jas_seq2d_copy(jas_seq2d_t *x); 242 243 jas_matrix_t *jas_seq2d_create(int xstart, int ystart, int xend, int yend); 244 245 #define jas_seq2d_destroy(s) \ 246 jas_matrix_destroy(s) 247 248 #define jas_seq2d_xstart(s) \ 249 ((s)->xstart_) 250 #define jas_seq2d_ystart(s) \ 251 ((s)->ystart_) 252 #define jas_seq2d_xend(s) \ 253 ((s)->xend_) 254 #define jas_seq2d_yend(s) \ 255 ((s)->yend_) 256 #define jas_seq2d_getref(s, x, y) \ 257 (jas_matrix_getref(s, (y) - (s)->ystart_, (x) - (s)->xstart_)) 258 #define jas_seq2d_get(s, x, y) \ 259 (jas_matrix_get(s, (y) - (s)->ystart_, (x) - (s)->xstart_)) 260 #define jas_seq2d_rowstep(s) \ 261 jas_matrix_rowstep(s) 262 #define jas_seq2d_width(s) \ 263 ((s)->xend_ - (s)->xstart_) 264 #define jas_seq2d_height(s) \ 265 ((s)->yend_ - (s)->ystart_) 266 #define jas_seq2d_setshift(s, x, y) \ 267 ((s)->xstart_ = (x), (s)->ystart_ = (y), \ 268 (s)->xend_ = (s)->xstart_ + (s)->numcols_, \ 269 (s)->yend_ = (s)->ystart_ + (s)->numrows_) 270 271 void jas_seq2d_bindsub(jas_matrix_t *s, jas_matrix_t *s1, int xstart, 272 int ystart, int xend, int yend); 273 274 /******************************************************************************\ 275 * Functions/macros for 1-D sequence class. 276 \******************************************************************************/ 277 278 #define jas_seq_create(start, end) \ 279 (jas_seq2d_create(start, 0, end, 1)) 280 281 #define jas_seq_destroy(seq) \ 282 (jas_seq2d_destroy(seq)) 283 284 #define jas_seq_set(seq, i, v) \ 285 ((seq)->rows_[0][(i) - (seq)->xstart_] = (v)) 286 #define jas_seq_getref(seq, i) \ 287 (&(seq)->rows_[0][(i) - (seq)->xstart_]) 288 #define jas_seq_get(seq, i) \ 289 ((seq)->rows_[0][(i) - (seq)->xstart_]) 290 #define jas_seq_start(seq) \ 291 ((seq)->xstart_) 292 #define jas_seq_end(seq) \ 293 ((seq)->xend_) 294 295 #ifdef __cplusplus 296 } 297 #endif 298 299 #endif