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 
9 /*-----------------------------------------------------------------------*/
10 /* a Tmask shows which 1D lines through a 3D volume have nonzero entries */
11 /*-----------------------------------------------------------------------*/
12 
free_Tmask(Tmask * tm)13 void free_Tmask( Tmask * tm )
14 {
15    if( tm != NULL ){
16       free(tm->mask[0]) ; free(tm->mask[1]) ; free(tm->mask[2]) ; free(tm) ;
17    }
18    return ;
19 }
20 
21 /*-----------------------------------------------------------------------*/
22 
create_Tmask_byte(int nx,int ny,int nz,byte * vol)23 Tmask * create_Tmask_byte( int nx, int ny, int nz, byte * vol )
24 {
25    Tmask * tm ;
26    int ii,jj,kk,vv , nxy,nyz,nzx ;
27    byte * bz , *xym,*yzm,*zxm , *bxy,*byz,*bzx ;
28 
29    tm = (Tmask *) malloc(sizeof(Tmask)) ;
30    tm->nmask[TM_IXY] = nxy = nx*ny ;
31    tm->nmask[TM_IYZ] = nyz = ny*nz ;
32    tm->nmask[TM_IZX] = nzx = nz*nx ;
33 
34    tm->mask[TM_IXY] = xym = (byte *) calloc(1,sizeof(byte)*nxy) ;
35    tm->mask[TM_IYZ] = yzm = (byte *) calloc(1,sizeof(byte)*nyz) ;
36    tm->mask[TM_IZX] = zxm = (byte *) calloc(1,sizeof(byte)*nzx) ;
37 
38    for( byz=yzm,kk=0 ; kk < nz ; kk++,byz+=ny ){
39       bz = vol + kk*nxy ;
40       for( bxy=xym,jj=0 ; jj < ny ; jj++,bz+=nx,bxy+=nx ){
41          for( bzx=zxm,ii=0 ; ii < nx ; ii++,bzx+=nz ){
42             if( bz[ii] ){ bxy[ii] = byz[jj] = bzx[kk] = 1 ; }
43          }
44       }
45    }
46 
47    return tm ;
48 }
49 
50 /*-----------------------------------------------------------------------*/
51 
create_Tmask_rgba(int nx,int ny,int nz,rgba * vol)52 Tmask * create_Tmask_rgba( int nx, int ny, int nz, rgba * vol )
53 {
54    Tmask *tm ;
55    int ii,jj,kk,vv , nxy,nyz,nzx ;
56    byte *xym,*yzm,*zxm , *bxy,*byz,*bzx ;
57    rgba *bz ;
58 
59    tm = (Tmask *) malloc(sizeof(Tmask)) ;
60    tm->nmask[TM_IXY] = nxy = nx*ny ;
61    tm->nmask[TM_IYZ] = nyz = ny*nz ;
62    tm->nmask[TM_IZX] = nzx = nz*nx ;
63 
64    tm->mask[TM_IXY] = xym = (byte *) calloc(1,sizeof(byte)*nxy) ;
65    tm->mask[TM_IYZ] = yzm = (byte *) calloc(1,sizeof(byte)*nyz) ;
66    tm->mask[TM_IZX] = zxm = (byte *) calloc(1,sizeof(byte)*nzx) ;
67 
68    for( byz=yzm,kk=0 ; kk < nz ; kk++,byz+=ny ){
69      bz = vol + kk*nxy ;
70      for( bxy=xym,jj=0 ; jj < ny ; jj++,bz+=nx,bxy+=nx ){
71        for( bzx=zxm,ii=0 ; ii < nx ; ii++,bzx+=nz ){
72          if( bz[ii].a ){ bxy[ii] = byz[jj] = bzx[kk] = 1 ; }
73        }
74      }
75    }
76 
77    return tm ;
78 }
79