00001 #undef MAIN
00002 #include "afni.h"
00003 #include <Xm/XmAll.h>
00004
00005 #define NUM_AV_FIRST 20
00006
00007
00008
00009 typedef struct {
00010 int reg_num , av_invert ;
00011 MCW_arrowval *reg_av[TTO_COUNT] ;
00012 char *reg_label[TTO_COUNT] ;
00013 short reg_tto[TTO_COUNT] ;
00014 short reg_ttbrik[TTO_COUNT] ;
00015 short reg_ttval[TTO_COUNT] ;
00016 short reg_ttovc[TTO_COUNT] ;
00017
00018 Widget shell , scrollw , workwin ;
00019 MCW_arrowval *meth_av , *hemi_av ;
00020
00021 Three_D_View * im3d ;
00022 MCW_DC *dc ;
00023 } TTRR_controls ;
00024
00025 static TTRR_controls *ttc = NULL ;
00026
00027
00028
00029 static void TTRR_action_CB ( Widget, XtPointer, XtPointer ) ;
00030 static void TTRR_delete_window_CB( Widget, XtPointer, XtPointer ) ;
00031 static void TTRR_av_CB ( MCW_arrowval * , XtPointer ) ;
00032
00033 static void TTRR_load_file( char * ) ;
00034 static void TTRR_save_CB ( Widget , XtPointer , MCW_choose_cbs * ) ;
00035 static void TTRR_load_CB ( Widget , XtPointer , MCW_choose_cbs * ) ;
00036
00037
00038
00039
00040
00041
00042
00043 #define TTRR_clear_label "Clear"
00044 #define TTRR_load_label "Load"
00045 #define TTRR_save_label "Save"
00046 #define TTRR_redraw_label "Redraw"
00047 #define TTRR_done_label "Done"
00048 #define TTRR_help_label "Help"
00049
00050 #define TTRR_clear_hint "Set all colors to 'none'"
00051 #define TTRR_load_hint "Load colors from a file"
00052 #define TTRR_save_hint "Save colors to a file"
00053 #define TTRR_redraw_hint "Redraw using current colors"
00054 #define TTRR_done_hint "Close this window"
00055
00056 #define NUM_TTRR_ACT 6
00057
00058 static MCW_action_item TTRR_act[] = {
00059 { TTRR_clear_label , TTRR_action_CB, NULL,NULL, TTRR_clear_hint , 0 } ,
00060 { TTRR_load_label , TTRR_action_CB, NULL,NULL, TTRR_load_hint , 0 } ,
00061 { TTRR_save_label , TTRR_action_CB, NULL,NULL, TTRR_save_hint , 0 } ,
00062 { TTRR_redraw_label, TTRR_action_CB, NULL,NULL, TTRR_redraw_hint,-1 } ,
00063 { TTRR_done_label , TTRR_action_CB, NULL,NULL, TTRR_done_hint , 1 } ,
00064 { TTRR_help_label , TTRR_action_CB, NULL,NULL, NULL , 0 }
00065 } ;
00066
00067 #define NMETHOD 5
00068 #define METHOD_OFF "Off"
00069 #define METHOD_GAF "Gyral/Area/Func"
00070 #define METHOD_AGF "Area/Gyral/Func"
00071 #define METHOD_FGA "Func/Gyral/Area"
00072 #define METHOD_FAG "Func/Area/Gyral"
00073
00074 static char *METHOD_strings[NMETHOD] = {
00075 METHOD_OFF , METHOD_GAF , METHOD_AGF , METHOD_FGA , METHOD_FAG
00076 } ;
00077
00078 #define NHEMI 3
00079 #define HEMI_LEFT "Left only"
00080 #define HEMI_RIGHT "Right only"
00081 #define HEMI_BOTH "Both"
00082
00083 static char *HEMI_strings[NHEMI] = { HEMI_LEFT , HEMI_RIGHT , HEMI_BOTH } ;
00084
00085 static char helpstring[] =
00086 "The purpose of these controls is to enable display of the brain\n"
00087 "regions defined by the Talairach Daemon database (generously\n"
00088 "contributed by Jack Lancaster and Peter Fox of RIC UTHSCSA).\n"
00089 "\n"
00090 "In the database, some voxels have 2 labels - a larger scale\n"
00091 "'gyral' name and a finer scale 'area' name; these are marked\n"
00092 "with [G] and [A] in the region list.\n"
00093 "In the database there are\n"
00094 " 1,205,737 voxels with at least one label\n"
00095 " 709,953 voxels with only a 'gyral' label\n"
00096 " 15,898 voxels with only a 'area' label\n"
00097 " 479,886 voxels with both types of labels\n"
00098 "For example, the Parahippocampal Gyrus and the Hippocampus (area)\n"
00099 "have a great deal of overlap.\n"
00100 "\n"
00101 "Method:\n"
00102 " To enable display of the selected regions, you must choose the\n"
00103 " Method to be something other than 'Off'. The other Method choices\n"
00104 " determine the order in which color overlays take place; for example,\n"
00105 " 'Gyral/Area/Func' means that a 'gyral' color, if present in a voxel,\n"
00106 " will overlay on top of any 'area' color there, which would in turn\n"
00107 " overlay on top of any functional color there. At this time, there\n"
00108 " is no way to blend the colors from overlapping results.\n"
00109 "\n"
00110 "Hemisphere(s):\n"
00111 " Use this to control which side(s) of the brain will have brain\n"
00112 " region overlays. At this time, this option only affects the volume\n"
00113 " rendering and has no effect on the 2D image viewers, in which\n"
00114 " regions from both hemispheres will be rendered, regardless.\n"
00115 "\n"
00116 "The regional controls are to set the overlay colors; if a region's\n"
00117 "color is set to 'none', then it will not be overlaid.\n"
00118 "\n"
00119 "* To change all overlay colors to 'none', use the Clear button.\n"
00120 "* To save the color settings to a file, use the Save button.\n"
00121 "* To read saved color settings from a file, use the Load button.\n"
00122 "* Set environment variable AFNI_TTRR_SETUP to the name of a Save\n"
00123 " color file, and it will be loaded when you first create this\n"
00124 " control panel. See README.environment for more details.\n"
00125 "* The Done button closes the control panel, but doesn't change colors.\n"
00126 "\n"
00127 "NOTES:\n"
00128 " * At this time, the Redraw button has no functionality;\n"
00129 " after you change the color settings in this window, you must\n"
00130 " force an image redisplay to see the changes. In the 2D image\n"
00131 " viewers, you can do this by turning 'See TT Atlas Regions'\n"
00132 " off and on; in the volume renderer, you must press the 'Reload'\n"
00133 " button to force the proper redisplay ('Draw' isn't enough).\n"
00134 " * The region rendering only works if the dataset being drawn in the\n"
00135 " 2D image viewers and/or Render Dataset plugin is in the +tlrc\n"
00136 " coordinates sytem, and is at 1 mm resolution.\n"
00137 " * The regions used here are derived from the axial slices in the\n"
00138 " Talairach-Tournoux Atlas. Since these slices are several mm\n"
00139 " apart, the resolution of the regions in the I-S direction is\n"
00140 " fairly crude. This means that the regions look 'blocky' in\n"
00141 " sagittal and coronal 2D images, but look smoother in axial images.\n"
00142 " * The Atlas is only useful as a ROUGH guide to determining where you\n"
00143 " are in any individual brain. Do not rely exclusively on the Atlas\n"
00144 " for brain region labeling: you must use your knowledge, skills,\n"
00145 " and abilities as well.\n"
00146 "\n"
00147 "-- RWCox - July 2001\n"
00148 ;
00149
00150
00151
00152 static void TTRR_setup_widgets( MCW_DC * dc )
00153 {
00154 XmString xstr ;
00155 char lbuf[256] , *ept ;
00156 Widget toprc , bar , actar , frame , separator , label ;
00157 int ww,hh,bww , ii ;
00158
00159 ENTRY("TTRR_setup_widgets") ;
00160
00161
00162
00163 if( dc == NULL || ttc != NULL ) EXRETURN ;
00164
00165 SHOW_AFNI_PAUSE ;
00166
00167
00168
00169 ttc = myXtNew(TTRR_controls) ;
00170
00171 ttc->dc = dc ;
00172
00173 ttc->av_invert = AFNI_yesenv( "AFNI_TTRR_INVERT" ) ;
00174
00175
00176
00177 ttc->shell =
00178 XtVaAppCreateShell(
00179 "AFNI" , "AFNI" , topLevelShellWidgetClass , dc->display ,
00180
00181 XmNtitle , "TT Atlas Rendering" ,
00182 XmNiconName , "TT Atlas" ,
00183 #if 0
00184 XmNmappedWhenManaged , False ,
00185 #endif
00186 XmNdeleteResponse , XmDO_NOTHING ,
00187 XmNallowShellResize , False ,
00188 XmNinitialResourcesPersistent , False ,
00189 NULL ) ;
00190
00191 DC_yokify( ttc->shell , dc ) ;
00192
00193 if( afni48_good )
00194 XtVaSetValues( ttc->shell ,
00195 XmNiconPixmap , afni48_pixmap ,
00196 NULL ) ;
00197
00198 XmAddWMProtocolCallback(
00199 ttc->shell ,
00200 XmInternAtom( dc->display , "WM_DELETE_WINDOW" , False ) ,
00201 TTRR_delete_window_CB , (XtPointer) ttc ) ;
00202
00203
00204
00205 toprc = XtVaCreateWidget(
00206 "AFNI" , xmFormWidgetClass , ttc->shell ,
00207 XmNborderWidth , 0 ,
00208 XmNborderColor , 0 ,
00209 XmNtraversalOn , False ,
00210 XmNinitialResourcesPersistent , False ,
00211 NULL ) ;
00212
00213
00214
00215 xstr = XmStringCreateLtoR("-- Control Talairach Daemon display colors --" ,
00216 XmFONTLIST_DEFAULT_TAG ) ;
00217 label = XtVaCreateManagedWidget(
00218 "AFNI" , xmLabelWidgetClass , toprc ,
00219 XmNlabelString , xstr ,
00220 XmNalignment , XmALIGNMENT_CENTER ,
00221
00222 XmNleftAttachment , XmATTACH_FORM ,
00223 XmNrightAttachment, XmATTACH_FORM ,
00224 XmNtopAttachment , XmATTACH_FORM ,
00225 XmNtopOffset , 3 ,
00226 XmNinitialResourcesPersistent , False ,
00227 NULL ) ;
00228 XmStringFree( xstr ) ;
00229
00230 MCW_widget_geom( label , &ww , &hh , NULL , NULL ) ;
00231 XtVaSetValues( ttc->shell ,
00232 XmNminWidth , ww+3 ,
00233 XmNminHeight , 11*hh ,
00234 NULL ) ;
00235
00236 separator = XtVaCreateManagedWidget(
00237 "AFNI" , xmSeparatorWidgetClass , toprc ,
00238 XmNseparatorType , XmSHADOW_ETCHED_IN ,
00239 XmNshadowThickness, 2 ,
00240 XmNleftAttachment , XmATTACH_FORM ,
00241 XmNrightAttachment, XmATTACH_FORM ,
00242 XmNtopAttachment , XmATTACH_WIDGET ,
00243 XmNtopWidget , label ,
00244 XmNtopOffset , 1 ,
00245 NULL ) ;
00246
00247
00248
00249 for( ii=0 ; ii < NUM_TTRR_ACT ; ii++ )
00250 TTRR_act[ii].data = (XtPointer) ttc ;
00251
00252 actar = MCW_action_area( toprc , TTRR_act , NUM_TTRR_ACT ) ;
00253
00254 XtVaSetValues( actar ,
00255 XmNleftAttachment , XmATTACH_FORM ,
00256 XmNrightAttachment, XmATTACH_FORM ,
00257 XmNtopAttachment , XmATTACH_WIDGET ,
00258 XmNtopWidget , separator ,
00259 XmNtopOffset , 3 ,
00260 NULL ) ;
00261
00262 separator = XtVaCreateManagedWidget(
00263 "AFNI" , xmSeparatorWidgetClass , toprc ,
00264 XmNseparatorType , XmSHADOW_ETCHED_IN ,
00265 XmNshadowThickness, 2 ,
00266 XmNleftAttachment , XmATTACH_FORM ,
00267 XmNrightAttachment, XmATTACH_FORM ,
00268 XmNtopAttachment , XmATTACH_WIDGET ,
00269 XmNtopWidget , actar ,
00270 XmNtopOffset , 1 ,
00271 NULL ) ;
00272
00273
00274
00275 ttc->meth_av = new_MCW_optmenu( toprc , "Method" ,
00276 0 , NMETHOD-1 , NMETHOD-1 , 0 ,
00277 NULL,NULL ,
00278 MCW_av_substring_CB, METHOD_strings ) ;
00279
00280 XtVaSetValues( ttc->meth_av->wrowcol ,
00281 XmNleftAttachment , XmATTACH_FORM ,
00282 XmNtopAttachment , XmATTACH_WIDGET ,
00283 XmNtopWidget , separator ,
00284 XmNtopOffset , 3 ,
00285 XmNleftOffset , 3 ,
00286 NULL ) ;
00287
00288 ttc->hemi_av = new_MCW_optmenu( toprc , "Hemisphere(s)" ,
00289 0 , NHEMI-1 , NHEMI-1 , 0 ,
00290 NULL,NULL ,
00291 MCW_av_substring_CB, HEMI_strings ) ;
00292
00293 XtVaSetValues( ttc->hemi_av->wrowcol ,
00294 XmNrightAttachment, XmATTACH_FORM ,
00295 XmNtopAttachment , XmATTACH_WIDGET ,
00296 XmNtopWidget , separator ,
00297 XmNtopOffset , 3 ,
00298 XmNrightOffset , 3 ,
00299 NULL ) ;
00300
00301 separator = XtVaCreateManagedWidget(
00302 "AFNI" , xmSeparatorWidgetClass , toprc ,
00303 XmNseparatorType , XmSHADOW_ETCHED_IN ,
00304 XmNshadowThickness, 2 ,
00305 XmNleftAttachment , XmATTACH_FORM ,
00306 XmNrightAttachment, XmATTACH_FORM ,
00307 XmNtopAttachment , XmATTACH_WIDGET ,
00308 XmNtopWidget , ttc->meth_av->wrowcol ,
00309 XmNtopOffset , 1 ,
00310 NULL ) ;
00311
00312
00313
00314 ttc->scrollw =
00315 XtVaCreateWidget(
00316 "AFNI" , xmScrolledWindowWidgetClass , toprc ,
00317 XmNscrollingPolicy , XmAUTOMATIC ,
00318 XmNwidth , ww+2*hh ,
00319 XmNheight , 3*hh ,
00320 XmNleftAttachment , XmATTACH_FORM ,
00321 XmNrightAttachment , XmATTACH_FORM ,
00322 XmNtopAttachment , XmATTACH_WIDGET ,
00323 XmNbottomAttachment, XmATTACH_FORM ,
00324 XmNtopWidget , separator ,
00325 XmNtopOffset , 3 ,
00326 XmNtraversalOn , False ,
00327 XmNinitialResourcesPersistent , False ,
00328 NULL ) ;
00329
00330 frame =
00331 XtVaCreateWidget(
00332 "AFNI" , xmFrameWidgetClass , ttc->scrollw ,
00333 XmNshadowType , XmSHADOW_ETCHED_IN ,
00334 XmNshadowThickness , 5 ,
00335 XmNtraversalOn , False ,
00336 XmNinitialResourcesPersistent , False ,
00337 NULL ) ;
00338
00339 ttc->workwin =
00340 XtVaCreateWidget(
00341 "AFNI" , xmFormWidgetClass , frame ,
00342 XmNborderWidth , 0 ,
00343 XmNborderColor , 0 ,
00344 XmNtraversalOn , False ,
00345 XmNinitialResourcesPersistent , False ,
00346 NULL ) ;
00347
00348
00349
00350 ttc->reg_num = 0 ;
00351 for( ii=0 ; ii < TTO_COUNT ; ii++ ){
00352
00353 if( strncmp(TTO_list[ii].name,"Left ",6) != 0 ) continue ;
00354 if( TTO_list[ii].tdval == 0 ) continue ;
00355
00356 if( TTO_list[ii].tdlev == 2 ) strcpy(lbuf,"[G] ") ;
00357 else if( TTO_list[ii].tdlev == 4 ) strcpy(lbuf,"[A] ") ;
00358 else continue ;
00359
00360 strcat(lbuf,TTO_list[ii].name+6) ;
00361
00362 ttc->reg_label [ttc->reg_num] = strdup(lbuf) ;
00363 ttc->reg_tto [ttc->reg_num] = ii ;
00364 ttc->reg_ttbrik[ttc->reg_num] = (TTO_list[ii].tdlev==2) ? 0 : 1 ;
00365 ttc->reg_ttval [ttc->reg_num] = TTO_list[ii].tdval ;
00366 ttc->reg_ttovc [ttc->reg_num] = 0 ;
00367
00368
00369
00370
00371
00372 if( ttc->reg_num < NUM_AV_FIRST ){
00373 ttc->reg_av[ttc->reg_num] =
00374 new_MCW_colormenu(
00375 ttc->workwin ,
00376 ttc->reg_label[ttc->reg_num] ,
00377 dc ,
00378 0 ,
00379 dc->ovc->ncol_ov - 1 ,
00380 0 ,
00381 TTRR_av_CB,NULL
00382 ) ;
00383
00384 XtVaSetValues( ttc->reg_av[ttc->reg_num]->wrowcol ,
00385 XmNleftAttachment , XmATTACH_FORM ,
00386 XmNtopAttachment , (ttc->reg_num==0)
00387 ? XmATTACH_FORM
00388 : XmATTACH_WIDGET ,
00389 XmNtopWidget , (ttc->reg_num==0)
00390 ? NULL
00391 : ttc->reg_av[ttc->reg_num-1]->wrowcol ,
00392 XmNrightAttachment , XmATTACH_FORM ,
00393 NULL ) ;
00394 }
00395
00396 ttc->reg_num++ ;
00397 }
00398
00399
00400
00401 XtManageChild( ttc->workwin ) ;
00402 XtManageChild( frame ) ;
00403 XtManageChild( ttc->scrollw ) ;
00404 XtManageChild( toprc ) ;
00405 XtRealizeWidget( ttc->shell ) ;
00406
00407 WATCH_cursorize( ttc->shell ) ;
00408 XmUpdateDisplay( ttc->shell ) ;
00409
00410
00411
00412 #define LUCK 5
00413 #define CMMAX 17
00414
00415 MCW_widget_geom( ttc->reg_av[0]->wrowcol , &ww , &hh , NULL,NULL ) ;
00416
00417 XtVaGetValues( ttc->scrollw , XmNverticalScrollBar , &bar , NULL ) ;
00418 MCW_widget_geom( bar , &bww , NULL,NULL,NULL ) ;
00419
00420 hh = CMMAX*hh + LUCK ;
00421 ww += bww + 5*LUCK ;
00422
00423
00424
00425
00426 MCW_widget_geom( ttc->meth_av->wrowcol , &ii , NULL,NULL,NULL ) ;
00427 MCW_widget_geom( ttc->hemi_av->wrowcol , &bww , NULL,NULL,NULL ) ;
00428 bww += ii + LUCK ;
00429 if( ww < bww ) ww = bww ;
00430
00431 XtVaSetValues( ttc->shell , XmNwidth , ww , XmNheight , hh , NULL ) ;
00432 XmUpdateDisplay( ttc->shell ) ;
00433
00434
00435
00436
00437 for( ii=NUM_AV_FIRST ; ii < ttc->reg_num ; ii++ ){
00438 ttc->reg_av[ii] =
00439 new_MCW_colormenu(
00440 ttc->workwin ,
00441 ttc->reg_label[ii] ,
00442 dc ,
00443 0 ,
00444 dc->ovc->ncol_ov - 1 ,
00445 0 ,
00446 NULL,NULL
00447 ) ;
00448
00449 XtVaSetValues( ttc->reg_av[ii]->wrowcol ,
00450 XmNleftAttachment , XmATTACH_FORM ,
00451 XmNtopAttachment , XmATTACH_WIDGET ,
00452 XmNtopWidget , ttc->reg_av[ii-1]->wrowcol ,
00453 XmNrightAttachment , XmATTACH_FORM ,
00454 NULL ) ;
00455
00456 XtRealizeWidget( ttc->reg_av[ii]->wrowcol ) ;
00457
00458 if( ii%NUM_AV_FIRST == 0 )
00459 XmUpdateDisplay( ttc->shell ) ;
00460 }
00461
00462 PLUTO_cursorize( ttc->shell ) ;
00463
00464
00465
00466 ept = getenv( "AFNI_TTRR_SETUP" ) ;
00467 if( ept != NULL ) TTRR_load_file( ept ) ;
00468
00469
00470
00471 SHOW_AFNI_READY ; EXRETURN ;
00472 }
00473
00474
00475
00476
00477
00478 void TTRR_popup( Three_D_View * im3d )
00479 {
00480 ENTRY("TTRR_popup") ;
00481
00482 if( ttc == NULL ) TTRR_setup_widgets( im3d->dc ) ;
00483
00484 ttc->im3d = im3d ;
00485 XtMapWidget( ttc->shell ) ;
00486
00487 EXRETURN ;
00488 }
00489
00490
00491
00492
00493
00494 static void TTRR_av_CB( MCW_arrowval * av , XtPointer cd )
00495 {
00496 if( !ttc->av_invert || av == NULL || av->ival == av->old_ival ) return ;
00497
00498 if( av->ival == 0 ||
00499 (av->ival != 0 && av->old_ival == 0) ) MCW_invert_widget(av->wrowcol);
00500
00501 return ;
00502 }
00503
00504
00505
00506
00507
00508 static void TTRR_action_CB( Widget w , XtPointer cd , XtPointer cbs )
00509 {
00510 char * wname = XtName(w) ;
00511 int ii ;
00512
00513 ENTRY("TTRR_action_CB") ;
00514
00515 if( strcmp(wname,TTRR_help_label) == 0 ){
00516
00517 new_MCW_textwin( w , helpstring , TEXT_READONLY ) ;
00518
00519 } else if( strcmp(wname,TTRR_done_label) == 0 ){
00520
00521 TTRR_delete_window_CB(NULL,NULL,NULL) ;
00522
00523 } else if( strcmp(wname,TTRR_clear_label) == 0 ){
00524
00525
00526
00527 for( ii=0 ; ii < ttc->reg_num ; ii++ ){
00528 if( ttc->reg_av[ii]->ival != 0 ){
00529 AV_assign_ival( ttc->reg_av[ii] , 0 ) ;
00530
00531 if( ttc->av_invert && ttc->reg_av[ii]->old_ival != 0 )
00532 MCW_invert_widget(ttc->reg_av[ii]->wrowcol);
00533 }
00534 }
00535
00536 } else if( strcmp(wname,TTRR_redraw_label) == 0 ){
00537
00538 BEEPIT ;
00539
00540 } else if( strcmp(wname,TTRR_load_label) == 0 ){
00541
00542 MCW_choose_string( w , "Filename to load" , NULL ,
00543 TTRR_load_CB , NULL ) ;
00544
00545 } else if( strcmp(wname,TTRR_save_label) == 0 ){
00546
00547 MCW_choose_string( w , "Filename to save" , NULL ,
00548 TTRR_save_CB , NULL ) ;
00549 }
00550
00551 EXRETURN ;
00552 }
00553
00554
00555
00556
00557
00558
00559 static void TTRR_delete_window_CB( Widget w , XtPointer cd , XtPointer cbs )
00560 {
00561 ENTRY("TTRR_delete_window_CB") ;
00562
00563 if( ttc != NULL ){
00564 XtUnmapWidget(ttc->shell) ;
00565 XmUpdateDisplay(ttc->shell) ;
00566 }
00567 EXRETURN ;
00568 }
00569
00570
00571
00572
00573
00574
00575 static TTRR_params *ttp = NULL ;
00576
00577 TTRR_params * TTRR_get_params(void)
00578 {
00579 int ii,jj ;
00580
00581 ENTRY("TTRR_get_params") ;
00582
00583 if( ttc == NULL ) RETURN(NULL) ;
00584
00585 if( ttc->meth_av->ival == TTRR_METH_OFF ) RETURN(NULL) ;
00586
00587
00588
00589 if( ttp == NULL ){
00590 ttp = myXtNew(TTRR_params) ;
00591 ttp->ttbrik = (byte *) malloc(sizeof(byte)*ttc->reg_num) ;
00592 ttp->ttval = (byte *) malloc(sizeof(byte)*ttc->reg_num) ;
00593 ttp->ttovc = (byte *) malloc(sizeof(byte)*ttc->reg_num) ;
00594 }
00595
00596
00597
00598 ttp->meth = ttc->meth_av->ival ;
00599 ttp->hemi = ttc->hemi_av->ival ;
00600
00601
00602
00603 for( ii=jj=0 ; ii < ttc->reg_num ; ii++ ){
00604 ttc->reg_ttovc[ii] = ttc->reg_av[ii]->ival ;
00605 if( ttc->reg_ttovc[ii] > 0 ){
00606 ttp->ttbrik[jj] = (byte) ttc->reg_ttbrik[ii] ;
00607 ttp->ttval [jj] = (byte) ttc->reg_ttval [ii] ;
00608 ttp->ttovc [jj] = (byte) ttc->reg_ttovc [ii] ;
00609 jj++ ;
00610 }
00611 }
00612
00613 ttp->num = jj ;
00614 RETURN(ttp) ;
00615 }
00616
00617
00618
00619 static void TTRR_load_file( char * fname )
00620 {
00621 FILE *fp = fopen(fname,"r") ;
00622
00623 #define NLBUF 1024
00624 if( fp != NULL ){
00625 char lbuf[NLBUF], **stok , *name, *color, *ept ;
00626 int ns , ic , ii ;
00627
00628 while(1){
00629 ept = fgets( lbuf , NLBUF , fp ) ;
00630 if( ept == NULL ) break ;
00631 stok = NULL ;
00632 ns = breakup_string( lbuf , &stok ) ;
00633 if( ns <= 0 || stok == NULL ) continue ;
00634 if( ns == 1 ){ freeup_strings(ns,stok); continue; }
00635 if( stok[0][0] == '#' ||
00636 (stok[0][0] == '/' && stok[0][1] == '/') )
00637 { freeup_strings(ns,stok); continue; }
00638 name = stok[0] ;
00639 if( ns == 2 ) color = stok[1] ;
00640 else color = stok[2] ;
00641 ic = DC_find_overlay_color( ttc->dc , color ) ;
00642 if( ic < 0 ){ freeup_strings(ns,stok); continue; }
00643
00644
00645
00646 for( ii=0 ; ii < ttc->reg_num ; ii++ ){
00647 if( ig_strstr( ttc->reg_label[ii], name, "._ " ) != NULL ){
00648 AV_assign_ival( ttc->reg_av[ii] , ic ) ;
00649 }
00650 }
00651
00652 freeup_strings(ns,stok) ;
00653 }
00654
00655 fclose(fp) ;
00656 }
00657
00658 return ;
00659 }
00660
00661
00662
00663
00664 static void TTRR_load_CB( Widget w , XtPointer cd , MCW_choose_cbs * cbs )
00665 {
00666 if( cbs->reason != mcwCR_string ||
00667 cbs->cval == NULL || strlen(cbs->cval) == 0 ){
00668
00669 PLUTO_beep() ; return ;
00670 }
00671
00672 if( !THD_is_file(cbs->cval) ){ PLUTO_beep(); return; }
00673
00674 TTRR_load_file( cbs->cval ) ; return ;
00675 }
00676
00677
00678
00679 static void TTRR_save_CB( Widget w , XtPointer cd , MCW_choose_cbs * cbs )
00680 {
00681 int ii , qq , jj ;
00682 FILE *fp ;
00683 char name[128] , *color ;
00684
00685 if( cbs->reason != mcwCR_string ||
00686 cbs->cval == NULL || strlen(cbs->cval) == 0 ){
00687
00688 PLUTO_beep() ; return ;
00689 }
00690
00691 fp = fopen( cbs->cval , "w" ) ;
00692 if( fp == NULL ){ PLUTO_beep(); return; }
00693
00694 for( ii=0 ; ii < ttc->reg_num ; ii++ ){
00695 color = ttc->dc->ovc->label_ov[ttc->reg_av[ii]->ival] ;
00696 qq = (ttc->reg_label[ii][0] == '[') ? 4 : 0 ;
00697 strcpy(name,ttc->reg_label[ii]+qq) ;
00698 qq = strlen(name) ;
00699 for( jj=0 ; jj < qq ; jj++ ){
00700 if( name[jj] == '.' ) name[jj] = ' ' ;
00701 else if( name[jj] == ' ' ) name[jj] = '_' ;
00702 }
00703 fprintf(fp, "%s = %s\n",name,color) ;
00704 }
00705 fclose(fp) ; return ;
00706 }