1 #include "mrilib.h"
2 
3 /*----------------------------------------------------------------------------*/
4 /* Interleave two images in a checkerboard */
5 
mri_check_2D(int bsiz,MRI_IMAGE * ima,MRI_IMAGE * imb)6 MRI_IMAGE * mri_check_2D( int bsiz , MRI_IMAGE *ima , MRI_IMAGE *imb )
7 {
8    MRI_IMAGE *imc ;
9    int nx , ny , ii , jj , ib,jb , ps , kk ;
10    char *aar , *bar , *car , *sar ;
11 
12 ENTRY("mri_check_2D") ;
13 
14    if( ima == NULL || imb == NULL ) RETURN(NULL) ;
15    nx = ima->nx ; ny = ima->ny ;
16    if( imb->nx != nx || imb->ny != ny || ima->kind != imb->kind ) RETURN(NULL);
17 
18    if( bsiz < 1 ) bsiz = (int)sqrt(0.5*(nx+ny)) ;
19 
20    aar = (char *)mri_data_pointer(ima) ; if( aar == NULL ) RETURN(NULL) ;
21    bar = (char *)mri_data_pointer(imb) ; if( bar == NULL ) RETURN(NULL) ;
22    ps  = ima->pixel_size ;
23    imc = mri_new( nx , ny , ima->kind ) ;
24    car = (char *)mri_data_pointer(imc) ;
25 
26    for( kk=jj=0 ; jj < ny ; jj++ ){
27      jb = (jj/bsiz) % 2 ;
28      for( ii=0 ; ii < nx ; ii++ ){
29        ib  = (ii/bsiz) % 2 ;
30        sar = (ib==jb) ? aar : bar ;  /* choose source image */
31 
32        switch( ps ){  /* copy ps bytes from source to result */
33          default:
34            memcpy( car+kk , sar+kk , ps ) ; kk += ps ;
35          break ;
36 
37          case 4: car[kk] = sar[kk] ; kk++ ; /* fall thru */
38          case 3: car[kk] = sar[kk] ; kk++ ; /* fall thru */
39          case 2: car[kk] = sar[kk] ; kk++ ; /* fall thru */
40          case 1: car[kk] = sar[kk] ; kk++ ; break ;
41        }
42      }
43    }
44 
45    MRI_COPY_AUX(imc,ima) ; RETURN(imc) ;
46 }
47 
48 /*----------------------------------------------------------------------------*/
49 /* 'Wiper' combine 2 images, according to wcode method */
50 
mri_wiper_2D(int wcode,float wfac,MRI_IMAGE * ima,MRI_IMAGE * imb)51 MRI_IMAGE * mri_wiper_2D( int wcode,float wfac, MRI_IMAGE *ima, MRI_IMAGE *imb )
52 {
53    MRI_IMAGE *imc ;
54    int nx , ny , ii , jj , ib,jb , ps , kk ;
55    char *aar , *bar , *car , *sar ;
56    byte *mar ;
57 
58 ENTRY("mri_wiper_2D") ;
59 
60    if( ima == NULL || imb == NULL ) RETURN(NULL) ;
61    nx = ima->nx ; ny = ima->ny ;
62    if( imb->nx != nx || imb->ny != ny || ima->kind != imb->kind ) RETURN(NULL);
63 
64         if( wfac <= 0.0f ){ imc = mri_copy(imb) ; RETURN(imc) ; }
65    else if( wfac >= 1.0f ){ imc = mri_copy(ima) ; RETURN(imc) ; }
66 
67 #undef  IJ
68 #define IJ(i,j) ((i)+(j)*nx)
69 
70    mar = (byte *)calloc(sizeof(byte),nx*ny) ;
71    imc = mri_new( nx , ny , ima->kind ) ;
72    car = (char *)mri_data_pointer(imc) ;
73 
74    ps  = ima->pixel_size ;
75    aar = (char *)mri_data_pointer(ima) ; if( aar == NULL ) RETURN(NULL) ;
76    bar = (char *)mri_data_pointer(imb) ; if( bar == NULL ) RETURN(NULL) ;
77 
78    /* make mask */
79 
80    switch( wcode ){
81      default:
82      case WIPER_FROM_LEFT:
83        ib = (int)rintf(wfac*nx) ;
84        for( jj=0 ; jj < ny ; jj++ )
85          for( ii=ib ; ii < nx ; ii++ ) mar[IJ(ii,jj)] = 1 ;
86      break ;
87 
88      case WIPER_FROM_BOTTOM:
89        jb = (int)rintf(wfac*ny) ;
90        for( jj=jb ; jj < ny ; jj++ )
91          for( ii=0 ; ii < nx ; ii++ ) mar[IJ(ii,jj)] = 1 ;
92      break ;
93 
94      case WIPER_FROM_CENTER:{
95        float nxh=0.5f*(nx-1)    , nyh=0.5f*(ny-1)    ;
96        float nxq=1.0f/(nxh*nxh) , nyq=1.0f/(nyh*nyh) ;
97        float jr,rr ;
98        for( jj=0 ; jj < ny ; jj++ ){
99          jr = (jj-nyh)*(jj-nyh)*nyq ;
100          for( ii=0 ; ii < nx ; ii++ ){
101            rr = (ii-nxh)*(ii-nxh)*nxq+jr; if( rr >= wfac ) mar[IJ(ii,jj)] = 1;
102          }
103        }
104      }
105      break ;
106    }
107 
108    /* copy data, depending on mask */
109 
110    for( kk=jj=0 ; jj < ny ; jj++ ){
111      for( ii=0 ; ii < nx ; ii++ ){
112        sar = mar[IJ(ii,jj)] ? bar : aar ;  /* choose source image */
113 
114        switch( ps ){  /* copy ps bytes from source to result */
115          default:
116            memcpy( car+kk , sar+kk , ps ) ; kk += ps ;
117          break ;
118 
119          case 4: car[kk] = sar[kk] ; kk++ ; /* fall thru */
120          case 3: car[kk] = sar[kk] ; kk++ ; /* fall thru */
121          case 2: car[kk] = sar[kk] ; kk++ ; /* fall thru */
122          case 1: car[kk] = sar[kk] ; kk++ ; break ;
123        }
124      }
125    }
126 
127    free(mar) ; MRI_COPY_AUX(imc,ima) ; RETURN(imc) ;
128 }
129 
130 /*----------------------------------------------------------------------------*/
131 /* Mix 2 images in a fraction from 0 to 1 (0=ima 1=imb). */
132 
mri_mix_2D(float wfac,MRI_IMAGE * ima,MRI_IMAGE * imb)133 MRI_IMAGE * mri_mix_2D( float wfac, MRI_IMAGE *ima, MRI_IMAGE *imb )
134 {
135    MRI_IMAGE *imc=NULL ;
136    int nx , ny , ii , nxy ;
137    float fa , fb ;
138 
139 ENTRY("mri_mix_2D") ;
140 
141    if( ima == NULL || imb == NULL ) RETURN(NULL) ;
142    nx = ima->nx ; ny = ima->ny ; nxy = nx*ny ;
143    if( imb->nx != nx || imb->ny != ny || ima->kind != imb->kind ) RETURN(NULL);
144 
145         if( wfac <= 0.0f ){ imc = mri_copy(ima) ; RETURN(imc) ; }
146    else if( wfac >= 1.0f ){ imc = mri_copy(imb) ; RETURN(imc) ; }
147 
148    imc = mri_new( nx , ny , ima->kind ) ;
149    fa  = 1.0f-wfac ; fb = wfac ;
150 
151    switch( ima->kind ){
152 
153      default: mri_free(imc) ; imc = NULL ; break ; /* bad */
154 
155      case MRI_byte:{
156        byte *ar=MRI_BYTE_PTR(ima), *br=MRI_BYTE_PTR(imb), *cr=MRI_BYTE_PTR(imc) ;
157        for( ii=0 ; ii < nxy ; ii++ )
158          cr[ii] = (byte)(fa*ar[ii]+fb*br[ii]+0.49f) ;
159      }
160      break ;
161 
162      case MRI_short:{
163        short *ar=MRI_SHORT_PTR(ima), *br=MRI_SHORT_PTR(imb), *cr=MRI_SHORT_PTR(imc) ;
164        for( ii=0 ; ii < nxy ; ii++ )
165          cr[ii] = (short)(fa*ar[ii]+fb*br[ii]+0.49f) ;
166      }
167      break ;
168 
169      case MRI_float:{
170        float *ar=MRI_FLOAT_PTR(ima), *br=MRI_FLOAT_PTR(imb), *cr=MRI_FLOAT_PTR(imc) ;
171        for( ii=0 ; ii < nxy ; ii++ )
172          cr[ii] = fa*ar[ii]+fb*br[ii] ;
173      }
174      break ;
175 
176      case MRI_rgb:{
177        byte *ar=MRI_BYTE_PTR(ima), *br=MRI_BYTE_PTR(imb), *cr=MRI_BYTE_PTR(imc) ;
178        for( ii=0 ; ii < 3*nxy ; ii++ )
179          cr[ii] = (byte)(fa*ar[ii]+fb*br[ii]+0.49f) ;
180      }
181      break ;
182 
183      case MRI_complex:{
184        complex *ar=MRI_COMPLEX_PTR(ima), *br=MRI_COMPLEX_PTR(imb), *cr=MRI_COMPLEX_PTR(imc) ;
185        for( ii=0 ; ii < nxy ; ii++ ){
186          cr[ii].r = fa*ar[ii].r+fb*br[ii].r ; cr[ii].i = fa*ar[ii].i+fb*br[ii].i ;
187        }
188      }
189      break ;
190 
191    }
192 
193    RETURN(imc) ;
194 }
195