#include "mrilib.h"
#include "thd.h"
/*---------------------------------------------------------------
Routine to extract a float version of a brick from a dataset
-- RWCox - 10 Aug 2001
-----------------------------------------------------------------*/
MRI_IMAGE * THD_extract_float_brick( int iv , THD_3dim_dataset * dset )
{
MRI_IMAGE * im ;
float * var ;
register int ii , nvox ;
ENTRY("THD_extract_float_brick") ;
if( iv < 0 || !ISVALID_DSET(dset) || iv >= DSET_NVALS(dset) ) RETURN(NULL);
im = mri_new_conforming( DSET_BRICK(dset,iv) , MRI_float ) ;
var = MRI_FLOAT_PTR(im) ;
nvox = DSET_NVOX(dset) ;
/*-- extract/scale brick into var --*/
switch( DSET_BRICK_TYPE(dset,iv) ){
default:
fprintf(stderr,"Can't handle sub-bricks of type %s\n",
MRI_TYPE_name[DSET_BRICK_TYPE(dset,iv)]) ;
mri_free(im) ;
RETURN(NULL) ;
case MRI_short:{
register short *dar = DSET_ARRAY(dset,iv) ;
register float fac = DSET_BRICK_FACTOR(dset,iv) ;
if( fac == 0.0 ) fac = 1.0 ;
for( ii=0 ; ii < nvox ; ii++ ) var[ii] = fac*dar[ii] ;
}
break ;
case MRI_byte:{
register byte *dar = DSET_ARRAY(dset,iv) ;
register float fac = DSET_BRICK_FACTOR(dset,iv) ;
if( fac == 0.0 ) fac = 1.0 ;
for( ii=0 ; ii < nvox ; ii++ ) var[ii] = fac*dar[ii] ;
}
break ;
case MRI_float:{
register float *dar = DSET_ARRAY(dset,iv) ;
register float fac = DSET_BRICK_FACTOR(dset,iv) ;
if( fac == 0.0 ) fac = 1.0 ;
for( ii=0 ; ii < nvox ; ii++ ) var[ii] = fac*dar[ii] ;
}
break ;
case MRI_complex:{
register complex *dar = DSET_ARRAY(dset,iv) ;
register float fac = DSET_BRICK_FACTOR(dset,iv) ;
if( fac == 0.0 ) fac = 1.0 ;
for( ii=0 ; ii < nvox ; ii++ ) var[ii] = fac*CABS(dar[ii]) ;
}
break ;
case MRI_int:{
register int *dar = DSET_ARRAY(dset,iv) ;
register float fac = DSET_BRICK_FACTOR(dset,iv) ;
if( fac == 0.0 ) fac = 1.0 ;
for( ii=0 ; ii < nvox ; ii++ ) var[ii] = fac*dar[ii] ;
}
break ;
case MRI_double:{
register double *dar = DSET_ARRAY(dset,iv) ;
register float fac = DSET_BRICK_FACTOR(dset,iv) ;
if( fac == 0.0 ) fac = 1.0 ;
for( ii=0 ; ii < nvox ; ii++ ) var[ii] = fac*dar[ii] ;
}
break ;
case MRI_rgb:{
register byte *dar = DSET_ARRAY(dset,iv) ;
for( ii=0 ; ii < nvox ; ii++ )
var[ii] = 0.299*dar[3*ii] + 0.587*dar[3*ii+1] + 0.114*dar[3*ii+2] ;
}
}
RETURN(im) ;
}
syntax highlighted by Code2HTML, v. 0.9.1