1 /*****************************************************************************
2    Major portions of this software are copyrighted by the Medical College
3    of Wisconsin, 1994-2000, and are released under the Gnu General Public
4    License, Version 2.  See the file README.Copyright for details.
5 ******************************************************************************/
6 
7 #include "mrilib.h"
8 
9 /*** 7D SAFE ***/
10 
11 /*-----------------------------------------------------
12   Convert input image to the type given by "datum".
13 -------------------------------------------------------*/
14 
mri_to_mri(int datum,MRI_IMAGE * oldim)15 MRI_IMAGE * mri_to_mri( int datum , MRI_IMAGE *oldim )
16 {
17    MRI_IMAGE *newim ;
18 
19 ENTRY("mri_to_mri") ;
20 
21    if( oldim == NULL ) RETURN( NULL );  /* 09 Feb 1999 */
22 
23    if( oldim->kind == datum ){
24      newim = mri_copy(oldim) ; RETURN(newim) ;   /* 10 Dec 2008 */
25    }
26 
27    if( oldim->kind == MRI_fvect ){               /* 10 Dec 2008 */
28      MRI_IMAGE *qim = mri_fvect_subimage(oldim,0) ;
29      if( datum == MRI_float ){
30        newim = qim ;
31      } else {
32        newim = mri_to_mri(datum,qim) ; mri_free(qim) ;
33      }
34      RETURN(newim) ;
35    }
36 
37    /*-- return to the normal conversion cases --*/
38 
39    switch( datum ){
40       default:
41          fprintf(stderr,
42            "\nUnsupported mri_to_mri conversion!\a\n") ;
43          newim = NULL ;
44       break ;
45 
46       case MRI_short:{
47          double imtop ;
48          imtop = mri_maxabs( oldim ) ;
49 
50          if( imtop <= 32767.0 )
51             newim = mri_to_short( 1.0 , oldim ) ;
52          else
53             newim = mri_to_short_scl( 0.0 , 10000.0 , oldim ) ;
54       }
55       break ;
56 
57       case MRI_float:
58          newim = mri_to_float( oldim ) ;
59       break ;
60 
61       case MRI_byte:{
62          float immin , immax ;
63 
64          if( oldim->kind == MRI_byte ){
65             newim = mri_to_byte( oldim ) ;
66          } else {
67             immin = mri_min( oldim ) ; immax = mri_max( oldim ) ;
68             if( immin >= 0 && immax < 256 )
69                newim = mri_to_byte_scl( 1.0 , 0.0 , oldim ) ;
70             else
71                newim = mri_to_byte_scl( 0.0 , 255.0 , oldim ) ;
72         }
73       }
74       break ;
75 
76       case MRI_complex:
77          newim = mri_to_complex( oldim ) ;
78       break ;
79 
80       case MRI_rgb:
81          newim = mri_to_rgb( oldim ) ; /* 11 Feb 1999 */
82       break ;
83 
84       case MRI_rgba:
85          newim = mri_to_rgba( oldim ) ; /* 20 Mar 2002 */
86       break ;
87 
88   }
89   RETURN( newim );
90 }
91 
92 /*-----------------------------------------------------
93   Convert input image to the type given by "datum",
94   scaled by the given factor.
95 -------------------------------------------------------*/
96 
mri_to_mri_scl(int datum,double factor,MRI_IMAGE * oldim)97 MRI_IMAGE * mri_to_mri_scl( int datum , double factor , MRI_IMAGE * oldim )
98 {
99    MRI_IMAGE * newim ;
100 
101 ENTRY("mri_to_mri_scl") ;
102 
103    if( oldim == NULL ) RETURN( NULL );  /* 09 Feb 1999 */
104 
105    switch( datum ){
106       default:
107          fprintf(stderr,
108            "\nUnsupported mri_to_mri conversion!\a\n") ;
109          newim = NULL ;
110       break ;
111 
112       case MRI_short:
113          newim = mri_to_short( factor , oldim ) ;
114       break ;
115 
116       case MRI_float:
117          newim = mri_scale_to_float( factor , oldim ) ;
118       break ;
119 
120       case MRI_byte:
121          newim = mri_to_byte_scl( factor , 0.0 , oldim ) ;
122       break ;
123 
124       case MRI_complex:{
125          complex * cxar ; int ii , nvox ;
126          newim = mri_to_complex( oldim ) ;
127          cxar = MRI_COMPLEX_PTR(newim) ;
128          nvox = newim->nvox ;
129          for( ii=0 ; ii < nvox ; ii++ ){
130             cxar[ii].r *= factor ; cxar[ii].i *= factor ;
131          }
132       }
133       break ;
134   }
135   RETURN( newim );
136 }
137