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 #include "string.h"
9 
10 /*** NOT 7D SAFE ***/
11 
12 /** only works on short and byte images **/
13 
mri_nsize(MRI_IMAGE * imin)14 MRI_IMAGE * mri_nsize( MRI_IMAGE * imin )
15 {
16    MRI_IMAGE * imout = NULL ;
17    int nx , ny , ntop , nxpad , nypad , ix,jy,ioff , ii;
18 
19    if( imin == NULL ){
20       fprintf(stderr,"\n*** mri_nsize: NULL image passed as input!\n") ;
21       return NULL ;
22    }
23 
24    if( ! MRI_IS_2D(imin) ){
25       fprintf(stderr,"\n*** mri_nsize only works on 2D images!\n") ;
26       EXIT(1) ;
27    }
28 
29    nx   = imin->nx ;  ny = imin->ny ;
30    ntop = MAX(nx,ny) ;
31 
32         if( ntop <=  32 ) ntop =  32 ;  /* next power of 2 */
33    else if( ntop <=  64 ) ntop =  64 ;
34    else if( ntop <= 128 ) ntop = 128 ;
35    else if( ntop <= 256 ) ntop = 256 ;
36    else if( ntop <= 512 ) ntop = 512 ;
37    else if( ntop <=1024 ) ntop =1024 ;
38    else {
39       fprintf(stderr,"\n*** mri_nsize: cannot scale up %d x %d images!\n",nx,ny) ;
40       return NULL ;
41    }
42 
43    switch( imin->kind ){
44 
45       default: break ;
46 
47       case MRI_short:{
48          short * ptin , * ptout ;
49          imout = mri_new( ntop,ntop , MRI_short ) ;
50          ptin  = mri_data_pointer( imin ) ;
51          ptout = mri_data_pointer( imout ) ;
52 
53          for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii] = 0 ;
54 
55          nxpad = (ntop-nx) / 2 ;
56          nypad = (ntop-ny) / 2 ;
57 
58          for( jy=0 ; jy < ny ; jy++ ){
59             ioff = (jy+nypad) * ntop + nxpad ;
60             for( ix=0 ; ix < nx ; ix++ )
61                ptout[ix+ioff] = ptin[ix+jy*nx] ;
62          }
63       }
64       break ;
65 
66       case MRI_byte:{
67          byte * ptin , * ptout ;
68          imout = mri_new( ntop,ntop , MRI_byte ) ;
69          ptin  = mri_data_pointer( imin ) ;
70          ptout = mri_data_pointer( imout ) ;
71 
72          for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii] = 0 ;
73 
74          nxpad = (ntop-nx) / 2 ;
75          nypad = (ntop-ny) / 2 ;
76 
77          for( jy=0 ; jy < ny ; jy++ ){
78             ioff = (jy+nypad) * ntop + nxpad ;
79             for( ix=0 ; ix < nx ; ix++ )
80                ptout[ix+ioff] = ptin[ix+jy*nx] ;
81          }
82       }
83       break ;
84 
85       case MRI_int:{
86          int * ptin , * ptout ;
87          imout = mri_new( ntop,ntop , MRI_int ) ;
88          ptin  = mri_data_pointer( imin ) ;
89          ptout = mri_data_pointer( imout ) ;
90 
91          for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii] = 0 ;
92 
93          nxpad = (ntop-nx) / 2 ;
94          nypad = (ntop-ny) / 2 ;
95 
96          for( jy=0 ; jy < ny ; jy++ ){
97             ioff = (jy+nypad) * ntop + nxpad ;
98             for( ix=0 ; ix < nx ; ix++ )
99                ptout[ix+ioff] = ptin[ix+jy*nx] ;
100          }
101       }
102       break ;
103 
104       case MRI_float:{
105          float * ptin , * ptout ;
106          imout = mri_new( ntop,ntop , MRI_float ) ;
107          ptin  = mri_data_pointer( imin ) ;
108          ptout = mri_data_pointer( imout ) ;
109 
110          for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii] = 0 ;
111 
112          nxpad = (ntop-nx) / 2 ;
113          nypad = (ntop-ny) / 2 ;
114 
115          for( jy=0 ; jy < ny ; jy++ ){
116             ioff = (jy+nypad) * ntop + nxpad ;
117             for( ix=0 ; ix < nx ; ix++ )
118                ptout[ix+ioff] = ptin[ix+jy*nx] ;
119          }
120       }
121       break ;
122 
123       case MRI_double:{
124          double * ptin , * ptout ;
125          imout = mri_new( ntop,ntop , MRI_double ) ;
126          ptin  = mri_data_pointer( imin ) ;
127          ptout = mri_data_pointer( imout ) ;
128 
129          for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii] = 0 ;
130 
131          nxpad = (ntop-nx) / 2 ;
132          nypad = (ntop-ny) / 2 ;
133 
134          for( jy=0 ; jy < ny ; jy++ ){
135             ioff = (jy+nypad) * ntop + nxpad ;
136             for( ix=0 ; ix < nx ; ix++ )
137                ptout[ix+ioff] = ptin[ix+jy*nx] ;
138          }
139       }
140       break ;
141 
142       case MRI_complex:{
143          complex * ptin , * ptout ;
144          imout = mri_new( ntop,ntop , MRI_complex ) ;
145          ptin  = mri_data_pointer( imin ) ;
146          ptout = mri_data_pointer( imout ) ;
147 
148          for( ii=0 ; ii < ntop*ntop ; ii++ ) ptout[ii].r = ptout[ii].i = 0 ;
149 
150          nxpad = (ntop-nx) / 2 ;
151          nypad = (ntop-ny) / 2 ;
152 
153          for( jy=0 ; jy < ny ; jy++ ){
154             ioff = (jy+nypad) * ntop + nxpad ;
155             for( ix=0 ; ix < nx ; ix++ )
156                ptout[ix+ioff] = ptin[ix+jy*nx] ;
157          }
158       }
159       break ;
160    }
161 
162    MRI_COPY_AUX(imout,imin) ;
163    return imout ;
164 }
165