#include "mrilib.h" #define VERSION_STRING "
galler v0.1 - RWCox
\n" typedef struct { char name[64] ; int *vpt , retab,bot,top ; } cvar ; static int thumbsize = 120 ; static int imagesize = 900 ; static int rowmax = 7 ; static cvar clist[] = { { "thumbsize" , &thumbsize , 1 , 50,500 } , { "imagesize" , &imagesize , 0 , 50,2000} , { "rowmax" , &rowmax , 1 , 2,10 } , { "\0" , NULL , 0 , 0,0 } } ; static int tabled = 0 ; static int tr = 0 ; static int tc = 0 ; static float gam = 1.0f ; static char imagename[1024] ; static char thumbname[1024] ; static int nx_im , ny_im , nx_th , ny_th ; static void GAL_imageize( char *iname, char *prefix , int lab ) ; #define CLOSEROW \ do{ if( tabled && tr ){ \ fprintf(ofp,"\n\n"); tr=tc=0; \ }} while(0) #define OPENTABLE \ do{ fprintf(ofp,"\n
\n" \ "\n") ; \ tabled = 1 ; tr = tc = 0 ; \ } while(0) #define CLOSETABLE \ do{ if(tabled){ CLOSEROW ; \ fprintf(ofp,"
\n
\n
\n"); tabled = 0; \ }} while(0) #define HEADERIZE \ do{ if( !head_done ){ \ int hh ; \ fprintf(ofp, "\n") ; \ if( num_tst > 0 ){ \ fprintf(ofp,"") ; \ for( hh=0; hh < num_tst; hh++ ) fprintf(ofp," %s",tst[hh]); \ fprintf(ofp,"\n") ; \ } \ fprintf(ofp, "\n") ; \ head_done = 1 ; \ }} while(0) /*-----------------------------------------------------------------------*/ int main( int argc , char *argv[] ) { NI_str_array *sar=NULL ; FILE *ifp=stdin , *ofp=stdout ; int iarg=1 , ii , nim=0 ; char linbuf[65536] , *cpt , *prefix , *inam,*tnam ; int head_done=0 , tdperc ; int num_bst=0 ; char *bst[666] ; int num_tst=0 ; char *tst[666] ; /* - - - - - - - - - - */ if( argc < 3 || strcasecmp(argv[1],"-help") == 0 ){ printf("Usage: galler infile outdirectory\n") ; printf( "Creates an HTML thumbnail image gallery in 'outdirectory',\n" "using the specification in 'infile', which consists of\n" "a series of 1 line commands and file specifications.\n" ) ; exit(0) ; } /* - - - - - - - - - - */ while( iarg < argc && argv[iarg][0] == '-' && argv[iarg][1] != '\0' ){ ERROR_exit("This program has no options") ; } /* - - - - - - - - - - */ if( strcmp(argv[iarg],"-") != 0 ){ ifp = fopen( argv[iarg] , "r" ) ; if( ifp == NULL ) ERROR_exit("Can't open input file '%s'",argv[iarg]); INFO_message("Opened input file '%s'",argv[iarg]) ; } iarg++ ; /* - - - - - - - - - - */ prefix = argv[iarg] ; if( THD_is_ondisk(prefix) ){ if( !THD_is_directory(prefix) ) ERROR_exit("Prefix '%s' already exists, but not a directory!",prefix); } else { ii = THD_mkdir(prefix) ; if( ii == 0 ) ERROR_exit("Can't create directory '%s'",prefix); INFO_message("Created directory '%s'",prefix) ; } /* - - - - - - - - - - */ sprintf(imagename,"%-1.999s/index.html",prefix) ; ofp = fopen( imagename , "w" ) ; if( ofp == NULL ) ERROR_exit("Can't open file '%s' for output",imagename); /* - - - - - - - - - - */ #if 0 fprintf(ofp,"\n" "\n" ) ; head_done = 1 ; #endif /* - - - - - - - - - - */ GetLine: cpt = fgets( linbuf , 65536 , ifp ) ; if( cpt == NULL ) goto CleanUp ; GotLine: if( sar != NULL ) NI_delete_str_array(sar) ; sar = NI_decode_string_list( linbuf , "~" ) ; if( sar == NULL || sar->num < 1 ){ CLOSEROW ; goto GetLine ; } if( sar->str[0][0] == '#' ){ char *dpt ; int ndpt ; CLOSEROW ; if( sar->str[0][1] == '\0' ){ if( sar->num < 2 ) goto GetLine ; cpt = sar->str[1] ; dpt = (sar->num > 2) ? sar->str[2] : NULL ; ndpt = 2 ; } else { cpt = sar->str[0]+1 ; dpt = (sar->num > 1) ? sar->str[1] : NULL ; ndpt = 1 ; } if( dpt != NULL ){ int val=(int)strtod(dpt,NULL) , didit=0 ; for( ii=0 ; clist[ii].vpt != NULL ; ii++ ){ if( strcasecmp(cpt,clist[ii].name) == 0 ){ if( val < clist[ii].bot ) val = clist[ii].bot ; else if( val > clist[ii].top ) val = clist[ii].top ; *(clist[ii].vpt) = val ; if( clist[ii].retab ) CLOSETABLE ; INFO_message("Set variable %s = %d",clist[ii].name,val) ; didit = 1 ; break ; } } if( didit ) goto GetLine ; } if( strncasecmp(cpt,"cop",3)==0 || strncasecmp(cpt,"lit",3)==0 ){ HEADERIZE ; CLOSETABLE ; while(1){ cpt = fgets( linbuf , 65536 , ifp ) ; if( cpt == NULL ) goto CleanUp ; for( ; isspace(*cpt) ; cpt++ ) ; /* nada */ if( *cpt == '#' ) goto GotLine ; fprintf(ofp,"%s",cpt) ; } } else if( strcasecmp(cpt,"hr")==0 ){ HEADERIZE ; if( tabled ) CLOSETABLE ; else fprintf(ofp,"
\n") ; } else if( strncasecmp(cpt,"newtab",6)==0 ){ HEADERIZE ; CLOSETABLE ; } else if( strncasecmp(cpt,"body",4)==0 && dpt != NULL ){ for( ii=ndpt ; ii < sar->num ; ii++ ) bst[num_bst++] = strdup(sar->str[ii]) ; } else if( strncasecmp(cpt,"titl",4)==0 && dpt != NULL ){ for( ii=ndpt ; ii < sar->num ; ii++ ) tst[num_tst++] = strdup(sar->str[ii]) ; } else if( strncasecmp(cpt,"gam",3)==0 && dpt != NULL ){ float qam=(float)strtod(dpt,NULL) ; if( qam > 0.0f ){ gam = qam; INFO_message("Set gamma = %f",gam); } } goto GetLine ; } HEADERIZE ; if( !tabled ) OPENTABLE ; if( !tr ){ fprintf(ofp,"\n") ; tr = 1 ; } INFO_message("Processing image '%s'",sar->str[0]) ; GAL_imageize( sar->str[0] , prefix , ++nim ) ; if( imagename[0] == '\0' || thumbname[0] == '\0' ){ WARNING_message("Can't process image '%s'",sar->str[0]) ; --nim ; goto GetLine ; } inam = THD_trailname(imagename,0) ; tnam = THD_trailname(thumbname,0) ; tdperc = (int)(100.0/rowmax) ; fprintf(ofp, " " "" , tdperc , inam , tnam , nx_th , ny_th ) ; if( sar->num > 1 ){ fprintf(ofp,"
\n") ; for( ii=1 ; ii < sar->num ; ii++ ) fprintf(ofp," %s",sar->str[ii]) ; fprintf(ofp,"\n") ; } fprintf(ofp,"\n") ; if( ++tc >= rowmax ) CLOSEROW ; goto GetLine ; /* - - - - - - - - - - */ CleanUp: CLOSETABLE ; if( head_done ) fprintf(ofp, VERSION_STRING "\n" "\n") ; else WARNING_message("No Web page output?!") ; INFO_message("Program done") ; exit(0) ; } /*-----------------------------------------------------------------------*/ static void GAL_imageize( char *iname, char *prefix , int lab ) { MRI_IMAGE *inim , *qim , *bim ; int nx,ny , nxnew , nynew ; imagename[0] = thumbname[0] = '\0' ; if( iname == NULL || *iname == '\0' ) return ; if( prefix == NULL || *prefix == '\0' ) prefix = "." ; inim = mri_read( iname ) ; if( inim == NULL ) return ; if( inim->kind != MRI_rgb ){ qim = mri_to_rgb(inim) ; mri_free(inim) ; inim = qim ; } if( gam != 1.0f ){ ININFO_message(" -Processing gamma") ; mri_gamma_rgb_inplace( gam , inim ) ; } nx = inim->nx ; ny = inim->ny ; sprintf(imagename,"%-1.999s/Im%04d.jpg",prefix,lab) ; if( nx <= imagesize && ny <= imagesize ){ mri_write_jpg( imagename , inim ) ; nx_im = inim->nx ; ny_im = inim->ny ; } else { float fx , fy ; fx = imagesize / (float)nx ; fy = imagesize / (float)ny ; fx = MIN(fx,fy) ; nxnew = (int)(nx*fx); nynew = (int)(ny*fx) ; if( fx < 0.95f ){ float sigma = 0.3456789f/fx ; ININFO_message(" -Antialias filter sigma=%.2f",sigma) ; bim = mri_rgb_blur2D( sigma , inim ) ; } else bim = inim ; ININFO_message(" -Resizing to %d x %d",nxnew,nynew) ; qim = mri_resize( bim , nxnew , nynew ) ; nx_im = qim->nx ; ny_im = qim->ny ; mri_write_jpg( imagename , qim ) ; mri_free(qim) ; if( bim != inim ) mri_free(bim) ; } sprintf(thumbname,"%-1.999s/Th%04d.jpg",prefix,lab) ; if( nx <= thumbsize && ny <= thumbsize ){ mri_write_jpg( thumbname , inim ) ; nx_th = inim->nx ; ny_th = inim->ny ; } else { float fx , fy ; fx = thumbsize / (float)nx ; fy = thumbsize / (float)ny ; fx = MIN(fx,fy) ; nxnew = (int)(nx*fx); nynew = (int)(ny*fx) ; ININFO_message(" - Making thumbnail %d x %d",nxnew,nynew) ; qim = mri_resize( inim , nxnew , nynew ) ; nx_th = qim->nx ; ny_th = qim->ny ; mri_write_jpg( thumbname , qim ) ; mri_free(qim) ; } mri_free(inim) ; return ; }