1 #include "mrilib.h"
2 #include "mayo_analyze.h"
3 
4 #if 0
5 /*---------------------------------------------------------------*/
6 
7 static void swap_4(void *ppp)
8 {
9    unsigned char *pntr = (unsigned char *) ppp ;
10    unsigned char b0, b1, b2, b3;
11 
12    b0 = *pntr; b1 = *(pntr+1); b2 = *(pntr+2); b3 = *(pntr+3);
13    *pntr = b3; *(pntr+1) = b2; *(pntr+2) = b1; *(pntr+3) = b0;
14 }
15 
16 /*---------------------------------------------------------------*/
17 
18 static void swap_8(void *ppp)
19 {
20    unsigned char *pntr = (unsigned char *) ppp ;
21    unsigned char b0, b1, b2, b3;
22    unsigned char b4, b5, b6, b7;
23 
24    b0 = *pntr    ; b1 = *(pntr+1); b2 = *(pntr+2); b3 = *(pntr+3);
25    b4 = *(pntr+4); b5 = *(pntr+5); b6 = *(pntr+6); b7 = *(pntr+7);
26 
27    *pntr     = b7; *(pntr+1) = b6; *(pntr+2) = b5; *(pntr+3) = b4;
28    *(pntr+4) = b3; *(pntr+5) = b2; *(pntr+6) = b1; *(pntr+7) = b0;
29 }
30 
31 /*---------------------------------------------------------------*/
32 
33 static void swap_2(void *ppp)
34 {
35    unsigned char *pntr = (unsigned char *) ppp ;
36    unsigned char b0, b1;
37 
38    b0 = *pntr; b1 = *(pntr+1);
39    *pntr = b1; *(pntr+1) = b0;
40 }
41 
42 /*---------------------------------------------------------------*/
43 
44 static void swap_analyze_hdr( struct dsr *pntr )
45 {
46    swap_4(&pntr->hk.sizeof_hdr) ;
47    swap_4(&pntr->hk.extents) ;
48    swap_2(&pntr->hk.session_error) ;
49    swap_2(&pntr->dime.dim[0]) ;
50    swap_2(&pntr->dime.dim[1]) ;
51    swap_2(&pntr->dime.dim[2]) ;
52    swap_2(&pntr->dime.dim[3]) ;
53    swap_2(&pntr->dime.dim[4]) ;
54    swap_2(&pntr->dime.dim[5]) ;
55    swap_2(&pntr->dime.dim[6]) ;
56    swap_2(&pntr->dime.dim[7]) ;
57 #if 0
58    swap_2(&pntr->dime.unused1) ;
59 #endif
60    swap_2(&pntr->dime.datatype) ;
61    swap_2(&pntr->dime.bitpix) ;
62    swap_4(&pntr->dime.pixdim[0]) ;
63    swap_4(&pntr->dime.pixdim[1]) ;
64    swap_4(&pntr->dime.pixdim[2]) ;
65    swap_4(&pntr->dime.pixdim[3]) ;
66    swap_4(&pntr->dime.pixdim[4]) ;
67    swap_4(&pntr->dime.pixdim[5]) ;
68    swap_4(&pntr->dime.pixdim[6]) ;
69    swap_4(&pntr->dime.pixdim[7]) ;
70    swap_4(&pntr->dime.vox_offset) ;
71    swap_4(&pntr->dime.funused1) ;
72    swap_4(&pntr->dime.funused2) ;
73    swap_4(&pntr->dime.cal_max) ;
74    swap_4(&pntr->dime.cal_min) ;
75    swap_4(&pntr->dime.compressed) ;
76    swap_4(&pntr->dime.verified) ;
77    swap_2(&pntr->dime.dim_un0) ;
78    swap_4(&pntr->dime.glmax) ;
79    swap_4(&pntr->dime.glmin) ;
80    return ;
81 }
82 #endif
83 
84 /*-----------------------------------------------------------------
85   Write an image in ANALYZE 7.5 format;
86   fname.hdr and fname.img will be written, in native byte order.
87                                                 29 Nov 2001 - RWCox
88 -------------------------------------------------------------------*/
89 
mri_write_analyze(char * fname,MRI_IMAGE * im)90 void mri_write_analyze( char *fname , MRI_IMAGE *im )
91 {
92    struct dsr hdr ;  /* ANALYZE .hdr */
93    void *ip ;
94    FILE *fp ;
95    char *fff ;
96 
97 ENTRY("mri_write_analyze") ;
98 
99    /*-- check inputs for sanity --*/
100 
101    if( fname == NULL || fname[0] == '\0' || im == NULL ) EXRETURN ;
102    ip = mri_data_pointer(im) ;
103 
104    /*-- clear header --*/
105 
106    memset( &hdr , 0 , sizeof(struct dsr) ) ;
107 
108    /*-- set random header stuff --*/
109 
110    hdr.hk.sizeof_hdr = sizeof(struct dsr) ;
111    hdr.hk.regular    = 'r' ;
112 
113    sprintf( hdr.hk.db_name   , "%.17s"           , fname ) ;
114 #if 0
115    sprintf( hdr.hist.descrip , "via AFNI: %.68s" , fname ) ;
116 #endif
117 
118    /*-- set data dimensions --*/
119 
120    hdr.dime.dim[0] = mri_dimensionality(im) ;
121    hdr.dime.dim[1] = im->nx ; hdr.dime.pixdim[1] = im->dx ;
122    hdr.dime.dim[2] = im->ny ; hdr.dime.pixdim[2] = im->dy ;
123    hdr.dime.dim[3] = im->nz ; hdr.dime.pixdim[3] = im->dz ;
124    hdr.dime.dim[4] = im->nt ; hdr.dime.pixdim[4] = im->dt ;
125    hdr.dime.dim[5] = im->nu ; hdr.dime.pixdim[5] = im->du ;
126    hdr.dime.dim[6] = im->nv ; hdr.dime.pixdim[6] = im->dv ;
127    hdr.dime.dim[7] = im->nw ; hdr.dime.pixdim[7] = im->dw ;
128 
129    hdr.dime.funused1 = 1.0 ;  /* SPM scale factor */
130 
131    /*-- set data type --*/
132 
133    switch( im->kind ){
134 
135       default: EXRETURN ;    /* bad */
136 
137       case MRI_byte:    hdr.dime.datatype = ANDT_UNSIGNED_CHAR; break;
138       case MRI_short:   hdr.dime.datatype = ANDT_SIGNED_SHORT ; break;
139       case MRI_int:     hdr.dime.datatype = ANDT_SIGNED_INT   ; break;
140       case MRI_float:   hdr.dime.datatype = ANDT_FLOAT        ; break;
141       case MRI_complex: hdr.dime.datatype = ANDT_COMPLEX      ; break;
142       case MRI_double:  hdr.dime.datatype = ANDT_DOUBLE       ; break;
143       case MRI_rgb:     hdr.dime.datatype = ANDT_RGB          ; break;
144    }
145 
146    hdr.dime.bitpix = 8*im->pixel_size ;
147 
148    if( ip != NULL ){
149      hdr.dime.glmin = mri_min( im ) ;
150      hdr.dime.glmax = mri_max( im ) ;
151    } else {
152      hdr.dime.glmin = 0.0 ;
153      hdr.dime.glmax = 0.0 ;
154    }
155 
156    /*--KRH 03/11/04 writing out originator field from AFNI origin--*/
157    /*- adding 1.5 to value for rounding (+0.5) and conversion      */
158    /*                           to 1-based matlab arrays (+1.0)  - */
159    /*--change abs() to -()                    25 Mar 2004  [rickr] */
160 
161   if( AFNI_yesenv("AFNI_ANALYZE_ORIGINATOR") ){
162     short xyzuv[5] = {0};
163     xyzuv[0] = -im->xo/im->dx + 1.5;
164     xyzuv[1] = -im->yo/im->dy + 1.5;
165     xyzuv[2] = -im->zo/im->dz + 1.5;
166     memcpy( hdr.hist.originator, xyzuv, 10 );
167   }
168 
169    /*-- write header --*/
170 
171    fff = AFMALL(char, strlen(fname)+16 ) ;
172 
173    sprintf(fff,"%s.hdr",fname) ;
174    fp = fopen( fff , "wb" ) ;
175    if( fp == NULL ){
176       fprintf(stderr,"** Can't open file %s for output!\n",fff) ;
177       free(fff) ; EXRETURN ;
178    }
179    fwrite( &hdr , sizeof(struct dsr) , 1 , fp ) ;
180    fclose(fp) ;
181 
182    if( ip == NULL ){      /* 30 Sep 2002: skip .img if data not present */
183      free(fff); EXRETURN;
184    }
185 
186    /*-- write image --*/
187 
188    sprintf(fff,"%s.img",fname) ;
189    fp = fopen( fff , "wb" ) ;
190    if( fp == NULL ){
191       fprintf(stderr,"** Can't open file %s for output!\n",fff) ;
192       free(fff) ; EXRETURN ;
193    }
194    fwrite( ip , im->nvox , im->pixel_size , fp ) ;
195    fclose(fp) ;
196 
197    free(fff) ; EXRETURN ;
198 }
199