#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