1 #include "mrilib.h"
2
3 /*-----------------------------------------------------------------
4 Pad a 2D image by adding/subtracting of zeros:
5 nxbot = # to add on -x side (can be negative, to remove planes)
6 nxtop = # to add on +x side, etc.
7 If all n?bot,n?top values are zero, just returns a copy
8 of the input. If too much is cut off, or something else
9 bad happens, returns NULL.
10
11 Adapted from edt_volpad.c -- 26 Feb 2001 -- RWCox
12 Actual work now done in mri_valpad_2D
13 -------------------------------------------------------------------*/
mri_zeropad_2D(int nxbot,int nxtop,int nybot,int nytop,MRI_IMAGE * fim)14 MRI_IMAGE * mri_zeropad_2D( int nxbot , int nxtop ,
15 int nybot , int nytop , MRI_IMAGE *fim )
16 {
17 return(mri_valpad_2D(nxbot, nxtop, nybot, nytop, fim, 0));
18 }
19
mri_valpad_2D(int nxbot,int nxtop,int nybot,int nytop,MRI_IMAGE * fim,byte val)20 MRI_IMAGE * mri_valpad_2D( int nxbot , int nxtop ,
21 int nybot , int nytop , MRI_IMAGE *fim,
22 byte val)
23 {
24 int nxold,nyold , nxnew,nynew , nx,ny ;
25 int ii,jj , iibot,iitop , jjbot,jjtop ;
26 MRI_IMAGE *vim ;
27
28 ENTRY("mri_valpad_2D") ;
29
30 /*- check for user stupidity -*/
31
32 if( fim == NULL ) RETURN(NULL) ;
33
34 nx = fim->nx ; ny = fim->ny ;
35
36 /*- special case: just copy input -*/
37
38 if( nxbot == 0 && nybot == 0 &&
39 nxtop == 0 && nytop == 0 ){
40
41 vim = mri_copy( fim ) ;
42 RETURN(vim) ;
43 }
44
45 nxold = nx ; nxnew = nxold + nxbot + nxtop ; /* dimensions */
46 nyold = ny ; nynew = nyold + nybot + nytop ;
47
48 iibot = MAX(0,-nxbot) ; iitop = MIN(nxold,nxold+nxtop) ; /* range of data */
49 jjbot = MAX(0,-nybot) ; jjtop = MIN(nyold,nyold+nytop) ; /* in old dataset */
50
51 if( nxnew < 1 || iibot >= iitop || /* check for reasonable sizes */
52 nynew < 1 || jjbot >= jjtop ){ /* and ranges of dataset */
53
54 fprintf(stderr,"*** mri_zeropad: can't cut image down to nothing!\n") ;
55 RETURN(NULL) ;
56 }
57
58 vim = mri_new( nxnew , nynew , fim->kind ) ;
59 MRI_COPY_AUX(vim,fim) ;
60 memset( mri_data_pointer(vim) , val ,
61 nxnew*nynew*mri_datum_size(vim->kind) ) ;
62
63 /* macros for computing 1D subscripts from 2D indices */
64
65 #undef SNEW /* in case was defined in some stupid .h file */
66 #undef SOLD
67 #define SNEW(i,j) ((i+nxbot)+(j+nybot)*nxnew)
68 #define SOLD(i,j) (i+j*nxold)
69
70 switch( fim->kind ){ /* copy rows of old into new */
71
72 default:
73 fprintf(stderr,"*** mri_zeropad: unknown input datum=%d\n",fim->kind) ;
74 mri_free(vim) ;
75 RETURN(NULL) ;
76
77 case MRI_byte:{
78 byte *bnew = MRI_BYTE_PTR(vim), *bold = MRI_BYTE_PTR(fim) ;
79 for( jj=jjbot ; jj < jjtop ; jj++ )
80 for( ii=iibot ; ii < iitop ; ii++ )
81 bnew[SNEW(ii,jj)] = bold[SOLD(ii,jj)] ;
82 }
83 break ;
84
85 case MRI_rgb:{
86 byte *bnew = MRI_RGB_PTR(vim), *bold = MRI_RGB_PTR(fim) ;
87 for( jj=jjbot ; jj < jjtop ; jj++ )
88 for( ii=iibot ; ii < iitop ; ii++ ){
89 bnew[3*SNEW(ii,jj) ] = bold[3*SOLD(ii,jj) ] ;
90 bnew[3*SNEW(ii,jj)+1] = bold[3*SOLD(ii,jj)+1] ;
91 bnew[3*SNEW(ii,jj)+2] = bold[3*SOLD(ii,jj)+2] ;
92 }
93 }
94 break ;
95
96 case MRI_short:{
97 short *bnew = MRI_SHORT_PTR(vim), *bold = MRI_SHORT_PTR(fim) ;
98 for( jj=jjbot ; jj < jjtop ; jj++ )
99 for( ii=iibot ; ii < iitop ; ii++ )
100 bnew[SNEW(ii,jj)] = bold[SOLD(ii,jj)] ;
101 }
102 break ;
103
104 case MRI_int:{
105 int *bnew = MRI_INT_PTR(vim), *bold = MRI_INT_PTR(fim) ;
106 for( jj=jjbot ; jj < jjtop ; jj++ )
107 for( ii=iibot ; ii < iitop ; ii++ )
108 bnew[SNEW(ii,jj)] = bold[SOLD(ii,jj)] ;
109 }
110 break ;
111
112 case MRI_float:{
113 float *bnew = MRI_FLOAT_PTR(vim), *bold = MRI_FLOAT_PTR(fim) ;
114 for( jj=jjbot ; jj < jjtop ; jj++ )
115 for( ii=iibot ; ii < iitop ; ii++ )
116 bnew[SNEW(ii,jj)] = bold[SOLD(ii,jj)] ;
117 }
118 break ;
119
120 case MRI_double:{
121 double *bnew = MRI_DOUBLE_PTR(vim), *bold = MRI_DOUBLE_PTR(fim) ;
122 for( jj=jjbot ; jj < jjtop ; jj++ )
123 for( ii=iibot ; ii < iitop ; ii++ )
124 bnew[SNEW(ii,jj)] = bold[SOLD(ii,jj)] ;
125 }
126 break ;
127
128 case MRI_complex:{
129 complex *bnew = MRI_COMPLEX_PTR(vim), *bold = MRI_COMPLEX_PTR(fim) ;
130 for( jj=jjbot ; jj < jjtop ; jj++ )
131 for( ii=iibot ; ii < iitop ; ii++ )
132 bnew[SNEW(ii,jj)] = bold[SOLD(ii,jj)] ;
133 }
134 break ;
135
136 } /* end of switch on datum type */
137
138 RETURN(vim) ;
139 }
140