#include "mrilib.h"

/*** 7D SAFE ***/

double mri_min( MRI_IMAGE *im )
{
   register int ii , npix ;
   byte   byte_min   = 255 ;
   short  short_min  = 32767 ;
   int    int_min    = 2000000000 ;
   float  float_min  = 99999999.0 ;
   double double_min = 99999999.0 ;

   npix = im->nvox ;

   switch( im->kind ){

      case MRI_byte:
         for( ii=0 ; ii < npix ; ii++ )
            byte_min = MIN( byte_min , im->im.byte_data[ii] ) ;
         return (double) byte_min ;

      case MRI_short:
         for( ii=0 ; ii < npix ; ii++ )
            short_min = MIN( short_min , im->im.short_data[ii] ) ;
         return (double) short_min ;

      case MRI_int:
         for( ii=0 ; ii < npix ; ii++ )
            int_min = MIN( int_min , im->im.int_data[ii] ) ;
         return (double) int_min ;

      case MRI_float:
         for( ii=0 ; ii < npix ; ii++ )
            float_min = MIN( float_min , im->im.float_data[ii] ) ;
         return (double) float_min ;

      case MRI_double:
         for( ii=0 ; ii < npix ; ii++ )
            double_min = MIN( double_min , im->im.double_data[ii] ) ;
         return double_min ;

      case MRI_complex:
         for( ii=0 ; ii < npix ; ii++ )
            float_min = MIN( float_min , CSQR(im->im.complex_data[ii]) ) ;
         return sqrt(float_min) ;

      case MRI_rgb:{
         byte *rgb = im->im.rgb_data ;
         double val , bot=255.9 ;
         for( ii=0 ; ii < npix ; ii++ ){  /* scale to brightness */
            val =  0.299 * rgb[3*ii]      /* between 0 and 255     */
                 + 0.587 * rgb[3*ii+1]
                 + 0.114 * rgb[3*ii+2] ;
            if( val < bot ) bot = val ;
         }
         return bot ;
      }

      default:
         fprintf( stderr , "mri_min:  unknown image kind\n" ) ;
      break ;
   }
   return 0 ;
}
