00001
00002
00003
00004
00005
00006
00007 #undef MAIN
00008
00009 #include "afni.h"
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 int AFNI_receive_init( Three_D_View * im3d , int rmask ,
00094 gen_func * cb , void * cb_data , char * cbname )
00095 {
00096 int ir ;
00097
00098 ENTRY("AFNI_receive_init") ;
00099
00100
00101
00102 if( ! IM3D_VALID(im3d) ||
00103 cb == NULL ||
00104 (rmask & RECEIVE_ALL_MASK) == 0 ) RETURN(-1) ;
00105
00106 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ )
00107 if( im3d->vinfo->receiver[ir] == NULL ) break ;
00108
00109 if( ir == im3d->vinfo->num_receiver ){
00110 #if 0
00111 fprintf(stderr,"AFNI_receive_init AFREALL() with ir=%d num_receiver=%d\n",
00112 ir,im3d->vinfo->num_receiver ) ;
00113 #endif
00114 im3d->vinfo->receiver = AFREALL( im3d->vinfo->receiver, AFNI_receiver *, ir+1 );
00115 im3d->vinfo->num_receiver ++ ;
00116 }
00117 im3d->vinfo->receiver[ir] = AFMALL( AFNI_receiver, sizeof(AFNI_receiver)) ;
00118
00119 im3d->vinfo->receiver[ir]->receiver_func = cb ;
00120 im3d->vinfo->receiver[ir]->receiver_mask = rmask ;
00121 im3d->vinfo->receiver[ir]->receiver_data = cb_data ;
00122
00123 im3d->vinfo->receiver[ir]->receiver_funcname =
00124 strdup( (cbname != NULL) ? cbname : "[unknown func]" ) ;
00125
00126 AFNI_toggle_drawing( im3d ) ;
00127
00128 RETURN(ir) ;
00129 }
00130
00131
00132
00133
00134
00135 void AFNI_receive_destroy( Three_D_View * im3d )
00136 {
00137 int ir ;
00138
00139 ENTRY("AFNI_receive_destroy") ;
00140
00141 if( !IM3D_VALID(im3d) ) EXRETURN ;
00142
00143 if( im3d->vinfo->receiver != NULL && im3d->vinfo->num_receiver > 0 ){
00144
00145 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ ){
00146
00147 if( im3d->vinfo->receiver[ir] != NULL ){
00148 #if 0
00149 im3d->vinfo->receiver[ir]->receiver_func(
00150 RECEIVE_CLOSURE , 0 , NULL ,
00151 im3d->vinfo->receiver[ir]->receiver_data ) ;
00152 #else
00153 AFNI_CALL_VOID_4ARG( im3d->vinfo->receiver[ir]->receiver_func ,
00154 int,RECEIVE_CLOSURE , int,0 ,
00155 void *,NULL ,
00156 void *,im3d->vinfo->receiver[ir]->receiver_data ) ;
00157 #endif
00158
00159 if( im3d->vinfo->receiver[ir]->receiver_funcname != NULL )
00160 free( im3d->vinfo->receiver[ir]->receiver_funcname ) ;
00161 free( im3d->vinfo->receiver[ir] ) ;
00162 im3d->vinfo->receiver[ir] = NULL ;
00163 }
00164 }
00165
00166 im3d->vinfo->num_receiver = 0 ;
00167 im3d->vinfo->drawing_enabled = 0 ;
00168 im3d->vinfo->drawing_mode = DRAWING_LINES ;
00169 }
00170
00171 EXRETURN ;
00172 }
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 int AFNI_receive_control( Three_D_View *im3d, int key, int code, void *arg )
00184 {
00185 ENTRY("AFNI_receive_control") ;
00186
00187
00188
00189 if( ! IM3D_VALID(im3d) || im3d->vinfo->receiver == NULL ) RETURN(-1) ;
00190 if( key < 0 || key >= im3d->vinfo->num_receiver ) RETURN(-1) ;
00191 if( im3d->vinfo->receiver[key] == NULL ) RETURN(-1) ;
00192
00193
00194
00195 switch( code ){
00196
00197 default: RETURN(-1) ;
00198
00199 case DRAWNOTICE_STARTUP:{
00200 im3d->vinfo->receiver[key]->receiver_mask |= RECEIVE_DRAWNOTICE_MASK ;
00201 }
00202 break ;
00203
00204 case DRAWNOTICE_SHUTDOWN:{
00205 im3d->vinfo->receiver[key]->receiver_mask &= (RECEIVE_ALL_MASK - RECEIVE_DRAWNOTICE_MASK) ;
00206 }
00207 break ;
00208
00209 case DSETCHANGE_STARTUP:{
00210 im3d->vinfo->receiver[key]->receiver_mask |= RECEIVE_DSETCHANGE_MASK ;
00211 }
00212 break ;
00213
00214 case DSETCHANGE_SHUTDOWN:{
00215 im3d->vinfo->receiver[key]->receiver_mask &= (RECEIVE_ALL_MASK - RECEIVE_DSETCHANGE_MASK) ;
00216 }
00217 break ;
00218
00219 case DRAWING_STARTUP:{
00220 im3d->vinfo->receiver[key]->receiver_mask |= RECEIVE_DRAWING_MASK ;
00221 AFNI_toggle_drawing( im3d ) ;
00222 }
00223 break ;
00224
00225 case DRAWING_SHUTDOWN:{
00226 im3d->vinfo->receiver[key]->receiver_mask &= (RECEIVE_ALL_MASK - RECEIVE_DRAWING_MASK) ;
00227 AFNI_toggle_drawing( im3d ) ;
00228 }
00229 break ;
00230
00231 case DRAWING_OVCINDEX:{
00232 int ind = (int) arg ;
00233
00234 if( ind <= 0 || ind >= im3d->dc->ovc->ncol_ov ){
00235 RETURN(-1) ;
00236 } else {
00237 Pixel ppp = im3d->dc->ovc->pix_ov[ind] ;
00238 drive_MCW_imseq( im3d->s123, isqDR_button2_pixel, (XtPointer)ppp ) ;
00239 drive_MCW_imseq( im3d->s231, isqDR_button2_pixel, (XtPointer)ppp ) ;
00240 drive_MCW_imseq( im3d->s312, isqDR_button2_pixel, (XtPointer)ppp ) ;
00241 im3d->vinfo->drawing_pixel = ppp ;
00242 }
00243 }
00244 break ;
00245
00246 case DRAWING_X11PIXEL:{
00247 Pixel ppp = (Pixel) arg ;
00248 drive_MCW_imseq( im3d->s123, isqDR_button2_pixel, (XtPointer)ppp ) ;
00249 drive_MCW_imseq( im3d->s231, isqDR_button2_pixel, (XtPointer)ppp ) ;
00250 drive_MCW_imseq( im3d->s312, isqDR_button2_pixel, (XtPointer)ppp ) ;
00251 im3d->vinfo->drawing_pixel = ppp ;
00252 }
00253 break ;
00254
00255 case DRAWING_LINES:
00256 case DRAWING_FILL:
00257 case DRAWING_POINTS:
00258 case DRAWING_NODRAW:{
00259 im3d->vinfo->drawing_mode = code ;
00260 drive_MCW_imseq( im3d->s123, isqDR_button2_mode, (XtPointer)code ) ;
00261 drive_MCW_imseq( im3d->s231, isqDR_button2_mode, (XtPointer)code ) ;
00262 drive_MCW_imseq( im3d->s312, isqDR_button2_mode, (XtPointer)code ) ;
00263 }
00264 break ;
00265
00266 case DRAWING_LINEWIDTH:{
00267 int ww = (int) arg ;
00268 if( ww >= 0 ){
00269 drive_MCW_imseq( im3d->s123, isqDR_button2_width, (XtPointer)ww ) ;
00270 drive_MCW_imseq( im3d->s231, isqDR_button2_width, (XtPointer)ww ) ;
00271 drive_MCW_imseq( im3d->s312, isqDR_button2_width, (XtPointer)ww ) ;
00272 }
00273 }
00274 break ;
00275
00276 case VIEWPOINT_STARTUP:{
00277 im3d->vinfo->receiver[key]->receiver_mask |= RECEIVE_VIEWPOINT_MASK ;
00278 }
00279 break ;
00280
00281 case VIEWPOINT_SHUTDOWN:{
00282 im3d->vinfo->receiver[key]->receiver_mask &= (RECEIVE_ALL_MASK - RECEIVE_VIEWPOINT_MASK) ;
00283 }
00284 break ;
00285
00286 case REDISPLAY_STARTUP:{
00287 im3d->vinfo->receiver[key]->receiver_mask |= RECEIVE_REDISPLAY_MASK ;
00288 }
00289 break ;
00290
00291 case REDISPLAY_SHUTDOWN:{
00292 im3d->vinfo->receiver[key]->receiver_mask &= (RECEIVE_ALL_MASK - RECEIVE_REDISPLAY_MASK) ;
00293 }
00294 break ;
00295
00296 case FUNCDISPLAY_STARTUP:{
00297 im3d->vinfo->receiver[key]->receiver_mask |= RECEIVE_FUNCDISPLAY_MASK ;
00298 }
00299 break ;
00300
00301 case FUNCDISPLAY_SHUTDOWN:{
00302 im3d->vinfo->receiver[key]->receiver_mask &= (RECEIVE_ALL_MASK - RECEIVE_FUNCDISPLAY_MASK) ;
00303 }
00304 break ;
00305
00306 case OVERLAY_STARTUP:{
00307 im3d->vinfo->receiver[key]->receiver_mask |= RECEIVE_OVERLAY_MASK ;
00308 }
00309 break ;
00310
00311 case OVERLAY_SHUTDOWN:{
00312 im3d->vinfo->receiver[key]->receiver_mask &= (RECEIVE_ALL_MASK - RECEIVE_OVERLAY_MASK) ;
00313 }
00314 break ;
00315
00316 case TIMEINDEX_STARTUP:{
00317 im3d->vinfo->receiver[key]->receiver_mask |= RECEIVE_TIMEINDEX_MASK ;
00318 }
00319 break ;
00320
00321 case TIMEINDEX_SHUTDOWN:{
00322 im3d->vinfo->receiver[key]->receiver_mask &= (RECEIVE_ALL_MASK - RECEIVE_TIMEINDEX_MASK) ;
00323 }
00324 break ;
00325
00326 case EVERYTHING_SHUTDOWN:{
00327 im3d->vinfo->receiver[key]->receiver_mask = 0 ;
00328 AFNI_toggle_drawing( im3d ) ;
00329 }
00330 break ;
00331
00332 }
00333
00334
00335
00336 if( im3d->vinfo->receiver[key]->receiver_mask == 0 ){
00337 int ir , nn=0 ;
00338
00339 if( im3d->vinfo->receiver[key]->receiver_funcname != NULL )
00340 free( im3d->vinfo->receiver[key]->receiver_funcname ) ;
00341
00342 free( im3d->vinfo->receiver[key] ) ;
00343 im3d->vinfo->receiver[key] = NULL ;
00344
00345 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ )
00346 if( im3d->vinfo->receiver[ir] != NULL ) nn++ ;
00347
00348 if( nn == 0 ) im3d->vinfo->num_receiver = 0 ;
00349 }
00350
00351 RETURN(0) ;
00352 }
00353
00354
00355
00356
00357
00358 void AFNI_toggle_drawing( Three_D_View * im3d )
00359 {
00360 int turn_on = 0 ;
00361
00362 ENTRY("AFNI_toggle_drawing") ;
00363
00364 if( ! IM3D_OPEN(im3d) ) EXRETURN ;
00365
00366
00367
00368 if( im3d->vinfo->receiver != NULL ){
00369 int ir ;
00370 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ )
00371 if( im3d->vinfo->receiver[ir] != NULL &&
00372 (im3d->vinfo->receiver[ir]->receiver_mask & RECEIVE_DRAWING_MASK) )
00373 turn_on++ ;
00374 }
00375 im3d->vinfo->drawing_enabled = (turn_on != 0) ;
00376
00377 if( ! im3d->vinfo->drawing_enabled ){
00378
00379
00380
00381 drive_MCW_imseq( im3d->s123 , isqDR_button2_disable , NULL ) ;
00382 drive_MCW_imseq( im3d->s231 , isqDR_button2_disable , NULL ) ;
00383 drive_MCW_imseq( im3d->s312 , isqDR_button2_disable , NULL ) ;
00384
00385 drive_MCW_grapher( im3d->g123 , graDR_button2_disable , NULL ) ;
00386 drive_MCW_grapher( im3d->g231 , graDR_button2_disable , NULL ) ;
00387 drive_MCW_grapher( im3d->g312 , graDR_button2_disable , NULL ) ;
00388
00389 } else {
00390
00391
00392
00393 drive_MCW_imseq( im3d->s123 , isqDR_button2_enable , NULL ) ;
00394 drive_MCW_imseq( im3d->s231 , isqDR_button2_enable , NULL ) ;
00395 drive_MCW_imseq( im3d->s312 , isqDR_button2_enable , NULL ) ;
00396
00397 if( im3d->vinfo->drawing_pixel > 0 ){
00398 drive_MCW_imseq( im3d->s123, isqDR_button2_pixel,
00399 (XtPointer)im3d->vinfo->drawing_pixel ) ;
00400 drive_MCW_imseq( im3d->s231, isqDR_button2_pixel,
00401 (XtPointer)im3d->vinfo->drawing_pixel ) ;
00402 drive_MCW_imseq( im3d->s312, isqDR_button2_pixel,
00403 (XtPointer)im3d->vinfo->drawing_pixel ) ;
00404 }
00405
00406 drive_MCW_imseq( im3d->s123, isqDR_button2_mode,
00407 (XtPointer)im3d->vinfo->drawing_mode ) ;
00408 drive_MCW_imseq( im3d->s231, isqDR_button2_mode,
00409 (XtPointer)im3d->vinfo->drawing_mode ) ;
00410 drive_MCW_imseq( im3d->s312, isqDR_button2_mode,
00411 (XtPointer)im3d->vinfo->drawing_mode ) ;
00412
00413 drive_MCW_grapher( im3d->g123 , graDR_button2_enable , NULL ) ;
00414 drive_MCW_grapher( im3d->g231 , graDR_button2_enable , NULL ) ;
00415 drive_MCW_grapher( im3d->g312 , graDR_button2_enable , NULL ) ;
00416
00417 }
00418
00419 EXRETURN ;
00420 }
00421
00422
00423
00424
00425
00426
00427 void AFNI_process_alteration( Three_D_View * im3d )
00428 {
00429 int ir ;
00430
00431 ENTRY("AFNI_process_alteration") ;
00432
00433 if( !IM3D_VALID(im3d) || im3d->vinfo->receiver == NULL ||
00434 im3d->vinfo->num_receiver == 0 ) EXRETURN ;
00435
00436 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ ){
00437 if( im3d->vinfo->receiver[ir] != NULL ){
00438 STATUS(im3d->vinfo->receiver[ir]->receiver_funcname) ;
00439 #if 0
00440 im3d->vinfo->receiver[ir]->receiver_func(
00441 RECEIVE_ALTERATION , 0 , NULL ,
00442 im3d->vinfo->receiver[ir]->receiver_data ) ;
00443 #else
00444 AFNI_CALL_VOID_4ARG( im3d->vinfo->receiver[ir]->receiver_func ,
00445 int,RECEIVE_ALTERATION , int,0 ,
00446 void *,NULL ,
00447 void *,im3d->vinfo->receiver[ir]->receiver_data ) ;
00448 #endif
00449 }
00450 }
00451
00452 EXRETURN ;
00453 }
00454
00455
00456
00457
00458
00459 void AFNI_process_drawnotice( Three_D_View * im3d )
00460 {
00461 int ir ;
00462
00463 ENTRY("AFNI_process_drawnotice") ;
00464
00465 if( !IM3D_VALID(im3d) || im3d->vinfo->receiver == NULL ||
00466 im3d->vinfo->num_receiver == 0 ) EXRETURN ;
00467
00468 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ ){
00469
00470 if( im3d->vinfo->receiver[ir] != NULL &&
00471 (im3d->vinfo->receiver[ir]->receiver_mask & RECEIVE_DRAWNOTICE_MASK) ){
00472
00473 STATUS(im3d->vinfo->receiver[ir]->receiver_funcname) ;
00474 #if 0
00475 im3d->vinfo->receiver[ir]->receiver_func(
00476 RECEIVE_DRAWNOTICE , 0 , NULL ,
00477 im3d->vinfo->receiver[ir]->receiver_data ) ;
00478 #else
00479 AFNI_CALL_VOID_4ARG( im3d->vinfo->receiver[ir]->receiver_func ,
00480 int,RECEIVE_DRAWNOTICE , int,0 ,
00481 void *,NULL ,
00482 void *,im3d->vinfo->receiver[ir]->receiver_data ) ;
00483 #endif
00484 }
00485 }
00486
00487 EXRETURN ;
00488 }
00489
00490
00491
00492
00493
00494 void AFNI_process_dsetchange( Three_D_View * im3d )
00495 {
00496 int ir ;
00497
00498 ENTRY("AFNI_process_dsetchange") ;
00499
00500 if( !IM3D_VALID(im3d) || im3d->vinfo->receiver == NULL ||
00501 im3d->vinfo->num_receiver == 0 ) EXRETURN ;
00502
00503 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ ){
00504
00505 if( im3d->vinfo->receiver[ir] != NULL &&
00506 (im3d->vinfo->receiver[ir]->receiver_mask & RECEIVE_DSETCHANGE_MASK) ){
00507
00508 STATUS(im3d->vinfo->receiver[ir]->receiver_funcname) ;
00509 #if 0
00510 im3d->vinfo->receiver[ir]->receiver_func(
00511 RECEIVE_DSETCHANGE , 0 , NULL ,
00512 im3d->vinfo->receiver[ir]->receiver_data ) ;
00513 #else
00514 AFNI_CALL_VOID_4ARG( im3d->vinfo->receiver[ir]->receiver_func ,
00515 int,RECEIVE_DSETCHANGE , int,0 ,
00516 void *,NULL ,
00517 void *,im3d->vinfo->receiver[ir]->receiver_data ) ;
00518 #endif
00519 }
00520 }
00521
00522 EXRETURN ;
00523 }
00524
00525
00526
00527
00528
00529 void AFNI_process_viewpoint( Three_D_View * im3d )
00530 {
00531 int ir , ijk[3] ;
00532
00533 ENTRY("AFNI_process_viewpoint") ;
00534
00535 if( !IM3D_VALID(im3d) || im3d->vinfo->receiver == NULL ||
00536 im3d->vinfo->num_receiver == 0 ) EXRETURN ;
00537
00538 ijk[0] = im3d->vinfo->i1 ;
00539 ijk[1] = im3d->vinfo->j2 ;
00540 ijk[2] = im3d->vinfo->k3 ;
00541
00542 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ ){
00543 if( im3d->vinfo->receiver[ir] != NULL &&
00544 (im3d->vinfo->receiver[ir]->receiver_mask & RECEIVE_VIEWPOINT_MASK) ){
00545
00546 STATUS(im3d->vinfo->receiver[ir]->receiver_funcname) ;
00547 #if 0
00548 im3d->vinfo->receiver[ir]->receiver_func(
00549 RECEIVE_VIEWPOINT , 3 , ijk ,
00550 im3d->vinfo->receiver[ir]->receiver_data ) ;
00551 #else
00552 AFNI_CALL_VOID_4ARG( im3d->vinfo->receiver[ir]->receiver_func ,
00553 int,RECEIVE_VIEWPOINT , int,3 ,
00554 void *,ijk ,
00555 void *,im3d->vinfo->receiver[ir]->receiver_data ) ;
00556 #endif
00557 }
00558 }
00559
00560 EXRETURN ;
00561 }
00562
00563
00564
00565
00566
00567 void AFNI_process_timeindex( Three_D_View * im3d )
00568 {
00569 int ir ;
00570
00571 ENTRY("AFNI_process_timeindex") ;
00572
00573 if( !IM3D_VALID(im3d) || im3d->vinfo->receiver == NULL ||
00574 im3d->vinfo->num_receiver == 0 ) EXRETURN ;
00575
00576 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ ){
00577 if( im3d->vinfo->receiver[ir] != NULL &&
00578 (im3d->vinfo->receiver[ir]->receiver_mask & RECEIVE_TIMEINDEX_MASK) ){
00579
00580 STATUS(im3d->vinfo->receiver[ir]->receiver_funcname) ;
00581 #if 0
00582 im3d->vinfo->receiver[ir]->receiver_func(
00583 RECEIVE_TIMEINDEX , 0 , NULL ,
00584 im3d->vinfo->receiver[ir]->receiver_data ) ;
00585 #else
00586 AFNI_CALL_VOID_4ARG( im3d->vinfo->receiver[ir]->receiver_func ,
00587 int,RECEIVE_TIMEINDEX , int,0 ,
00588 void *,NULL ,
00589 void *,im3d->vinfo->receiver[ir]->receiver_data ) ;
00590 #endif
00591 }
00592 }
00593
00594 EXRETURN ;
00595 }
00596
00597
00598
00599
00600
00601 void AFNI_process_redisplay( Three_D_View * im3d )
00602 {
00603 int ir ;
00604
00605 ENTRY("AFNI_process_redisplay") ;
00606
00607 if( !IM3D_VALID(im3d) || im3d->vinfo->receiver == NULL ||
00608 im3d->vinfo->num_receiver == 0 ) EXRETURN ;
00609
00610 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ ){
00611 if( im3d->vinfo->receiver[ir] != NULL &&
00612 (im3d->vinfo->receiver[ir]->receiver_mask & RECEIVE_REDISPLAY_MASK) ){
00613
00614 STATUS(im3d->vinfo->receiver[ir]->receiver_funcname) ;
00615 #if 0
00616 im3d->vinfo->receiver[ir]->receiver_func(
00617 RECEIVE_REDISPLAY , 0 , NULL ,
00618 im3d->vinfo->receiver[ir]->receiver_data ) ;
00619 #else
00620 AFNI_CALL_VOID_4ARG( im3d->vinfo->receiver[ir]->receiver_func ,
00621 int,RECEIVE_REDISPLAY , int,0 ,
00622 void *,NULL ,
00623 void *,im3d->vinfo->receiver[ir]->receiver_data ) ;
00624 #endif
00625 }
00626 }
00627
00628 EXRETURN ;
00629 }
00630
00631
00632
00633
00634
00635 void AFNI_process_funcdisplay( Three_D_View * im3d )
00636 {
00637 int ir ;
00638
00639 ENTRY("AFNI_process_funcdisplay") ;
00640
00641 if( !IM3D_VALID(im3d) || im3d->vinfo->receiver == NULL ||
00642 im3d->vinfo->num_receiver == 0 ) EXRETURN ;
00643
00644 for( ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ ){
00645 if( im3d->vinfo->receiver[ir] != NULL &&
00646 (im3d->vinfo->receiver[ir]->receiver_mask & RECEIVE_FUNCDISPLAY_MASK) ){
00647
00648 STATUS(im3d->vinfo->receiver[ir]->receiver_funcname) ;
00649 #if 0
00650 im3d->vinfo->receiver[ir]->receiver_func(
00651 RECEIVE_FUNCDISPLAY , 0 , NULL ,
00652 im3d->vinfo->receiver[ir]->receiver_data ) ;
00653 #else
00654 AFNI_CALL_VOID_4ARG( im3d->vinfo->receiver[ir]->receiver_func ,
00655 int,RECEIVE_FUNCDISPLAY , int,0 ,
00656 void *,NULL ,
00657 void *,im3d->vinfo->receiver[ir]->receiver_data ) ;
00658 #endif
00659 }
00660 }
00661
00662 EXRETURN ;
00663 }
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683 void AFNI_process_drawing( Three_D_View *im3d , int mode ,
00684 int npts , int *xd , int *yd , int *zd )
00685 {
00686 int ii , nn , ir , nsent ;
00687 int *vp[4] , *xn=NULL , *yn=NULL , *zn=NULL ;
00688
00689 ENTRY("AFNI_process_drawing") ;
00690
00691 if( !IM3D_VALID(im3d) || im3d->vinfo->receiver == NULL ||
00692 im3d->vinfo->num_receiver == 0 ||
00693 npts < 0 || im3d->vinfo->drawing_enabled == 0 ) EXRETURN ;
00694
00695 if(PRINT_TRACING){
00696 char str[256] ; sprintf(str,"received %d points",npts) ; STATUS(str) ;
00697 }
00698
00699
00700
00701
00702 if( im3d->vinfo->drawing_mode == DRAWING_POINTS ||
00703 im3d->vinfo->drawing_mode == DRAWING_NODRAW || npts <= 1 ){
00704
00705 xn = xd ; yn = yd ; zn = zd ; nn = npts ;
00706 }
00707
00708
00709
00710
00711 else if( im3d->vinfo->drawing_mode == DRAWING_LINES ){
00712
00713 AFNI_3d_linefill( npts , xd,yd,zd , &nn , &xn , &yn , &zn ) ;
00714 }
00715
00716
00717
00718 else if( im3d->vinfo->drawing_mode == DRAWING_FILL ){
00719
00720
00721
00722
00723 AFNI_3d_linefill( npts , xd,yd,zd , &nn , &xn , &yn , &zn ) ;
00724 }
00725
00726
00727
00728 #if 0
00729 fprintf(stderr,"Sending %d points to receiver\n",nn) ;
00730 #endif
00731
00732 vp[3] = &mode ;
00733
00734 vp[0] = xn ; vp[1] = yn ; vp[2] = zn ;
00735
00736 for( nsent=ir=0 ; ir < im3d->vinfo->num_receiver ; ir++ ){
00737
00738 if( im3d->vinfo->receiver[ir] != NULL &&
00739 (im3d->vinfo->receiver[ir]->receiver_mask & RECEIVE_DRAWING_MASK) ){
00740
00741 STATUS(im3d->vinfo->receiver[ir]->receiver_funcname) ;
00742 #if 0
00743 im3d->vinfo->receiver[ir]->receiver_func(
00744 RECEIVE_POINTS , nn ,
00745 (void *) vp , im3d->vinfo->receiver[ir]->receiver_data ) ;
00746 #else
00747 AFNI_CALL_VOID_4ARG( im3d->vinfo->receiver[ir]->receiver_func ,
00748 int,RECEIVE_POINTS , int,nn ,
00749 void *,vp ,
00750 void *,im3d->vinfo->receiver[ir]->receiver_data ) ;
00751 #endif
00752 nsent++ ;
00753 }
00754 }
00755
00756
00757
00758 if( nsent > 0 ) AFNI_process_drawnotice( im3d ) ;
00759
00760
00761
00762 if( xn != xd ){ free(xn); free(yn); free(zn); }
00763 EXRETURN ;
00764 }
00765
00766
00767
00768
00769
00770
00771
00772 void AFNI_3d_linefill( int nin , int * xin , int * yin , int * zin ,
00773 int * nout , int ** xout , int ** yout , int ** zout )
00774 {
00775 int * xut , * yut , * zut ;
00776 int nut , iin , jout , nall ;
00777 int x1,y1,z1 , x2,y2,z2 , dx,dy,dz , adx,ady,adz , xlast,ylast,zlast ;
00778 float fdxyz , fdx,fdy,fdz , fx,fy,fz ;
00779
00780 ENTRY("AFNI_3d_linefill") ;
00781
00782
00783
00784 if( nin <= 0 || xin == NULL || yin == NULL || zin == NULL ){
00785 *nout = 0 ; *xout = *yout = *zout = NULL ; EXRETURN ;
00786 }
00787
00788
00789
00790 if( nin == 1 ){
00791 nut = 1 ; *nout = nut ;
00792 xut = (int *) malloc(sizeof(int)) ; xut[0] = xin[0] ; *xout = xut ;
00793 yut = (int *) malloc(sizeof(int)) ; yut[0] = yin[0] ; *yout = yut ;
00794 zut = (int *) malloc(sizeof(int)) ; zut[0] = zin[0] ; *zout = zut ;
00795 EXRETURN ;
00796 }
00797
00798
00799
00800 nall = nin ;
00801 xut = (int *) malloc( sizeof(int) * nall ) ;
00802 yut = (int *) malloc( sizeof(int) * nall ) ;
00803 zut = (int *) malloc( sizeof(int) * nall ) ;
00804 nut = 0 ;
00805
00806 #undef ADDPT
00807 #define ADDPT(i,j,k) \
00808 do{ if( nut == nall ){ \
00809 nall += 128 ; \
00810 xut = (int *) realloc( xut , sizeof(int) * nall ) ; \
00811 yut = (int *) realloc( yut , sizeof(int) * nall ) ; \
00812 zut = (int *) realloc( zut , sizeof(int) * nall ) ; \
00813 } \
00814 xut[nut] = xlast = (i) ; \
00815 yut[nut] = ylast = (j) ; \
00816 zut[nut] = zlast = (k) ; nut++ ; } while(0)
00817
00818
00819
00820 x2 = xin[0] ; y2 = yin[0] ; z2 = zin[0] ;
00821 for( iin=0 ; iin < nin-1 ; iin++ ){
00822 x1 = x2 ; y1 = y2 ; z1 = z2 ;
00823 x2 = xin[iin+1] ; y2 = yin[iin+1] ; z2 = zin[iin+1] ;
00824 dx = x2 - x1 ; dy = y2 - y1 ; dz = z2 - z1 ;
00825 adx = abs(dx) ; ady = abs(dy) ; adz = abs(dz) ;
00826
00827
00828
00829 ADDPT(x1,y1,z1) ;
00830
00831
00832
00833 if( adx <= 1 && ady <= 1 && adz <= 1 ) continue ;
00834
00835
00836
00837 #define SFRAC 0.495
00838
00839 fdxyz = adx + ady + adz ;
00840 fdx = SFRAC * dx / fdxyz ;
00841 fdy = SFRAC * dy / fdxyz ;
00842 fdz = SFRAC * dz / fdxyz ;
00843
00844
00845
00846
00847 #if 0
00848 fprintf(stderr,"linefill: from %d %d %d to %d %d %d\n",
00849 x1,y1,z1 , x2,y2,z2 ) ;
00850 #endif
00851
00852 fx = x1+fdx+0.499 ; fy = y1+fdy+0.499 ; fz = z1+fdz+0.499 ;
00853 do {
00854 fx = fx + fdx ; fy = fy + fdy ; fz = fz + fdz ;
00855 x1 = (int) fx ; y1 = (int) fy ; z1 = (int) fz ;
00856
00857 #if 0
00858 fprintf(stderr," at %d %d %d\n",x1,y1,z1) ;
00859 #endif
00860
00861 if( x1 == x2 && y1 == y2 && z1 == z2 ) break ;
00862
00863 if( x1 != xlast || y1 != ylast || z1 != zlast ) ADDPT(x1,y1,z1) ;
00864 } while(1) ;
00865
00866 }
00867
00868 ADDPT(x2,y2,z2) ;
00869
00870 *nout = nut ; *xout = xut ; *yout = yut ; *zout = zut ;
00871 EXRETURN ;
00872 }
00873
00874
00875
00876
00877
00878 void AFNI_ijk_to_xyz( THD_3dim_dataset * dset ,
00879 int ii , int jj , int kk ,
00880 float * xx , float * yy , float * zz )
00881 {
00882 THD_fvec3 fv ;
00883
00884 if( ! ISVALID_DSET(dset) ) return ;
00885
00886 fv = THD_3dind_to_3dmm( dset , TEMP_IVEC3(ii,jj,kk) ) ;
00887 *xx = fv.xyz[0] ;
00888 *yy = fv.xyz[1] ;
00889 *zz = fv.xyz[2] ;
00890 return ;
00891 }
00892
00893 void AFNI_xyz_to_ijk( THD_3dim_dataset * dset ,
00894 float xx , float yy , float zz ,
00895 int * ii , int * jj , int * kk )
00896 {
00897 THD_ivec3 iv ;
00898
00899 if( ! ISVALID_DSET(dset) ) return ;
00900
00901 iv = THD_3dmm_to_3dind ( dset , TEMP_FVEC3(xx,yy,zz) ) ;
00902 *ii = iv.ijk[0] ;
00903 *jj = iv.ijk[1] ;
00904 *kk = iv.ijk[2] ;
00905 return ;
00906 }
00907
00908 void AFNI_xyz_to_dicomm( THD_3dim_dataset * dset ,
00909 float xx , float yy , float zz ,
00910 float * xd , float * yd , float * zd )
00911 {
00912 THD_fvec3 fv ;
00913
00914 if( ! ISVALID_DSET(dset) ) return ;
00915
00916 fv = THD_3dmm_to_dicomm( dset , TEMP_FVEC3(xx,yy,zz) ) ;
00917 *xd = fv.xyz[0] ;
00918 *yd = fv.xyz[1] ;
00919 *zd = fv.xyz[2] ;
00920 return ;
00921 }
00922
00923 void AFNI_dicomm_to_xyz( THD_3dim_dataset * dset ,
00924 float xd , float yd , float zd ,
00925 float * xx , float * yy , float * zz )
00926 {
00927 THD_fvec3 fv ;
00928
00929 if( ! ISVALID_DSET(dset) ) return ;
00930
00931 fv = THD_3dmm_to_dicomm( dset , TEMP_FVEC3(xd,yd,zd) ) ;
00932 *xx = fv.xyz[0] ;
00933 *yy = fv.xyz[1] ;
00934 *zz = fv.xyz[2] ;
00935 return ;
00936 }