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