Changeset 1385 for trunk/psLib/src/image/psImageExtraction.c
- Timestamp:
- Aug 4, 2004, 1:37:39 PM (22 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/image/psImageExtraction.c (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/image/psImageExtraction.c
r1374 r1385 9 9 * @author Robert DeSonia, MHPCC 10 10 * 11 * @version $Revision: 1. 4$ $Name: not supported by cvs2svn $12 * @date $Date: 2004-08-04 00:55:17$11 * @version $Revision: 1.5 $ $Name: not supported by cvs2svn $ 12 * @date $Date: 2004-08-04 23:37:39 $ 13 13 * 14 14 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 29 29 unsigned int outputRowSize; // output row size in bytes 30 30 unsigned int inputColOffset; // offset in bytes to first subset pixel in input row 31 31 32 32 if ( image == NULL || image->data.V == NULL ) { 33 psError( __func__, "Can not subset image because input image or its pixel buffer is NULL." );34 return NULL;35 }36 33 psError( __func__, "Can not subset image because input image or its pixel buffer is NULL." ); 34 return NULL; 35 } 36 37 37 if ( image->type.dimen != PS_DIMEN_IMAGE ) { 38 psError( __func__, "Can not subset image because input image is not an image." );39 return NULL;40 }41 38 psError( __func__, "Can not subset image because input image is not an image." ); 39 return NULL; 40 } 41 42 42 if ( numCols < 1 || numRows < 1 ) { 43 psError( __func__, "Can not subset image because number of rows or columns are zero (%dx%d).",44 numCols, numRows );45 return NULL;46 }47 43 psError( __func__, "Can not subset image because number of rows or columns are zero (%dx%d).", 44 numCols, numRows ); 45 return NULL; 46 } 47 48 48 if ( col0 >= image->numCols || row0 >= image->numRows ) { 49 psError( __func__, "Can not subset image because col0,row0 (%d,%d) is not a valid pixel location.",50 col0, row0 );51 return NULL;52 }53 49 psError( __func__, "Can not subset image because col0,row0 (%d,%d) is not a valid pixel location.", 50 col0, row0 ); 51 return NULL; 52 } 53 54 54 /* validate subimage size */ 55 55 if ( col0 + numCols >= image->numCols || row0 + numRows >= image->numRows ) { 56 psError( __func__, "Can not subset image outside of image boundaries (size=%dx%d, "57 "subset=[%d:%d,%d:%d]).", image->numCols, image->numRows, col0,58 col0 + numCols, row0, row0 + numRows );59 return NULL;60 }61 62 56 psError( __func__, "Can not subset image outside of image boundaries (size=%dx%d, " 57 "subset=[%d:%d,%d:%d]).", image->numCols, image->numRows, col0, 58 col0 + numCols, row0, row0 + numRows ); 59 return NULL; 60 } 61 62 63 63 elementSize = PSELEMTYPE_SIZEOF( image->type.type ); 64 64 65 65 out = psImageRecycle( out, numCols, numRows, image->type.type ); 66 66 67 67 // set the parent information into the child output image 68 68 *( int* ) & out->row0 = row0; 69 69 *( int* ) & out->col0 = col0; 70 70 *( psImage** ) & out->parent = ( psImage* ) image; 71 71 72 72 // add output image as a child of the input image. 73 73 image->nChildren++; … … 75 75 image->nChildren * sizeof( psImage* ) ); 76 76 image->children[ image->nChildren - 1 ] = out; 77 77 78 78 inputColOffset = elementSize * col0; 79 79 outputRowSize = elementSize * numCols; 80 80 81 81 for ( int row = 0; row < numRows; row++ ) { 82 memcpy( out->data.V[ row ], image->data.U8[ row0 + row ] + inputColOffset,83 outputRowSize );84 }85 82 memcpy( out->data.V[ row ], image->data.U8[ row0 + row ] + inputColOffset, 83 outputRowSize ); 84 } 85 86 86 return ( out ); 87 87 } … … 96 96 int numRows; 97 97 int numCols; 98 98 99 99 if ( input == NULL || input->data.V == NULL ) { 100 psError( __func__, "Can not copy image because input image or its pixel buffer is NULL." );101 psFree( output );102 return NULL;103 }104 100 psError( __func__, "Can not copy image because input image or its pixel buffer is NULL." ); 101 psFree( output ); 102 return NULL; 103 } 104 105 105 if ( input == output ) { 106 psError( __func__, "Can not copy image because given input and output "107 "parameter reference the same psImage struct." );108 psFree( output );109 return NULL;110 }111 106 psError( __func__, "Can not copy image because given input and output " 107 "parameter reference the same psImage struct." ); 108 psFree( output ); 109 return NULL; 110 } 111 112 112 if ( input->type.dimen != PS_DIMEN_IMAGE ) { 113 psError( __func__, "Can not copy image because input image is not actually an image." );114 psFree( output );115 return NULL;116 }117 113 psError( __func__, "Can not copy image because input image is not actually an image." ); 114 psFree( output ); 115 return NULL; 116 } 117 118 118 inDatatype = input->type.type; 119 119 numRows = input->numRows; … … 121 121 elements = numRows * numCols; 122 122 elementSize = PSELEMTYPE_SIZEOF( inDatatype ); 123 123 124 124 if ( inDatatype == PS_TYPE_PTR || type == PS_TYPE_PTR ) { 125 psError( __func__, "Can not copy image to/from a void* matrix" );126 psFree( output );127 return NULL;128 }129 125 psError( __func__, "Can not copy image to/from a void* matrix" ); 126 psFree( output ); 127 return NULL; 128 } 129 130 130 output = psImageRecycle( output, numCols, numRows, type ); 131 131 132 132 // cover the trival case of copy of the same datatype. 133 133 if ( type == inDatatype ) { 134 memcpy( output->data.V[ 0 ], input->data.V[ 0 ], elementSize * elements );135 return output;136 }137 134 memcpy( output->data.V[ 0 ], input->data.V[ 0 ], elementSize * elements ); 135 return output; 136 } 137 138 138 #define PSIMAGE_ELEMENT_COPY(IN,INTYPE,OUT,OUTTYPE,ELEMENTS) { \ 139 139 ps##INTYPE *in = IN->data.INTYPE[0]; \ 140 140 ps##OUTTYPE *out = OUT->data.OUTTYPE[0]; \ 141 141 for (int e=0;e<ELEMENTS;e++) { \ 142 *(out++) = *(in++); \143 } \144 } 145 142 *(out++) = *(in++); \ 143 } \ 144 } 145 146 146 #define PSIMAGE_COPY_CASE(OUT,OUTTYPE) \ 147 147 switch (inDatatype) { \ 148 case PS_TYPE_S8: \149 PSIMAGE_ELEMENT_COPY(input,S8,OUT,OUTTYPE,elements); \150 break; \151 case PS_TYPE_S16: \152 PSIMAGE_ELEMENT_COPY(input,S16,OUT,OUTTYPE,elements); \153 break; \154 case PS_TYPE_S32: \155 PSIMAGE_ELEMENT_COPY(input,S32,OUT,OUTTYPE,elements); \156 break; \157 case PS_TYPE_S64: \158 PSIMAGE_ELEMENT_COPY(input,S64,OUT,OUTTYPE,elements); \159 break; \160 case PS_TYPE_U8: \161 PSIMAGE_ELEMENT_COPY(input,U8,OUT,OUTTYPE,elements); \162 break; \163 case PS_TYPE_U16: \164 PSIMAGE_ELEMENT_COPY(input,U16,OUT,OUTTYPE,elements); \165 break; \166 case PS_TYPE_U32: \167 PSIMAGE_ELEMENT_COPY(input,U32,OUT,OUTTYPE,elements); \168 break; \169 case PS_TYPE_U64: \170 PSIMAGE_ELEMENT_COPY(input,U64,OUT,OUTTYPE,elements); \171 break; \172 case PS_TYPE_F32: \173 PSIMAGE_ELEMENT_COPY(input,F32,OUT,OUTTYPE,elements); \174 break; \175 case PS_TYPE_F64: \176 PSIMAGE_ELEMENT_COPY(input,F64,OUT,OUTTYPE,elements); \177 break; \178 case PS_TYPE_C32: \179 PSIMAGE_ELEMENT_COPY(input,C32,OUT,OUTTYPE,elements); \180 break; \181 case PS_TYPE_C64: \182 PSIMAGE_ELEMENT_COPY(input,C64,OUT,OUTTYPE,elements); \183 break; \184 default: \185 break; \186 }187 148 case PS_TYPE_S8: \ 149 PSIMAGE_ELEMENT_COPY(input,S8,OUT,OUTTYPE,elements); \ 150 break; \ 151 case PS_TYPE_S16: \ 152 PSIMAGE_ELEMENT_COPY(input,S16,OUT,OUTTYPE,elements); \ 153 break; \ 154 case PS_TYPE_S32: \ 155 PSIMAGE_ELEMENT_COPY(input,S32,OUT,OUTTYPE,elements); \ 156 break; \ 157 case PS_TYPE_S64: \ 158 PSIMAGE_ELEMENT_COPY(input,S64,OUT,OUTTYPE,elements); \ 159 break; \ 160 case PS_TYPE_U8: \ 161 PSIMAGE_ELEMENT_COPY(input,U8,OUT,OUTTYPE,elements); \ 162 break; \ 163 case PS_TYPE_U16: \ 164 PSIMAGE_ELEMENT_COPY(input,U16,OUT,OUTTYPE,elements); \ 165 break; \ 166 case PS_TYPE_U32: \ 167 PSIMAGE_ELEMENT_COPY(input,U32,OUT,OUTTYPE,elements); \ 168 break; \ 169 case PS_TYPE_U64: \ 170 PSIMAGE_ELEMENT_COPY(input,U64,OUT,OUTTYPE,elements); \ 171 break; \ 172 case PS_TYPE_F32: \ 173 PSIMAGE_ELEMENT_COPY(input,F32,OUT,OUTTYPE,elements); \ 174 break; \ 175 case PS_TYPE_F64: \ 176 PSIMAGE_ELEMENT_COPY(input,F64,OUT,OUTTYPE,elements); \ 177 break; \ 178 case PS_TYPE_C32: \ 179 PSIMAGE_ELEMENT_COPY(input,C32,OUT,OUTTYPE,elements); \ 180 break; \ 181 case PS_TYPE_C64: \ 182 PSIMAGE_ELEMENT_COPY(input,C64,OUT,OUTTYPE,elements); \ 183 break; \ 184 default: \ 185 break; \ 186 } 187 188 188 switch ( type ) { 189 case PS_TYPE_S8:190 PSIMAGE_COPY_CASE( output, S8 );191 break;192 case PS_TYPE_S16:193 PSIMAGE_COPY_CASE( output, S16 );194 break;195 case PS_TYPE_S32:196 PSIMAGE_COPY_CASE( output, S32 );197 break;198 case PS_TYPE_S64:199 PSIMAGE_COPY_CASE( output, S64 );200 break;201 case PS_TYPE_U8:202 PSIMAGE_COPY_CASE( output, U8 );203 break;204 case PS_TYPE_U16:205 PSIMAGE_COPY_CASE( output, U16 );206 break;207 case PS_TYPE_U32:208 PSIMAGE_COPY_CASE( output, U32 );209 break;210 case PS_TYPE_U64:211 PSIMAGE_COPY_CASE( output, U64 );212 break;213 case PS_TYPE_F32:214 PSIMAGE_COPY_CASE( output, F32 );215 break;216 case PS_TYPE_F64:217 PSIMAGE_COPY_CASE( output, F64 );218 break;219 case PS_TYPE_C32:220 PSIMAGE_COPY_CASE( output, C32 );221 break;222 case PS_TYPE_C64:223 PSIMAGE_COPY_CASE( output, C64 );224 break;225 default:226 break;227 }189 case PS_TYPE_S8: 190 PSIMAGE_COPY_CASE( output, S8 ); 191 break; 192 case PS_TYPE_S16: 193 PSIMAGE_COPY_CASE( output, S16 ); 194 break; 195 case PS_TYPE_S32: 196 PSIMAGE_COPY_CASE( output, S32 ); 197 break; 198 case PS_TYPE_S64: 199 PSIMAGE_COPY_CASE( output, S64 ); 200 break; 201 case PS_TYPE_U8: 202 PSIMAGE_COPY_CASE( output, U8 ); 203 break; 204 case PS_TYPE_U16: 205 PSIMAGE_COPY_CASE( output, U16 ); 206 break; 207 case PS_TYPE_U32: 208 PSIMAGE_COPY_CASE( output, U32 ); 209 break; 210 case PS_TYPE_U64: 211 PSIMAGE_COPY_CASE( output, U64 ); 212 break; 213 case PS_TYPE_F32: 214 PSIMAGE_COPY_CASE( output, F32 ); 215 break; 216 case PS_TYPE_F64: 217 PSIMAGE_COPY_CASE( output, F64 ); 218 break; 219 case PS_TYPE_C32: 220 PSIMAGE_COPY_CASE( output, C32 ); 221 break; 222 case PS_TYPE_C64: 223 PSIMAGE_COPY_CASE( output, C64 ); 224 break; 225 default: 226 break; 227 } 228 228 return output; 229 229 } … … 247 247 int delta = 1; 248 248 psF64* outData; 249 249 250 250 if ( in == NULL || in->data.V == NULL ) { 251 psError( __func__, "Input image can not be NULL." );252 psFree( out );253 return NULL;254 }255 251 psError( __func__, "Input image can not be NULL." ); 252 psFree( out ); 253 return NULL; 254 } 255 256 256 if ( numRows == 0 || numCols == 0 ) { 257 psError( __func__, "The specified region contains no data (%dx%d)",258 numCols, numRows );259 psFree( out );260 return NULL;261 }262 257 psError( __func__, "The specified region contains no data (%dx%d)", 258 numCols, numRows ); 259 psFree( out ); 260 return NULL; 261 } 262 263 263 type = in->type.type; 264 264 inRows = in->numRows; 265 265 inCols = in->numCols; 266 266 267 267 if ( direction == PS_CUT_X_NEG || direction == PS_CUT_Y_NEG ) { 268 delta = -1;269 }270 268 delta = -1; 269 } 270 271 271 // if numRows/numCols is negative, invert the problem to give positive 272 272 // numRows/numCols (and cut in opposite direction). 273 273 if ( numRows < 0 ) { 274 numRows = -numRows;275 row -= ( numRows - 1 );276 delta = -delta;277 }278 274 numRows = -numRows; 275 row -= ( numRows - 1 ); 276 delta = -delta; 277 } 278 279 279 if ( numCols < 0 ) { 280 numCols = -numCols;281 col -= ( numCols - 1 );282 delta = -delta;283 }284 280 numCols = -numCols; 281 col -= ( numCols - 1 ); 282 delta = -delta; 283 } 284 285 285 if ( mask != NULL ) { 286 if ( inRows != mask->numRows || inCols != mask->numCols ) {287 psError( __func__, "The mask and image dimensions did not match (%dx%d vs %dx%d)",288 mask->numCols, mask->numRows, in->numCols, in->numRows );289 psFree( out );290 }291 if ( mask->type.type != PS_TYPE_MASK ) {292 psError( __func__, "The mask datatype (%d) must be %s.",293 mask->type.type, PS_TYPE_MASK_NAME );294 psFree( out );295 }296 }297 286 if ( inRows != mask->numRows || inCols != mask->numCols ) { 287 psError( __func__, "The mask and image dimensions did not match (%dx%d vs %dx%d)", 288 mask->numCols, mask->numRows, in->numCols, in->numRows ); 289 psFree( out ); 290 } 291 if ( mask->type.type != PS_TYPE_MASK ) { 292 psError( __func__, "The mask datatype (%d) must be %s.", 293 mask->type.type, PS_TYPE_MASK_NAME ); 294 psFree( out ); 295 } 296 } 297 298 298 if ( row >= inRows || col >= inCols || 299 299 col + numCols > in->numCols || row + numRows > in->numRows ) { 300 psError( __func__, "The specified image region (%d,%d to %d,%d) is outside of image area (0,0 to %d,%d).",301 col, row, col + numCols - 1, row + numRows - 1, in->numCols - 1, in->numRows - 1 );302 psFree( out );303 return NULL;304 }305 300 psError( __func__, "The specified image region (%d,%d to %d,%d) is outside of image area (0,0 to %d,%d).", 301 col, row, col + numCols - 1, row + numRows - 1, in->numCols - 1, in->numRows - 1 ); 302 psFree( out ); 303 return NULL; 304 } 305 306 306 // verify that the stats struct specifies a single stats operation 307 307 if ( stats == NULL || p_psGetStatValue( stats, &statVal ) == false ) { 308 psError( __func__, "The stat options didn't specify a single supported statistic type." );309 psFree( out );310 return NULL;311 }312 308 psError( __func__, "The stat options didn't specify a single supported statistic type." ); 309 psFree( out ); 310 return NULL; 311 } 312 313 313 // since stats input is const, I need to create a 'scratch' stats struct 314 314 myStats = psAlloc( sizeof( psStats ) ); 315 315 *myStats = *stats; 316 317 318 316 317 318 319 319 if ( direction == PS_CUT_X_POS || direction == PS_CUT_X_NEG ) { 320 psVector * imgVec = psVectorAlloc( numRows, type ); 321 psVector* maskVec = NULL; 322 psMaskType* maskData = NULL; 323 324 // recycle output to make a proper sized/type output structure 325 // n.b. type is double as that is the type given for all stats in psStats. 326 out = psVectorRecycle( out, PS_TYPE_F64, numCols ); 327 outData = out->data.F64; 328 if ( delta < 0 ) { 329 outData += numCols - 1; 330 } 331 332 if ( mask != NULL ) { 333 maskVec = psVectorAlloc( numRows, mask->type.type ); 334 } 335 336 #define PSIMAGE_CUT_VERTICAL(TYPE) \ 337 case PS_TYPE_##TYPE: { \ 338 psMaskType* maskVecData = NULL; \ 339 for (int c=0;c<numCols;c++) { \ 340 ps##TYPE *imgData = in->data.TYPE[row] + col + c; \ 341 ps##TYPE *imgVecData = imgVec->data.TYPE; \ 342 if (maskVec != NULL) { \ 343 maskVecData = maskVec->data.V; \ 344 maskData = (psMaskType*)(mask->data.V[row]) + col + c; \ 345 } \ 346 for (int r=0;r<numRows;r++) { \ 347 *(imgVecData++) = *imgData; \ 348 imgData += inCols; \ 349 if (maskVecData != NULL) { \ 350 *(maskVecData++) = *maskData; \ 351 maskData += inCols; \ 352 } \ 353 } \ 354 myStats = psVectorStats(myStats,imgVec,maskVec,maskVal); \ 355 (void)p_psGetStatValue(myStats,&statVal); \ 356 *outData = statVal; \ 357 outData += delta; \ 320 psVector * imgVec = psVectorAlloc( numRows, type ); 321 psVector* maskVec = NULL; 322 psMaskType* maskData = NULL; 323 324 // recycle output to make a proper sized/type output structure 325 // n.b. type is double as that is the type given for all stats in psStats. 326 out = psVectorRecycle( out, PS_TYPE_F64, numCols ); 327 outData = out->data.F64; 328 if ( delta < 0 ) { 329 outData += numCols - 1; 330 } 331 332 if ( mask != NULL ) { 333 maskVec = psVectorAlloc( numRows, mask->type.type ); 334 } 335 336 #define PSIMAGE_CUT_VERTICAL(TYPE) \ 337 case PS_TYPE_##TYPE: { \ 338 psMaskType* maskVecData = NULL; \ 339 for (int c=0;c<numCols;c++) { \ 340 ps##TYPE *imgData = in->data.TYPE[row] + col + c; \ 341 ps##TYPE *imgVecData = imgVec->data.TYPE; \ 342 if (maskVec != NULL) { \ 343 maskVecData = maskVec->data.V; \ 344 maskData = (psMaskType*)(mask->data.V[row]) + col + c; \ 345 } \ 346 for (int r=0;r<numRows;r++) { \ 347 *(imgVecData++) = *imgData; \ 348 imgData += inCols; \ 349 if (maskVecData != NULL) { \ 350 *(maskVecData++) = *maskData; \ 351 maskData += inCols; \ 358 352 } \ 359 break; \ 360 } 361 362 switch ( type ) { 363 PSIMAGE_CUT_VERTICAL( U8 ); 364 PSIMAGE_CUT_VERTICAL( U16 ); 365 PSIMAGE_CUT_VERTICAL( U32 ); 366 PSIMAGE_CUT_VERTICAL( U64 ); 367 PSIMAGE_CUT_VERTICAL( S8 ); 368 PSIMAGE_CUT_VERTICAL( S16 ); 369 PSIMAGE_CUT_VERTICAL( S32 ); 370 PSIMAGE_CUT_VERTICAL( S64 ); 371 PSIMAGE_CUT_VERTICAL( F32 ); 372 PSIMAGE_CUT_VERTICAL( F64 ); 373 PSIMAGE_CUT_VERTICAL( C32 ); 374 PSIMAGE_CUT_VERTICAL( C64 ); 375 default: 376 psError( __func__, "Unsupported datatype (%d)", type ); 377 psFree( out ); 378 out = NULL; 379 } 380 psFree( imgVec ); 381 psFree( maskVec ); 382 } else if ( direction == PS_CUT_Y_POS || direction == PS_CUT_Y_NEG ) { // Cut in Y direction 353 } \ 354 myStats = psVectorStats(myStats,imgVec,maskVec,maskVal); \ 355 (void)p_psGetStatValue(myStats,&statVal); \ 356 *outData = statVal; \ 357 outData += delta; \ 358 } \ 359 break; \ 360 } 361 362 switch ( type ) { 363 PSIMAGE_CUT_VERTICAL( U8 ); 364 PSIMAGE_CUT_VERTICAL( U16 ); 365 PSIMAGE_CUT_VERTICAL( U32 ); 366 PSIMAGE_CUT_VERTICAL( U64 ); 367 PSIMAGE_CUT_VERTICAL( S8 ); 368 PSIMAGE_CUT_VERTICAL( S16 ); 369 PSIMAGE_CUT_VERTICAL( S32 ); 370 PSIMAGE_CUT_VERTICAL( S64 ); 371 PSIMAGE_CUT_VERTICAL( F32 ); 372 PSIMAGE_CUT_VERTICAL( F64 ); 373 PSIMAGE_CUT_VERTICAL( C32 ); 374 PSIMAGE_CUT_VERTICAL( C64 ); 375 default: 376 psError( __func__, "Unsupported datatype (%d)", type ); 377 psFree( out ); 378 out = NULL; 379 } 380 psFree( imgVec ); 381 psFree( maskVec ); 382 } else 383 if ( direction == PS_CUT_Y_POS || direction == PS_CUT_Y_NEG ) { // Cut in Y direction 383 384 psVector * imgVec = NULL; 384 385 psVector* maskVec = NULL; 385 386 int elementSize = PSELEMTYPE_SIZEOF( type ); 386 387 387 388 // fill in psVectors to fake out the statistics functions. 388 389 imgVec = psAlloc( sizeof( psVector ) ); … … 390 391 imgVec->n = imgVec->nalloc = numCols; 391 392 if ( mask != NULL ) { 392 maskVec = psAlloc( sizeof( psVector ) );393 maskVec->type = mask->type;394 maskVec->n = maskVec->nalloc = numCols;395 }396 393 maskVec = psAlloc( sizeof( psVector ) ); 394 maskVec->type = mask->type; 395 maskVec->n = maskVec->nalloc = numCols; 396 } 397 397 398 // recycle output to make a proper sized/type output structure 398 399 // n.b. type is double as that is the type given for all stats in psStats. … … 400 401 outData = out->data.F64; 401 402 if ( delta < 0 ) { 402 outData += numRows - 1; 403 outData += numRows - 1; 404 } 405 406 for ( int r = 0;r < numRows;r++ ) { 407 // point the vector struct to the data to calculate the stats 408 imgVec->data.V = ( void* ) ( in->data.U8[ row + r ] + col * elementSize ); 409 if ( maskVec != NULL ) { 410 maskVec->data.V = ( void* ) ( mask->data.U8[ row + r ] + col * sizeof( psMaskType ) ); 403 411 } 404 405 for ( int r = 0;r < numRows;r++ ) { 406 // point the vector struct to the data to calculate the stats 407 imgVec->data.V = ( void* ) ( in->data.U8[ row + r ] + col * elementSize ); 408 if ( maskVec != NULL ) { 409 maskVec->data.V = ( void* ) ( mask->data.U8[ row + r ] + col * sizeof( psMaskType ) ); 410 } 411 myStats = psVectorStats( myStats, imgVec, maskVec, maskVal ); 412 ( void ) p_psGetStatValue( myStats, &statVal ); // we know it works cause we tested it above 413 *outData = statVal; 414 outData += delta; 415 } 412 myStats = psVectorStats( myStats, imgVec, maskVec, maskVal ); 413 ( void ) p_psGetStatValue( myStats, &statVal ); // we know it works cause we tested it above 414 *outData = statVal; 415 outData += delta; 416 } 416 417 psFree( imgVec ); 417 418 psFree( maskVec ); … … 421 422 out = NULL; 422 423 } 423 424 424 425 psFree( myStats ); 425 426 426 427 return out; 427 428 }
Note:
See TracChangeset
for help on using the changeset viewer.
