1 #include "mrilib.h"
2 
3 static char *gfilt=NULL ;
4 static char *ganim=NULL ;
5 static int   setup=-1    ;
6 
7 /*** N.B.: The code in this file has not been tested!!! -- RWCox ***/
8 
9 /*-----------------------------------------------------------------
10   Return 1 if animated gif output is setup, 0 if it can't be
11 -------------------------------------------------------------------*/
12 
setup_mri_write_angif(void)13 int setup_mri_write_angif( void )
14 {
15    char *pq,*pg,*pgs,*pwg=NULL ;
16 
17    if( setup >= 0 ) return setup ;
18 
19    /*-- make the commands: gfilt to produce 1 gif
20                            ganim to animate a bunch of them --*/
21 
22    pg = THD_find_executable( "ppmtogif" ) ;
23    if( pg == NULL ){ setup = 0; return setup; }
24    pq = THD_find_executable( "ppmquant" ) ;
25    if( pq == NULL ){ setup = 0; return setup; }
26    pgs = THD_find_executable( "gifsicle" ) ;
27    if( pgs == NULL ){
28      pwg = THD_find_executable( "whirlgif" ) ;
29      if( pwg == NULL ){ setup = 0; return setup; }
30    }
31 
32    gfilt = AFMALL(char, strlen(pg)+strlen(pq)+32) ;
33    sprintf( gfilt , "%s 127 | %s > %%s" , pq,pg ) ;
34 
35    if( pgs != NULL ){
36       ganim = AFMALL(char, strlen(pgs)+64) ;
37       sprintf(ganim,"%s -d 10 -l -O1 -k 127 --method median-cut",pgs) ;
38    } else {
39       ganim = AFMALL(char, strlen(pwg)+64) ;
40       sprintf(ganim,"%s -loop -time 10",pwg) ;
41    }
42 
43    setup = 1; return setup;
44 }
45 
46 /*-----------------------------------------------------------------
47   Return 1 if write worked, 0 if not
48 -------------------------------------------------------------------*/
49 
mri_write_angif(char * fname,MRI_IMARR * imar)50 int mri_write_angif( char *fname , MRI_IMARR *imar )
51 {
52    char gnam[32] , gt[16] , filt[512] ;
53    MRI_IMAGE *tim , *qim ;
54    int ii , nim ;
55    FILE *fp ;
56 
57    /*-- sanity check --*/
58 
59    if( fname == NULL || fname[0] == '\0'      ||
60        imar  == NULL || IMARR_COUNT(imar) < 2   ) return 0 ;
61 
62    if( setup <  0 ) setup_mri_write_angif() ;
63    if( setup == 0 ) return 0 ;
64 
65    /*-- make individual gifs from each file --*/
66 
67    nim = IMARR_COUNT(imar) ;
68 
69    sprintf(gt,"%x",(unsigned int)PTOI(imar)) ; gt[5] = '\0' ;
70 
71    for( ii=0 ; ii < nim ; ii++ ){
72       sprintf(gnam,"Elvis%s.%05d.gif",gt,ii) ;
73 
74       tim = IMARR_SUBIMAGE(imar,ii) ; if( tim == NULL ) continue ;
75       qim = tim ;
76       if( tim->kind != MRI_rgb ) qim = mri_to_rgb( tim ) ;
77 
78       sprintf( filt , gfilt , gnam ) ;
79       fp = popen( filt , "w" ) ;
80       if( fp == NULL ){
81          fprintf(stderr,"** Can't open output filter %s\n",filt) ;
82          return 0 ;
83       }
84 
85       fprintf(fp,"P6\n%d %d\n255\n" , qim->nx,qim->ny ) ;
86       fwrite( MRI_RGB_PTR(qim), sizeof(byte), 3*qim->nvox, fp ) ;
87       pclose(fp) ;
88 
89       if( qim != tim ) mri_free(qim) ;
90    }
91 
92    /*-- make the animated gif output --*/
93 
94    sprintf( filt , "%s Elvis.%s.*.gif > %s" , ganim , gt , fname ) ;
95    system( filt ) ;
96 
97    /*-- remove individual gif files --*/
98 
99    for( ii=0 ; ii < nim ; ii++ ){
100       sprintf(gnam,"Elvis%s.%05d.gif",gt,ii) ;
101       remove(gnam) ;
102    }
103 
104    return 1 ; /* indicate success */
105 }
106