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