00001 #include "SUMA_suma.h"
00002 #define MAIN
00003 #include "../afni.h"
00004 #undef MAIN
00005
00006 #ifdef SUMA_MakeColorMap_STAND_ALONE
00007 #define STAND_ALONE
00008 #elif defined SUMA_ScaleToMap_STAND_ALONE
00009 #define STAND_ALONE
00010 #endif
00011
00012 #ifdef STAND_ALONE
00013
00014 SUMA_SurfaceViewer *SUMAg_cSV;
00015 SUMA_SurfaceViewer *SUMAg_SVv;
00016
00017 int SUMAg_N_SVv = 0;
00018 SUMA_DO *SUMAg_DOv;
00019 int SUMAg_N_DOv = 0;
00020 SUMA_CommonFields *SUMAg_CF;
00021 #else
00022 extern SUMA_CommonFields *SUMAg_CF;
00023 extern SUMA_DO *SUMAg_DOv;
00024 extern SUMA_SurfaceViewer *SUMAg_SVv;
00025 extern int SUMAg_N_SVv;
00026 extern int SUMAg_N_DOv;
00027 #endif
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 SUMA_COLOR_MAP* SUMA_MakeColorMap (float **Fiducials, int Nfid, int Ncols, SUMA_Boolean SkipLast, char *Name)
00063 {
00064 static char FuncName[]={"SUMA_MakeColorMap"};
00065 float **M, dFid[3];
00066 int i, j, Ninter, Ngap, im, Ncolsgood, Npergap;
00067 SUMA_COLOR_MAP * SM;
00068
00069 SUMA_ENTRY;
00070
00071
00072 for (i=0; i < Nfid; ++i) {
00073 for (j=0; j < 3; ++j) {
00074 if (Fiducials[i][j] < 0 || Fiducials[i][j] > 1) {
00075 fprintf (SUMA_STDERR,"Error %s: Fiducial colors must be between 0 & 1 (found %f)\n", FuncName, Fiducials[i][j]);
00076 SUMA_RETURN (NULL);
00077 }
00078 }
00079 }
00080
00081 if (SkipLast) Ninter = Ncols - (Nfid - 1);
00082 else Ninter = Ncols - Nfid;
00083
00084 Ngap = Nfid - 1;
00085
00086
00087 if (Ninter % Ngap) {
00088
00089 if (SkipLast) Ncolsgood = (int)(rint((float)Ninter/Ngap) * Ngap + Nfid + 1);
00090 else Ncolsgood = (int)(rint((float)Ninter/Ngap) * Ngap + Nfid);
00091
00092 fprintf (SUMA_STDERR,"Error %s: The choice of Ncols does not work with the number\nof fiducial colours.\nTry Ncols = %d\n", \
00093 FuncName, Ncolsgood);
00094 SUMA_RETURN (NULL);
00095 }
00096
00097
00098 M = (float **)SUMA_allocate2D (Ncols, 3, sizeof(float));
00099 if (M == NULL) {
00100 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for M.\n", FuncName);
00101 SUMA_RETURN (NULL);
00102 }
00103
00104
00105 im = 0;
00106 Npergap = Ninter / Ngap;
00107
00108 for (i=0; i < Ngap; ++i) {
00109 dFid[0] = (Fiducials[i+1][0] - Fiducials[i][0])/(Npergap+1);
00110 dFid[1] = (Fiducials[i+1][1] - Fiducials[i][1])/(Npergap+1);
00111 dFid[2] = (Fiducials[i+1][2] - Fiducials[i][2])/(Npergap+1);
00112
00113
00114 for (j=0; j < Npergap+1; ++ j) {
00115
00116 if (im < Ncols) {
00117 M[im][0] = Fiducials[i][0] + j*dFid[0];
00118 M[im][1] = Fiducials[i][1] + j*dFid[1];
00119 M[im][2] = Fiducials[i][2] + j*dFid[2];
00120
00121 }
00122
00123 ++im;
00124 }
00125 }
00126 if (!SkipLast) {
00127 M[im][0] = Fiducials[Ngap][0];
00128 M[im][1] = Fiducials[Ngap][1];
00129 M[im][2] = Fiducials[Ngap][2];
00130 }
00131
00132
00133 SM = (SUMA_COLOR_MAP *)SUMA_malloc(sizeof(SUMA_COLOR_MAP));
00134 if (SM == NULL) {
00135 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for SM.\n", FuncName);
00136 SUMA_RETURN (NULL);
00137 }
00138
00139 SM->Name = (char *)SUMA_calloc(strlen(Name)+1, sizeof(char));
00140 if (SM->Name == NULL) {
00141 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for SM->Name.\n", FuncName);
00142 SUMA_RETURN (NULL);
00143 }
00144 sprintf(SM->Name, "%s",Name);
00145 SM->M = M;
00146 SM->N_Col = Ncols;
00147
00148 SM->frac = NULL;
00149 SM->cname = NULL;
00150 SM->Sgn = 0;
00151 SM->SO = NULL;
00152
00153 SUMA_RETURN (SM);
00154 }
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 SUMA_COLOR_MAP* SUMA_MakeColorMap_v2 (float **Fiducials, int Nfid, int *Nint, SUMA_Boolean SkipLast, char *Name)
00185 {
00186 static char FuncName[]={"SUMA_MakeColorMap_v2"};
00187 float **M, dFid[3];
00188 int i, j, im, Ncols;
00189 SUMA_COLOR_MAP * SM;
00190
00191 SUMA_ENTRY;
00192
00193
00194 if (Nint[0]) {
00195 fprintf (SUMA_STDERR,"Error %s: The index of the first color (%d) must be 0, indexing starts at 0 not 1.\n", FuncName, Nint[0]);
00196 SUMA_RETURN (NULL);
00197 }
00198 for (i=0; i < Nfid; ++i) {
00199 for (j=0; j < 3; ++j) {
00200 if (Fiducials[i][j] < 0 || Fiducials[i][j] > 1) {
00201 fprintf (SUMA_STDERR,"Error %s: Fiducial colors must be between 0 & 1 (found %f)\n", FuncName, Fiducials[i][j]);
00202 SUMA_RETURN (NULL);
00203 }
00204 }
00205 }
00206
00207 Ncols = Nint[Nfid-1]+1;
00208
00209 if (SkipLast) Ncols = Ncols - 1;
00210
00211
00212 M = (float **)SUMA_allocate2D (Ncols, 3, sizeof(float));
00213 if (M == NULL) {
00214 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for M.\n", FuncName);
00215 SUMA_RETURN (NULL);
00216 }
00217
00218
00219 im = 0;
00220 for (i=0; i < Nfid-1; ++i) {
00221 dFid[0] = (Fiducials[i+1][0] - Fiducials[i][0])/(Nint[i+1]-Nint[i]);
00222 dFid[1] = (Fiducials[i+1][1] - Fiducials[i][1])/(Nint[i+1]-Nint[i]);
00223 dFid[2] = (Fiducials[i+1][2] - Fiducials[i][2])/(Nint[i+1]-Nint[i]);
00224
00225
00226 for (j=0; j < (Nint[i+1]- Nint[i]); ++ j) {
00227
00228 M[im][0] = Fiducials[i][0] + j*dFid[0];
00229 M[im][1] = Fiducials[i][1] + j*dFid[1];
00230 M[im][2] = Fiducials[i][2] + j*dFid[2];
00231
00232
00233 ++im;
00234 }
00235 }
00236
00237 if (!SkipLast){
00238 M[im][0] = Fiducials[Nfid-1][0];
00239 M[im][1] = Fiducials[Nfid-1][1];
00240 M[im][2] = Fiducials[Nfid-1][2];
00241 }
00242
00243
00244 SM = (SUMA_COLOR_MAP *)SUMA_malloc(sizeof(SUMA_COLOR_MAP));
00245 if (SM == NULL) {
00246 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for SM.\n", FuncName);
00247 SUMA_RETURN (NULL);
00248 }
00249
00250 SM->Name = (char *)SUMA_calloc(strlen(Name)+1, sizeof(char));
00251 if (SM->Name == NULL) {
00252 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for SM->Name.\n", FuncName);
00253 SUMA_RETURN (NULL);
00254 }
00255 sprintf(SM->Name, "%s",Name);
00256 SM->M = M;
00257 SM->N_Col = Ncols;
00258
00259 SM->frac = NULL;
00260 SM->cname = NULL;
00261 SM->Sgn = 0;
00262 SM->SO = NULL;
00263 SUMA_RETURN (SM);
00264 }
00265
00266
00267 void SUMA_Free_ColorMap (SUMA_COLOR_MAP* SM)
00268 {
00269 static char FuncName[]={"SUMA_Free_ColorMap"};
00270 int i = 0;
00271
00272 SUMA_ENTRY;
00273
00274 if (SM->Name) SUMA_free(SM->Name);
00275 if (SM->M) SUMA_free2D((char **)SM->M, SM->N_Col);
00276 if (SM->cname) {
00277 for (i=0; i<SM->N_Col; ++i) { if (SM->cname[i]) SUMA_free(SM->cname[i]); }
00278 SUMA_free(SM->cname);
00279 }
00280 if (SM->frac) SUMA_free(SM->frac);
00281 if (SM->SO) SUMA_Free_Surface_Object(SM->SO);
00282
00283 if (SM) SUMA_free(SM);
00284
00285 SUMA_RETURNe;
00286 }
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299 SUMA_AFNI_COLORS *SUMA_Get_AFNI_Default_Color_Maps ()
00300 {
00301 static char FuncName[]={"SUMA_Get_AFNI_Default_Color_Maps"};
00302 float rgb[3];
00303 SUMA_RGB_NAME *Cv = NULL;
00304 SUMA_COLOR_MAP **CMv=NULL;
00305 SUMA_COLOR_MAP *CMp=NULL, *CMn=NULL;
00306 SUMA_AFNI_COLORS *SAC=NULL;
00307 int i, j, icol;
00308 int N_maps, N_cols;
00309 int ival , ii,jj ;
00310 float fval ;
00311 float pthr[NPANE_MAX+1] ;
00312 int pov[NPANE_MAX+1] ;
00313 char *homeenv=NULL, *sumarc=NULL;
00314 struct stat stbuf;
00315 SUMA_Boolean LocalHead_Detail = NOPE;
00316 SUMA_Boolean LocalHead = NOPE;
00317
00318 SUMA_ENTRY;
00319
00320
00321
00322 N_maps = -1;
00323 N_cols = -1;
00324
00325
00326 Cv = SUMA_Add_Color ("none",
00327 -1.0, -1.0, -1.0, 1.0,
00328 Cv, &N_cols);
00329
00330
00331 for (i=0; i<DEFAULT_NCOLOVR; ++i) {
00332 if (!SUMA_Interpret_AFNIColor (INIT_def_colovr[i], rgb)) {
00333 fprintf(SUMA_STDERR,"Error %s: Failed to interpret color %s : %s\n", FuncName, INIT_def_labovr[i], INIT_def_colovr[i]);
00334 } else {
00335 if (LocalHead_Detail) fprintf(SUMA_STDERR,"%s: Adding color...", FuncName);
00336 Cv = SUMA_Add_Color (INIT_def_labovr[i],
00337 rgb[0], rgb[1], rgb[2], 1.0,
00338 Cv, &N_cols);
00339 }
00340 }
00341
00342
00343
00344
00345 for( ii=NPANE_INIT+1 ; ii <= NPANE_MAX ; ii++ ){
00346 fval = 1.0 / ii ;
00347 pthr[0] = 1.0 ;
00348 pthr[ii] = 0.0 ;
00349 for( jj=1 ; jj < ii ; jj++ ) pthr[jj] = fval * (ii-jj) ;
00350 for( jj=0 ; jj < ii ; jj++ ) pov[jj] = (jj % INIT_ncolovr) + 1 ;
00351
00352 for( jj=0 ; jj <= ii ; jj++ ) INIT_pval_pos[ii][jj] = pthr[jj] ;
00353 for( jj=0 ; jj < ii ; jj++ ) INIT_ovin_pos[ii][jj] = pov[jj] ;
00354 }
00355
00356
00357 for( ii=NPANE_INIT+1 ; ii <= NPANE_MAX ; ii++ ){
00358 fval = 1.0 / ii ;
00359 pthr[0] = 1.0 ;
00360 pthr[ii] = -1.0 ;
00361 for( jj=1 ; jj < ii ; jj++ ) pthr[jj] = fval * (ii-2*jj) ;
00362 for( jj=0 ; jj < ii ; jj++ ) pov[jj] = (jj % INIT_ncolovr) + 1 ;
00363
00364 for( jj=0 ; jj <= ii ; jj++ ) INIT_pval_sgn[ii][jj] = pthr[jj] ;
00365 for( jj=0 ; jj < ii ; jj++ ) INIT_ovin_sgn[ii][jj] = pov[jj] ;
00366 }
00367
00368 #if defined(RGBCYC_COUNT) && RGBCYC_COUNT <= NPANE_MAX
00369 ii = RGBCYC_COUNT ;
00370 for( jj=0 ; jj < ii ; jj++ ) INIT_ovin_pos[ii][jj] = RGBCYC_FIRST+jj+1 ;
00371 for( jj=0 ; jj < ii ; jj++ ) INIT_ovin_sgn[ii][jj] = RGBCYC_FIRST+jj+1 ;
00372 #endif
00373
00374
00375
00376 for (i = NPANE_MIN; i<= NPANE_MAX; ++i) {
00377 CMp = (SUMA_COLOR_MAP *)SUMA_malloc(sizeof(SUMA_COLOR_MAP));
00378 CMn = (SUMA_COLOR_MAP *)SUMA_malloc(sizeof(SUMA_COLOR_MAP));
00379 if (CMp == NULL || CMn == NULL) {
00380 SUMA_SL_Crit ("Failed to allocate for CMp &/| CMn.");
00381 SUMA_RETURN(NULL);
00382 }
00383
00384 CMp->SO = NULL;
00385 CMn->SO = NULL;
00386 CMp->cname = NULL;
00387 CMn->cname = NULL;
00388 CMp->N_Col = i;
00389 CMn->N_Col = i;
00390 CMp->Sgn = 1;
00391 CMn->Sgn = -1;
00392
00393 CMp->Name = (char *)SUMA_calloc(25, sizeof(char));
00394 CMn->Name = (char *)SUMA_calloc(25, sizeof(char));
00395 CMp->frac = (float *)SUMA_calloc(i, sizeof(float));
00396 CMn->frac = (float *)SUMA_calloc(i, sizeof(float));
00397 CMp->M = (float**)SUMA_allocate2D (CMp->N_Col, 3, sizeof(float));
00398 CMn->M = (float**)SUMA_allocate2D (CMn->N_Col, 3, sizeof(float));
00399 if ( CMp->frac == NULL || CMn->frac == NULL
00400 || CMp->M == NULL || CMn->M == NULL
00401 || CMp->Name == NULL || CMn->Name == NULL ) {
00402 SUMA_SL_Crit ("Failed to allocate for fields of CMp &/| CMn.");
00403 SUMA_RETURN (NULL);
00404 }
00405
00406 sprintf(CMp->Name, "afni_p%d",i);
00407 sprintf(CMn->Name, "afni_n%d",i);
00408
00409 if (LocalHead_Detail) fprintf (SUMA_STDERR,"%s: Building colormap POS #%d (%s)\n", FuncName, i, CMp->Name);
00410
00411 for ( j = 0; j < i; ++j) {
00412 if (!INIT_ovin_pos[i][j]) {
00413 if (LocalHead_Detail) {
00414 fprintf (SUMA_STDERR,"\t[i%d] NoColor\t%f\n",
00415 INIT_ovin_pos[i][j],
00416 INIT_pval_pos[i][j]);
00417 }
00418 CMp->M[i - j - 1][0] = CMp->M[i - j - 1][1] = CMp->M[i - j - 1][2] = -1.0;
00419 } else {
00420 if (LocalHead_Detail) {
00421 fprintf (SUMA_STDERR,"\t[i%d] %s\t%f\n",
00422 INIT_ovin_pos[i][j],
00423 INIT_def_labovr[INIT_ovin_pos[i][j]-1], INIT_pval_pos[i][j]);
00424 }
00425
00426 icol = SUMA_Find_Color (INIT_def_labovr[INIT_ovin_pos[i][j]-1], Cv, N_cols);
00427 if (icol < 0) {
00428 fprintf (SUMA_STDERR,"Error%s: Failed to find color %s\nUsing no-color in its place\n",
00429 FuncName, INIT_def_labovr[INIT_ovin_pos[i][j]-1]);
00430 CMp->M[i - j - 1][0] = CMp->M[i - j - 1][1] = CMp->M[i - j - 1][2] = -1.0;
00431 } else {
00432 CMp->M[i - j - 1][0] = Cv[icol].r;
00433 CMp->M[i - j - 1][1] = Cv[icol].g;
00434 CMp->M[i - j - 1][2] = Cv[icol].b;
00435 }
00436 }
00437 CMp->frac[i - j - 1] = INIT_pval_pos[i][j];
00438 }
00439
00440
00441 CMv = SUMA_Add_ColorMap (CMp, CMv, &N_maps);
00442 if (!CMv) {
00443 SUMA_SL_Crit("Failed in SUMA_Add_ColorMap");
00444 SUMA_RETURN(NULL);
00445 }
00446
00447 if (LocalHead_Detail) fprintf (SUMA_STDERR,"%s: Building colormap SGN #%d (%s)\n", FuncName, i, CMn->Name);
00448
00449 for ( j = 0; j < i; ++j) {
00450 if (!INIT_ovin_sgn[i][j]) {
00451 if (LocalHead_Detail) {
00452 fprintf (SUMA_STDERR,"\t[i%d] NoColor\t%f\n",
00453 INIT_ovin_sgn[i][j],
00454 INIT_pval_sgn[i][j]);
00455 }
00456 CMn->M[i - j - 1][0] = CMn->M[i - j - 1][1] = CMn->M[i - j - 1][2] = -1.0;
00457 } else {
00458 if (LocalHead_Detail) {
00459 fprintf (SUMA_STDERR,"\t[i%d] %s\t%f\n",
00460 INIT_ovin_sgn[i][j],
00461 INIT_def_labovr[INIT_ovin_sgn[i][j]-1], INIT_pval_sgn[i][j]);
00462 }
00463 icol = SUMA_Find_Color (INIT_def_labovr[INIT_ovin_sgn[i][j]-1], Cv, N_cols);
00464 if (icol < 0) {
00465 fprintf (SUMA_STDERR,"Error%s: Failed to find color %s\nUsing no-color in its place",
00466 FuncName, INIT_def_labovr[INIT_ovin_sgn[i][j]-1]);
00467 CMn->M[i - j - 1][0] = CMn->M[i - j - 1][1] = CMn->M[i - j - 1][2] = -1.0;
00468 } else {
00469 CMn->M[i - j - 1][0] = Cv[icol].r;
00470 CMn->M[i - j - 1][1] = Cv[icol].g;
00471 CMn->M[i - j - 1][2] = Cv[icol].b;
00472 }
00473 }
00474 CMn->frac[i - j - 1] = INIT_pval_sgn[i][j];
00475 }
00476
00477
00478 CMv = SUMA_Add_ColorMap (CMn, CMv, &N_maps);
00479 if (!CMv) {
00480 SUMA_SL_Crit("Failed in SUMA_Add_ColorMap");
00481 SUMA_RETURN(NULL);
00482 }
00483 }
00484
00485
00486
00487
00488
00489
00490 SAC = (SUMA_AFNI_COLORS *) SUMA_malloc(sizeof(SUMA_AFNI_COLORS));
00491 SAC->CMv = CMv;
00492 SAC->N_maps = N_maps;
00493 SAC->Cv = Cv;
00494 SAC->N_cols = N_cols;
00495
00496
00497
00498
00499 SUMA_LH("Calling Process setup");
00500 homeenv = getenv("HOME");
00501
00502 if (!homeenv) sumarc = SUMA_copy_string(".afnirc");
00503 else sumarc = SUMA_append_string (homeenv, "/.afnirc");
00504 if (stat(sumarc, &stbuf) != -1) {
00505 if (LocalHead) fprintf (SUMA_STDERR,"%s: Loading %s ...\n", FuncName, sumarc);
00506 if (SUMA_AFNI_Extract_Colors ( sumarc, SAC ) < 0) {
00507 fprintf(SUMA_STDERR,"Error %s: Failed scanning .afnirc for colors and colormaps.\nProceeding ...\n", FuncName);
00508 }
00509 } else {
00510 if (LocalHead) fprintf (SUMA_STDERR,"%s: No rc files found.\n", FuncName);
00511 }
00512 if (sumarc) SUMA_free(sumarc);
00513
00514
00515 if (LocalHead_Detail) {
00516 SUMA_Show_ColorVec (SAC->Cv, SAC->N_cols, NULL);
00517 }
00518
00519 if (LocalHead_Detail) {
00520 SUMA_Show_ColorMapVec (SAC->CMv, SAC->N_maps, NULL, 1);
00521 }
00522
00523 SUMA_LH("Returning");
00524
00525 SUMA_RETURN(SAC);
00526 }
00527
00528
00529
00530
00531 SUMA_AFNI_COLORS *SUMA_Build_Color_maps(void)
00532 {
00533 static char FuncName[]={"SUMA_Build_Color_maps"};
00534 SUMA_RGB_NAME *Cv = NULL;
00535 int i;
00536 SUMA_COLOR_MAP **CMv=NULL;
00537 SUMA_COLOR_MAP *CM=NULL;
00538 SUMA_AFNI_COLORS *SAC=NULL;
00539
00540 SUMA_ENTRY;
00541
00542 SAC = SUMA_Get_AFNI_Default_Color_Maps();
00543
00544
00545
00546 for (i=SUMA_CMAP_UNDEFINED+1; i<SUMA_CMAP_N_MAPS; ++i) {
00547 CM = SUMA_GetStandardMap (i);
00548 if (!CM) {
00549 SUMA_SL_Crit("Failed to create standard maps");
00550 SUMA_RETURN(NULL);
00551 }
00552 SAC->CMv = SUMA_Add_ColorMap (CM, SAC->CMv, &(SAC->N_maps));
00553 if (!SAC->CMv) {
00554 SUMA_SL_Crit("Failed in SUMA_Add_ColorMap");
00555 SUMA_RETURN(NULL);
00556 }
00557 }
00558
00559 SUMA_RETURN(SAC);
00560 }
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584 SUMA_RGB_NAME * SUMA_Add_Color (char *Name, float r, float g, float b, float a, SUMA_RGB_NAME *oCv, int *N_cols)
00585 {
00586 static char FuncName[]={"SUMA_Add_Color"};
00587 SUMA_RGB_NAME *NewCv = NULL;
00588 int iadd;
00589 SUMA_Boolean LocalHead = NOPE;
00590
00591 SUMA_ENTRY;
00592
00593 if (!(r == -1.0 && g == -1.0 && b == -1.0)) {
00594 if ( r < 0 || r > 1 ||
00595 g < 0 || g > 1 ||
00596 b < 0 || b > 1 ||
00597 a < 0 || a > 1 ) {
00598 SUMA_S_Err("Bad r, g, b and/or a values.\nMust be between 0 and 1.Nothing done.");
00599 SUMA_RETURN(oCv);
00600 }
00601 }else {
00602 SUMA_LH("No color");
00603 }
00604
00605 if (strlen(Name) > SUMA_MAX_COLOR_NAME -1 ) {
00606 SUMA_S_Err("Too long a color name\n(> SUMA_MAX_COLOR_NAME)\nNothing done.");
00607 SUMA_RETURN(oCv);
00608 }
00609
00610 if (!oCv) {
00611 SUMA_LH("New color vector, allocating");
00612 NewCv = (SUMA_RGB_NAME *) SUMA_calloc(1, sizeof(SUMA_RGB_NAME));
00613 *N_cols = 1;
00614 NewCv[*N_cols-1].r = r;
00615 NewCv[*N_cols-1].g = g;
00616 NewCv[*N_cols-1].b = b;
00617 NewCv[*N_cols-1].a = a;
00618 sprintf(NewCv[*N_cols-1].Name, "%s", Name);
00619 SUMA_RETURN(NewCv);
00620 }
00621
00622
00623 iadd = SUMA_Find_Color (Name, oCv, *N_cols);
00624
00625 if (iadd >= 0) {
00626 SUMA_LH("Replacing old color");
00627 NewCv = oCv;
00628 NewCv[iadd].r = r;
00629 NewCv[iadd].g = g;
00630 NewCv[iadd].b = b;
00631 NewCv[iadd].a = a;
00632 SUMA_RETURN(oCv);
00633 }
00634
00635
00636 SUMA_LH("Adding new color");
00637 *N_cols += 1;
00638 NewCv = (SUMA_RGB_NAME *) SUMA_realloc(oCv, *N_cols * sizeof(SUMA_RGB_NAME));
00639 NewCv[*N_cols-1].r = r;
00640 NewCv[*N_cols-1].g = g;
00641 NewCv[*N_cols-1].b = b;
00642 NewCv[*N_cols-1].a = a;
00643 sprintf(NewCv[*N_cols-1].Name, "%s", Name);
00644
00645 SUMA_RETURN(NewCv);
00646 }
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665 SUMA_COLOR_MAP ** SUMA_Add_ColorMap (SUMA_COLOR_MAP *CM, SUMA_COLOR_MAP **OldCMv, int *N_maps)
00666 {
00667 static char FuncName[]={"SUMA_Add_ColorMap"};
00668 SUMA_COLOR_MAP ** NewCMv = NULL;
00669 int iadd;
00670 SUMA_Boolean LocalHead = NOPE;
00671
00672 SUMA_ENTRY;
00673
00674 if (!CM) {
00675 SUMA_S_Warn("Null CM, nothing to do");
00676 SUMA_RETURN(OldCMv);
00677 }
00678 if (!OldCMv) {
00679 SUMA_LH("New color vector, allocating");
00680 NewCMv = (SUMA_COLOR_MAP **) SUMA_calloc(1, sizeof(SUMA_COLOR_MAP *));
00681 *N_maps = 1;
00682 NewCMv[0] = CM;
00683 SUMA_RETURN(NewCMv);
00684 }
00685
00686
00687 iadd = SUMA_Find_ColorMap (CM->Name, OldCMv, *N_maps, CM->Sgn);
00688 if (iadd >= 0) {
00689 SUMA_LH("Replacing old colormap");
00690 SUMA_Free_ColorMap (OldCMv[iadd]);
00691 OldCMv[iadd] = CM;
00692 SUMA_RETURN(OldCMv);
00693 }
00694
00695
00696 SUMA_LH("Adding new color map");
00697 *N_maps += 1;
00698 NewCMv = (SUMA_COLOR_MAP **) SUMA_realloc(OldCMv, *N_maps * sizeof(SUMA_COLOR_MAP *));
00699 NewCMv[*N_maps - 1] = CM;
00700
00701 SUMA_RETURN(NewCMv);
00702 }
00703
00704
00705
00706
00707
00708 SUMA_AFNI_COLORS *SUMA_DestroyAfniColors (SUMA_AFNI_COLORS *SAC)
00709 {
00710 static char FuncName[]={"SUMA_DestroyAfniColors"};
00711 int i;
00712
00713 if (!SAC) SUMA_RETURN(NULL);
00714
00715
00716 for (i=0; i < SAC->N_maps; ++i) {
00717 if (SAC->CMv[i]) SUMA_Free_ColorMap(SAC->CMv[i]);
00718 }
00719 SUMA_free(SAC->CMv);
00720 SAC->N_maps = -1;
00721
00722
00723 SUMA_free(SAC->Cv);
00724 SAC->N_cols = -1;
00725
00726
00727 SUMA_free(SAC);
00728
00729 SUMA_RETURN(NULL);
00730 }
00731
00732
00733
00734
00735
00736 char *SUMA_ColorVec_Info (SUMA_RGB_NAME *Cv, int N_cols)
00737 {
00738 static char FuncName[]={"SUMA_ColorVec_Info"};
00739 int i;
00740 char stmp[100], *s = NULL;
00741 SUMA_STRING *SS = NULL;
00742 SUMA_Boolean LocalHead = NOPE;
00743
00744 SUMA_ENTRY;
00745
00746 SS = SUMA_StringAppend (NULL, NULL);
00747
00748 if (Cv) {
00749 for (i=0; i < N_cols; ++i) {
00750 if (Cv[i].r == -1) {
00751 sprintf (stmp, "%d/%d: color(%d) No Color(%s): [%f %f %f %f]\n",
00752 i+1, N_cols, i, Cv[i].Name, Cv[i].r, Cv[i].g, Cv[i].b, Cv[i].a);
00753 SS = SUMA_StringAppend (SS, stmp);
00754 } else {
00755 sprintf (stmp, "%d/%d: color(%d) %s: [%f %f %f %f]\n",
00756 i+1, N_cols, i, Cv[i].Name, Cv[i].r, Cv[i].g, Cv[i].b, Cv[i].a);
00757 SS = SUMA_StringAppend (SS, stmp);
00758 }
00759 }
00760 } else {
00761 sprintf (stmp, "NULL Cv.\n");
00762 SS = SUMA_StringAppend (SS, stmp);
00763 }
00764
00765
00766 SS = SUMA_StringAppend (SS, NULL);
00767
00768 s = SS->s;
00769 SUMA_free(SS);
00770
00771 SUMA_RETURN(s);
00772 }
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786 char *SUMA_ColorMapVec_Info (SUMA_COLOR_MAP **CMv, int N_maps, int detail)
00787 {
00788 static char FuncName[]={"SUMA_ColorMapVec_Info"};
00789 int i, j, jmax;
00790 char stmp[256], *s = NULL;
00791 SUMA_STRING *SS = NULL;
00792 SUMA_Boolean LocalHead = NOPE;
00793
00794 SUMA_ENTRY;
00795
00796 SUMA_LH("Entered");
00797 SS = SUMA_StringAppend (NULL, NULL);
00798
00799 if (CMv) {
00800 for (i=0; i < N_maps; ++i) {
00801 if (!CMv[i]) {
00802 sprintf (stmp, "%d/%d: cmap(%d) NULL\n", i+1, N_maps, i);
00803 SS = SUMA_StringAppend (SS, stmp);
00804 } else {
00805 switch (CMv[i]->Sgn) {
00806 case 0:
00807 sprintf (stmp, "%d/%d: cmap(%d) %s(.), %d cols.", i+1, N_maps, i, CMv[i]->Name, CMv[i]->N_Col);
00808 break;
00809 case 1:
00810 sprintf (stmp, "%d/%d: cmap(%d) %s(+), %d cols.", i+1, N_maps, i, CMv[i]->Name, CMv[i]->N_Col);
00811 break;
00812 case -1:
00813 sprintf (stmp, "%d/%d: cmap(%d) %s(-), %d cols.", i+1, N_maps, i, CMv[i]->Name, CMv[i]->N_Col);
00814 break;
00815 default:
00816 sprintf (stmp, "%d/%d: cmap(%d) %s(?), %d cols.\n\tSgn field of colormap is not acceptable (%d)\n",
00817 i+1, N_maps, i, CMv[i]->Name, CMv[i]->N_Col, CMv[i]->Sgn);
00818 break;
00819 }
00820 SS = SUMA_StringAppend (SS, stmp);
00821 if (CMv[i]->frac) {
00822 SS = SUMA_StringAppend (SS, " Possibly non-linear\n");
00823 } else {
00824 SS = SUMA_StringAppend (SS, " Linear\n");
00825 }
00826 switch (detail) {
00827 case 0:
00828 jmax = 0;
00829 break;
00830 case 1:
00831 if (CMv[i]->N_Col < 5) jmax = CMv[i]->N_Col;
00832 else jmax = 5;
00833 break;
00834 case 2:
00835 jmax = CMv[i]->N_Col;
00836 break;
00837 default:
00838 SUMA_SL_Err("Bad detail value\nUsing detail = 2");
00839 jmax = CMv[i]->N_Col;
00840 break;
00841 }
00842
00843 if (jmax) {
00844 for (j=jmax-1; j >= 0; --j) {
00845 if (CMv[i]->frac) {
00846 if (j == jmax -1) {
00847 sprintf (stmp, "rank (i)[R \tG \tB \t\tf]\n");
00848 SS = SUMA_StringAppend (SS,stmp);
00849 }
00850 sprintf (stmp, "%03d:\t[% .3f\t% .3f\t% .3f\t\t% .3f]\n",
00851 j, CMv[i]->M[j][0], CMv[i]->M[j][1], CMv[i]->M[j][2], CMv[i]->frac[j]);
00852 } else {
00853 if (j == jmax - 1) {
00854 sprintf (stmp, "rank (i):[R \tG \tB ]\n");
00855 SS = SUMA_StringAppend (SS,stmp);
00856 }
00857 sprintf (stmp, "%03d:\t[% .3f\t% .3f\t% .3f]\n",
00858 j, CMv[i]->M[j][0], CMv[i]->M[j][1], CMv[i]->M[j][2]);
00859 }
00860 SS = SUMA_StringAppend (SS,stmp);
00861 }
00862 if (jmax < CMv[i]->N_Col - 1) {
00863 if (CMv[i]->frac) SS = SUMA_StringAppend (SS,"..:\t [.....\t....\t....\t\t....]\n");
00864 else SS = SUMA_StringAppend (SS,"..:\t [.....\t....\t....]\n");
00865 }
00866 if (jmax < CMv[i]->N_Col) {
00867 j = CMv[i]->N_Col - 1;
00868 if (CMv[i]->frac) {
00869 sprintf (stmp, "%03d:\t [% .3f\t% .3f\t% .3f\t\t% .3f]\n",
00870 j, CMv[i]->M[j][0], CMv[i]->M[j][1], CMv[i]->M[j][2], CMv[i]->frac[j]);
00871 } else {
00872 sprintf (stmp, "%03d:\t [% .3f\t% .3f\t% .3f]\n",
00873 j, CMv[i]->M[j][0], CMv[i]->M[j][1], CMv[i]->M[j][2]);
00874 }
00875 SS = SUMA_StringAppend (SS,stmp);
00876 }
00877 }
00878 }
00879 }
00880 } else {
00881 sprintf (stmp, "NULL CMv.\n");
00882 SS = SUMA_StringAppend (SS, stmp);
00883 }
00884
00885
00886 SS = SUMA_StringAppend (SS, NULL);
00887
00888 s = SS->s;
00889 SUMA_free(SS);
00890
00891 SUMA_LH("Left");
00892
00893 SUMA_RETURN(s);
00894 }
00895
00896
00897
00898
00899
00900 void SUMA_Show_ColorVec (SUMA_RGB_NAME *CMv, int N_maps, FILE *Out)
00901 {
00902 static char FuncName[]={"SUMA_Show_ColorVec"};
00903 char *s;
00904
00905 SUMA_ENTRY;
00906
00907 if (Out == NULL) Out = stdout;
00908
00909 s = SUMA_ColorVec_Info(CMv, N_maps);
00910
00911 if (s) {
00912 fprintf (Out, "%s", s);
00913 SUMA_free(s);
00914 }else {
00915 fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_ColorVec_Info.\n", FuncName);
00916 }
00917
00918 SUMA_RETURNe;
00919 }
00920
00921
00922
00923
00924
00925 void SUMA_Show_ColorMapVec (SUMA_COLOR_MAP **CMv, int N_maps, FILE *Out, int detail)
00926 {
00927 static char FuncName[]={"SUMA_Show_ColorMapVec"};
00928 char *s;
00929 SUMA_Boolean LocalHead = NOPE;
00930
00931 SUMA_ENTRY;
00932
00933
00934 if (Out == NULL) Out = stdout;
00935
00936 s = SUMA_ColorMapVec_Info(CMv, N_maps, detail);
00937
00938 if (s) {
00939 fprintf (Out, "%s", s);
00940 SUMA_free(s);
00941 }else {
00942 fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_ColorMapVec_Info.\n", FuncName);
00943 }
00944
00945
00946 SUMA_RETURNe;
00947 }
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957 int SUMA_Find_Color ( char *Name, SUMA_RGB_NAME *Cv, int N_cols)
00958 {
00959 static char FuncName[]={"SUMA_Find_Color"};
00960 int icol = -1, i;
00961 SUMA_Boolean LocalHead = NOPE;
00962
00963 SUMA_ENTRY;
00964
00965 if (!Cv) {
00966 SUMA_S_Warn("Nothing to do. NULL Cv");
00967 SUMA_RETURN(icol);
00968 }
00969
00970 for (i=0; i < N_cols; ++i) {
00971 if (strcmp(Cv[i].Name, Name) == 0) {
00972 SUMA_LH("Found Color");
00973 icol = i;
00974 SUMA_RETURN(icol);
00975 }
00976 }
00977
00978 SUMA_LH("Failed to find color");
00979 SUMA_RETURN(icol);
00980 }
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993 int SUMA_Find_ColorMap ( char *Name, SUMA_COLOR_MAP **CMv, int N_maps, int sgn)
00994 {
00995 static char FuncName[]={"SUMA_Find_ColorMap"};
00996 int imap = -1, i;
00997 SUMA_Boolean LocalHead = NOPE;
00998
00999 SUMA_ENTRY;
01000
01001 if (!CMv) {
01002 SUMA_S_Warn("Nothing to do. NULL CMv");
01003 SUMA_RETURN(imap);
01004 }
01005
01006
01007 for (i=0; i < N_maps; ++i) {
01008 if (CMv[i]) {
01009 if (sgn != -2) {
01010 if (strcmp(CMv[i]->Name, Name) == 0 && CMv[i]->Sgn == sgn) {
01011 SUMA_LH("Found Map");
01012 imap = i;
01013 SUMA_RETURN(imap);
01014 }
01015 } else {
01016
01017 if (strcmp(CMv[i]->Name, Name) == 0 ) {
01018 SUMA_LH("Found Map");
01019 imap = i;
01020 SUMA_RETURN(imap);
01021 }
01022 }
01023 }
01024 }
01025
01026 SUMA_LH("Failed to find map");
01027 SUMA_RETURN(imap);
01028 }
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045 SUMA_COLOR_MAP *SUMA_Read_Color_Map_1D (char *Name)
01046 {
01047 static char FuncName[]={"SUMA_Read_Color_Map_1D"};
01048 MRI_IMAGE *im = NULL;
01049 float *far=NULL;
01050 float ColSum;
01051 int i=0;
01052 SUMA_COLOR_MAP* SM = NULL;
01053 SUMA_Boolean LocalHead = NOPE;
01054
01055 SUMA_ENTRY;
01056
01057 if (!Name) {
01058 SUMA_S_Err("NULL file name");
01059 SUMA_RETURN(SM);
01060 }
01061
01062
01063 im = mri_read_1D (Name);
01064 if (!im) {
01065 SUMA_S_Err("Failed to read file");
01066 SUMA_RETURN(NULL);
01067 }
01068
01069
01070 if (im->ny != 3 && im->ny != 4) {
01071 SUMA_S_Err("File must contain 3 or 4 columns only");
01072 SUMA_RETURN(NULL);
01073
01074 }
01075
01076
01077
01078 SM = (SUMA_COLOR_MAP*) SUMA_malloc(sizeof(SUMA_COLOR_MAP));
01079 SM->SO = NULL;
01080 SM->cname = NULL;
01081 SM->N_Col = im->nx;
01082 SM->Name = (char *)SUMA_malloc(sizeof(char)*(strlen(Name)+1));
01083 sprintf(SM->Name, "%s", Name);
01084 if (im->ny == 4) {
01085 SM->frac = (float*) SUMA_calloc(im->nx, sizeof(float));
01086 } else {
01087 SM->frac = NULL;
01088 }
01089
01090 SM->M = (float**)SUMA_allocate2D (SM->N_Col, 3, sizeof(float));
01091
01092
01093 far = MRI_FLOAT_PTR(im);
01094
01095 ColSum = 0;
01096 if (im->ny == 4) {
01097 SM->Sgn = 1;
01098 for (i=0; i < im->nx; ++i) {
01099 SM->M[SM->N_Col - i - 1][0] = far[i]; ColSum += far[i];
01100 SM->M[SM->N_Col - i - 1][1] = far[i+im->nx]; ColSum += far[i+im->nx];
01101 SM->M[SM->N_Col - i - 1][2] = far[i+2*im->nx]; ColSum += far[i+2*im->nx];
01102 SM->frac[SM->N_Col - i - 1] = far[i+3*im->nx];
01103 if (SM->frac[SM->N_Col - i - 1] < 0.0) SM->Sgn = -1;
01104 }
01105 } else {
01106 SM->Sgn = 0;
01107 for (i=0; i < im->nx; ++i) {
01108 SM->M[SM->N_Col - i - 1][0] = far[i]; ColSum += far[i];
01109 SM->M[SM->N_Col - i - 1][1] = far[i+im->nx]; ColSum += far[i+im->nx];
01110 SM->M[SM->N_Col - i - 1][2] = far[i+2*im->nx]; ColSum += far[i+2*im->nx];
01111 }
01112 }
01113
01114 ColSum = ColSum / (3.0 * SM->N_Col);
01115 if (ColSum > 1) {
01116
01117 for (i=0; i < SM->N_Col; ++i) {
01118 SM->M[i][0] /= 255.0; SM->M[i][1] /= 255.0; SM->M[i][2] /= 255.0;
01119 }
01120 }
01121
01122
01123 if (SM->frac && SM->N_Col > 1) {
01124 for (i=0; i < im->nx-1; ++i) {
01125 if (SM->frac[i] > SM->frac[i+1]) {
01126 SUMA_S_Err("Fractions must be specified in monotonic\n descending order from the top to the bottom of the column");
01127 SUMA_Free_ColorMap (SM); mri_free(im);
01128 SUMA_RETURN(NULL);
01129 }
01130 }
01131 }
01132
01133 mri_free(im); im = NULL;
01134
01135 if (LocalHead) {
01136 fprintf (SUMA_STDERR,"%s: Colormap read:\n", FuncName);
01137 if (SM->frac) {
01138 for (i=0; i < SM->N_Col; ++i) {
01139 fprintf (SUMA_STDOUT,"%f\t%f\t%f\t%f\n", SM->M[i][0], SM->M[i][1], SM->M[i][2], SM->frac[i]);
01140 }
01141 } else SUMA_disp_mat (SM->M, SM->N_Col, 3, 1);
01142 }
01143
01144
01145 SUMA_RETURN (SM);
01146 }
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159 SUMA_COLOR_MAP *SUMA_Linearize_Color_Map (SUMA_COLOR_MAP* SM, int N_lin)
01160 {
01161 static char FuncName[]={"SUMA_Linearize_Color_Map"};
01162 SUMA_COLOR_MAP* LSM = NULL;
01163 int ilin = 0, i = 0, ilin_stp = -1;
01164 SUMA_Boolean LocalHead = NOPE;
01165
01166 SUMA_ENTRY;
01167
01168 if (!SM) {
01169 SUMA_S_Err("NULL color map");
01170 SUMA_RETURN(LSM);
01171 }
01172
01173 if (!SM->frac) {
01174 SUMA_S_Err("NULL SM->frac!\nMap is linear");
01175 SUMA_RETURN(LSM);
01176 }
01177
01178 if (N_lin < 0) N_lin = 2048;
01179
01180 if (!N_lin) {
01181 SUMA_S_Err("N_lin = 0");
01182 SUMA_RETURN(LSM);
01183 }
01184
01185
01186 LSM = (SUMA_COLOR_MAP *)SUMA_malloc(sizeof(SUMA_COLOR_MAP));
01187 if (LSM == NULL) {
01188 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for LSM.\n", FuncName);
01189 SUMA_RETURN (NULL);
01190 }
01191 LSM->SO = NULL;
01192
01193 LSM->Name = (char *)SUMA_calloc(strlen(SM->Name)+10, sizeof(char));
01194 if (LSM->Name == NULL) {
01195 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for LSM->Name.\n", FuncName);
01196 SUMA_free(LSM);
01197 SUMA_RETURN (NULL);
01198 }
01199 sprintf(LSM->Name, "%s_lin",SM->Name);
01200 LSM->N_Col = N_lin;
01201 LSM->frac = NULL;
01202 LSM->cname = NULL;
01203 LSM->Sgn = SM->Sgn;
01204
01205 LSM->M = (float **)SUMA_allocate2D (LSM->N_Col, 3, sizeof(float));
01206 if (LSM->M == NULL) {
01207 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for LSM->M.\n", FuncName);
01208 SUMA_free(LSM->Name);
01209 SUMA_free(LSM);
01210 SUMA_RETURN (NULL);
01211 }
01212
01213 ilin = 0;
01214 for (i=0; i < SM->N_Col; ++i) {
01215 if (LSM->Sgn >= 0) {
01216 ilin_stp = (int)(ceil((double)SM->frac[i] * (double)LSM->N_Col)) - 1;
01217 } else {
01218 ilin_stp = (int)(ceil( (1.0 + (double)SM->frac[i]) * (double)LSM->N_Col/2 ) ) - 1;
01219 }
01220 while (ilin < ilin_stp) {
01221 LSM->M[ilin][0] = SM->M[i][0];
01222 LSM->M[ilin][1] = SM->M[i][1];
01223 LSM->M[ilin][2] = SM->M[i][2];
01224 ++ilin;
01225 }
01226 }
01227
01228
01229 LSM->M[LSM->N_Col-1][0] = SM->M[SM->N_Col-1][0];
01230 LSM->M[LSM->N_Col-1][1] = SM->M[SM->N_Col-1][1];
01231 LSM->M[LSM->N_Col-1][2] = SM->M[SM->N_Col-1][2];
01232
01233 if (LocalHead) {
01234 for (i=0; i < LSM->N_Col; ++i) {
01235 fprintf (SUMA_STDOUT,"%d:\t%f\t%f\t%f\n", i, LSM->M[i][0], LSM->M[i][1], LSM->M[i][2]);
01236 }
01237 fprintf (SUMA_STDOUT,"%s: ilin_stp = %d\n", FuncName, ilin_stp);
01238 }
01239
01240 SUMA_RETURN(LSM);
01241 }
01242
01243
01244
01245
01246
01247
01248
01249 int r_sprintf_long_to_hex
01250 (
01251 char * dest,
01252 unsigned long lsrc,
01253 int bytes,
01254 int pad
01255 )
01256 {
01257 static char hexstring[] = "0123456789ABCDEF";
01258
01259 unsigned char ub;
01260 char * cp = dest;
01261 int posn, size, ret;
01262
01263 if ( (bytes <= 0) || (bytes > 4) )
01264 {
01265 *cp = '\0';
01266 return 0;
01267 }
01268
01269 size = r_ulong_size( lsrc );
01270
01271 if ( (size < bytes) && !pad )
01272 ret = size;
01273 else
01274 ret = bytes;
01275
01276 for ( posn = ret-1; posn >= 0; posn-- )
01277 {
01278
01279 ub = ( lsrc >> (posn << 3) ) & 0xff;
01280 *cp++ = hexstring[(ub>>4) & 0xf];
01281 *cp++ = hexstring[ ub & 0xf];
01282 }
01283
01284 *cp = '\0';
01285
01286 return ret;
01287 }
01288
01289
01290 int r_ulong_size ( unsigned long l )
01291 {
01292 if ( l & 0xff000000 )
01293 return 4;
01294
01295 if ( l & 0xff0000 )
01296 return 3;
01297
01298 if ( l & 0xff00 )
01299 return 2;
01300
01301 return 1;
01302 }
01303
01304 #ifdef SUMA_MakeColorMap_STAND_ALONE
01305 void SUMA_MakeColorMap_usage ()
01306 {
01307 static char FuncName[]={"SUMA_MakeColorMap_usage"};
01308 char * s = NULL;
01309 s = SUMA_help_basics();
01310 fprintf (SUMA_STDOUT, "\n"
01311 "Usage1: \n"
01312 "MakeColorMap <-fn Fiducials_Ncol> [-pos] [-ah prefix] [-h/-help]\n"
01313 " Creates a colormap of N colors that contains the fiducial colors.\n"
01314 " -fn Fiducials_Ncol: Fiducial colors and their indices in the color\n"
01315 " map are listed in file Fiducials_Ncol.\n"
01316 " Each row contains 4 tab delimited values:\n"
01317 " R G B i\n"
01318 " R G B values are between 0 and 1 and represent the \n"
01319 " i-th color in the colormap. i should be between 0 and\n"
01320 " N-1, N being the total number of colors in the colormap.\n"
01321 "\n"
01322 "Usage2: \n"
01323 "MakeColorMap <-f Fiducials> <-nc N> [-sl] [-ah prefix] [-h/-help]\n"
01324 " Creates a colormap of N colors that contains the fiducial colors.\n"
01325 " -f Fiducials: Fiducial colors are listed in an ascii file Fiducials. \n"
01326 " Each row contains 3 tab delimited R G B values between 0 and 1.\n"
01327 " -nc N: Total number of colors in the color map.\n"
01328 " -sl: (optional, default is NO) if used, the last color in the Fiducial \n"
01329 " list is omitted. This is useful in creating cyclical color maps.\n"
01330 "\n"
01331 "Usage3: \n"
01332 "MakeColorMap <-std MapName>\n"
01333 " Returns one of SUMA's standard colormaps. Choose from:\n"
01334 " rgybr20, ngray20, gray20, bw20, bgyr19, \n"
01335 " matlab_default_byr64, roi128, roi256, roi64\n"
01336 "\n"
01337 "Common options to all usages:\n"
01338 " -ah prefix: (optional, Afni Hex format.\n"
01339 " default is RGB values in decimal form)\n"
01340 " use this option if you want a color map formatted to fit \n"
01341 " in AFNI's .afnirc file. The colormap is written out as \n"
01342 " prefix_01 = #xxxxxxx \n prefix_02 = #xxxxxxx\n etc...\n"
01343 " -h or -help: displays this help message.\n"
01344 "\n"
01345 ""
01346 "Example Usage 1: Creating a colormap of 20 colors that goes from \n"
01347 "Red to Green to Blue to Yellow to Red.\n"
01348 "\n"
01349 " The file FidCol_Nind contains the following:\n"
01350 " 1 0 0 0\n 0 1 0 5\n 0 0 1 10\n 1 1 0 15\n 1 0 0 19\n"
01351 "\n"
01352 " The following command will generate the RGB colormap in decimal form:\n"
01353 " MakeColorMap -fn FidCol_Nind \n"
01354 "\n"
01355 " The following command will generate the colormap and write it as \n"
01356 " an AFNI color palette file:\n"
01357 " MakeColorMap -fn FidCol_Nind -ah TestPalette > TestPalette.pal\n"
01358 "\n"
01359 "Example Usage 2: Creating a cyclical version of the colormap in usage 1:\n"
01360 "\n"
01361 " The file FidCol contains the following:\n"
01362 " 1 0 0\n 0 1 0\n 0 0 1\n 1 1 0\n 1 0 0\n"
01363 "\n"
01364 " The following command will generate the RGB colormap in decimal form:\n"
01365 " MakeColorMap -f FidCol -sl -nc 20 \n"
01366 "\n"
01367 "Example Usage 3: MakeColorMap -std ngray20 \n"
01368 "\n"
01369 "To read in a new colormap into AFNI, either paste the contents of \n"
01370 "TestPalette.pal in your .afnirc file or read the .pal file using \n"
01371 "AFNI as follows:\n"
01372 "1- run afni\n2- Define Function --> right click on Inten (over colorbar) \n"
01373 " --> Read in palette (choose TestPalette.pal)\n"
01374 "3- set the #colors chooser (below colorbar) to 20 (the number of colors in \n"
01375 " TestPalette.pal).\n"
01376 "%s",s);
01377 SUMA_free(s); s = NULL;
01378 s = SUMA_New_Additions(0, 1); printf("%s\n", s);SUMA_free(s); s = NULL;
01379 fprintf (SUMA_STDOUT, " Ziad S. Saad & Rick R. Reynolds SSCC/NIMH/NIH ziad@nih.gov Tue Apr 23 14:14:48 EDT 2002\n\n");
01380
01381 }
01382
01383 int main (int argc,char *argv[])
01384 {
01385 static char FuncName[]={"MakeColorMap"};
01386 char *FidName = NULL, *Prfx = NULL, h[9], *StdType=NULL;
01387 int Ncols = 0, N_Fid = 0, kar, i, ifact, *Nind = NULL;
01388 float **Fid=NULL, **M=NULL;
01389 MRI_IMAGE *im = NULL;
01390 float *far=NULL;
01391 SUMA_Boolean brk, SkipLast, AfniHex, PosMap,
01392 Usage1, Usage2, Usage3, LocalHead = NOPE;
01393 SUMA_COLOR_MAP *SM=NULL;
01394
01395 SUMA_mainENTRY;
01396
01397 SUMA_STANDALONE_INIT;
01398
01399
01400 if (argc < 2) {
01401 SUMA_MakeColorMap_usage();
01402 exit (1);
01403 }
01404
01405 kar = 1;
01406 brk = NOPE;
01407 SkipLast = NOPE;
01408 AfniHex = NOPE;
01409 PosMap = NOPE;
01410 Usage1 = NOPE;
01411 Usage2 = NOPE;
01412 Usage3 = NOPE;
01413 while (kar < argc) {
01414 if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) {
01415 SUMA_MakeColorMap_usage();
01416 exit (1);
01417 }
01418
01419 SUMA_SKIP_COMMON_OPTIONS(brk, kar);
01420
01421 if (!brk && (strcmp(argv[kar], "-v") == 0))
01422 {
01423 LocalHead = NOPE;
01424 brk = YUP;
01425 }
01426 if (!brk && (strcmp(argv[kar], "-f") == 0))
01427 {
01428 kar ++;
01429 if (kar >= argc) {
01430 fprintf (SUMA_STDERR, "need argument after -f ");
01431 exit (1);
01432 }
01433 FidName = argv[kar];
01434 Usage1 = YUP;
01435 brk = YUP;
01436 }
01437
01438 if (!brk && (strcmp(argv[kar], "-fn") == 0))
01439 {
01440 kar ++;
01441 if (kar >= argc) {
01442 fprintf (SUMA_STDERR, "need argument after -fn ");
01443 exit (1);
01444 }
01445 FidName = argv[kar];
01446 Usage2 = YUP;
01447 brk = YUP;
01448 }
01449
01450 if (!brk && (strcmp(argv[kar], "-nc") == 0))
01451 {
01452 kar ++;
01453 if (kar >= argc) {
01454 fprintf (SUMA_STDERR, "need argument after -nc ");
01455 exit (1);
01456 }
01457 Ncols = atoi(argv[kar]);
01458 Usage1 = YUP;
01459 brk = YUP;
01460 }
01461
01462 if (!brk && (strcmp(argv[kar], "-ah") == 0))
01463 {
01464 kar ++;
01465 if (kar >= argc) {
01466 fprintf (SUMA_STDERR, "need argument after -ah ");
01467 exit (1);
01468 }
01469 Prfx = argv[kar];
01470 AfniHex = YUP;
01471 brk = YUP;
01472 }
01473
01474 if (!brk && (strcmp(argv[kar], "-std") == 0))
01475 {
01476 kar ++;
01477 if (kar >= argc) {
01478 fprintf (SUMA_STDERR, "need argument after -std ");
01479 exit (1);
01480 }
01481 StdType = argv[kar];
01482 Usage3 = YUP;
01483 brk = YUP;
01484 }
01485
01486 if (!brk && (strcmp(argv[kar], "-sl") == 0))
01487 {
01488 SkipLast = YUP;
01489 brk = YUP;
01490 }
01491
01492 if (!brk && (strcmp(argv[kar], "-pos") == 0))
01493 {
01494
01495 PosMap = YUP;
01496
01497 brk = YUP;
01498 }
01499
01500 if (!brk) {
01501 fprintf (SUMA_STDERR,"Error %s: Option %s not understood. Try -help for usage\n", FuncName, argv[kar]);
01502 exit (1);
01503 } else {
01504 brk = NOPE;
01505 kar ++;
01506 }
01507
01508 }
01509
01510
01511 if ( (Usage1 && Usage2) || (Usage1 && Usage3) || (Usage2 && Usage3)) {
01512 fprintf (SUMA_STDERR,"Error %s: Mixing options from multiple usage modes.\n", FuncName);
01513 exit(1);
01514 }
01515
01516 if (!Usage1 && !Usage2 && !Usage3) {
01517 fprintf (SUMA_STDERR,"Error %s: One of these options must be used:\n-f -fn or -std.\n", FuncName);
01518 exit(1);
01519 }
01520
01521 if (Usage1 || Usage2) {
01522 if (!SUMA_filexists (FidName)) {
01523 fprintf (SUMA_STDERR,"Error %s: File %s could not be found.\n", FuncName, FidName);
01524 exit(1);
01525 }
01526
01527
01528 im = mri_read_1D (FidName);
01529 if (!im) {
01530 SUMA_S_Err("Failed to read file");
01531 exit(1);
01532 }
01533
01534 far = MRI_FLOAT_PTR(im);
01535 N_Fid = im->nx * im->ny;
01536 }
01537
01538 if (PosMap) {
01539 fprintf (SUMA_STDERR,"\nWarning %s: -pos option is obsolete.\n", FuncName);
01540 }
01541
01542
01543
01544 if (Usage1) {
01545 if (N_Fid % 3) {
01546 fprintf (SUMA_STDERR,"Error %s: Not all rows in %s appear to have RGB triplets.\n", FuncName, FidName);
01547 exit (1);
01548 }
01549
01550 Fid = (float **) SUMA_allocate2D (N_Fid / 3, 3, sizeof(float));
01551 if (Fid == NULL) {
01552 fprintf (SUMA_STDERR,"Error %s: Could not allocate for Fid.\n", FuncName);
01553 exit(1);
01554 }
01555
01556 for (i=0; i < im->nx; ++i) {
01557 Fid[i][0] = far[i];
01558 Fid[i][1] = far[i+im->nx];
01559 Fid[i][2] = far[i+2*im->nx];
01560 }
01561
01562 mri_free(im); im = NULL;
01563
01564 SM = SUMA_MakeColorMap (Fid, N_Fid/3, Ncols, SkipLast, FuncName);
01565 if (SM == NULL) {
01566 fprintf (SUMA_STDERR,"Error %s: Error in SUMA_MakeColorMap.\n", FuncName);
01567 exit(1);
01568 }
01569 }
01570 if (Usage2) {
01571 if (N_Fid % 4) {
01572 fprintf (SUMA_STDERR,"Error %s: Not all rows in %s appear to have RGB N quadruplets.\n", FuncName, FidName);
01573 exit (1);
01574 }
01575
01576 Fid = (float **) SUMA_allocate2D (N_Fid / 4, 3, sizeof(float));
01577 Nind = (int *) SUMA_calloc (N_Fid/4, sizeof(int));
01578 if (Fid == NULL || !Nind) {
01579 fprintf (SUMA_STDERR,"Error %s: Could not allocate for Fid or Nind.\n", FuncName);
01580 exit(1);
01581 }
01582
01583 for (i=0; i < im->nx; ++i) {
01584 Fid[i][0] = far[i];
01585 Fid[i][1] = far[i+im->nx];
01586 Fid[i][2] = far[i+2*im->nx];
01587 Nind[i] = (int)far[i+3*im->nx];
01588 }
01589
01590 mri_free(im); im = NULL;
01591
01592
01593 SM = SUMA_MakeColorMap_v2 (Fid, N_Fid/4, Nind, SkipLast, FuncName);
01594 if (SM == NULL) {
01595 fprintf (SUMA_STDERR,"Error %s: Error in SUMA_MakeColorMap.\n", FuncName);
01596 exit(1);
01597 }
01598 Ncols = SM->N_Col;
01599 }
01600
01601 if (Usage3) {
01602 SM = SUMA_GetStandardMap (SUMA_StandardMapCode(StdType));
01603 if (SM == NULL) {
01604 fprintf (SUMA_STDERR,"Error %s: Error in SUMA_MakeColorMap.\n", FuncName);
01605 exit(1);
01606 }
01607 Ncols = SM->N_Col;
01608 }
01609
01610 M = SM->M;
01611
01612 if (AfniHex && Ncols > 200) {
01613 fprintf (SUMA_STDERR,"Error %s: Cannot write a colormap of more than 200 colors in Afni's hex format.\n", FuncName);
01614 exit(1);
01615 }
01616
01617
01618 if (!AfniHex)
01619 SUMA_disp_mat (M, Ncols, 3, 1);
01620 else {
01621 fprintf (stdout, "\n***COLORS\n");
01622
01623 for (i=0; i < Ncols; ++i) {
01624
01625 r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][0]*255)), 1, 0);
01626 if (i<10) fprintf (stdout, "%s_0%d = #%s", Prfx, i, h);
01627 else fprintf (stdout, "%s_%d = #%s", Prfx, i, h);
01628
01629 r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][1]*255)), 1, 0);
01630 fprintf (stdout, "%s", h);
01631
01632 r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][2]*255)), 1, 0);
01633 fprintf (stdout, "%s\n", h);
01634 }
01635
01636
01637
01638 fprintf (stdout, "\n***PALETTES %s [%d]\n//1 to -1 range\n", Prfx, Ncols);
01639 ifact = 2;
01640 for (i=0; i < Ncols; ++i) {
01641 fprintf (stdout, "%f -> ", 1.0 - (float)(ifact*i)/Ncols);
01642 if (i<10) fprintf (stdout, "%s_0%d\n", Prfx, i);
01643 else fprintf (stdout, "%s_%d\n", Prfx, i);
01644 }
01645 fprintf (stdout, "\n***PALETTES %s [%d+]\n//1 to 0 range\n", Prfx, Ncols);
01646 ifact = 1;
01647 for (i=0; i < Ncols; ++i) {
01648 fprintf (stdout, "%f -> ", 1.0 - (float)(ifact*i)/Ncols);
01649 if (i<10) fprintf (stdout, "%s_0%d\n", Prfx, i);
01650 else fprintf (stdout, "%s_%d\n", Prfx, i);
01651 }
01652 }
01653
01654
01655 if (Usage1) {
01656 if (Fid) SUMA_free2D((char **)Fid, N_Fid / 3);
01657 } else {
01658 if (Fid) SUMA_free2D((char **)Fid, N_Fid / 4);
01659 if (Nind) SUMA_free(Nind);
01660 }
01661 if (SM) SUMA_Free_ColorMap(SM);
01662
01663 if (!SUMA_Free_CommonFields(SUMAg_CF)) { SUMA_SL_Err("Failed to free commonfields."); }
01664
01665 SUMA_RETURN (0);
01666 }
01667 #endif
01668
01669
01670
01671
01672
01673 SUMA_COLOR_MAP *SUMA_CmapOfPlane (SUMA_OVERLAYS *Sover )
01674 {
01675 static char FuncName[]={"SUMA_CmapOfPlane"};
01676 SUMA_COLOR_MAP *ColMap = NULL;
01677 int icmap;
01678
01679 SUMA_ENTRY;
01680
01681 if (!Sover) { SUMA_SL_Err("NULL Sover"); SUMA_RETURN(ColMap); }
01682 if (!Sover->cmapname) { SUMA_SL_Err("NULL Colormap name"); SUMA_RETURN(ColMap); }
01683
01684 if (strcmp(Sover->cmapname, "explicit") == 0) {
01685 SUMA_RETURN(NULL);
01686 }
01687
01688 if (!SUMAg_CF->scm) {
01689 SUMAg_CF->scm = SUMA_Build_Color_maps();
01690 if (!SUMAg_CF->scm) {
01691 SUMA_SL_Err("Can't build color maps");
01692 SUMA_RETURN(ColMap);
01693 }
01694 }
01695 icmap = SUMA_Find_ColorMap ( Sover->cmapname, SUMAg_CF->scm->CMv, SUMAg_CF->scm->N_maps, -2 );
01696 if (icmap < 0) { SUMA_SL_Err("Failed to find ColMap"); SUMA_RETURN(ColMap); }
01697 ColMap = SUMAg_CF->scm->CMv[icmap];
01698
01699 SUMA_RETURN(ColMap);
01700
01701 }
01702
01703
01704
01705
01706
01707
01708
01709
01710 SUMA_Boolean SUMA_RemoveSO_CoordBias(SUMA_SurfaceObject *SO, SUMA_OVERLAYS *ovr)
01711 {
01712 static char FuncName[]={"SUMA_RemoveSO_CoordBias"};
01713 int i, i3;
01714
01715 SUMA_ENTRY;
01716
01717 if (ovr->OptScl->BiasVect) {
01718 switch (ovr->OptScl->DoBias) {
01719 case SW_CoordBias_X:
01720
01721 for (i=0; i < ovr->N_NodeDef; ++i) {
01722 i3 = 3*ovr->NodeDef[i];
01723 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i];
01724 }
01725 break;
01726 case SW_CoordBias_Y:
01727
01728 for (i=0; i < ovr->N_NodeDef; ++i) {
01729 i3 = 3*ovr->NodeDef[i]+1;
01730 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i];
01731 }
01732 break;
01733 case SW_CoordBias_Z:
01734
01735 for (i=0; i < ovr->N_NodeDef; ++i) {
01736 i3 = 3*ovr->NodeDef[i]+2;
01737 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i];
01738 }
01739 break;
01740 case SW_CoordBias_N:
01741
01742 for (i=0; i < ovr->N_NodeDef; ++i) {
01743 i3 = 3*ovr->NodeDef[i];
01744 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i] * SO->NodeNormList[i3]; ++i3;
01745 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i] * SO->NodeNormList[i3]; ++i3;
01746 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i] * SO->NodeNormList[i3];
01747 }
01748 break;
01749 default:
01750 SUMA_SL_Err("This should not be");
01751 SUMA_RETURN(NOPE);
01752 }
01753 } else {
01754 SUMA_SL_Err("DO not call me with no bias!");
01755 SUMA_RETURN(NOPE);
01756 }
01757
01758
01759 SUMA_NewSurfaceGeometry(SO);
01760
01761 SUMA_RETURN(YUP);
01762 }
01763
01764
01765
01766
01767
01768 SUMA_Boolean SUMA_TransferCoordBias(SUMA_OVERLAYS *ovr, SUMA_WIDGET_INDEX_COORDBIAS BiasDim)
01769 {
01770 static char FuncName[]={"SUMA_TransferCoordBias"};
01771 SUMA_SurfaceObject *SO=NULL;
01772 int iso;
01773 SUMA_Boolean LocalHead = NOPE;
01774 SUMA_ENTRY;
01775
01776 if (!ovr) SUMA_RETURN(YUP);
01777
01778 for (iso=0; iso<SUMAg_N_DOv; ++iso) {
01779 if (SUMA_isSO(SUMAg_DOv[iso])) {
01780 SO = (SUMA_SurfaceObject *)SUMAg_DOv[iso].OP;
01781 if (SUMA_isOverlayOfSO(SO, ovr)) {
01782 SUMA_TransferSO_CoordBias(SO, ovr, BiasDim);
01783 }
01784 }
01785 }
01786
01787 SUMA_LH("Setting bias flag");
01788 ovr->OptScl->DoBias = BiasDim;
01789
01790 SUMA_RETURN(YUP);
01791
01792 }
01793
01794
01795
01796
01797 SUMA_Boolean SUMA_TransferSO_CoordBias(SUMA_SurfaceObject *SO, SUMA_OVERLAYS *ovr, SUMA_WIDGET_INDEX_COORDBIAS BiasDim)
01798 {
01799 static char FuncName[]={"SUMA_TransferSO_CoordBias"};
01800 SUMA_Boolean LocalHead = NOPE;
01801 int i, i3;
01802
01803 SUMA_ENTRY;
01804
01805 SUMA_LH("Called");
01806
01807
01808 if (ovr->OptScl->BiasVect) {
01809 SUMA_LH("Removing old bias");
01810
01811 switch (ovr->OptScl->DoBias) {
01812 case SW_CoordBias_X:
01813
01814 for (i=0; i < ovr->N_NodeDef; ++i) {
01815 i3 = 3*ovr->NodeDef[i];
01816 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i];
01817 }
01818 break;
01819 case SW_CoordBias_Y:
01820
01821 for (i=0; i < ovr->N_NodeDef; ++i) {
01822 i3 = 3*ovr->NodeDef[i]+1;
01823 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i];
01824 }
01825 break;
01826 case SW_CoordBias_Z:
01827
01828 for (i=0; i < ovr->N_NodeDef; ++i) {
01829 i3 = 3*ovr->NodeDef[i]+2;
01830 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i];
01831 }
01832 break;
01833 case SW_CoordBias_N:
01834
01835 for (i=0; i < ovr->N_NodeDef; ++i) {
01836 i3 = 3*ovr->NodeDef[i];
01837 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i] * SO->NodeNormList[i3]; ++i3;
01838 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i] * SO->NodeNormList[i3]; ++i3;
01839 SO->NodeList[i3] -= ovr->OptScl->BiasVect[i] * SO->NodeNormList[i3];
01840 }
01841 break;
01842 default:
01843 SUMA_SL_Err("This should not be");
01844 SUMA_RETURN(NOPE);
01845 }
01846 SUMA_LH("Adding new bias");
01847
01848 #if 0
01849
01850 switch (BiasDim) {
01851 case SW_CoordBias_X:
01852
01853 for (i=0; i < ovr->N_NodeDef; ++i) {
01854 i3 = 3*ovr->NodeDef[i];
01855 SO->NodeList[i3] += ovr->OptScl->BiasVect[i];
01856 }
01857 break;
01858 case SW_CoordBias_Y:
01859
01860 for (i=0; i < ovr->N_NodeDef; ++i) {
01861 i3 = 3*ovr->NodeDef[i]+1;
01862 SO->NodeList[i3] += ovr->OptScl->BiasVect[i];
01863 }
01864 break;
01865 case SW_CoordBias_Z:
01866
01867 for (i=0; i < ovr->N_NodeDef; ++i) {
01868 i3 = 3*ovr->NodeDef[i]+2;
01869 SO->NodeList[i3] += ovr->OptScl->BiasVect[i];
01870 }
01871 break;
01872 case SW_CoordBias_N:
01873
01874 for (i=0; i < ovr->N_NodeDef; ++i) {
01875 i3 = 3*ovr->NodeDef[i];
01876 SO->NodeList[i3] += ovr->OptScl->BiasVect[i] * SO->NodeNormList[i3]; ++i3;
01877 SO->NodeList[i3] += ovr->OptScl->BiasVect[i] * SO->NodeNormList[i3]; ++i3;
01878 SO->NodeList[i3] += ovr->OptScl->BiasVect[i] * SO->NodeNormList[i3];
01879 }
01880 break;
01881 default:
01882 SUMA_SL_Err("This should not be.\nWhy, oh why ?");
01883 SUMA_RETURN(NOPE);
01884 }
01885 #else
01886
01887 SUMA_ADD_COORD_BIAS_VECT(SO, ovr, BiasDim, ovr->OptScl->BiasVect);
01888 #endif
01889 }
01890
01891
01892 SUMA_NewSurfaceGeometry(SO);
01893 SUMA_RETURN(YUP);
01894 }
01895
01896
01897
01898
01899 SUMA_Boolean SUMA_NewSurfaceGeometry(SUMA_SurfaceObject *SO)
01900 {
01901 static char FuncName[]={"SUMA_NewSurfaceGeometry"};
01902 int ii, i;
01903 SUMA_Boolean LocalHead = NOPE;
01904
01905 SUMA_ENTRY;
01906
01907
01908
01909
01910 SUMA_MIN_MAX_SUM_VECMAT_COL (SO->NodeList, SO->N_Node, SO->NodeDim, SO->MinDims, SO->MaxDims, SO->Center);
01911
01912 SO->Center[0] /= SO->N_Node;
01913 SO->Center[1] /= SO->N_Node;
01914 SO->Center[2] /= SO->N_Node;
01915
01916 SUMA_MIN_VEC (SO->MinDims, 3, SO->aMinDims );
01917 SUMA_MAX_VEC (SO->MaxDims, 3, SO->aMaxDims);
01918
01919
01920 for (ii=0; ii<SUMAg_N_SVv; ++ii) {
01921 if (!SUMAg_SVv[ii].isShaded && SUMAg_SVv[ii].X->TOPLEVEL) {
01922 for (i=0; i< SUMAg_SVv[ii].N_DO; ++i) {
01923 if (SUMA_isSO_G(SUMAg_DOv[SUMAg_SVv[ii].RegisteredDO[i]], SUMAg_SVv[ii].CurGroupName)) {
01924
01925 if (SUMA_findSO_inDOv(SO->idcode_str, SUMAg_DOv, SUMAg_N_DOv) == SUMAg_SVv[ii].RegisteredDO[i]) {
01926
01927 SUMA_LH("Marking Viewer ");
01928 SUMAg_SVv[ii].NewGeom = YUP;
01929 }
01930 }
01931 }
01932 }
01933 }
01934
01935 SUMA_RETURN(YUP);
01936 }
01937
01938
01939
01940
01941
01942
01943
01944
01945
01946
01947
01948 SUMA_Boolean SUMA_SetSO_CoordBias(SUMA_SurfaceObject *SO, SUMA_OVERLAYS *ovr, float *NewBias, SUMA_WIDGET_INDEX_COORDBIAS BiasDim)
01949 {
01950 static char FuncName[]={"SUMA_SetSO_CoordBias"};
01951 int i, i3;
01952 SUMA_Boolean LocalHead = NOPE;
01953
01954 SUMA_ENTRY;
01955
01956 if (!ovr) {
01957 SUMA_SL_Err("NULL ovr");
01958 SUMA_RETURN(NOPE);
01959 }
01960 if (!ovr->NodeDef) {
01961 SUMA_SL_Err("NULL ovr->NodeDef");
01962 SUMA_RETURN(NOPE);
01963 }
01964
01965 if (NewBias) {
01966 #if 0
01967 switch (BiasDim) {
01968 case SW_CoordBias_X:
01969
01970 for (i=0; i < ovr->N_NodeDef; ++i) {
01971 i3 = 3*ovr->NodeDef[i];
01972 SO->NodeList[i3] += NewBias[i];
01973 }
01974 break;
01975 case SW_CoordBias_Y:
01976
01977 for (i=0; i < ovr->N_NodeDef; ++i) {
01978 i3 = 3*ovr->NodeDef[i]+1;
01979 SO->NodeList[i3] += NewBias[i];
01980 }
01981 break;
01982 case SW_CoordBias_Z:
01983
01984 for (i=0; i < ovr->N_NodeDef; ++i) {
01985 i3 = 3*ovr->NodeDef[i]+2;
01986 SO->NodeList[i3] += NewBias[i];
01987 }
01988 break;
01989 case SW_CoordBias_N:
01990
01991 for (i=0; i < ovr->N_NodeDef; ++i) {
01992 i3 = 3*ovr->NodeDef[i];
01993 SO->NodeList[i3] += NewBias[i] * SO->NodeNormList[i3]; ++i3;
01994 SO->NodeList[i3] += NewBias[i] * SO->NodeNormList[i3]; ++i3;
01995 SO->NodeList[i3] += NewBias[i] * SO->NodeNormList[i3];
01996 }
01997 break;
01998 case SW_CoordBias_None:
01999
02000 SUMA_SL_Err("Why are you calling me with SW_CoordBias_None and a non-null NewBias?");
02001 SUMA_RETURN(NOPE);
02002 break;
02003 default:
02004 SUMA_SL_Err("This should not be.\nNot at all.");
02005 SUMA_RETURN(NOPE);
02006 }
02007 #else
02008
02009 SUMA_ADD_COORD_BIAS_VECT(SO, ovr, BiasDim, NewBias);
02010 #endif
02011
02012 } else {
02013
02014 }
02015
02016
02017 SUMA_NewSurfaceGeometry(SO);
02018 SUMA_RETURN(YUP);
02019 }
02020
02021
02022
02023
02024
02025
02026
02027 SUMA_Boolean SUMA_SetCoordBias(SUMA_OVERLAYS *ovr, float *NewBias, SUMA_WIDGET_INDEX_COORDBIAS BiasDim)
02028 {
02029 static char FuncName[]={"SUMA_SetCoordBias"};
02030 int i, i3, iso;
02031 SUMA_SurfaceObject *SO=NULL;
02032 SUMA_Boolean LocalHead = NOPE;
02033 SUMA_ENTRY;
02034
02035 if (!ovr) SUMA_RETURN(YUP);
02036
02037 if (ovr->OptScl->BiasVect ) {
02038 SUMA_SL_Err("Can't have Non NULL bias here");
02039 SUMA_Show_ColorOverlayPlanes(&ovr,1,1);
02040 SUMA_RETURN(NOPE);
02041 }
02042
02043 for (iso=0; iso<SUMAg_N_DOv; ++iso) {
02044 if (SUMA_isSO(SUMAg_DOv[iso])) {
02045 SO = (SUMA_SurfaceObject *)SUMAg_DOv[iso].OP;
02046 if (SUMA_isOverlayOfSO(SO, ovr)) {
02047 SUMA_LH(SO->Label);
02048 SUMA_SetSO_CoordBias(SO, ovr, NewBias, BiasDim);
02049 }
02050 }
02051 }
02052
02053 ovr->OptScl->BiasVect = NewBias;
02054 ovr->OptScl->DoBias = BiasDim;
02055
02056 SUMA_RETURN(YUP);
02057 }
02058
02059 SUMA_Boolean SUMA_RemoveCoordBias(SUMA_OVERLAYS *ovr)
02060 {
02061 static char FuncName[]={"SUMA_RemoveCoordBias"};
02062 int i, i3, iso;
02063 SUMA_SurfaceObject *SO=NULL;
02064 SUMA_Boolean LocalHead = NOPE;
02065 SUMA_ENTRY;
02066
02067 if (!ovr) SUMA_RETURN(YUP);
02068 if (ovr->OptScl->BiasVect) {
02069 for (iso=0; iso<SUMAg_N_DOv; ++iso) {
02070 if (SUMA_isSO(SUMAg_DOv[iso])) {
02071 SO = (SUMA_SurfaceObject *)SUMAg_DOv[iso].OP;
02072 if (SUMA_isOverlayOfSO(SO, ovr)) {
02073 SUMA_LH(SO->Label);
02074 SUMA_RemoveSO_CoordBias(SO, ovr);
02075 }
02076 }
02077 }
02078
02079 SUMA_free(ovr->OptScl->BiasVect);
02080 }
02081 ovr->OptScl->BiasVect = NULL;
02082 ovr->OptScl->DoBias = SW_CoordBias_None;
02083
02084 SUMA_RETURN(YUP);
02085 }
02086
02087
02088
02089
02090
02091
02092
02093
02094
02095
02096
02097
02098 SUMA_Boolean SUMA_ScaleToMap_Interactive ( SUMA_OVERLAYS *Sover )
02099 {
02100 static char FuncName[]={"SUMA_ScaleToMap_Interactive"};
02101 float *V=NULL, *T=NULL, *B=NULL;
02102 int i, icmap, i3, cnt, cnt3, loc[2], *nd=NULL;
02103 float Range[2], minV, maxV, minB, maxB, fact=0.0, floc = 0.0;
02104 SUMA_COLOR_MAP *ColMap = NULL;
02105 SUMA_SCALE_TO_MAP_OPT *Opt = NULL;
02106 SUMA_COLOR_SCALED_VECT * SV = NULL;
02107 float *junk;
02108 SUMA_WIDGET_INDEX_COORDBIAS HoldBiasOpt;
02109 SUMA_Boolean LocalHead = NOPE;
02110
02111 SUMA_ENTRY;
02112
02113
02114 if (!Sover) { SUMA_SL_Err("NULL Sover"); SUMA_RETURN(NOPE); }
02115 if (!Sover->cmapname) { SUMA_SL_Err("NULL Colormap name"); SUMA_RETURN(NOPE); }
02116 if (!SUMAg_CF->scm) {
02117 SUMAg_CF->scm = SUMA_Build_Color_maps();
02118 if (!SUMAg_CF->scm) {
02119 SUMA_SL_Err("Can't build color maps");
02120 SUMA_RETURN(NOPE);
02121 }
02122 }
02123 icmap = SUMA_Find_ColorMap ( Sover->cmapname, SUMAg_CF->scm->CMv, SUMAg_CF->scm->N_maps, -2 );
02124 if (icmap < 0) { SUMA_SL_Err("Failed to find ColMap"); SUMA_RETURN(NOPE); }
02125 ColMap = SUMAg_CF->scm->CMv[icmap];
02126
02127 Opt = Sover->OptScl;
02128
02129
02130 SV = SUMA_Create_ColorScaledVect(Sover->dset_link->dnel->vec_filled);
02131
02132 SUMA_LH("Fetching vetors from dset");
02133 T = NULL; V = NULL; B = NULL;
02134
02135 if (Opt->tind >= 0 && Opt->UseThr) {
02136 SUMA_LH("Fetching Threshold column");
02137
02138 T = SUMA_DsetCol2Float (Sover->dset_link, Opt->tind, 0);
02139 if (!T) { SUMA_SL_Err("Failed to get T"); SUMA_RETURN(NOPE); }
02140 switch (Opt->ThrMode) {
02141 case SUMA_LESS_THAN:
02142 for (i=0; i<Sover->dset_link->dnel->vec_filled; ++i) {
02143 if (T[i] < Opt->ThreshRange[0]) {
02144 SV->isMasked[i] = YUP;
02145 }
02146 }
02147 break;
02148 case SUMA_ABS_LESS_THAN:
02149 for (i=0; i<Sover->dset_link->dnel->vec_filled; ++i) {
02150 if (T[i] < Opt->ThreshRange[0] && T[i] > -Opt->ThreshRange[0]) {
02151 SV->isMasked[i] = YUP;
02152 }
02153 }
02154 break;
02155 case SUMA_THRESH_OUTSIDE_RANGE:
02156 for (i=0; i<Sover->dset_link->dnel->vec_filled; ++i) {
02157 if (T[i] < Opt->ThreshRange[0] || T[i] > Opt->ThreshRange[1]) {
02158 SV->isMasked[i] = YUP;
02159 }
02160 }
02161 break;
02162 case SUMA_THRESH_INSIDE_RANGE:
02163 for (i=0; i<Sover->dset_link->dnel->vec_filled; ++i) {
02164 if (T[i] > Opt->ThreshRange[0] && T[i] < Opt->ThreshRange[1]) {
02165 SV->isMasked[i] = YUP;
02166 }
02167 }
02168 break;
02169 default:
02170 SUMA_SL_Err("Wrond threshold mode");
02171 SUMA_RETURN(NOPE);
02172 break;
02173 }
02174
02175 if (T) SUMA_free(T); T = NULL;
02176 }
02177
02178 SUMA_LH("Fetching Intensity column");
02179 if (Opt->find < 0) { SUMA_SL_Crit("Bad column index.\n"); SUMA_RETURN(NOPE); }
02180 else {
02181
02182 V = SUMA_DsetCol2Float (Sover->dset_link, Opt->find, 0);
02183 if (!V) { SUMA_SL_Err("Failed to get V"); SUMA_RETURN(NOPE); }
02184 }
02185
02186
02187 if (Opt->alaAFNI) {
02188
02189 SUMA_LH("Scaling a la AFNI");
02190 if (!SUMA_ScaleToMap_alaAFNI (V, Sover->dset_link->dnel->vec_filled,
02191 SUMA_LARG_ABS(Opt->IntRange[0], Opt->IntRange[1]),
02192 ColMap, Opt,
02193 SV) ) {
02194 SUMA_SL_Err("Failed in SUMA_ScaleToMap_alaAFNI");
02195 SUMA_RETURN(NOPE);
02196 }
02197 } else {
02198
02199 SUMA_LH("Scaling a la SUMA");
02200 if (!SUMA_ScaleToMap( V, Sover->dset_link->dnel->vec_filled,
02201 Opt->IntRange[0], Opt->IntRange[1],
02202 ColMap, Opt,
02203 SV) ){
02204 SUMA_SL_Err("Failed in SUMA_ScaleToMap");
02205 SUMA_RETURN(NOPE);
02206 }
02207 }
02208
02209
02210 if (Opt->bind >= 0 && Opt->UseBrt) {
02211 SUMA_LH("Brightness modulation needed");
02212
02213 B = SUMA_DsetCol2Float (Sover->dset_link, Opt->bind, 0);
02214 if (!B) { SUMA_SL_Err("Failed to get B"); SUMA_RETURN(NOPE); }
02215
02216 if (Opt->BrightRange[0] && Opt->BrightRange[1]) {
02217
02218 minB = Opt->BrightRange[0]; maxB = Opt->BrightRange[1];
02219 for (i=0; i<Sover->dset_link->dnel->vec_filled; ++i) {
02220 if (!SV->isMasked[i]) {
02221
02222 if (B[i] < Opt->BrightRange[0]) B[i] = Opt->BrightRange[0];
02223 else if (B[i] > Opt->BrightRange[1]) B[i] = Opt->BrightRange[1];
02224 }
02225 }
02226 } else {
02227 if (!SUMA_GetDsetColRange(Sover->dset_link, Opt->bind, Range, loc)) { SUMA_SL_Err("Failed to get ColRange!"); SUMA_RETURN(NOPE); }
02228 minB = Range[0]; maxB = Range[1];
02229 }
02230
02231 SUMA_LH("Scaling by B");
02232 fact = (Opt->BrightMap[1] - Opt->BrightMap[0]) / (maxB - minB);
02233 for (i=0; i<Sover->dset_link->dnel->vec_filled; ++i) {
02234 if (!SV->isMasked[i]) {
02235
02236 i3 = 3*i;
02237 floc = (B[i] - minB) * fact + Opt->BrightMap[0];
02238 SV->cV[i3 ] = SV->cV[i3 ] * floc;
02239 SV->cV[i3 +1] = SV->cV[i3 +1] * floc;
02240 SV->cV[i3 +2] = SV->cV[i3 +2] * floc;
02241 }
02242 }
02243 }
02244
02245
02246 HoldBiasOpt = Opt->DoBias;
02247 if (Opt->DoBias == SW_CoordBias_X || Opt->DoBias == SW_CoordBias_Y || Opt->DoBias == SW_CoordBias_Z || Opt->DoBias == SW_CoordBias_N ) {
02248 SUMA_RemoveCoordBias(Sover);
02249 }
02250
02251
02252 SUMA_LH("Copying into NodeDef");
02253 nd = SUMA_GetNodeDef(Sover->dset_link);
02254 if (nd) {
02255 cnt = 0;
02256 for (i=0; i<Sover->dset_link->dnel->vec_filled; ++i) {
02257 if (!SV->isMasked[i]) {
02258 cnt3 = 3*cnt; i3 = 3*i;
02259 Sover->NodeDef[cnt] = nd[i];
02260 Sover->ColVec[cnt3 ] = SV->cV[i3 ];
02261 Sover->ColVec[cnt3 +1] = SV->cV[i3 +1];
02262 Sover->ColVec[cnt3 +2] = SV->cV[i3 +2];
02263 if (SV->BiasCoordVec) SV->BiasCoordVec[cnt] = SV->BiasCoordVec[i];
02264 ++cnt;
02265 }
02266 }
02267 } else {
02268 cnt = 0;
02269 for (i=0; i<Sover->dset_link->dnel->vec_filled; ++i) {
02270 if (!SV->isMasked[i]) {
02271 cnt3 = 3*cnt; i3 = 3*i;
02272 Sover->NodeDef[cnt] = i;
02273 Sover->ColVec[cnt3 ] = SV->cV[i3 ];
02274 Sover->ColVec[cnt3 +1] = SV->cV[i3 +1];
02275 Sover->ColVec[cnt3 +2] = SV->cV[i3 +2];
02276 if (SV->BiasCoordVec) SV->BiasCoordVec[cnt] = SV->BiasCoordVec[i];
02277 ++cnt;
02278 }
02279 }
02280 }
02281 Sover->N_NodeDef = cnt;
02282 Sover->FullList = NOPE;
02283
02284
02285
02286 switch (HoldBiasOpt) {
02287 case SW_CoordBias_X:
02288 SUMA_LH("Bias X");
02289 SUMA_SetCoordBias(Sover, SV->BiasCoordVec, SW_CoordBias_X);
02290 SV->BiasCoordVec = NULL;
02291 break;
02292 case SW_CoordBias_Y:
02293 SUMA_LH("Bias Y");
02294 SUMA_SetCoordBias(Sover, SV->BiasCoordVec, SW_CoordBias_Y);
02295 SV->BiasCoordVec = NULL;
02296 break;
02297 case SW_CoordBias_Z:
02298 SUMA_LH("Bias Z");
02299 SUMA_SetCoordBias(Sover, SV->BiasCoordVec, SW_CoordBias_Z);
02300 SV->BiasCoordVec = NULL;
02301 break;
02302 case SW_CoordBias_N:
02303 SUMA_LH("Bias N");
02304 SUMA_SetCoordBias(Sover, SV->BiasCoordVec, SW_CoordBias_N);
02305 SV->BiasCoordVec = NULL;
02306 break;
02307 default:
02308 SUMA_LH("Bias None");
02309 break;
02310 }
02311
02312 if (LocalHead) {
02313 SUMA_LH("In Scale_Interactive\n**********************");
02314
02315 }
02316
02317
02318
02319 SUMA_LH("Cleanup, cleanup, everybody cleanup");
02320 if (T) SUMA_free(T); T = NULL;
02321 if (V) SUMA_free(V); V = NULL;
02322 if (B) SUMA_free(B); B = NULL;
02323 if (SV) SUMA_Free_ColorScaledVect (SV); SV = NULL;
02324 SUMA_RETURN(YUP);
02325
02326 }
02327
02328 SUMA_Boolean SUMA_ScaleToMap_alaAFNI ( float *V, int N_V,
02329 float range,
02330 SUMA_COLOR_MAP *ColMap,
02331 SUMA_SCALE_TO_MAP_OPT *Opt,
02332 SUMA_COLOR_SCALED_VECT * SV)
02333 {
02334 static char FuncName[]={"SUMA_ScaleToMap_alaAFNI"};
02335 int i,j, i0, i1, i3, mxColindex;
02336 float Vmin, Vmax, MinCol, MaxCol, Vrange, Vscl, r, **Mbuf= NULL;
02337 SUMA_Boolean NewMap = NOPE;
02338 SUMA_Boolean LocalHead = NOPE;
02339
02340 SUMA_ENTRY;
02341
02342
02343
02344 if (range == 0.0) {
02345
02346 Vmin = V[0]; Vmax = V[0];
02347 for (i=0; i < N_V; ++i) {
02348 if (V[i] > Vmax) Vmax = V[i];
02349 else if (V[i] < Vmin) Vmin = V[i];
02350 }
02351 } else {
02352 if (ColMap->Sgn >= 0) {
02353 Vmin = 0.0;
02354 Vmax = range;
02355 }else {
02356 Vmin = -range;
02357 Vmax = range;
02358 }
02359 }
02360
02361
02362 if (Opt->ApplyMask){
02363 if (Opt->MaskZero) {
02364
02365 for (i=0; i < N_V; ++i) {
02366 if (!V[i] || (V[i] >= Opt->MaskRange[0] && V[i] <= Opt->MaskRange[1]) ) SV->isMasked[i] = YUP;
02367 }
02368 } else {
02369
02370 for (i=0; i < N_V; ++i) {
02371 if (V[i] >= Opt->MaskRange[0] && V[i] <= Opt->MaskRange[1]) SV->isMasked[i] = YUP;
02372 }
02373 }
02374 } else {
02375 if (Opt->MaskZero) {
02376
02377 for (i=0; i < N_V; ++i) {
02378 if (!V[i]) SV->isMasked[i] = YUP;
02379 }
02380 }
02381 }
02382
02383
02384 if (Opt->ApplyClip) {
02385 SUMA_S_Warn("Option Opt->ApplyClip not applicable here.\nOption ignored.");
02386 }
02387 for (i=0; i < N_V; ++i) {
02388 if (!SV->isMasked[i]) {
02389 if (V[i] > Vmin) {
02390
02391 } else {
02392 V[i] = Vmin;
02393 }
02394
02395 if (V[i] < Vmax) {
02396
02397 } else {
02398 V[i] = Vmax;
02399 }
02400 }
02401 }
02402
02403
02404 if (ColMap->frac) {
02405
02406 SUMA_LH("Linearizing colormap ...");
02407 NewMap = YUP;
02408 if (ColMap->frac[0] > 0 && ColMap->Sgn == -1) {
02409 SUMA_S_Warn ("Color map fractions are positive with Sgn flag = -1");
02410 }
02411 if (ColMap->frac[0] < 0 && ColMap->Sgn == 1) {
02412 SUMA_S_Warn ("Color map fractions are negative with Sgn flag = 1");
02413 }
02414 ColMap = SUMA_Linearize_Color_Map (ColMap, -1);
02415 if (LocalHead) {
02416 FILE *lincmap=NULL;
02417 int ii = 0;
02418 lincmap=fopen("./lincmap.1D", "w");
02419 if (lincmap) {
02420 SUMA_LH("Linearized map written to ./lincmap.1D");
02421
02422
02423 for (ii=ColMap->N_Col-1; ii >=0; --ii) {
02424 fprintf (lincmap, "%d\t%f\t%f\t%f\n", ii, ColMap->M[ii][0], ColMap->M[ii][1],ColMap->M[ii][2]);
02425 }
02426 fclose (lincmap); lincmap = NULL;
02427 }else {
02428 SUMA_SL_Err("Failed to write linearized colormap to file.\nProceeding...");
02429 }
02430 }
02431
02432 }else {
02433 SUMA_LH("NO Linearizing of colormap deemed necessary...");
02434 NewMap = NOPE;
02435 }
02436
02437
02438 Mbuf = NULL;
02439 if (Opt->BrightFact <= 0 || Opt->BrightFact > 1) {
02440 fprintf (SUMA_STDERR,"Error %s: Opt->BrightFact must be between ]0 1]\n", FuncName);
02441 SUMA_RETURN (NOPE);
02442 }else {
02443 if (Opt->BrightFact != 1) {
02444 Mbuf = ColMap->M;
02445 ColMap->M = (float **)SUMA_allocate2D(ColMap->N_Col, 3, sizeof(float));
02446 for (i=0; i < ColMap->N_Col; ++i) {
02447 ColMap->M[i][0] = Mbuf[i][0] * Opt->BrightFact;
02448 ColMap->M[i][1] = Mbuf[i][1] * Opt->BrightFact;
02449 ColMap->M[i][2] = Mbuf[i][2] * Opt->BrightFact;
02450 }
02451
02452 Opt->MaskColor[0] *= Opt->BrightFact;
02453 Opt->MaskColor[1] *= Opt->BrightFact;
02454 Opt->MaskColor[2] *= Opt->BrightFact;
02455 }
02456 }
02457
02458 if (Opt->interpmode != SUMA_DIRECT && Opt->interpmode != SUMA_NO_INTERP && Opt->interpmode != SUMA_INTERP) {
02459 fprintf (SUMA_STDERR,"Error %s: Opt->interpmode is incorrectly specifed (%d).\n", FuncName, Opt->interpmode);
02460 SUMA_RETURN(NOPE);
02461 }
02462
02463 if (Opt->interpmode == SUMA_INTERP || Opt->interpmode == SUMA_NO_INTERP) {
02464
02465 MinCol = 0.0; MaxCol = (float)ColMap->N_Col;
02466 Vrange = Vmax - Vmin;
02467 if (LocalHead) fprintf(SUMA_STDERR,"%s: [Vrange, Vmax, Vmin] = [%f, %f, %f]\nInterpMode=%d\n",
02468 FuncName, Vrange, Vmax, Vmin, Opt->interpmode);
02469 if (Vrange < 0) {
02470 fprintf (SUMA_STDERR,"Error %s: Vmax < Vmin.\n", FuncName);
02471 SUMA_RETURN (NOPE);
02472 }
02473
02474 if (Vrange > 0) {
02475 mxColindex = ColMap->N_Col -1;
02476 if (Opt->interpmode == SUMA_NO_INTERP) {
02477 SUMA_LH("No_Interp mode");
02478 for (i=0; i < N_V; ++i) {
02479 i3 = 3*i;
02480 if (!SV->isMasked[i]) {
02481 Vscl = (V[i] - Vmin) / Vrange * ColMap->N_Col;
02482 if (Vscl < 0) Vscl = 0; if (Vscl > ColMap->N_Col) Vscl = ColMap->N_Col;
02483 i0 = (int)(Vscl);
02484 if (i0 > mxColindex) i0 = mxColindex;
02485 if (LocalHead) {
02486 fprintf(SUMA_STDERR,"%s: %f-->%f: Colmap index is %d\n", FuncName, V[i], Vscl, i0);
02487 }
02488 if (ColMap->M[i0][0] >= 0) {
02489 SV->cV[i3 ] = ColMap->M[i0][0];
02490 SV->cV[i3+1] = ColMap->M[i0][1];
02491 SV->cV[i3+2] = ColMap->M[i0][2];
02492 } else {
02493 SV->isMasked[i] = YUP;
02494 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02495 }
02496 } else {
02497 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02498 }
02499 if (LocalHead) {
02500 fprintf(SUMA_STDERR,"%s: %f-->[%f %f %f]\n", FuncName, V[i], SV->cV[i3 ], SV->cV[i3+1], SV->cV[i3+2]);
02501 }
02502 }
02503 } else {
02504 SUMA_LH("Interp mode");
02505 for (i=0; i < N_V; ++i) {
02506 i3 = 3*i;
02507 if (!SV->isMasked[i]) {
02508 Vscl = (V[i] - Vmin) / Vrange * ColMap->N_Col;
02509 if (Vscl < 0) Vscl = 0; if (Vscl > ColMap->N_Col) Vscl = ColMap->N_Col;
02510
02511 i0 = (int)(Vscl);
02512 if (i0 > mxColindex) i0 = mxColindex;
02513 i1=i0+1;
02514
02515 if (ColMap->M[i0][0] >= 0) {
02516 if (i1 < ColMap->N_Col) {
02517 r = Vscl - i0;
02518
02519
02520
02521 SV->cV[i3 ] = ColMap->M[i0][0] + r * (ColMap->M[i1][0] - ColMap->M[i0][0]);
02522 SV->cV[i3+1] = ColMap->M[i0][1] + r * (ColMap->M[i1][1] - ColMap->M[i0][1]);
02523 SV->cV[i3+2] = ColMap->M[i0][2] + r * (ColMap->M[i1][2] - ColMap->M[i0][2]);
02524 } else {
02525 SV->cV[i3 ] = ColMap->M[i0][0];
02526 SV->cV[i3+1] = ColMap->M[i0][1];
02527 SV->cV[i3+2] = ColMap->M[i0][2];
02528 }
02529 } else {
02530 SV->isMasked[i] = YUP;
02531 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02532 }
02533 } else {
02534 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02535 }
02536 }
02537 }
02538 } else {
02539 fprintf (SUMA_STDOUT,"Warning %s: Node value range is 0, using middle color in colormap.\n", FuncName);
02540 i0 = (ColMap->N_Col - 1)/2;
02541 for (i=0; i < N_V; ++i) {
02542 i3 = 3*i;
02543 if (!SV->isMasked[i]) {
02544 if (ColMap->M[i0][0] >= 0) {
02545 SV->cV[i3 ] = ColMap->M[i0][0];
02546 SV->cV[i3+1] = ColMap->M[i0][1];
02547 SV->cV[i3+2] = ColMap->M[i0][2];
02548 } else {
02549 SV->isMasked[i] = YUP;
02550 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02551 }
02552 } else {
02553 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02554 }
02555 }
02556 }
02557 } else {
02558
02559 SUMA_LH("Direct colormapping");
02560 if (Opt->interpmode != SUMA_DIRECT) {
02561 fprintf (SUMA_STDOUT,"Error %s: Logic error, should never get here with Opt->interpmode != SUMA_DIRECT\n", FuncName);
02562 SUMA_RETURN(NOPE);
02563 }
02564 for (i=0; i < N_V; ++i) {
02565 i3 = 3*i;
02566 if (!SV->isMasked[i]) {
02567 i0 = (int)V[i];
02568 if (i0 < 0) i0 = 0;
02569 else if (i0 >= ColMap->N_Col) i0 = ColMap->N_Col -1;
02570 if (ColMap->M[i0][0] >= 0) {
02571 SV->cV[i3 ] = ColMap->M[i0][0];
02572 SV->cV[i3+1] = ColMap->M[i0][1];
02573 SV->cV[i3+2] = ColMap->M[i0][2];
02574 } else {
02575 SV->isMasked[i] = YUP;
02576 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02577 }
02578 } else {
02579 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02580 }
02581
02582 }
02583 }
02584 if (Mbuf) {
02585
02586 SUMA_free2D((char **)ColMap->M, ColMap->N_Col);
02587 ColMap->M = Mbuf; Mbuf = NULL;
02588 }
02589 if (NewMap) {
02590 SUMA_LH("Freeing linearized colormap.");
02591 SUMA_Free_ColorMap (ColMap);
02592 }
02593
02594 SUMA_RETURN (YUP);
02595
02596 }
02597
02598
02599
02600
02601
02602
02603
02604
02605
02606
02607
02608
02609
02610
02611
02612
02613
02614
02615
02616
02617
02618
02619
02620
02621
02622
02623
02624 SUMA_Boolean SUMA_ScaleToMap (float *V, int N_V,
02625 float Vmin, float Vmax,
02626 SUMA_COLOR_MAP *ColMap,
02627 SUMA_SCALE_TO_MAP_OPT *Opt,
02628 SUMA_COLOR_SCALED_VECT * SV)
02629 {
02630 static char FuncName[]={"SUMA_ScaleToMap"};
02631 int i,j, i0, i1, mxColindex, i3=0;
02632 float MinCol, MaxCol, Vrange, Vscl, r, **Mbuf= NULL;
02633 SUMA_Boolean NewMap = NOPE;
02634 SUMA_Boolean LocalHead = NOPE;
02635
02636 SUMA_ENTRY;
02637
02638 if (!ColMap) {
02639 SUMA_SL_Err("NULL ColMap");
02640 SUMA_RETURN(NOPE);
02641 }
02642 if (!Opt) {
02643 SUMA_SL_Err("NULL Opt");
02644 SUMA_RETURN(NOPE);
02645 }
02646 if (!SV) {
02647 SUMA_SL_Err("NULL SV");
02648 SUMA_RETURN(NOPE);
02649 }
02650 if (!V) {
02651 SUMA_SL_Err("NULL V");
02652 SUMA_RETURN(NOPE);
02653 }
02654
02655
02656 if (ColMap->Sgn < 0) {
02657
02658
02659 SUMA_LH("Colormap is split into positive and negative.\n Make sure your range is from -a to + a to have the mapping resemble AFNI's");
02660 }
02661
02662
02663 if (Opt->ApplyMask){
02664 SUMA_LH("Applying Mask");
02665 if (Opt->MaskZero) {
02666
02667 for (i=0; i < N_V; ++i) {
02668 if (!V[i] || (V[i] >= Opt->MaskRange[0] && V[i] <= Opt->MaskRange[1])) SV->isMasked[i] = YUP;
02669 }
02670 } else {
02671
02672 for (i=0; i < N_V; ++i) {
02673 if (V[i] >= Opt->MaskRange[0] && V[i] <= Opt->MaskRange[1]) SV->isMasked[i] = YUP;
02674 }
02675 }
02676 }else {
02677 if (Opt->MaskZero) {
02678 SUMA_LH("Masking Zeros");
02679
02680 for (i=0; i < N_V; ++i) {
02681 if (!V[i]) SV->isMasked[i] = YUP;
02682 }
02683 }
02684 }
02685
02686
02687 if (Opt->ApplyClip) {
02688 SUMA_LH( "Applying Clip \n"
02689 "(This one's not used in\n"
02690 " interactive mode anymore \n"
02691 " because clipping is handled \n"
02692 " in the colormapping part)");
02693 for (i=0; i < N_V; ++i) {
02694 if (!SV->isMasked[i]) {
02695 if (V[i] > Opt->IntRange[0]) {
02696
02697 } else {
02698 V[i] = Opt->IntRange[0];
02699 }
02700
02701 if (V[i] < Opt->IntRange[1]) {
02702
02703 } else {
02704 V[i] = Opt->IntRange[1];
02705 }
02706 }
02707 }
02708 Vmin = Opt->IntRange[0];
02709 Vmax = Opt->IntRange[1];
02710 }
02711
02712
02713 if (Opt->DoBias == SW_CoordBias_X || Opt->DoBias == SW_CoordBias_Y || Opt->DoBias == SW_CoordBias_Z || Opt->DoBias == SW_CoordBias_N) {
02714 SUMA_LH("Coord Bias requested");
02715 if (!SV->BiasCoordVec) {
02716 SUMA_LH("Allocating for BiasCoordVec");
02717 SV->BiasCoordVec = (float *)SUMA_calloc(N_V, sizeof(float));
02718 if (!SV->BiasCoordVec) { SUMA_SL_Crit("Failed to allocate"); SUMA_RETURN(NOPE); }
02719 }else {
02720 SUMA_SL_Err("Do not expect this not to be null here ... ");
02721 SUMA_RETURN(NOPE);
02722 }
02723 } else {
02724 SUMA_LH("No Coord Bias requested");
02725 if (SV->BiasCoordVec) {
02726 SUMA_SL_Err("Do NOT expect this not to be null here ... ");
02727 SUMA_RETURN(NOPE);
02728 }
02729 }
02730
02731
02732 if (ColMap->frac) {
02733 if (Opt->interpmode == SUMA_NO_INTERP || Opt->interpmode == SUMA_INTERP) {
02734
02735 SUMA_LH("Linearizing colormap ...");
02736 NewMap = YUP;
02737 if (ColMap->frac[0] > 0 && ColMap->Sgn == -1) {
02738 SUMA_S_Warn ("Color map fractions are positive with Sgn flag = -1");
02739 }
02740 if (ColMap->frac[0] < 0 && ColMap->Sgn == 1) {
02741 SUMA_S_Warn ("Color map fractions are negative with Sgn flag = 1");
02742 }
02743 ColMap = SUMA_Linearize_Color_Map (ColMap, -1);
02744 } else {
02745 if (Opt->interpmode != SUMA_DIRECT) {
02746 SUMA_SL_Err("Not expected interpmode.");
02747
02748 NewMap = NOPE;
02749 }
02750 }
02751 }else {
02752 SUMA_LH("NO Linearizing of colormap deemed necessary...");
02753 NewMap = NOPE;
02754 }
02755
02756
02757 Mbuf = NULL;
02758 if (Opt->BrightFact <= 0 || Opt->BrightFact > 1) {
02759 fprintf (SUMA_STDERR,"Error %s: Opt->BrightFact must be between ]0 1]\n", FuncName);
02760 SUMA_RETURN (NOPE);
02761 }else {
02762 if (Opt->BrightFact != 1) {
02763 SUMA_LH("Modulating brightness of map");
02764 Mbuf = ColMap->M;
02765 ColMap->M = (float **)SUMA_allocate2D(ColMap->N_Col, 3, sizeof(float));
02766 for (i=0; i < ColMap->N_Col; ++i) {
02767 ColMap->M[i][0] = Mbuf[i][0] * Opt->BrightFact;
02768 ColMap->M[i][1] = Mbuf[i][1] * Opt->BrightFact;
02769 ColMap->M[i][2] = Mbuf[i][2] * Opt->BrightFact;
02770 }
02771
02772 Opt->MaskColor[0] *= Opt->BrightFact;
02773 Opt->MaskColor[1] *= Opt->BrightFact;
02774 Opt->MaskColor[2] *= Opt->BrightFact;
02775 }
02776 }
02777
02778
02779 if (Opt->interpmode != SUMA_DIRECT && Opt->interpmode != SUMA_NO_INTERP && Opt->interpmode != SUMA_INTERP) {
02780 fprintf (SUMA_STDERR,"Error %s: Opt->interpmode is incorrectly specifed (%d).\n", FuncName, Opt->interpmode);
02781 SUMA_RETURN(NOPE);
02782 }
02783
02784 if (Opt->interpmode == SUMA_NO_INTERP || Opt->interpmode == SUMA_INTERP) {
02785
02786 MinCol = 0.0; MaxCol = (float)ColMap->N_Col;
02787 Vrange = Vmax - Vmin;
02788 if (Vrange < 0) {
02789 fprintf (SUMA_STDERR,"Error %s: Vmax < Vmin.\n", FuncName);
02790 SUMA_RETURN (NOPE);
02791 }
02792
02793 if (Vrange > 0) {
02794 mxColindex = ColMap->N_Col -1;
02795 if (Opt->interpmode == SUMA_NO_INTERP) {
02796 SUMA_LH("No Interp Mode");
02797 for (i=0; i < N_V; ++i) {
02798 i3 = 3*i;
02799 if (!SV->isMasked[i]) {
02800 Vscl = (V[i] - Vmin) / Vrange * ColMap->N_Col;
02801 if (Vscl < 0) Vscl = 0; if (Vscl > ColMap->N_Col) Vscl = ColMap->N_Col;
02802 i0 = (int)(Vscl);
02803 if (i0 > mxColindex) i0 = mxColindex;
02804 if (SV->BiasCoordVec) SV->BiasCoordVec[i] = Vscl;
02805 if (ColMap->M[i0][0] >= 0) {
02806 SV->cV[i3 ] = ColMap->M[i0][0];
02807 SV->cV[i3+1] = ColMap->M[i0][1];
02808 SV->cV[i3+2] = ColMap->M[i0][2];
02809 } else {
02810 SV->isMasked[i] = YUP;
02811 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02812 }
02813 } else {
02814 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02815 }
02816 }
02817 } else {
02818 SUMA_LH("Interp Mode");
02819 for (i=0; i < N_V; ++i) {
02820 i3 = 3*i;
02821 if (!SV->isMasked[i]) {
02822 Vscl = (V[i] - Vmin) / Vrange * ColMap->N_Col;
02823 if (Vscl < 0) Vscl = 0; if (Vscl > ColMap->N_Col) Vscl = ColMap->N_Col;
02824
02825 i0 = (int)(Vscl);
02826 if (i0 > mxColindex) i0 = mxColindex;
02827 i1=i0+1;
02828 if (SV->BiasCoordVec) {
02829 SV->BiasCoordVec[i] = Vscl;
02830 }
02831
02832 if (ColMap->M[i0][0] >= 0) {
02833 if (i1 < ColMap->N_Col) {
02834 r = Vscl - i0;
02835 SV->cV[i3 ] = ColMap->M[i0][0] + r * (ColMap->M[i1][0] - ColMap->M[i0][0]);
02836 SV->cV[i3+1] = ColMap->M[i0][1] + r * (ColMap->M[i1][1] - ColMap->M[i0][1]);
02837 SV->cV[i3+2] = ColMap->M[i0][2] + r * (ColMap->M[i1][2] - ColMap->M[i0][2]);
02838 } else {
02839 SV->cV[i3 ] = ColMap->M[i0][0];
02840 SV->cV[i3+1] = ColMap->M[i0][1];
02841 SV->cV[i3+2] = ColMap->M[i0][2];
02842 }
02843 } else {
02844 SV->isMasked[i] = YUP;
02845 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02846 }
02847 } else {
02848 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02849 }
02850 }
02851 }
02852 }else {
02853 fprintf (SUMA_STDOUT,"Warning %s: Node value range is 0, using middle color in colormap.\n", FuncName);
02854 i0 = (ColMap->N_Col - 1)/2;
02855 for (i=0; i < N_V; ++i) {
02856 i3 = 3 * i;
02857 if (!SV->isMasked[i]) {
02858 if (SV->BiasCoordVec) SV->BiasCoordVec[i] = i0;
02859 SV->cV[i3 ] = ColMap->M[i0][0];
02860 SV->cV[i3+1] = ColMap->M[i0][1];
02861 SV->cV[i3+2] = ColMap->M[i0][2];
02862 } else {
02863 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02864 }
02865 }
02866 }
02867 } else {
02868
02869 SUMA_LH( "Direct colormapping.\n"
02870 "Opt->IntRange values are \n"
02871 "meaningless" );
02872 if (Opt->interpmode != SUMA_DIRECT) {
02873 fprintf (SUMA_STDOUT,"Error %s: Logic error, should never get here with Opt->interpmode != SUMA_DIRECT\n", FuncName);
02874 SUMA_RETURN(NOPE);
02875 }
02876 for (i=0; i < N_V; ++i) {
02877 i3 = 3*i;
02878 if (!SV->isMasked[i]) {
02879 i0 = (int)V[i];
02880 if (i0 < 0) i0 = 0;
02881 else if (i0 >= ColMap->N_Col) i0 = ColMap->N_Col -1;
02882 if (ColMap->M[i0][0] >= 0) {
02883 SV->cV[i3 ] = ColMap->M[i0][0];
02884 SV->cV[i3+1] = ColMap->M[i0][1];
02885 SV->cV[i3+2] = ColMap->M[i0][2];
02886 if (SV->BiasCoordVec) SV->BiasCoordVec[i] = i0;
02887 } else {
02888 SV->isMasked[i] = YUP;
02889 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02890 }
02891 } else {
02892 SV->cV[i3 ] = Opt->MaskColor[0]; SV->cV[i3+1] = Opt->MaskColor[1]; SV->cV[i3+2] = Opt->MaskColor[2];
02893 }
02894
02895 }
02896
02897 }
02898
02899
02900 Vrange = (Opt->CoordBiasRange[1] - Opt->CoordBiasRange[0]) / ColMap->N_Col;
02901 if (SV->BiasCoordVec) {
02902 SUMA_LH("Adding the CoordBias");
02903 for (i=0; i < N_V; ++i) {
02904 if (!SV->isMasked[i]) {
02905 SV->BiasCoordVec[i] = Opt->CoordBiasRange[0] + SV->BiasCoordVec[i] * Vrange;
02906
02907 } else SV->BiasCoordVec[i] = 0.0;
02908 }
02909 }
02910
02911 if (Mbuf) {
02912
02913 SUMA_free2D((char **)ColMap->M, ColMap->N_Col);
02914 ColMap->M = Mbuf; Mbuf = NULL;
02915 }
02916 if (NewMap) {
02917 SUMA_LH("Freeing linearized colormap.");
02918 SUMA_Free_ColorMap (ColMap);
02919 }
02920
02921 SUMA_RETURN (YUP);
02922 }
02923
02924
02925
02926
02927
02928
02929
02930
02931
02932
02933 SUMA_COLOR_SCALED_VECT * SUMA_Create_ColorScaledVect(int N_Node)
02934 {
02935 static char FuncName[]={"SUMA_Create_ColorScaledVect"};
02936 SUMA_COLOR_SCALED_VECT * S;
02937 SUMA_Boolean LocalHead = NOPE;
02938
02939 SUMA_ENTRY;
02940 if (LocalHead) fprintf (SUMA_STDERR,"%s:\n Allocate for %d nodes ...\n", FuncName, N_Node);
02941 S = (SUMA_COLOR_SCALED_VECT *)SUMA_malloc(sizeof(SUMA_COLOR_SCALED_VECT));
02942 if (S == NULL) {
02943 fprintf(SUMA_STDERR, "Error %s: Failed to allocate for S.\n", FuncName);
02944 SUMA_RETURN (S);
02945 }
02946
02947
02948 S->cV = (float *) SUMA_calloc(N_Node * 3, sizeof(float));
02949 S->isMasked = (SUMA_Boolean *)SUMA_calloc(N_Node, sizeof(SUMA_Boolean));
02950 S->BiasCoordVec = NULL;
02951
02952 if (!S->cV || !S->isMasked) {
02953 fprintf(SUMA_STDERR, "Error %s: Failed to allocate for S->cV or S->isMasked.\n", FuncName);
02954 SUMA_free(S); S = NULL;
02955 SUMA_RETURN (S);
02956 }
02957
02958 S->N_Node = N_Node;
02959
02960
02961 SUMA_RETURN(S);
02962 }
02963
02964
02965
02966
02967
02968
02969
02970 void SUMA_Free_ColorScaledVect (SUMA_COLOR_SCALED_VECT * S)
02971 {
02972 static char FuncName[]={"SUMA_Free_ColorScaledVect"};
02973
02974 SUMA_ENTRY;
02975
02976 if (S->cV) SUMA_free(S->cV);
02977 if (S->isMasked) SUMA_free(S->isMasked);
02978 if (S->BiasCoordVec) SUMA_free(S->BiasCoordVec);
02979 if (S) SUMA_free(S);
02980 SUMA_RETURNe;
02981 }
02982
02983
02984
02985
02986
02987
02988
02989
02990
02991
02992
02993
02994
02995
02996
02997
02998
02999 SUMA_SCALE_TO_MAP_OPT * SUMA_ScaleToMapOptInit(void)
03000 {
03001 SUMA_SCALE_TO_MAP_OPT * Opt;
03002 static char FuncName[]={"SUMA_ScaleToMapOptInit"};
03003
03004 SUMA_ENTRY;
03005
03006 Opt = (SUMA_SCALE_TO_MAP_OPT *)SUMA_malloc(sizeof(SUMA_SCALE_TO_MAP_OPT));
03007
03008 if (Opt == NULL) {
03009 fprintf (SUMA_STDERR, "Error %s: Could not allocate for Opt.\n", FuncName);
03010 SUMA_RETURN (NULL);
03011 }
03012
03013 Opt->ApplyMask = NOPE;
03014 Opt->MaskRange[0] = Opt->MaskRange[1] = 0.0;
03015 Opt->MaskColor[0] = Opt->MaskColor[1] = Opt->MaskColor[2] = 0.0;
03016 Opt->ApplyClip = NOPE;
03017 Opt->IntRange[0] = Opt->IntRange[1] = 0.0;
03018 Opt->ThreshRange[0] = Opt->ThreshRange[1] = 0.0;
03019 Opt->BrightRange[0] = 0.0; Opt->BrightRange[1] = 0.0;
03020 Opt->BrightMap[0] = 0.3; Opt->BrightMap[1] = 0.8;
03021 Opt->BrightFact = 1.0;
03022 Opt->interpmode = SUMA_INTERP;
03023 Opt->alaAFNI = NOPE;
03024 Opt->AutoIntRange = YUP;
03025 Opt->AutoBrtRange = YUP;
03026 {
03027 char *eee = getenv("SUMA_MaskZero");
03028 if (eee) {
03029 if (strcmp(eee,"NO") == 0) Opt->MaskZero = NOPE;
03030 else if (strcmp(eee,"YES") == 0) Opt->MaskZero = YUP;
03031 else {
03032 fprintf (SUMA_STDERR, "Warning %s:\n"
03033 "Bad value for environment variable SUMA_MaskZero\n"
03034 "Assuming default of YES", FuncName);
03035 Opt->MaskZero = YUP;
03036 }
03037 } else Opt->MaskZero = YUP;
03038 }
03039
03040 Opt->find = 0;
03041 Opt->tind = 0;
03042 Opt->bind = 0;
03043 Opt->UseThr = NOPE;
03044 {
03045 char *eee = getenv("SUMA_AbsThreshold");
03046 if (eee) {
03047 if (strcmp(eee,"NO") == 0) Opt->ThrMode = SUMA_LESS_THAN;
03048 else if (strcmp(eee,"YES") == 0) Opt->ThrMode = SUMA_ABS_LESS_THAN;
03049 else {
03050 fprintf (SUMA_STDERR, "Warning %s:\n"
03051 "Bad value for environment variable SUMA_AbsThresh_tbold\n"
03052 "Assuming default of YES", FuncName);
03053 Opt->ThrMode = SUMA_ABS_LESS_THAN;
03054 }
03055 } else Opt->ThrMode = SUMA_ABS_LESS_THAN;
03056 }
03057
03058 Opt->UseBrt = NOPE;
03059 Opt->DoBias = SW_CoordBias_None;
03060 Opt->BiasVect = NULL;
03061 Opt->CoordBiasRange[0] = 0.0; Opt->CoordBiasRange[1] = 10.0;
03062 SUMA_RETURN (Opt);
03063
03064 }
03065
03066
03067
03068
03069
03070
03071
03072
03073
03074
03075
03076 char *SUMA_StandardMapName (SUMA_STANDARD_CMAP mapcode, int *N_col)
03077 {
03078 static char FuncName[]={"SUMA_StandardMapName"};
03079
03080 SUMA_ENTRY;
03081
03082 *N_col = -1;
03083 switch (mapcode) {
03084 case SUMA_CMAP_ERROR:
03085 SUMA_RETURN("Error");
03086 break;
03087 case SUMA_CMAP_UNDEFINED:
03088 SUMA_RETURN("Undefined");
03089 break;
03090 case SUMA_CMAP_RGYBR20:
03091 *N_col = 20;
03092 SUMA_RETURN("rgybr20");
03093 break;
03094 case SUMA_CMAP_nGRAY20:
03095 *N_col = 20;
03096 SUMA_RETURN("ngray20");
03097 break;
03098 case SUMA_CMAP_GRAY02:
03099 *N_col = 02;
03100 SUMA_RETURN("gray02");
03101 break;
03102 case SUMA_CMAP_flpGRAY02:
03103 *N_col = 02;
03104 SUMA_RETURN("gray_i02");
03105 break;
03106 case SUMA_CMAP_GRAY20:
03107 *N_col = 20;
03108 SUMA_RETURN("gray20");
03109 break;
03110 case SUMA_CMAP_BW20:
03111 *N_col = 20;
03112 SUMA_RETURN("bw20");
03113 break;
03114 case SUMA_CMAP_BGYR19:
03115 *N_col = 19;
03116 SUMA_RETURN("bgyr19");
03117 break;
03118 case SUMA_CMAP_MATLAB_DEF_BYR64:
03119 *N_col = 64;
03120 SUMA_RETURN("byr64");
03121 break;
03122 case SUMA_CMAP_BGYR64:
03123 *N_col = 64;
03124 SUMA_RETURN("bgyr64");
03125 break;
03126 case SUMA_CMAP_ROI256:
03127 *N_col = 256;
03128 SUMA_RETURN("roi256");
03129 break;
03130 case SUMA_CMAP_ROI128:
03131 *N_col = 128;
03132 SUMA_RETURN("roi128");
03133 break;
03134 case SUMA_CMAP_ROI64:
03135 *N_col = 64;
03136 SUMA_RETURN("roi64");
03137 break;
03138 default:
03139 SUMA_RETURN("Cowabonga-x321");
03140 break;
03141 }
03142 }
03143
03144
03145
03146
03147
03148
03149 SUMA_STANDARD_CMAP SUMA_StandardMapCode (char *Name)
03150 {
03151 static char FuncName[]={"SUMA_StandardMapCode"};
03152
03153 SUMA_ENTRY;
03154
03155 if (!Name) SUMA_RETURN(SUMA_CMAP_ERROR);
03156 SUMA_TO_LOWER(Name);
03157 if (!strcmp(Name, "undefined")) SUMA_RETURN(SUMA_CMAP_UNDEFINED);
03158 if (!strcmp(Name, "rgybr20")) SUMA_RETURN(SUMA_CMAP_RGYBR20);
03159 if (!strcmp(Name, "ngray20")) SUMA_RETURN(SUMA_CMAP_nGRAY20);
03160 if (!strcmp(Name, "gray20")) SUMA_RETURN(SUMA_CMAP_GRAY20);
03161 if (!strcmp(Name, "gray02")) SUMA_RETURN(SUMA_CMAP_GRAY02);
03162 if (!strcmp(Name, "gray_i02")) SUMA_RETURN(SUMA_CMAP_flpGRAY02);
03163 if (!strcmp(Name, "bw20")) SUMA_RETURN(SUMA_CMAP_BW20);
03164 if (!strcmp(Name, "bgyr19")) SUMA_RETURN(SUMA_CMAP_BGYR19);
03165 if (!strcmp(Name, "matlab_default_byr64")) SUMA_RETURN(SUMA_CMAP_MATLAB_DEF_BYR64);
03166 if (!strcmp(Name, "byr64")) SUMA_RETURN(SUMA_CMAP_MATLAB_DEF_BYR64);
03167 if (!strcmp(Name, "bgyr64")) SUMA_RETURN(SUMA_CMAP_BGYR64);
03168 if (!strcmp(Name, "ygbrp64")) SUMA_RETURN(SUMA_CMAP_ROI64);
03169 if (!strcmp(Name, "roi64")) SUMA_RETURN(SUMA_CMAP_ROI64);
03170 if (!strcmp(Name, "ygbrp128")) SUMA_RETURN(SUMA_CMAP_ROI128);
03171 if (!strcmp(Name, "ygbrp256")) SUMA_RETURN(SUMA_CMAP_ROI256);
03172 if (!strcmp(Name, "roi128")) SUMA_RETURN(SUMA_CMAP_ROI128);
03173 if (!strcmp(Name, "roi256")) SUMA_RETURN(SUMA_CMAP_ROI256);
03174
03175 SUMA_RETURN(SUMA_CMAP_ERROR);
03176 }
03177
03178
03179
03180
03181
03182
03183
03184
03185
03186
03187
03188
03189
03190
03191
03192
03193 SUMA_COLOR_MAP * SUMA_GetStandardMap (SUMA_STANDARD_CMAP mapcode)
03194 { static char FuncName[]={"SUMA_GetStandardMap"};
03195 float **Fiducials;
03196 int k, nc;
03197 int *Nind;
03198 int Ncols, NFid;
03199 SUMA_COLOR_MAP * CM;
03200
03201 SUMA_ENTRY;
03202
03203 switch (mapcode) {
03204 case SUMA_CMAP_RGYBR20:
03205 {
03206 Fiducials = (float **)SUMA_allocate2D(5, 3, sizeof(float));
03207 if (!Fiducials) {
03208 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials.\n", FuncName);
03209 SUMA_RETURN (NULL);
03210 }
03211
03212 k = 0;
03213 Fiducials[k][0] = 1.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.0; ++k;
03214 Fiducials[k][0] = 0.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0.0; ++k;
03215 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 1.0; ++k;
03216 Fiducials[k][0] = 1.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0.0; ++k;
03217 Fiducials[k][0] = 1.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.0; ++k;
03218
03219
03220 CM = SUMA_MakeColorMap (Fiducials, k, 20, YUP, SUMA_StandardMapName(mapcode,&nc));
03221
03222 SUMA_free2D((char **)Fiducials, k);
03223
03224 if (!CM) {
03225 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03226 SUMA_RETURN (NULL);
03227 }
03228 break;
03229 }
03230 case SUMA_CMAP_BGYR19:
03231 {
03232 Fiducials = (float **)SUMA_allocate2D(4, 3, sizeof(float));
03233 if (!Fiducials) {
03234 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials.\n", FuncName);
03235 SUMA_RETURN (NULL);
03236 }
03237
03238 k = 0;
03239 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 1.0; ++k;
03240 Fiducials[k][0] = 0.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0.0; ++k;
03241 Fiducials[k][0] = 1.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0.0; ++k;
03242 Fiducials[k][0] = 1.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.0; ++k;
03243
03244
03245 CM = SUMA_MakeColorMap (Fiducials, k, 19, NOPE, SUMA_StandardMapName(mapcode,&nc));
03246
03247 SUMA_free2D((char **)Fiducials, k);
03248
03249 if (!CM) {
03250 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03251 SUMA_RETURN (NULL);
03252 }
03253 break;
03254 }
03255
03256 case SUMA_CMAP_GRAY02:
03257 {
03258 Fiducials = (float **)SUMA_allocate2D(2, 3, sizeof(float));
03259 if (!Fiducials) {
03260 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials.\n", FuncName);
03261 SUMA_RETURN (NULL);
03262 }
03263
03264 k = 0;
03265 Fiducials[k][0] = Fiducials[k][1] = Fiducials[k][2] = 0.4; ++k;
03266 Fiducials[k][0] = Fiducials[k][1] = Fiducials[k][2] = 0.7; ++k;
03267
03268
03269 CM = SUMA_MakeColorMap (Fiducials, k, 2, NOPE, SUMA_StandardMapName(mapcode,&nc));
03270
03271 SUMA_free2D((char **)Fiducials, k);
03272
03273 if (!CM) {
03274 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03275 SUMA_RETURN (NULL);
03276 }
03277 break;
03278 }
03279
03280 case SUMA_CMAP_flpGRAY02:
03281 {
03282 Fiducials = (float **)SUMA_allocate2D(2, 3, sizeof(float));
03283 if (!Fiducials) {
03284 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials.\n", FuncName);
03285 SUMA_RETURN (NULL);
03286 }
03287
03288 k = 0;
03289 Fiducials[k][0] = Fiducials[k][1] = Fiducials[k][2] = 0.7; ++k;
03290 Fiducials[k][0] = Fiducials[k][1] = Fiducials[k][2] = 0.4; ++k;
03291
03292
03293 CM = SUMA_MakeColorMap (Fiducials, k, 2, NOPE, SUMA_StandardMapName(mapcode,&nc));
03294
03295 SUMA_free2D((char **)Fiducials, k);
03296
03297 if (!CM) {
03298 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03299 SUMA_RETURN (NULL);
03300 }
03301 break;
03302 }
03303 case SUMA_CMAP_GRAY20:
03304 {
03305 Fiducials = (float **)SUMA_allocate2D(2, 3, sizeof(float));
03306 if (!Fiducials) {
03307 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials.\n", FuncName);
03308 SUMA_RETURN (NULL);
03309 }
03310
03311 k = 0;
03312 Fiducials[k][0] = Fiducials[k][1] = Fiducials[k][2] = 0.3; ++k;
03313 Fiducials[k][0] = Fiducials[k][1] = Fiducials[k][2] = 0.8; ++k;
03314
03315
03316 CM = SUMA_MakeColorMap (Fiducials, k, 20, NOPE, SUMA_StandardMapName(mapcode,&nc));
03317
03318 SUMA_free2D((char **)Fiducials, k);
03319
03320 if (!CM) {
03321 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03322 SUMA_RETURN (NULL);
03323 }
03324 break;
03325 }
03326
03327 case SUMA_CMAP_nGRAY20:
03328 {
03329 Fiducials = (float **)SUMA_allocate2D(2, 3, sizeof(float));
03330 if (!Fiducials) {
03331 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials.\n", FuncName);
03332 SUMA_RETURN (NULL);
03333 }
03334
03335 k = 0;
03336 Fiducials[k][0] = Fiducials[k][1] = Fiducials[k][2] = 0.3; ++k;
03337 Fiducials[k][0] = Fiducials[k][1] = Fiducials[k][2] = 0.8; ++k;
03338
03339
03340 CM = SUMA_MakeColorMap (Fiducials, k, 20, NOPE, SUMA_StandardMapName(mapcode,&nc));
03341
03342 SUMA_free2D((char **)Fiducials, k);
03343
03344 if (!CM) {
03345 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03346 SUMA_RETURN (NULL);
03347 }
03348 break;
03349 }
03350
03351 case SUMA_CMAP_BW20:
03352 {
03353 Fiducials = (float **)SUMA_allocate2D(2, 3, sizeof(float));
03354 if (!Fiducials) {
03355 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials.\n", FuncName);
03356 SUMA_RETURN (NULL);
03357 }
03358
03359 k = 0;
03360 Fiducials[k][0] = Fiducials[k][1] = Fiducials[k][2] = 0.0; ++k;
03361 Fiducials[k][0] = Fiducials[k][1] = Fiducials[k][2] = 1.0; ++k;
03362
03363
03364 CM = SUMA_MakeColorMap (Fiducials, k, 20, NOPE, SUMA_StandardMapName(mapcode,&nc));
03365
03366 SUMA_free2D((char **)Fiducials, k);
03367
03368 if (!CM) {
03369 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03370 SUMA_RETURN (NULL);
03371 }
03372 break;
03373 }
03374 case SUMA_CMAP_MATLAB_DEF_BYR64:
03375 {
03376
03377 Ncols = 64;
03378 NFid = 10;
03379
03380 Fiducials = (float **)SUMA_allocate2D(NFid, 3, sizeof(float));
03381 Nind = (int *) SUMA_calloc (NFid, sizeof (int));
03382
03383 if (!Fiducials || !Nind) {
03384 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials or Nind.\n", FuncName);
03385 SUMA_RETURN (NULL);
03386 }
03387
03388
03389 k = 0;
03390 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.5625; Nind[k] = 0; ++k;
03391 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 1.0; Nind[k] = 7; ++k;
03392 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0.5; Fiducials[k][2] = 1.0; Nind[k] = 15; ++k;
03393 Fiducials[k][0] = 0.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 1.0; Nind[k] = 23; ++k;
03394 Fiducials[k][0] = 0.5; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0.5625; Nind[k] = 31; ++k;
03395 Fiducials[k][0] = 0.5625; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0.5; Nind[k] = 32; ++k;
03396 Fiducials[k][0] = 1.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0.0; Nind[k] = 40; ++k;
03397 Fiducials[k][0] = 1.0; Fiducials[k][1] = 0.5; Fiducials[k][2] = 0.0; Nind[k] = 48; ++k;
03398 Fiducials[k][0] = 1.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.0; Nind[k] = 56; ++k;
03399 Fiducials[k][0] = 0.5625; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.0; Nind[k] = 63; ++k;
03400
03401
03402 CM = SUMA_MakeColorMap_v2 (Fiducials, k, Nind, NOPE, SUMA_StandardMapName(mapcode,&nc));
03403
03404
03405 SUMA_free2D((char **)Fiducials, k);
03406 SUMA_free(Nind);
03407
03408 if (!CM) {
03409 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03410 SUMA_RETURN (NULL);
03411 }
03412 break;
03413
03414 }
03415
03416 case SUMA_CMAP_BGYR64:
03417 {
03418
03419 Ncols = 64;
03420 NFid = 10;
03421
03422 Fiducials = (float **)SUMA_allocate2D(NFid, 3, sizeof(float));
03423 Nind = (int *) SUMA_calloc (NFid, sizeof (int));
03424
03425 if (!Fiducials || !Nind) {
03426 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials or Nind.\n", FuncName);
03427 SUMA_RETURN (NULL);
03428 }
03429
03430
03431 k = 0;
03432 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.5625; Nind[k] = 0; ++k;
03433 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 1.0; Nind[k] = 7; ++k;
03434 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0.5; Fiducials[k][2] = 1.0; Nind[k] = 15; ++k;
03435 Fiducials[k][0] = 0.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 1.0; Nind[k] = 18; ++k;
03436 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0.5; Fiducials[k][2] = 0.0; Nind[k] = 24; ++k;
03437 Fiducials[k][0] = 0.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0.0; Nind[k] = 32; ++k;
03438 Fiducials[k][0] = 1.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0.0; Nind[k] = 43; ++k;
03439 Fiducials[k][0] = 1.0; Fiducials[k][1] = 0.5; Fiducials[k][2] = 0.0; Nind[k] = 48; ++k;
03440 Fiducials[k][0] = 1.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.0; Nind[k] = 56; ++k;
03441 Fiducials[k][0] = 0.5625; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.0; Nind[k] = 63; ++k;
03442
03443
03444 CM = SUMA_MakeColorMap_v2 (Fiducials, k, Nind, NOPE, SUMA_StandardMapName(mapcode,&nc));
03445
03446
03447 SUMA_free2D((char **)Fiducials, k);
03448 SUMA_free(Nind);
03449
03450 if (!CM) {
03451 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03452 SUMA_RETURN (NULL);
03453 }
03454 break;
03455
03456 }
03457 case SUMA_CMAP_ROI256:
03458 {
03459
03460 Ncols = 256;
03461 NFid = 6;
03462
03463 Fiducials = (float **)SUMA_allocate2D(NFid, 3, sizeof(float));
03464 Nind = (int *) SUMA_calloc (NFid, sizeof (int));
03465
03466 if (!Fiducials || !Nind) {
03467 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials or Nind.\n", FuncName);
03468 SUMA_RETURN (NULL);
03469 }
03470
03471
03472 k = 0;
03473 Fiducials[k][0] = 1.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0; Nind[k] = 0; ++k;
03474 Fiducials[k][0] = 0.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0; Nind[k] = 50; ++k;
03475 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0; Fiducials[k][2] = 1.0; Nind[k] = 100; ++k;
03476 Fiducials[k][0] = 1.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.0; Nind[k] = 150; ++k;
03477 Fiducials[k][0] = 0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 1; Nind[k] = 200; ++k;
03478 Fiducials[k][0] = 1; Fiducials[k][1] = 0; Fiducials[k][2] = 1; Nind[k] = 255; ++k;
03479
03480
03481
03482 CM = SUMA_MakeColorMap_v2 (Fiducials, k, Nind, NOPE, SUMA_StandardMapName(mapcode,&nc));
03483
03484
03485 SUMA_free2D((char **)Fiducials, k);
03486 SUMA_free(Nind);
03487
03488 if (!CM) {
03489 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03490 SUMA_RETURN (NULL);
03491 }
03492 break;
03493
03494 }
03495
03496
03497 case SUMA_CMAP_ROI128:
03498 {
03499
03500 Ncols = 128;
03501 NFid = 6;
03502
03503 Fiducials = (float **)SUMA_allocate2D(NFid, 3, sizeof(float));
03504 Nind = (int *) SUMA_calloc (NFid, sizeof (int));
03505
03506 if (!Fiducials || !Nind) {
03507 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials or Nind.\n", FuncName);
03508 SUMA_RETURN (NULL);
03509 }
03510
03511
03512 k = 0;
03513 Fiducials[k][0] = 1.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0; Nind[k] = 0; ++k;
03514 Fiducials[k][0] = 0.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0; Nind[k] = 25; ++k;
03515 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0; Fiducials[k][2] = 1.0; Nind[k] = 50; ++k;
03516 Fiducials[k][0] = 1.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.0; Nind[k] = 75; ++k;
03517 Fiducials[k][0] = 0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 1; Nind[k] = 100; ++k;
03518 Fiducials[k][0] = 1; Fiducials[k][1] = 0; Fiducials[k][2] = 1; Nind[k] = 127; ++k;
03519
03520
03521
03522 CM = SUMA_MakeColorMap_v2 (Fiducials, k, Nind, NOPE, SUMA_StandardMapName(mapcode,&nc));
03523
03524
03525 SUMA_free2D((char **)Fiducials, k);
03526 SUMA_free(Nind);
03527
03528 if (!CM) {
03529 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03530 SUMA_RETURN (NULL);
03531 }
03532 break;
03533
03534 }
03535
03536 case SUMA_CMAP_ROI64:
03537 {
03538
03539 Ncols = 64;
03540 NFid = 6;
03541
03542 Fiducials = (float **)SUMA_allocate2D(NFid, 3, sizeof(float));
03543 Nind = (int *) SUMA_calloc (NFid, sizeof (int));
03544
03545 if (!Fiducials || !Nind) {
03546 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for Fiducials or Nind.\n", FuncName);
03547 SUMA_RETURN (NULL);
03548 }
03549
03550
03551 k = 0;
03552 Fiducials[k][0] = 1.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0; Nind[k] = 0; ++k;
03553 Fiducials[k][0] = 0.0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 0; Nind[k] = 12; ++k;
03554 Fiducials[k][0] = 0.0; Fiducials[k][1] = 0; Fiducials[k][2] = 1.0; Nind[k] = 25; ++k;
03555 Fiducials[k][0] = 1.0; Fiducials[k][1] = 0.0; Fiducials[k][2] = 0.0; Nind[k] = 33; ++k;
03556 Fiducials[k][0] = 0; Fiducials[k][1] = 1.0; Fiducials[k][2] = 1; Nind[k] = 50; ++k;
03557 Fiducials[k][0] = 1; Fiducials[k][1] = 0; Fiducials[k][2] = 1; Nind[k] = 63; ++k;
03558
03559
03560
03561 CM = SUMA_MakeColorMap_v2 (Fiducials, k, Nind, NOPE, SUMA_StandardMapName(mapcode,&nc));
03562
03563
03564 SUMA_free2D((char **)Fiducials, k);
03565 SUMA_free(Nind);
03566
03567 if (!CM) {
03568 fprintf (SUMA_STDERR,"Error %s: Failed to create CM.\n", FuncName);
03569 SUMA_RETURN (NULL);
03570 }
03571 break;
03572
03573 }
03574
03575 default:
03576 fprintf (SUMA_STDERR,"Error %s: Unrecognized color map name.\n", FuncName);
03577 SUMA_RETURN (NULL);
03578
03579 }
03580
03581 SUMA_RETURN (CM);
03582 }
03583
03584 #ifdef SUMA_ScaleToMap_STAND_ALONE
03585 void SUMA_ScaleToMap_usage ()
03586 {
03587 static char FuncName[]={"SUMA_ScaleToMap_usage"};
03588 char * s = NULL;
03589 s = SUMA_help_basics();
03590 fprintf (SUMA_STDOUT, "\nUsage: ScaleToMap <-input IntFile icol vcol> \n"
03591 " [-cmap MapType] [-cmapfile Mapfile] [-cmapdb Palfile] [-frf] \n"
03592 " [-clp/-perc_clp clp0 clp1] [-apr/-anr range]\n"
03593 " [-interp/-nointerp/-direct] [-msk msk0 msk1] [-nomsk_col]\n"
03594 " [-msk_col R G B] [-br BrightFact]\n"
03595 " [-h/-help] [-verb] [-showmap] [-showdb]\n"
03596 "\n"
03597 " -input IntFile icol vcol: input data.\n"
03598 " Infile: 1D formatted ascii file containing node values\n"
03599 " icol: index of node index column \n"
03600 " (-1 if the node index is implicit)\n"
03601 " vcol: index of node value column.\n"
03602 " Example: -input ValOnly.1D -1 0 \n"
03603 " for a 1D file containing node values\n"
03604 " in the first column and no node indices.\n"
03605 " Example: -input NodeVal.1D 1 3\n"
03606 " for a 1D file containing node indices in\n"
03607 " the SECOND column and node values in the \n"
03608 " FOURTH column (index counting begins at 0)\n"
03609 " -v and -iv options are now obsolete.\n"
03610 " Use -input option instead.\n"
03611 " -cmap MapName: (optional, default RGYBR20) \n"
03612 " choose one of the standard colormaps available with SUMA:\n"
03613 " RGYBR20, BGYR19, BW20, GRAY20, MATLAB_DEF_BYR64, \n"
03614 " ROI64, ROI128\n"
03615 " You can also use AFNI's default paned color maps:\n"
03616 " The maps are labeled according to the number of \n"
03617 " panes and their sign. Example: afni_p10\n"
03618 " uses the positive 10-pane afni colormap.\n"
03619 " afni_n10 is the negative counterpart.\n"
03620 " These maps are meant to be used with\n"
03621 " the options -apr and -anr listed below.\n"
03622 " You can also load non-default AFNI colormaps\n"
03623 " from .pal files (AFNI's colormap format); see option\n"
03624 " -cmapdb below.\n"
03625 " -cmapdb Palfile: read color maps from AFNI .pal file\n"
03626 " In addition to the default paned AFNI colormaps, you\n"
03627 " can load colormaps from a .pal file.\n"
03628 " To access maps in the Palfile you must use the -cmap option\n"
03629 " with the label formed by the name of the palette, its sign\n"
03630 " and the number of panes. For example, to following palette:\n"
03631 " ***PALETTES deco [13]\n"
03632 " should be accessed with -cmap deco_n13\n"
03633 " ***PALETTES deco [13+]\n"
03634 " should be accessed with -cmap deco_p13\n"
03635 " -cmapfile Mapfile: read color map from Mapfile.\n"
03636 " Mapfile:1D formatted ascii file containing colormap.\n"
03637 " each row defines a color in one of two ways:\n"
03638 " R G B or\n"
03639 " R G B f \n"
03640 " where R, G, B specify the red, green and blue values, \n"
03641 " between 0 and 1 and f specifies the fraction of the range\n"
03642 " reached at this color. THINK values of right of AFNI colorbar.\n"
03643 " The use of fractions (it is optional) would allow you to create\n"
03644 " non-linear color maps where colors cover differing fractions of \n"
03645 " the data range.\n"
03646 " Sample colormap with positive range only (a la AFNI):\n"
03647 " 0 0 1 1.0\n"
03648 " 0 1 0 0.8\n"
03649 " 1 0 0 0.6\n"
03650 " 1 1 0 0.4\n"
03651 " 0 1 1 0.2\n"
03652 " Note the order in which the colors and fractions are specified.\n"
03653 " The bottom color of the +ve colormap should be at the bottom of the\n"
03654 " file and have the lowest +ve fraction. The fractions here define a\n"
03655 " a linear map so they are not necessary but they illustrate the format\n"
03656 " of the colormaps.\n"
03657 " Comparable colormap with negative range included:\n"
03658 " 0 0 1 1.0\n"
03659 " 0 1 0 0.6\n"
03660 " 1 0 0 0.2\n"
03661 " 1 1 0 -0.2\n"
03662 " 0 1 1 -0.6\n"
03663 " The bottom color of the -ve colormap should have the \n"
03664 " lowest -ve fraction. \n"
03665 " You can use -1 -1 -1 for a color to indicate a no color\n"
03666 " (like the 'none' color in AFNI). Values mapped to this\n"
03667 " 'no color' will be masked as with the -msk option.\n"
03668 " If your 1D color file has more than three or 4 columns,\n"
03669 " you can use the [] convention adopted by AFNI programs\n"
03670 " to select the columns you need.\n"
03671 " -frf: (optional) first row in file is the first color.\n"
03672 " As explained in the -cmapfile option above, the first \n"
03673 " or bottom (indexed 0 )color of the colormap should be \n"
03674 " at the bottom of the file. If the opposite is true, use\n"
03675 " the -frf option to signal that.\n"
03676 " This option is only useful with -cmapfile.\n"
03677 " -clp/-perc_clp clp0 clp1: (optional, default no clipping)\n"
03678 " clips values in IntVect. if -clp is used then values in vcol\n"
03679 " < clp0 are clipped to clp0 and > clp1 are clipped to clp1\n"
03680 " if -perc_clp is used them vcol is clipped to the values \n"
03681 " corresponding to clp0 and clp1 percentile.\n"
03682 " The -clp/-prec_clp options are mutually exclusive with -apr/-anr.\n"
03683 " -apr range: (optional) clips the values in IntVect to [0 range].\n"
03684 " This option allows range of colormap to be set as in AFNI, \n"
03685 " with Positive colorbar (Pos selected).\n"
03686 " This option is mutually exclusive with -clp/-perc_clp).\n"
03687 " set range = 0 for autoranging.\n"
03688 " If you use -apr and your colormap contains fractions, you\n"
03689 " must use a positive range colormap.\n"
03690 " -anr range: (optional) clips the values in IntVect to [-range range].\n"
03691 " This option allows range of colormap to be set as in AFNI, \n"
03692 " with Negative colorbar (Pos NOT selected).\n"
03693 " This option is mutually exclusive with -clp/-perc_clp).\n"
03694 " set range = 0 for autoranging.\n"
03695 " If you use -anr and your colormap contains fractions, you\n"
03696 " must use a negative range colormap.\n"
03697 " -interp: (default) use color interpolation between colors in colormap\n"
03698 " If a value is assigned between two colors on the colorbar,\n"
03699 " it receives a color that is an interpolation between those two colors.\n"
03700 " This is the default behaviour in SUMA and AFNI when using the continuous\n"
03701 " colorscale. Mutually exclusive with -nointerp and -direct options.\n"
03702 " -nointerp: (optional) turns off color interpolation within the colormap\n"
03703 " Color assigniment is done a la AFNI when the paned colormaps are used.\n"
03704 " Mutually exclusive with -interp and -direct options.\n"
03705 " -direct: (optional) values (typecast to integers) are mapped directly\n"
03706 " to index of color in color maps. Example: value 4 is assigned\n"
03707 " to the 5th (index 4) color in the color map (same for values\n"
03708 " 4.2 and 4.7). This mapping scheme is useful for ROI indexed type\n"
03709 " data. Negative data values are set to 0 and values >= N_col \n"
03710 " (the number of colors in the colormap) are set to N_col -1\n"
03711 " -msk_zero: (optional) values that are 0 will get masked no matter\n"
03712 " what colormaps or mapping schemes you are using. \n"
03713 " AFNI masks all zero values by default.\n"
03714 " -msk msk0 msk1: (optinal, default is no masking) \n"
03715 " Values in vcol (BEFORE clipping is performed) \n"
03716 " between [msk0 msk1] are masked by the masking color.\n"
03717 " -msk_col R G B: (optional, default is 0.3 0.3 0.3) \n"
03718 " Sets the color of masked voxels.\n"
03719 " -nomsk_col: do not output nodes that got masked.\n"
03720 " It does not make sense to use this option with\n"
03721 " -msk_col.\n"
03722 " -br BrightFact: (optional, default is 1) \n"
03723 " Applies a brightness factor to the colors \n"
03724 " of the colormap and the mask color.\n"
03725 " -h or -help: displays this help message.\n"
03726 "\n"
03727 " The following options are for debugging and sanity checks.\n"
03728 " -verb: (optional) verbose mode.\n"
03729 " -showmap: (optional) print the colormap to the screen and quit.\n"
03730 " This option is for debugging and sanity checks.\n"
03731 " -showdb: (optional) print the colors and colormaps of AFNI\n"
03732 " along with any loaded from the file Palfile.\n"
03733 "%s"
03734 "\n", s);
03735 SUMA_free(s); s = NULL;
03736 s = SUMA_New_Additions(0, 1); printf("%s\n", s);SUMA_free(s); s = NULL;
03737 fprintf (SUMA_STDOUT, " Ziad S. Saad SSCC/NIMH/NIH ziad@nih.gov \n"
03738 " July 31/02 \n"
03739 "\n");
03740 }
03741
03742 int main (int argc,char *argv[])
03743 {
03744 static char FuncName[]={"ScaleToMap"};
03745 char *IntName = NULL, *Prfx, h[9], *CmapFileName = NULL, *dbfile = NULL, *MapName=NULL;
03746 MRI_IMAGE *im = NULL;
03747 float *far=NULL;
03748 int N_V, N_Int, kar, k, ii, i, icol=-1, vcol=-1, Sgn, interpmode, k3;
03749 int Vminloc, Vmaxloc, *iV = NULL;
03750 float Vmin, Vmax, brfact;
03751 float *V = NULL, *Vsort = NULL;
03752 float IntRange[2], MaskColor[3], MaskRange[2], arange;
03753 SUMA_Boolean ApplyClip, ApplyMask, setMaskCol, ApplyPercClip, Vopt;
03754 SUMA_Boolean iVopt, inopt, NoMaskCol, MapSpecified, alaAFNI, MaskZero;
03755 SUMA_Boolean brk, frf, ShowMap, ShowMapdb;
03756 SUMA_COLOR_MAP *CM;
03757 SUMA_SCALE_TO_MAP_OPT * OptScl;
03758 SUMA_STANDARD_CMAP MapType;
03759 SUMA_COLOR_SCALED_VECT * SV;
03760 SUMA_AFNI_COLORS *SAC=NULL;
03761 SUMA_Boolean FromAFNI = NOPE;
03762 int imap, isPmap, isNmap;
03763 SUMA_Boolean LocalHead = NOPE;
03764
03765 SUMA_mainENTRY;
03766
03767 #if 0
03768
03769 SUMAg_CF = SUMA_Create_CommonFields ();
03770 if (SUMAg_CF == NULL) {
03771 fprintf(SUMA_STDERR,"Error %s: Failed in SUMA_Create_CommonFields\n", FuncName);
03772 exit(1);
03773 }
03774 SUMAg_CF->isGraphical = YUP;
03775
03776 SUMAg_CF->scm = SUMA_Build_Color_maps();
03777 if (!SUMAg_CF->scm) {
03778 SUMA_SL_Err("Failed to build color maps.\n");
03779 exit(1);
03780 }
03781 SUMA_INOUT_NOTIFY_OFF;
03782 #else
03783 SUMA_STANDALONE_INIT;
03784 #endif
03785
03786
03787
03788
03789
03790
03791
03792
03793
03794 kar = 1;
03795 brfact = 1;
03796 MaskColor[0] = MaskColor[1] = MaskColor[2] = 0.3;
03797 ApplyClip = NOPE;
03798 ApplyPercClip = NOPE;
03799 ApplyMask = NOPE;
03800 NoMaskCol = NOPE;
03801 MaskZero = NOPE;
03802 setMaskCol = NOPE;
03803 Vopt = NOPE;
03804 iVopt = NOPE;
03805 inopt = NOPE;
03806 MapType = SUMA_CMAP_RGYBR20;
03807 brk = NOPE;
03808 MapSpecified = NOPE;
03809 CmapFileName = NULL;
03810 interpmode = SUMA_UNDEFINED_MODE;
03811 ShowMap = NOPE;
03812 alaAFNI = NOPE;
03813 frf = NOPE;
03814 arange = -1.0;
03815 Sgn = 0;
03816 ShowMapdb = NOPE;
03817 while (kar < argc) {
03818
03819 if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) {
03820 SUMA_ScaleToMap_usage();
03821 exit (1);
03822 }
03823
03824 SUMA_SKIP_COMMON_OPTIONS(brk, kar);
03825
03826 if (!brk && strcmp(argv[kar], "-verb") == 0) {
03827 LocalHead = NOPE;
03828 brk = YUP;
03829 }
03830
03831 if (!brk && strcmp(argv[kar], "-ionot") == 0) {
03832 SUMA_SL_Err("-ionot is obsolete. \n"
03833 "Use -trace option.");
03834 exit (1);
03835 SUMA_INOUT_NOTIFY_ON;
03836 brk = YUP;
03837 }
03838
03839 if (!brk && strcmp(argv[kar], "-msk_zero") == 0) {
03840 MaskZero = YUP;
03841 brk = YUP;
03842 }
03843
03844 if (!brk && (strcmp(argv[kar], "-input") == 0)) {
03845 kar ++;
03846 if (kar+2 >= argc) {
03847 fprintf (SUMA_STDERR, "need 3 arguments after -input \n");
03848 exit (1);
03849 }
03850 IntName = argv[kar]; kar ++;
03851 icol = atoi(argv[kar]); kar ++;
03852 vcol = atoi(argv[kar]);
03853 inopt = YUP;
03854 brk = YUP;
03855 }
03856
03857 if (!brk && (strcmp(argv[kar], "-apr") == 0)) {
03858 if (arange >= 0) {
03859 fprintf (SUMA_STDERR, "range has already been specified.\n");
03860 exit (1);
03861 }
03862 kar ++;
03863 if (kar >= argc) {
03864 fprintf (SUMA_STDERR, "need argument after -apr \n");
03865 exit (1);
03866 }
03867 arange = atof(argv[kar]);
03868 if (arange < 0) {
03869 fprintf (SUMA_STDERR, "range must be positive.\n");
03870 exit (1);
03871 }
03872 Sgn = 1;
03873 alaAFNI = YUP;
03874 brk = YUP;
03875 }
03876
03877 if (!brk && (strcmp(argv[kar], "-anr") == 0)) {
03878 if (arange >= 0) {
03879 fprintf (SUMA_STDERR, "range has already been specified.\n");
03880 exit (1);
03881 }
03882 kar ++;
03883 if (kar >= argc) {
03884 fprintf (SUMA_STDERR, "need argument after -anr \n");
03885 exit (1);
03886 }
03887 arange = atof(argv[kar]);
03888 if (arange < 0) {
03889 fprintf (SUMA_STDERR, "range must be positive.\n");
03890 exit (1);
03891 }
03892
03893 Sgn = -1;
03894 alaAFNI = YUP;
03895 brk = YUP;
03896 }
03897
03898 if (!brk && (strcmp(argv[kar], "-v") == 0)) {
03899 fprintf (SUMA_STDERR, "\n -v option is now obsolete.\nUse -input option instead.\n");
03900 exit (1);
03901 kar ++;
03902 if (kar >= argc) {
03903 fprintf (SUMA_STDERR, "need argument after -v \n");
03904 exit (1);
03905 }
03906 IntName = argv[kar];
03907 Vopt = YUP;
03908 brk = YUP;
03909 }
03910
03911 if (!brk && (strcmp(argv[kar], "-iv") == 0)) {
03912 fprintf (SUMA_STDERR, "\n -iv option is now obsolete.\nUse -input option instead.\n");
03913 exit (1);
03914 kar ++;
03915 if (kar >= argc) {
03916 fprintf (SUMA_STDERR, "need argument after -iv \n");
03917 exit (1);
03918 }
03919 IntName = argv[kar];
03920 iVopt = YUP;
03921 brk = YUP;
03922 }
03923
03924 if (!brk && (strcmp(argv[kar], "-br") == 0)) {
03925 kar ++;
03926 if (kar >= argc) {
03927 fprintf (SUMA_STDERR, "need argument after -br \n");
03928 exit (1);
03929 }
03930 brfact = atof(argv[kar]);
03931
03932 brk = YUP;
03933 }
03934
03935 if (!brk && (strcmp(argv[kar], "-frf") == 0)) {
03936 frf = YUP;
03937 brk = YUP;
03938 }
03939
03940 if (!brk && (strcmp(argv[kar], "-showmap") == 0)) {
03941 ShowMap = YUP;
03942 brk = YUP;
03943 }
03944
03945 if (!brk && (strcmp(argv[kar], "-showdb") == 0)) {
03946 ShowMapdb = YUP;
03947 brk = YUP;
03948 }
03949
03950 if (!brk && (strcmp(argv[kar], "-nointerp") == 0)) {
03951 if (interpmode != SUMA_UNDEFINED_MODE) {
03952 fprintf (SUMA_STDERR, "Color interpolation mode already set.\n");
03953 }
03954 interpmode = SUMA_NO_INTERP;
03955 brk = YUP;
03956 }
03957
03958 if (!brk && (strcmp(argv[kar], "-direct") == 0)) {
03959 if (interpmode != SUMA_UNDEFINED_MODE) {
03960 fprintf (SUMA_STDERR, "Color interpolation mode already set.\n");
03961 }
03962 interpmode = SUMA_DIRECT;
03963 brk = YUP;
03964 }
03965
03966 if (!brk && (strcmp(argv[kar], "-interp") == 0)) {
03967 if (interpmode != SUMA_UNDEFINED_MODE) {
03968 fprintf (SUMA_STDERR, "Color interpolation mode already set.\n(-nointerp, -direct and -interp are mutually exclusive.\n");
03969 }
03970 interpmode = SUMA_INTERP;
03971 brk = YUP;
03972 }
03973
03974 if (!brk && (strcmp(argv[kar], "-clp") == 0)) {
03975 kar ++;
03976 if (kar+1 >= argc) {
03977 fprintf (SUMA_STDERR, "need 2 arguments after -clp \n");
03978 exit (1);
03979 }
03980 ApplyClip = YUP;
03981 IntRange[0] = atof(argv[kar]); kar ++;
03982 IntRange[1] = atof(argv[kar]);
03983 brk = YUP;
03984 }
03985
03986 if (!brk && (strcmp(argv[kar], "-perc_clp") == 0)) {
03987 kar ++;
03988 if (kar+1 >= argc) {
03989 fprintf (SUMA_STDERR, "need 2 arguments after -perc_clp ");
03990 exit (1);
03991 }
03992 ApplyPercClip = YUP;
03993 IntRange[0] = atof(argv[kar]); kar ++;
03994 IntRange[1] = atof(argv[kar]);
03995 brk = YUP;
03996 }
03997
03998 if (!brk && (strcmp(argv[kar], "-msk") == 0)) {
03999 kar ++;
04000 if (kar+1 >= argc) {
04001 fprintf (SUMA_STDERR, "need 2 arguments after -msk ");
04002 exit (1);
04003 }
04004 ApplyMask = YUP;
04005 MaskRange[0] = atof(argv[kar]); kar ++;
04006 MaskRange[1] = atof(argv[kar]);
04007 brk = YUP;
04008 }
04009
04010 if (!brk && (strcmp(argv[kar], "-nomsk_col") == 0)) {
04011 NoMaskCol = YUP;
04012 brk = YUP;
04013 }
04014
04015 if (!brk && (strcmp(argv[kar], "-msk_col") == 0)) {
04016 kar ++;
04017 if (kar+2 >= argc) {
04018 fprintf (SUMA_STDERR, "need 3 arguments after -msk_col ");
04019 exit (1);
04020 }
04021 setMaskCol = YUP;
04022 MaskColor[0] = atof(argv[kar]); kar ++;
04023 MaskColor[1] = atof(argv[kar]); kar ++;
04024 MaskColor[2] = atof(argv[kar]);
04025 brk = YUP;
04026 }
04027
04028 if (!brk && (strcmp(argv[kar], "-cmapfile") ==0)) {
04029 if (MapSpecified) {
04030 fprintf (SUMA_STDERR, "Color map already specified.\n-cmap and -cmapfile are mutually exclusive\n");
04031 exit (1);
04032 }
04033 MapSpecified = YUP;
04034 kar ++;
04035 if (kar >= argc) {
04036 fprintf (SUMA_STDERR, "need 1 arguments after -cmapfile ");
04037 exit (1);
04038 }
04039
04040 CmapFileName = argv[kar];
04041 brk = YUP;
04042 }
04043
04044 if (!brk && (strcmp(argv[kar], "-cmapdb") ==0)) {
04045 kar ++;
04046 if (kar >= argc) {
04047 fprintf (SUMA_STDERR, "need 1 arguments after -cmapdb ");
04048 exit (1);
04049 }
04050
04051 dbfile = argv[kar];
04052 brk = YUP;
04053 }
04054
04055
04056 if (!brk && (strcmp(argv[kar], "-cmap") ==0)) {
04057 if (MapSpecified) {
04058 fprintf (SUMA_STDERR, "Color map already specified.\n-cmap and -cmapfile are mutually exclusive\n");
04059 exit (1);
04060 }
04061 MapSpecified = YUP;
04062 kar ++;
04063 if (kar >= argc) {
04064 fprintf (SUMA_STDERR, "need 1 arguments after -cmap ");
04065 exit (1);
04066 }
04067 MapName = argv[kar];
04068 MapType = SUMA_CMAP_UNDEFINED;
04069 if (strcmp(argv[kar], "RYGBR20") == 0) MapType = SUMA_CMAP_RGYBR20;
04070 if (strcmp(argv[kar], "BW20") == 0) MapType = SUMA_CMAP_BW20;
04071 if (strcmp(argv[kar], "GRAY02") == 0) MapType = SUMA_CMAP_GRAY02;
04072 if (strcmp(argv[kar], "flpGRAY02") == 0) MapType = SUMA_CMAP_flpGRAY02;
04073 if (strcmp(argv[kar], "GRAY20") == 0) MapType = SUMA_CMAP_GRAY20;
04074 if (strcmp(argv[kar], "BGYR19") == 0) MapType = SUMA_CMAP_BGYR19;
04075 if (strcmp(argv[kar], "MATLAB_DEF_BYR64") == 0) MapType = SUMA_CMAP_MATLAB_DEF_BYR64;
04076 if (strcmp(argv[kar], "BGYR64") == 0) MapType = SUMA_CMAP_BGYR64;
04077 if (strcmp(argv[kar], "ROI64") == 0) MapType = SUMA_CMAP_ROI64;
04078 if (strcmp(argv[kar], "ROI128") == 0) MapType = SUMA_CMAP_ROI128;
04079 if (strcmp(argv[kar], "ROI256") == 0) MapType = SUMA_CMAP_ROI256;
04080
04081 if (MapType == SUMA_CMAP_UNDEFINED) {
04082
04083
04084
04085
04086 }
04087 brk = YUP;
04088 }
04089
04090 if (!brk) {
04091 fprintf (SUMA_STDERR,"Error %s: Option %s not understood. Try -help for usage\n", FuncName, argv[kar]);
04092 exit (1);
04093 } else {
04094 brk = NOPE;
04095 kar ++;
04096 }
04097
04098 }
04099
04100
04101 #if 0
04102
04103
04104 SAC = SUMA_Get_AFNI_Default_Color_Maps ();
04105 if (!SAC) {
04106 fprintf (SUMA_STDERR,"Error %s: Failed to obtain AFNI's standard colors.\n", FuncName);
04107 exit(1);
04108 } else {
04109
04110 if (dbfile) {
04111 SUMA_LH("Now trying to read db file");
04112 if (SUMA_AFNI_Extract_Colors ( dbfile, SAC ) < 0) {
04113 fprintf (SUMA_STDERR,"Error %s: Failed to read %s colormap file.\n", FuncName, dbfile);
04114 exit(1);
04115 }
04116 }
04117 }
04118 #else
04119 if (!SUMAg_CF->scm) {
04120 SUMAg_CF->scm = SUMA_Build_Color_maps();
04121 if (!SUMAg_CF->scm) {
04122 SUMA_SL_Err("Failed to build color maps.\n");
04123 exit(1);
04124 }
04125 }
04126
04127 SAC = SUMAg_CF->scm;
04128
04129 if (dbfile) {
04130 SUMA_LH("Now trying to read db file");
04131 if (SUMA_AFNI_Extract_Colors ( dbfile, SAC ) < 0) {
04132 fprintf (SUMA_STDERR,"Error %s: Failed to read %s colormap file.\n", FuncName, dbfile);
04133 exit(1);
04134 }
04135 }
04136 #endif
04137
04138 FromAFNI = NOPE;
04139 if (CmapFileName) {
04140
04141 CM = SUMA_Read_Color_Map_1D (CmapFileName);
04142 if (CM == NULL) {
04143 fprintf (SUMA_STDERR,"Error %s: Could not load colormap.\n", FuncName);
04144 exit (1);
04145 }
04146 if (frf) {
04147 SUMA_LH("Flipping colormap");
04148 SUMA_Flip_Color_Map (CM);
04149 }
04150
04151 if (!CM->Sgn) CM->Sgn = Sgn;
04152 }else{
04153
04154 if (MapType != SUMA_CMAP_UNDEFINED) {
04155 CM = SUMA_GetStandardMap (MapType);
04156 if (CM) {
04157
04158 CM->Sgn = Sgn;
04159 } else {
04160 fprintf (SUMA_STDERR,"Error %s: Could not get standard colormap.\n", FuncName);
04161 exit (1);
04162 }
04163 } else {
04164 SUMA_LH("An AFNI color map ");
04165
04166 FromAFNI = YUP;
04167 imap = SUMA_Find_ColorMap ( MapName, SAC->CMv, SAC->N_maps, -2);
04168 if (imap < 0) {
04169 fprintf (SUMA_STDERR,"Error %s: Could not find colormap %s.\n", FuncName, MapName);
04170 exit (1);
04171 }
04172 CM = SAC->CMv[imap];
04173 }
04174 }
04175
04176
04177
04178 if (ShowMap) {
04179 fprintf (SUMA_STDERR, "%s: Colormap used:\n", FuncName);
04180 SUMA_Show_ColorMapVec (&CM, 1, NULL, 2);
04181 {
04182 SUMA_SurfaceObject *SO = NULL;
04183 float orig[3] = { SUMA_CMAP_ORIGIN };
04184 float topright[3] = { SUMA_CMAP_TOPLEFT };
04185
04186 SUMA_SL_Note("JUST FOR TESTING");
04187 SO = SUMA_Cmap_To_SO (CM, orig, topright, 2);
04188 SUMA_SL_Note("Cleanup");
04189 if (SO) SUMA_Free_Surface_Object(SO);
04190 }
04191 exit(0);
04192 }
04193
04194
04195 if (ShowMapdb) {
04196 fprintf (SUMA_STDERR, "%s: AFNI colormaps found in db:\n", FuncName);
04197 SUMA_Show_ColorVec (SAC->Cv, SAC->N_cols, NULL);
04198 SUMA_Show_ColorMapVec (SAC->CMv, SAC->N_maps, NULL, 2);
04199 exit(0);
04200 }
04201
04202
04203 if (!IntName) {
04204 fprintf (SUMA_STDERR,"Error %s: No input file specified.\n", FuncName);
04205 exit(1);
04206 }
04207
04208
04209 if (interpmode == SUMA_UNDEFINED_MODE) interpmode = SUMA_INTERP;
04210
04211
04212 if (!SUMA_filexists (IntName)) {
04213 fprintf (SUMA_STDERR,"Error %s: File %s could not be found.\n", FuncName, IntName);
04214 exit(1);
04215 }
04216
04217 if (frf && !CmapFileName) {
04218 fprintf (SUMA_STDERR,"Error %s: -frf option is only valid with -cmapfile.\n", FuncName);
04219 exit(1);
04220 }
04221
04222 if (ApplyPercClip && ApplyClip) {
04223 fprintf (SUMA_STDERR,"Error %s: Simultaneous use of -clp and -perc_clp. You should be punished.\n", FuncName);
04224 exit(1);
04225 }
04226
04227 if ((ApplyPercClip || ApplyClip) && arange >= 0.0) {
04228 fprintf (SUMA_STDERR,"Error %s: Simultaneous use of -clp/-perc_clp and -apr/anr.\n Read the help.\n", FuncName);
04229 exit(1);
04230 }
04231
04232 if (iVopt || Vopt) {
04233 fprintf (SUMA_STDERR,"Error %s: -v and -iv are obsolete.\n Use -input option instead.\n", FuncName);
04234 exit(1);
04235 }
04236
04237 if (!inopt) {
04238 fprintf (SUMA_STDERR,"Error %s: -input option must be specified.\n", FuncName);
04239 exit(1);
04240 }
04241
04242 im = mri_read_1D (IntName);
04243
04244 if (!im) {
04245 SUMA_S_Err("Failed to read file");
04246 exit (1);
04247 }
04248
04249 if (vcol < 0) {
04250 fprintf (SUMA_STDERR,"Error %s: vcol must be > 0\n", FuncName);
04251 exit(1);
04252 }
04253
04254 far = MRI_FLOAT_PTR(im);
04255 if (icol < 0 && icol != -1) {
04256 fprintf (SUMA_STDERR,"Error %s: icol(%d) can only have -1 for a negative value\n", FuncName, icol);
04257 exit(1);
04258 }
04259
04260 if (icol >= im->ny || vcol >= im->ny) {
04261 fprintf (SUMA_STDERR,"Error %s: icol(%d) and vcol(%d) must be < %d\nwhich is the number of columns in %s\n",
04262 FuncName, icol, vcol, im->ny, IntName);
04263 exit(1);
04264 }
04265
04266
04267 if (brfact <=0 || brfact > 1) {
04268 fprintf (SUMA_STDERR,"Error %s: BrightFact must be > 0 and <= 1.\n", FuncName);
04269 exit (1);
04270 }
04271
04272 if (MaskColor[0] < 0 || MaskColor[0] > 1 || MaskColor[1] < 0 || MaskColor[1] > 1 || MaskColor[2] < 0 || MaskColor[2] > 1) {
04273 fprintf (SUMA_STDERR,"Error %s: MaskColor values must be >=0 <=1.\n", FuncName);
04274 exit(1);
04275 }
04276
04277
04278 N_V = im->nx;
04279 V = (float *) SUMA_calloc (N_V, sizeof(float));
04280 iV = (int *) SUMA_calloc (N_V, sizeof(int));
04281 if (!V || !iV) {
04282 fprintf (SUMA_STDERR,"Error %s: Could not allocate for V or iV.\n", FuncName);
04283 exit(1);
04284 }
04285
04286 if (icol < 0) {
04287 for (ii=0; ii < N_V; ++ii) {
04288 iV[ii] = ii;
04289 V[ii] = far[vcol*N_V+ii];
04290 }
04291 } else {
04292 for (ii=0; ii < N_V; ++ii) {
04293 iV[ii] = (int)far[icol*N_V+ii];
04294 V[ii] = far[vcol*N_V+ii];
04295 }
04296 }
04297
04298 mri_free(im); im = NULL;
04299
04300
04301
04302
04303
04304 SUMA_MIN_MAX_VEC(V, N_V, Vmin, Vmax, Vminloc, Vmaxloc)
04305
04306
04307 if (arange == 0.0) {
04308 if (fabs((double)Vmin) > fabs((double)Vmax)) arange = (float)fabs((double)Vmin);
04309 else arange = (float)fabs((double)Vmax);
04310 }
04311
04312 if (ApplyPercClip) {
04313
04314 fprintf (SUMA_STDERR,"%s: Percentile range [%f..%f] is equivalent to ", FuncName, IntRange[0], IntRange[1]);
04315 Vsort = SUMA_PercRange (V, NULL, N_V, IntRange, IntRange, NULL);
04316 fprintf (SUMA_STDERR,"[%f..%f]\n", IntRange[0], IntRange[1]);
04317 ApplyClip = YUP;
04318
04319 if (Vsort) SUMA_free(Vsort);
04320 else {
04321 fprintf (SUMA_STDERR,"Error %s: Error in SUMA_PercRange.\n", FuncName);
04322 exit(1);
04323 }
04324 }
04325
04326
04327
04328 OptScl = SUMA_ScaleToMapOptInit();
04329 if (!OptScl) {
04330 fprintf (SUMA_STDERR,"Error %s: Could not get scaling option structure.\n", FuncName);
04331 exit (1);
04332 }
04333
04334
04335 if (ApplyMask) {
04336 OptScl->ApplyMask = ApplyMask;
04337 OptScl->MaskRange[0] = MaskRange[0]; OptScl->MaskRange[1] = MaskRange[1];
04338 OptScl->MaskColor[0] = MaskColor[0]; OptScl->MaskColor[1] = MaskColor[1]; OptScl->MaskColor[2] = MaskColor[2];
04339 }
04340
04341 if (ApplyClip) {
04342 OptScl->ApplyClip = YUP;
04343 OptScl->IntRange[0] = IntRange[0]; OptScl->IntRange[1] = IntRange[1];
04344 }
04345
04346 OptScl->interpmode = interpmode;
04347
04348 OptScl->BrightFact = brfact;
04349
04350 if (MaskZero) OptScl->MaskZero = YUP;
04351
04352
04353
04354 SV = SUMA_Create_ColorScaledVect(N_V);
04355 if (!SV) {
04356 fprintf (SUMA_STDERR,"Error %s: Could not allocate for SV.\n", FuncName);
04357 exit(1);
04358 }
04359
04360
04361 if (alaAFNI) {
04362 if (LocalHead) {
04363 fprintf (SUMA_STDERR,"%s: Calling SUMA_ScaleToMap_alaAFNI\n", FuncName);
04364 fprintf (SUMA_STDERR,"%s: arange = %f\n", FuncName, arange);
04365 }
04366 if (CM->frac) {
04367 if (CM->frac[0] > 0 && CM->Sgn == -1) {
04368 SUMA_S_Err ("Color map fractions positive with -anr option");
04369 exit(1);
04370 }
04371 if (CM->frac[0] < 0 && CM->Sgn == 1) {
04372 SUMA_S_Err ("Color map fractions negative with -apr option");
04373 exit(1);
04374 }
04375 }
04376
04377 if (Sgn) {
04378 if (Sgn != CM->Sgn) {
04379 SUMA_S_Warn ("Mixing positive maps (all fractions > 0) with -anr option\nor vice versa. That is allowed but know what you're doing.\n");
04380 }
04381 }
04382 if (!SUMA_ScaleToMap_alaAFNI (V, N_V, arange, CM, OptScl, SV)) {
04383 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_ScaleToMap_alaAFNI.\n", FuncName);
04384 exit(1);
04385 }
04386 } else {
04387 if (LocalHead) fprintf (SUMA_STDERR,"%s: Calling SUMA_ScaleToMap\n", FuncName);
04388 if (!SUMA_ScaleToMap (V, N_V, Vmin, Vmax, CM, OptScl, SV)) {
04389 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_ScaleToMap.\n", FuncName);
04390 exit(1);
04391 }
04392 }
04393
04394
04395 if (NoMaskCol) {
04396 for (k=0; k < N_V; ++k) {
04397 k3 = 3*k;
04398 if (!SV->isMasked[k]) fprintf (SUMA_STDOUT, "%d %f %f %f\n", iV[k], SV->cV[k3 ], SV->cV[k3+1], SV->cV[k3+2]);
04399 }
04400 } else {
04401 for (k=0; k < N_V; ++k) {
04402 k3 = 3*k;
04403 fprintf (SUMA_STDOUT, "%d %f %f %f\n", iV[k], SV->cV[k3 ], SV->cV[k3+1], SV->cV[k3+2]);
04404 }
04405 }
04406
04407
04408 if (V) SUMA_free(V);
04409 if (iV) SUMA_free(iV);
04410 if (!FromAFNI) if (CM) SUMA_Free_ColorMap (CM);
04411 if (OptScl) SUMA_free(OptScl);
04412 if (SV) SUMA_Free_ColorScaledVect (SV);
04413 #if 0
04414 if (SAC) SAC = SUMA_DestroyAfniColors(SAC);
04415 #else
04416 SAC = NULL;
04417 #endif
04418 SUMA_Free_CommonFields(SUMAg_CF);
04419
04420 SUMA_RETURN (0);
04421 }
04422
04423 #endif
04424
04425
04426
04427
04428
04429
04430 void SUMA_Flip_Color_Map (SUMA_COLOR_MAP *CM)
04431 {
04432 static char FuncName[] = {"SUMA_Flip_Color_Map"};
04433 int lim, i, j, c;
04434 float t;
04435 SUMA_Boolean LocalHead = NOPE;
04436
04437 SUMA_ENTRY;
04438
04439 if (!CM) SUMA_RETURNe;
04440
04441 if (!CM->M) SUMA_RETURNe;
04442
04443 lim = CM->N_Col/2;
04444 for (j=0; j < 3; ++j) {
04445 for (i=0; i < lim; ++i) {
04446 t = CM->M[i][j];
04447 c = CM->N_Col - i - 1;
04448 CM->M[i][j] = CM->M[c][j];
04449 CM->M[c][j] = t;
04450 }
04451 }
04452
04453 if (CM->frac) {
04454 for (i=0; i < lim; ++i) {
04455 t = CM->frac[i];
04456 c = CM->N_Col - i - 1;
04457 CM->frac[i] = CM->frac[c];
04458 CM->frac[c] = t;
04459 }
04460 }
04461
04462 SUMA_RETURNe;
04463 }
04464
04465
04466
04467
04468
04469
04470
04471
04472
04473
04474
04475
04476
04477
04478
04479
04480
04481
04482
04483
04484
04485
04486
04487 float * SUMA_PercRange (float *V, float *Vsort, int N_V, float *PercRange, float *PercRangeVal, int *iPercRangeVal)
04488 {
04489 static char FuncName[] = {"SUMA_PercRange"};
04490 int *isort, il, ih;
04491
04492 SUMA_ENTRY;
04493
04494 if (PercRange[0] < 0 || PercRange[0] > 100 || PercRange[1] < 0 || PercRange[1] > 100) {
04495 fprintf (SUMA_STDERR, "Error %s: Values in PercRange must be between 0 and 100.\nVsort will be freed.\n", FuncName);
04496 if (Vsort) SUMA_free(Vsort);
04497 SUMA_RETURN (NULL);
04498 }
04499
04500 if (!Vsort) {
04501
04502 Vsort = (float *)SUMA_calloc (N_V, sizeof(float));
04503 if (!Vsort) {
04504 fprintf (SUMA_STDERR, "Error %s: Failed to allocate for Vsort.\n", FuncName);
04505 SUMA_RETURN (NULL);
04506 }
04507
04508 SUMA_COPY_VEC (V, Vsort, N_V, float, float);
04509
04510
04511 isort = SUMA_z_qsort (Vsort , N_V ); SUMA_free(isort);
04512 }
04513
04514
04515 il = (int)rint((N_V-1)*PercRange[0]/100.0);
04516 ih = (int)rint((N_V-1)*PercRange[1]/100.0);
04517 PercRangeVal[0] = Vsort[il];
04518 PercRangeVal[1] = Vsort[ih];
04519 if (iPercRangeVal) {
04520 iPercRangeVal[0] = il; iPercRangeVal[1] = ih;
04521 }
04522 SUMA_RETURN (Vsort);
04523 }
04524
04525
04526
04527
04528
04529 double * SUMA_dPercRange (double *V, double *Vsort, int N_V, double *PercRange, double *PercRangeVal, int *iPercRangeVal)
04530 {
04531 static char FuncName[] = {"SUMA_dPercRange"};
04532 int *isort, il, ih;
04533
04534 SUMA_ENTRY;
04535
04536 if (PercRange[0] < 0 || PercRange[0] > 100 || PercRange[1] < 0 || PercRange[1] > 100) {
04537 fprintf (SUMA_STDERR, "Error %s: Values in PercRange must be between 0 and 100.\nVsort will be freed.\n", FuncName);
04538 if (Vsort) SUMA_free(Vsort);
04539 SUMA_RETURN (NULL);
04540 }
04541
04542 if (!Vsort) {
04543
04544 Vsort = (double *)SUMA_calloc (N_V, sizeof(double));
04545 if (!Vsort) {
04546 fprintf (SUMA_STDERR, "Error %s: Failed to allocate for Vsort.\n", FuncName);
04547 SUMA_RETURN (NULL);
04548 }
04549
04550 SUMA_COPY_VEC (V, Vsort, N_V, double, double);
04551
04552
04553 isort = SUMA_z_doubqsort (Vsort , N_V ); SUMA_free(isort);
04554 }
04555
04556
04557 il = (int)rint((N_V-1)*PercRange[0]/100.0);
04558 ih = (int)rint((N_V-1)*PercRange[1]/100.0);
04559 PercRangeVal[0] = Vsort[il];
04560 PercRangeVal[1] = Vsort[ih];
04561 if (iPercRangeVal) {
04562 iPercRangeVal[0] = il; iPercRangeVal[1] = ih;
04563 }
04564 SUMA_RETURN (Vsort);
04565 }
04566
04567
04568
04569
04570
04571
04572
04573
04574
04575
04576
04577
04578
04579
04580
04581
04582
04583
04584
04585
04586
04587
04588
04589
04590
04591
04592
04593 SUMA_OVERLAYS * SUMA_CreateOverlayPointer (int N_Nodes, const char *Name, SUMA_DSET *dset, char *ownerid)
04594 {
04595 static char FuncName[]={"SUMA_CreateOverlayPointer"};
04596 SUMA_OVERLAYS *Sover=NULL;
04597 SUMA_FileName sfn;
04598 int N_Alloc = -1, i=0;
04599 SUMA_Boolean LocalHead = NOPE;
04600
04601 SUMA_ENTRY;
04602
04603 if (!dset) {
04604 SUMA_SL_Err("Need dset");
04605 SUMA_RETURN(NULL);
04606 }
04607
04608 Sover = (SUMA_OVERLAYS *)SUMA_malloc(sizeof(SUMA_OVERLAYS));
04609 if (!Sover) {
04610 fprintf (SUMA_STDERR,"Error %s: Could not allocate for Sover.\n", FuncName);
04611 SUMA_RETURN (NULL);
04612 }
04613
04614 Sover->N_links = 0;
04615 if (ownerid) sprintf(Sover->owner_id, "%s", ownerid);
04616 else Sover->owner_id[0] = '\0';
04617 Sover->LinkedPtrType = SUMA_LINKED_OVERLAY_TYPE;
04618
04619
04620 SUMA_LH("Linking to Dset");
04621 Sover->dset_link = (SUMA_DSET *)SUMA_LinkToPointer ((void *)dset);
04622
04623 if (Sover->dset_link->dnel) {
04624 if (N_Nodes != Sover->dset_link->dnel->vec_len) {
04625 SUMA_SL_Err("N_Nodes not equal to vec_len.");
04626 SUMA_RETURN(NULL);
04627 }
04628 } else { SUMA_SL_Err ("No nel yet !"); SUMA_RETURN(NULL);}
04629
04630
04631 Sover->Name = (char *)SUMA_calloc (strlen(Name)+1, sizeof(char));
04632 Sover->Name = strcpy(Sover->Name, Name);
04633
04634
04635 sfn = SUMA_StripPath((char *)Name);
04636 Sover->Label = sfn.FileName;
04637 if (sfn.Path) SUMA_free(sfn.Path);
04638
04639
04640
04641 SUMA_LH("Allocating for vectors");
04642 N_Alloc = COLP_N_ALLOC(Sover);
04643
04644 if (N_Alloc != N_Nodes) {
04645 SUMA_SL_Err("This is not supposed to be.");
04646 SUMA_RETURN(NULL);
04647 }
04648 Sover->N_NodeDef = N_Nodes;
04649 Sover->NodeDef = (int *) SUMA_calloc(N_Alloc, sizeof(int));
04650 for (i=0; i < Sover->N_NodeDef; ++i) Sover->NodeDef[i] = i;
04651 Sover->FullList = 1;
04652
04653
04654 Sover->ColVec = (float *)SUMA_calloc(N_Alloc*3, sizeof(float));
04655 Sover->LocalOpacity = (float *)SUMA_calloc(N_Alloc, sizeof(float));
04656
04657 if (!Sover->ColVec || !Sover->LocalOpacity || !Sover->NodeDef) {
04658 fprintf (SUMA_STDERR,"Error %s: Could not allocate for Sover fields.\n", FuncName);
04659 SUMA_free(Sover);
04660 SUMA_RETURN (NULL);
04661 }
04662
04663 Sover->GlobalOpacity = -1.0;
04664 Sover->LocalOpacity[0] = -1.0;
04665 Sover->Show = NOPE;
04666 Sover->PlaneOrder = -1;
04667 Sover->isBackGrnd = 0;
04668 Sover->DimFact = 0.3;
04669 Sover->ForceIntRange[0] = 0.0; Sover->ForceIntRange[1] = 0.0;
04670
04671
04672
04673 SUMA_LH("SCM stuff");
04674 if (!SUMAg_CF->scm) {
04675 SUMAg_CF->scm = SUMA_Build_Color_maps();
04676 }
04677 if (!SUMAg_CF->scm) {
04678 SUMA_LH("SUMA color maps not set up.");
04679 Sover->cmapname = NULL;
04680 Sover->OptScl = NULL;
04681 } else {
04682 Sover->cmapname = SUMA_copy_string("bgyr64");
04683 Sover->OptScl = SUMA_ScaleToMapOptInit();
04684 if (!Sover->OptScl) {
04685 fprintf (SUMA_STDERR,"Error %s: Could not get scaling option structure.\n", FuncName);
04686 SUMA_RETURN (NOPE);
04687 }
04688 }
04689
04690 Sover->SymIrange = 0;
04691
04692 SUMA_RETURN (Sover);
04693 }
04694
04695
04696
04697
04698 SUMA_Boolean SUMA_ReleaseOverlay (SUMA_OVERLAYS * Overlays, SUMA_INODE *Overlays_Inode)
04699 {
04700 static char FuncName[]={"SUMA_ReleaseOverlay"};
04701 SUMA_Boolean LocalHead = NOPE;
04702
04703 SUMA_ENTRY;
04704
04705 if (Overlays_Inode || Overlays) {
04706 if (SUMA_ReleaseLink(Overlays_Inode)) {
04707
04708 } else {
04709 if (LocalHead) fprintf (SUMA_STDERR,"%s: Overlay plane %s is free of links, freeing allocated memory ...\n", FuncName, Overlays->Name);
04710 if (Overlays) SUMA_FreeOverlayPointer (Overlays);
04711 if (Overlays_Inode) SUMA_free(Overlays_Inode);
04712 }
04713 }
04714 SUMA_RETURN(YUP);
04715 }
04716
04717
04718
04719
04720
04721
04722
04723
04724
04725
04726
04727
04728 SUMA_Boolean SUMA_FreeOverlayPointer (SUMA_OVERLAYS * Sover)
04729 {
04730 static char FuncName[]={"SUMA_FreeOverlayPointer"};
04731
04732 SUMA_ENTRY;
04733
04734 if (Sover == NULL) {
04735 fprintf (SUMA_STDERR,"Error %s: Sover is NULL, nothing to do. Returning OK flag.\n", FuncName);
04736 SUMA_RETURN (YUP);
04737 }
04738
04739 if (Sover->N_links) {
04740 Sover = (SUMA_OVERLAYS*)SUMA_UnlinkFromPointer((void *)Sover);
04741 SUMA_RETURN (YUP);
04742 }
04743
04744
04745 if (Sover->dset_link) Sover->dset_link = (SUMA_DSET *)SUMA_UnlinkFromPointer((void *)Sover->dset_link);
04746 if (Sover->NodeDef) SUMA_free(Sover->NodeDef);
04747
04748 if (Sover->ColVec) SUMA_free(Sover->ColVec);
04749 if (Sover->LocalOpacity) SUMA_free(Sover->LocalOpacity);
04750 if (Sover->Label) SUMA_free(Sover->Label);
04751 if (Sover->Name) SUMA_free(Sover->Name);
04752 if (Sover->cmapname) SUMA_free(Sover->cmapname);
04753 if (Sover->OptScl) SUMA_free(Sover->OptScl);
04754 SUMA_free(Sover); Sover = NULL;
04755
04756 SUMA_RETURN (YUP);
04757 }
04758
04759
04760
04761
04762
04763
04764
04765
04766
04767
04768
04769
04770
04771
04772 SUMA_OVERLAYS * SUMA_Fetch_OverlayPointer (SUMA_OVERLAYS **Overlays, int N_Overlays, const char * Name, int * OverInd)
04773 {
04774 static char FuncName[]={"SUMA_Fetch_OverlayPointer"};
04775 int i;
04776 SUMA_OVERLAYS *ptr= NULL;
04777 SUMA_Boolean LocalHead = NOPE;
04778
04779 SUMA_ENTRY;
04780
04781 for (i=0; i < N_Overlays; ++i) {
04782 if (!strcmp(Overlays[i]->Name, Name)) {
04783 *OverInd = i;
04784 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Found overlay plane %s, indexed %d.\n", FuncName, Name, i);
04785 SUMA_RETURN (Overlays[i]);
04786 }
04787 }
04788
04789 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Overlay plane %s was not found.\n", FuncName, Name);
04790
04791 *OverInd = -1;
04792
04793 SUMA_RETURN (NULL);
04794 }
04795
04796
04797
04798
04799
04800
04801
04802
04803
04804
04805
04806
04807
04808
04809
04810
04811
04812
04813
04814
04815
04816
04817
04818
04819
04820
04821 SUMA_Boolean SUMA_Overlays_2_GLCOLAR4(SUMA_SurfaceObject *SO, SUMA_SurfaceViewer *SV, GLfloat *glcolar)
04822 {
04823 static char FuncName[]={"SUMA_Overlays_2_GLCOLAR4"};
04824 int ShowOverLays[SUMA_MAX_OVERLAYS], ShowOverLays_Back[SUMA_MAX_OVERLAYS];
04825 int ShowOverLays_sort[SUMA_MAX_OVERLAYS], ShowOverLays_Back_sort[SUMA_MAX_OVERLAYS], iloc[SUMA_MAX_OVERLAYS];
04826 int OverlayOrder_Back[SUMA_MAX_OVERLAYS], OverlayOrder[SUMA_MAX_OVERLAYS];
04827 int i, j, NshowOverlays, NshowOverlays_Back, *isort, i4, i4_0, i4_1, i4_2;
04828 SUMA_Boolean *isColored, *isColored_Fore, *isColored_Back;
04829 GLfloat *glcolar_Fore , *glcolar_Fore_tmp, *glcolar_Back;
04830 float avg_Back, avgfact;
04831 SUMA_OVERLAYS ** Overlays;
04832 int N_Overlays;
04833 int N_Node;
04834 float Back_Modfact;
04835 SUMA_Boolean ShowBackground;
04836 SUMA_Boolean ShowForeground;
04837 SUMA_Boolean LocalHead = NOPE;
04838
04839 SUMA_ENTRY;
04840
04841 if (!SO || !SV || !glcolar) {
04842 SUMA_SL_Err("Null input to SUMA_Overlays_2_GLCOLAR4!");
04843 SUMA_RETURN(NOPE);
04844 }
04845
04846
04847 Overlays = SO->Overlays;
04848 N_Overlays = SO->N_Overlays;
04849 N_Node = SO->N_Node;
04850 Back_Modfact = SV->Back_Modfact;
04851 ShowBackground = SV->ShowBackground;
04852 ShowForeground = SV->ShowForeground;
04853
04854 if (LocalHead) {
04855 fprintf (SUMA_STDOUT, "%s: Showing all overlay planes.\n", FuncName);
04856 SUMA_Show_ColorOverlayPlanes (Overlays, N_Overlays, 0);
04857 }
04858
04859
04860
04861 NshowOverlays = 0;
04862 NshowOverlays_Back = 0;
04863 for (j=0; j < N_Overlays; ++j) {
04864 if (Overlays[j]->Show && Overlays[j]->GlobalOpacity != 0) {
04865 if (Overlays[j]->isBackGrnd) {
04866 ShowOverLays_Back[NshowOverlays_Back] = j;
04867 OverlayOrder_Back[NshowOverlays_Back] = Overlays[j]->PlaneOrder;
04868 ++ NshowOverlays_Back;
04869 }else {
04870 if (SO->SurfCont->ShowCurOnly) {
04871 if (SO->SurfCont->curColPlane == Overlays[j]) {
04872 SUMA_LH("Le ShowCurOnly in action");
04873 ShowOverLays[NshowOverlays] = j;
04874 OverlayOrder[NshowOverlays] = Overlays[j]->PlaneOrder;
04875 ++ NshowOverlays;
04876 }
04877 } else {
04878 ShowOverLays[NshowOverlays] = j;
04879 OverlayOrder[NshowOverlays] = Overlays[j]->PlaneOrder;
04880 ++ NshowOverlays;
04881 }
04882 }
04883 }
04884 }
04885
04886 if (LocalHead) fprintf (SUMA_STDERR,"%s: Found %d Mix overlays and %d Mix-Brightmod overlays.\n", FuncName, NshowOverlays, NshowOverlays_Back);
04887
04888
04889
04890 isColored = (SUMA_Boolean *) SUMA_calloc (N_Node, sizeof(SUMA_Boolean));
04891 if (!isColored) {
04892 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for isColored.\n", FuncName);
04893 SUMA_RETURN (NOPE);
04894 }
04895
04896 glcolar_Back = NULL;
04897 isColored_Back = NULL;
04898 if (ShowBackground) {
04899 if (NshowOverlays_Back) {
04900 glcolar_Back = (GLfloat *) SUMA_calloc (4*N_Node, sizeof(GLfloat));
04901 isColored_Back = (SUMA_Boolean *) SUMA_calloc (N_Node, sizeof(SUMA_Boolean));
04902
04903 if (!isColored_Back || !glcolar_Back) {
04904 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for isColored_Back || glcolar_Back.\n", FuncName);
04905 SUMA_RETURN (NOPE);
04906 }
04907 }
04908 }
04909
04910 isColored_Fore = NULL;
04911 glcolar_Fore = NULL;
04912 if (ShowForeground) {
04913 if (NshowOverlays) {
04914 glcolar_Fore = (GLfloat *) SUMA_calloc (4*N_Node, sizeof(GLfloat));
04915 isColored_Fore = (SUMA_Boolean *) SUMA_calloc (N_Node, sizeof(SUMA_Boolean));
04916
04917 if (!isColored_Fore || !glcolar_Fore) {
04918 fprintf (SUMA_STDERR,"Error %s: Failed to allocate for isColored_Fore || glcolar_Fore.\n", FuncName);
04919 SUMA_RETURN (NOPE);
04920 }
04921 }
04922 }
04923
04924
04925
04926
04927 if (ShowBackground) {
04928
04929
04930 if (NshowOverlays_Back > 1) {
04931 isort = SUMA_z_dqsort (OverlayOrder_Back, NshowOverlays_Back );
04932
04933 for (j=0; j < NshowOverlays_Back; ++j) {
04934 ShowOverLays_Back_sort[j] = ShowOverLays_Back[isort[j]];
04935 }
04936
04937 SUMA_free(isort);
04938 }
04939 if (NshowOverlays_Back == 1) {
04940 ShowOverLays_Back_sort[0] = ShowOverLays_Back[0];
04941 }
04942
04943
04944
04945 if (NshowOverlays_Back) {
04946 if (LocalHead) fprintf (SUMA_STDERR,"%s: Mixing Background colors ...\n", FuncName);
04947
04948 if (!SUMA_MixOverlays (Overlays, N_Overlays, ShowOverLays_Back_sort, NshowOverlays_Back, glcolar_Back, N_Node, isColored_Back, NOPE)) {
04949 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_MixOverlays.\n", FuncName);
04950 SUMA_RETURN (NOPE);
04951 }
04952 } else {
04953 ShowBackground = NOPE;
04954 }
04955 } else {
04956 NshowOverlays_Back = 0;
04957 }
04958
04959
04960
04961
04962 if (ShowForeground) {
04963
04964
04965 if (NshowOverlays > 1) {
04966 isort = SUMA_z_dqsort (OverlayOrder, NshowOverlays );
04967
04968 for (j=0; j < NshowOverlays; ++j) {
04969 ShowOverLays_sort[j] = ShowOverLays[isort[j]];
04970 }
04971
04972 SUMA_free(isort);
04973 }
04974 if (NshowOverlays == 1) {
04975 ShowOverLays_sort[0] = ShowOverLays[0];
04976 }
04977
04978
04979
04980 if (NshowOverlays) {
04981 if (LocalHead) fprintf (SUMA_STDERR,"%s: Mixing Foreground colors ....\n", FuncName);
04982 if (!SUMA_MixOverlays (Overlays, N_Overlays, ShowOverLays_sort, NshowOverlays, glcolar_Fore, N_Node, isColored_Fore, NOPE)) {
04983 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_MixOverlays.\n", FuncName);
04984 SUMA_RETURN (NOPE);
04985 }
04986 if (SUMAg_CF->X->NumForeSmoothing > 0) {
04987 glcolar_Fore_tmp = NULL;
04988 glcolar_Fore_tmp = SUMA_SmoothAttr_Neighb_Rec (glcolar_Fore, 4*SO->N_Node, NULL, SO->FN, 4, SUMAg_CF->X->NumForeSmoothing);
04989 if (!glcolar_Fore_tmp) {
04990 SUMA_SL_Err("Smoothing failed.\n");
04991 } else {
04992 SUMA_free(glcolar_Fore); glcolar_Fore = glcolar_Fore_tmp; glcolar_Fore_tmp = NULL;
04993 }
04994 }
04995 } else {
04996 ShowForeground = NOPE;
04997 }
04998 } else {
04999 NshowOverlays = 0;
05000 }
05001
05002
05003
05004 if (NshowOverlays && NshowOverlays_Back) {
05005 if (LocalHead) fprintf (SUMA_STDERR,"%s: Modulating Brightness of Foreground colors ...\n", FuncName);
05006
05007 for (i=0; i < N_Node; ++i) {
05008 avgfact = Back_Modfact / 3.0;
05009 if (isColored_Fore[i] && isColored_Back[i]) {
05010 i4_0 = 4 * i; i4_1 = i4_0 + 1; i4_2 = i4_0 + 2;
05011 if (!Back_Modfact) {
05012 glcolar[i4_0] = glcolar_Fore[i4_0];
05013 glcolar[i4_1] = glcolar_Fore[i4_1];
05014 glcolar[i4_2] = glcolar_Fore[i4_2];
05015 } else {
05016 avg_Back = (glcolar_Back[i4_0] + glcolar_Back[i4_1] + glcolar_Back[i4_2]) * avgfact ;
05017 glcolar[i4_0] = avg_Back * glcolar_Fore[i4_0];
05018 glcolar[i4_1] = avg_Back * glcolar_Fore[i4_1];
05019 glcolar[i4_2] = avg_Back * glcolar_Fore[i4_2];
05020 }
05021 isColored[i] = YUP;
05022 continue;
05023 }
05024 if (isColored_Fore[i]) {
05025 i4 = 4 * i;
05026 glcolar[i4] = glcolar_Fore[i4]; ++i4;
05027 glcolar[i4] = glcolar_Fore[i4]; ++i4;
05028 glcolar[i4] = glcolar_Fore[i4]; ++i4;
05029 isColored[i] = YUP;
05030 continue;
05031 }
05032 if (isColored_Back[i]) {
05033 i4 = 4 * i;
05034 glcolar[i4] = glcolar_Back[i4]; ++i4;
05035 glcolar[i4] = glcolar_Back[i4]; ++i4;
05036 glcolar[i4] = glcolar_Back[i4]; ++i4;
05037 isColored[i] = YUP;
05038 continue;
05039 } else {
05040
05041 i4 = 4 * i;
05042 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05043 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05044 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05045 isColored[i] = NOPE;
05046 }
05047 }
05048
05049 if (LocalHead) fprintf (SUMA_STDERR,"%s: Done Modulating Brightness of overlay colors.\n", FuncName);
05050 }
05051 if (NshowOverlays && !NshowOverlays_Back) {
05052 if (LocalHead) fprintf (SUMA_STDERR,"%s: Only Foreground colors.\n", FuncName);
05053 for (i=0; i < N_Node; ++i) {
05054 if (isColored_Fore[i]) {
05055 i4 = 4 * i;
05056 glcolar[i4] = glcolar_Fore[i4]; ++i4;
05057 glcolar[i4] = glcolar_Fore[i4]; ++i4;
05058 glcolar[i4] = glcolar_Fore[i4]; ++i4;
05059 isColored[i] = YUP;
05060 continue;
05061 } else {
05062 i4 = 4 * i;
05063 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05064 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05065 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05066 isColored[i] = NOPE;
05067 }
05068 }
05069 }
05070
05071 if (!NshowOverlays && NshowOverlays_Back) {
05072 if (LocalHead) fprintf (SUMA_STDERR,"%s: Only Background colors.\n", FuncName);
05073 for (i=0; i < N_Node; ++i) {
05074 if (isColored_Back[i]) {
05075 i4 = 4 * i;
05076 glcolar[i4] = glcolar_Back[i4]; ++i4;
05077 glcolar[i4] = glcolar_Back[i4]; ++i4;
05078 glcolar[i4] = glcolar_Back[i4]; ++i4;
05079 isColored[i] = YUP;
05080 continue;
05081 } else {
05082 i4 = 4 * i;
05083 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05084 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05085 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05086 isColored[i] = NOPE;
05087 }
05088 }
05089 }
05090
05091 if (!(ShowBackground) && !ShowForeground) {
05092 for (i=0; i < N_Node; ++i) {
05093 i4 = 4 * i;
05094 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05095 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05096 glcolar[i4] = SUMA_GRAY_NODE_COLOR; ++i4;
05097 }
05098 }
05099
05100
05101 if (isColored) SUMA_free(isColored);
05102 if (isColored_Back) SUMA_free(isColored_Back);
05103 if (glcolar_Back) SUMA_free(glcolar_Back);
05104 if (isColored_Fore) SUMA_free(isColored_Fore);
05105 if (glcolar_Fore) SUMA_free(glcolar_Fore);
05106
05107 SUMA_RETURN (YUP);
05108 }
05109
05110
05111
05112
05113
05114
05115
05116
05117
05118
05119
05120
05121
05122
05123
05124
05125 SUMA_Boolean SUMA_MixOverlays (SUMA_OVERLAYS ** Overlays, int N_Overlays, int *ShowOverlays, int NshowOverlays, GLfloat *glcolar, int N_Node, SUMA_Boolean *isColored, SUMA_Boolean FILL)
05126 {
05127 static char FuncName[] = {"SUMA_MixOverlays"};
05128 int i, j;
05129 int *NodeDef, N_NodeDef = -1;
05130 SUMA_Boolean Full, Fill, Locl, Glob;
05131 SUMA_Boolean LocalHead = NOPE;
05132
05133 SUMA_ENTRY;
05134
05135 if (!Overlays) {
05136 SUMA_SL_Err("Null Overlays!");
05137 SUMA_RETURN(NOPE);
05138 }
05139 if (!glcolar) {
05140 SUMA_SL_Err("Null glcolar!");
05141 SUMA_RETURN(NOPE);
05142 }
05143 if (!isColored) {
05144 fprintf (SUMA_STDERR, "Error %s: isColored is NULL.\n", FuncName);
05145 SUMA_RETURN (NOPE);
05146 }
05147 if (!ShowOverlays) {
05148 SUMA_SL_Err("NULL ShowOverlays");
05149 SUMA_RETURN (NOPE);
05150 }
05151 if (!NshowOverlays) {
05152 fprintf (SUMA_STDERR, "Warning %s: Nothing to do.\n", FuncName);
05153 if (FILL) {
05154 fprintf (SUMA_STDERR, "Warning %s: Filling with blank default color\n", FuncName);
05155 SUMA_FillBlanks_GLCOLAR4(isColored, N_Node, SUMA_GRAY_NODE_COLOR, SUMA_GRAY_NODE_COLOR, SUMA_GRAY_NODE_COLOR, glcolar);
05156 }
05157 SUMA_RETURN (YUP);
05158 }
05159
05160
05161 Full = YUP;
05162 Glob = YUP;
05163 Locl = YUP;
05164 Fill = YUP;
05165 for (j=0; j<NshowOverlays; ++j) {
05166 Full = YUP;
05167 Glob = YUP;
05168 Locl = YUP;
05169 Fill = YUP;
05170
05171 i = ShowOverlays[j];
05172 if (!Overlays[i]) {
05173 fprintf(SUMA_STDERR,"Error %s:\nNULL ShowOverlays[%d]\n", FuncName, i);
05174 SUMA_RETURN (NOPE);
05175 }
05176
05177
05178 if (LocalHead) fprintf (SUMA_STDOUT, "%s: Full listing flag: %d\n", FuncName, Overlays[i]->FullList);
05179 if (Overlays[i]->FullList) { Fill = NOPE; }
05180 else { Full = NOPE; }
05181
05182 if (j > 0) {
05183
05184 if (Overlays[i]->GlobalOpacity < 0.0) { Glob = NOPE; }
05185
05186
05187 if (Overlays[i]->LocalOpacity[0] < 0) { Locl = NOPE; }
05188 } else {
05189 Glob = NOPE; Locl = NOPE;
05190 }
05191
05192 NodeDef = COLP_NODEDEF(Overlays[i]);
05193 N_NodeDef = COLP_N_NODEDEF(Overlays[i]);
05194
05195
05196 if (LocalHead)
05197 fprintf (SUMA_STDOUT,"%s: Building color layer %d Overlay #%d: %s ...\nFull=%d, Glob=%d (Globopacity %f), Locl=%d,Fill=%d\n", \
05198 FuncName, j, i, Overlays[i]->Name, (int)Full, (int)Glob, Overlays[i]->GlobalOpacity, (int)Locl, (int)Fill);
05199
05200
05201
05202 if (Full && Glob && Locl) {
05203 if (SUMAg_CF->ColMixMode == SUMA_ORIG_MIX_MODE) {
05204 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_FGL_AR4op ...\n", FuncName);
05205
05206
05207 SUMA_RGBv_FGL_AR4op(\
05208 Overlays[i]->ColVec, glcolar, N_Node, Overlays[i]->GlobalOpacity, Overlays[i]->LocalOpacity, isColored);
05209 } else if (SUMAg_CF->ColMixMode == SUMA_4AML) {
05210 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_FGL_AR4op2 ...\n", FuncName);
05211 SUMA_RGBv_FGL_AR4op2(\
05212 Overlays[i]->ColVec, glcolar, N_Node, Overlays[i]->GlobalOpacity, Overlays[i]->LocalOpacity, isColored);
05213 }
05214 }
05215
05216 if (!Full && Glob && Locl) {
05217 if (SUMAg_CF->ColMixMode == SUMA_ORIG_MIX_MODE) {
05218 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_PGL_AR4op ...\n", FuncName);
05219
05220 SUMA_RGBv_PGL_AR4op(\
05221 Overlays[i]->ColVec, NodeDef, glcolar, N_NodeDef, isColored, Overlays[i]->GlobalOpacity, Overlays[i]->LocalOpacity, N_Node);
05222 } else if (SUMAg_CF->ColMixMode == SUMA_4AML) {
05223 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_PGL_AR4op2 ...\n", FuncName);
05224 SUMA_RGBv_PGL_AR4op2(\
05225 Overlays[i]->ColVec, NodeDef, glcolar, N_NodeDef, isColored, Overlays[i]->GlobalOpacity, Overlays[i]->LocalOpacity, N_Node);
05226 }
05227 }
05228
05229 if (Full && !Glob && Locl) {
05230 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_FnGL_AR4op...\n", FuncName);
05231
05232 SUMA_RGBv_FnGL_AR4op(\
05233 Overlays[i]->ColVec, glcolar, N_Node, Overlays[i]->LocalOpacity, isColored);
05234 }
05235
05236 if (!Full && !Glob && Locl) {
05237 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_PnGL_AR4op ...\n", FuncName);
05238
05239 SUMA_RGBv_PnGL_AR4op(\
05240 Overlays[i]->ColVec, NodeDef, glcolar, N_NodeDef, isColored, Overlays[i]->LocalOpacity, N_Node);
05241 }
05242
05243 if (Full && !Glob && !Locl) {
05244 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_FnGnL_AR4op ...\n", FuncName);
05245
05246 SUMA_RGBv_FnGnL_AR4op(\
05247 Overlays[i]->ColVec, glcolar, N_Node, isColored);
05248 }
05249
05250 if (!Full && !Glob && !Locl) {
05251 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_PnGnL_AR4op ...\n", FuncName);
05252
05253 SUMA_RGBv_PnGnL_AR4op(\
05254 Overlays[i]->ColVec, NodeDef, glcolar, N_NodeDef, isColored, N_Node);
05255 }
05256
05257 if (Full && Glob && !Locl) {
05258 if (SUMAg_CF->ColMixMode == SUMA_ORIG_MIX_MODE) {
05259 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_FGnL_AR4op...\n", FuncName);
05260
05261 SUMA_RGBv_FGnL_AR4op(\
05262 Overlays[i]->ColVec, glcolar, N_Node, Overlays[i]->GlobalOpacity, isColored);
05263 } else if (SUMAg_CF->ColMixMode == SUMA_4AML){
05264 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_FGnL_AR4op2...\n", FuncName);
05265 SUMA_RGBv_FGnL_AR4op2(\
05266 Overlays[i]->ColVec, glcolar, N_Node, Overlays[i]->GlobalOpacity, isColored);
05267 }
05268
05269 }
05270
05271 if (!Full && Glob && !Locl) {
05272 if (SUMAg_CF->ColMixMode == SUMA_ORIG_MIX_MODE) {
05273 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_PGnL_AR4op...\n", FuncName);
05274
05275 SUMA_RGBv_PGnL_AR4op(\
05276 Overlays[i]->ColVec, NodeDef, glcolar, N_NodeDef, isColored, Overlays[i]->GlobalOpacity, N_Node);
05277 } else if (SUMAg_CF->ColMixMode == SUMA_4AML){
05278 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Calling SUMA_RGBv_PGnL_AR4op2...\n", FuncName);
05279 SUMA_RGBv_PGnL_AR4op2(\
05280 Overlays[i]->ColVec, NodeDef, glcolar, N_NodeDef, isColored, Overlays[i]->GlobalOpacity, N_Node);
05281 }
05282 }
05283
05284 }
05285
05286 if (FILL && Fill) {
05287 if (LocalHead) fprintf (SUMA_STDOUT,"%s: Some nodes received no colors from any of the overplanes, filling them with background color ...\n", FuncName);
05288 SUMA_FillBlanks_GLCOLAR4(isColored, N_Node, SUMA_GRAY_NODE_COLOR, SUMA_GRAY_NODE_COLOR, SUMA_GRAY_NODE_COLOR, glcolar);
05289 SUMA_RETURN (YUP);
05290 }
05291
05292 SUMA_RETURN (YUP);
05293 }
05294
05295
05296
05297
05298
05299
05300
05301
05302
05303
05304
05305 SUMA_Boolean SUMA_Show_ColorOverlayPlanes (SUMA_OVERLAYS **Overlays, int N_Overlays, int detail)
05306 {
05307 static char FuncName[]={"SUMA_Show_ColorOverlayPlanes"};
05308 char *s;
05309
05310 SUMA_ENTRY;
05311
05312 s = SUMA_ColorOverlayPlane_Info (Overlays, N_Overlays, detail);
05313 if (s) {
05314 fprintf (SUMA_STDERR,"%s\n", s);
05315 SUMA_free(s);
05316 }
05317
05318 SUMA_RETURN (YUP);
05319 }
05320
05321
05322
05323
05324
05325 char *SUMA_ColorOverlayPlane_Info (SUMA_OVERLAYS **Overlays, int N_Overlays, int detail)
05326 {
05327 static char FuncName[]={"SUMA_ColorOverlayPlane_Info"};
05328 char stmp[1000], *s = NULL, *s2 = NULL;
05329 int i, j, ShowN, icmap;
05330 SUMA_COLOR_MAP *ColMap=NULL;
05331 int N_Alloc = -1, *NodeDef=NULL, N_NodeDef = -1;
05332
05333 SUMA_STRING *SS = NULL;
05334
05335 SUMA_ENTRY;
05336
05337 SS = SUMA_StringAppend (NULL, NULL);
05338
05339 sprintf (stmp,"Info on %d color overlay planes:\n---------------------------------\n", N_Overlays);
05340 SS = SUMA_StringAppend (SS,stmp);
05341 for (i=0; i < N_Overlays; ++i) {
05342 if (Overlays[i]) {
05343 sprintf (stmp,"Overlay plane %s:\norder %d, indexed %d\nDimFact %f, global opacity %f, isBackGrnd (isBackground) %d.\n ForceIntRange %f, %f.\nSymIrange = %d\n",
05344 Overlays[i]->Name, Overlays[i]->PlaneOrder, i, Overlays[i]->DimFact, Overlays[i]->GlobalOpacity, Overlays[i]->isBackGrnd,
05345 Overlays[i]->ForceIntRange[0], Overlays[i]->ForceIntRange[1], Overlays[i]->SymIrange);
05346 SS = SUMA_StringAppend (SS,stmp);
05347 SS = SUMA_StringAppend_va (SS, "N_links = %d\n", Overlays[i]->N_links);
05348 SS = SUMA_StringAppend_va (SS, "LinkedPtrType = %d\n", Overlays[i]->LinkedPtrType);
05349 SS = SUMA_StringAppend_va (SS, "owner_id = %s\n", Overlays[i]->owner_id);
05350 NodeDef = COLP_NODEDEF(Overlays[i]);
05351 N_NodeDef = COLP_N_NODEDEF(Overlays[i]);
05352 N_Alloc = COLP_N_ALLOC(Overlays[i]);
05353 sprintf (stmp,"Show=%d, N_Alloc=%d, N_NodeDef=%d\n", (int)Overlays[i]->Show, N_Alloc, N_NodeDef);
05354 SS = SUMA_StringAppend (SS,stmp);
05355 if (detail > 1) {
05356 ShowN = N_NodeDef;
05357 } else {
05358 if (N_NodeDef > 5) ShowN = 5;
05359 else ShowN = N_NodeDef;
05360 }
05361 SS = SUMA_StringAppend (SS,"\n");
05362 sprintf (stmp,"\tindex\tR\tG\tB\tLocOp\n");
05363 SS = SUMA_StringAppend (SS,stmp);
05364 for (j=0; j < ShowN; ++j) {
05365 SS = SUMA_StringAppend_va (SS, "\t%d\t%.3f\t%.3f\t%.3f\t%.3f\n",
05366 NodeDef[j], Overlays[i]->ColVec[3*j],
05367 Overlays[i]->ColVec[3*j+1], Overlays[i]->ColVec[3*j+2],
05368 Overlays[i]->LocalOpacity[j]);
05369 }
05370 SS = SUMA_StringAppend (SS,"\n");
05371 if (!Overlays[i]->cmapname) SS = SUMA_StringAppend (SS,"cmapname = NULL\n");
05372 else SS = SUMA_StringAppend_va (SS,"cmapname = %s\n", Overlays[i]->cmapname);
05373
05374 if (!SUMAg_CF->scm) {
05375 static int try_once=0;
05376 if (!try_once) { SUMAg_CF->scm = SUMA_Build_Color_maps(); ++ try_once; }
05377 }
05378 if (SUMAg_CF->scm) {
05379 icmap = SUMA_Find_ColorMap ( Overlays[i]->cmapname, SUMAg_CF->scm->CMv, SUMAg_CF->scm->N_maps, -2 );
05380 if (icmap < 0) { SS = SUMA_StringAppend (SS,"cmap not found.\n"); }
05381 else {
05382 ColMap = SUMAg_CF->scm->CMv[icmap];
05383 s2 = SUMA_ColorMapVec_Info(&ColMap, 1, detail);
05384 SS = SUMA_StringAppend (SS, s2); SUMA_free(s2); s2 = NULL;
05385 }
05386 s2 = SUMA_ScaleToMapOpt_Info (Overlays[i]->OptScl, 0);
05387 SS = SUMA_StringAppend (SS, s2); SUMA_free(s2); s2 = NULL;
05388 } else {
05389 SS = SUMA_StringAppend (SS,"\tNULL SUMA color maps.\n");
05390 }
05391 } else {
05392 SS = SUMA_StringAppend (SS,"\tNULL overlay plane.\n");
05393 }
05394 }
05395
05396 SS = SUMA_StringAppend (SS, NULL);
05397
05398 s = SS->s;
05399 SUMA_free(SS);
05400
05401 SUMA_RETURN(s);
05402 }
05403
05404 SUMA_Boolean SUMA_ShowScaleToMapOpt(SUMA_SCALE_TO_MAP_OPT *OptScl, FILE *Out, int detail)
05405 {
05406 static char FuncName[]={"SUMA_ShowScaleToMapOpt"};
05407 char *s=NULL;
05408
05409 SUMA_ENTRY;
05410
05411 if (!Out) Out = stdout;
05412
05413 s = SUMA_ScaleToMapOpt_Info(OptScl, detail);
05414
05415 fprintf (Out, "%s\n", s);
05416
05417 if (s) SUMA_free(s); s = NULL;
05418
05419 SUMA_RETURN(YUP);
05420 }
05421
05422 char *SUMA_ScaleToMapOpt_Info (SUMA_SCALE_TO_MAP_OPT *OptScl, int detail)
05423 {
05424 static char FuncName[]={"SUMA_ScaleToMapOpt_Info"};
05425 char *s = NULL;
05426 SUMA_STRING *SS = NULL;
05427
05428 SUMA_ENTRY;
05429 SS = SUMA_StringAppend (NULL, NULL);
05430
05431 if (!OptScl) { SS = SUMA_StringAppend (SS, "NULL ScaleToMap options\n"); }
05432 else {
05433 SS = SUMA_StringAppend (SS, "ScaleToMap options:\n");
05434 SS = SUMA_StringAppend_va (SS, "ApplyMask = %d\n", OptScl->ApplyMask);
05435 SS = SUMA_StringAppend_va (SS, "MaskRange = %f %f\n",
05436 OptScl->MaskRange[0], OptScl->MaskRange[1]);
05437 SS = SUMA_StringAppend_va (SS, "MaskColor = %f %f %f\n",
05438 OptScl->MaskColor[0], OptScl->MaskColor[1], OptScl->MaskColor[2]);
05439 SS = SUMA_StringAppend_va (SS, "ApplyClip = %d\n", OptScl->ApplyClip);
05440 SS = SUMA_StringAppend_va (SS, "BrightFact = %f\n", OptScl->BrightFact);
05441 SS = SUMA_StringAppend_va (SS, "MaskZero = %d\n", OptScl->MaskZero);
05442 SS = SUMA_StringAppend_va (SS, "find = %d\n", OptScl->find);
05443 SS = SUMA_StringAppend_va (SS, "IntRange = %f %f\n",
05444 OptScl->IntRange[0], OptScl->IntRange[1]);
05445 SS = SUMA_StringAppend_va (SS, "AutoIntRange = %d\n", OptScl->AutoIntRange);
05446 SS = SUMA_StringAppend_va (SS, "tind = %d (use:%d). Mode %d\n", OptScl->tind, OptScl->UseThr, OptScl->ThrMode);
05447 SS = SUMA_StringAppend_va (SS, "ThreshRange = %f %f\n",
05448 OptScl->ThreshRange[0], OptScl->ThreshRange[1]);
05449 SS = SUMA_StringAppend_va (SS, "bind = %d (use:%d)\n", OptScl->bind, OptScl->UseBrt);
05450 SS = SUMA_StringAppend_va (SS, "BrightRange = %f %f\n",
05451 OptScl->BrightRange[0], OptScl->BrightRange[1]);
05452 SS = SUMA_StringAppend_va (SS, "BrightMap = %f %f\n",
05453 OptScl->BrightMap[0], OptScl->BrightMap[1]);
05454 SS = SUMA_StringAppend_va (SS, "AutoBrtRange = %d\n", OptScl->AutoBrtRange);
05455 SS = SUMA_StringAppend_va (SS, "alaAFNI = %d\n", OptScl->alaAFNI);
05456 SS = SUMA_StringAppend_va (SS, "interpmode = %d\n", OptScl->interpmode);
05457 SS = SUMA_StringAppend_va (SS, "BiasMode = %d, Range=%f, %f \n",
05458 OptScl->DoBias, OptScl->CoordBiasRange[0], OptScl->CoordBiasRange[1]);
05459 if (OptScl->BiasVect) SS = SUMA_StringAppend_va (SS, "BiasVect is NOT NULL\n");
05460 else SS = SUMA_StringAppend_va (SS, "BiasVect is NULL\n");
05461 }
05462 SUMA_SS2S(SS, s);
05463 SUMA_RETURN(s);
05464 }
05465
05466
05467
05468
05469 void SUMA_FreeOverlayListDatum (void *OLDv)
05470 {
05471 static char FuncName[]={"SUMA_FreeOverlayListDatum"};
05472 SUMA_Boolean LocalHead = NOPE;
05473
05474 SUMA_ENTRY;
05475
05476 if (OLDv) SUMA_free(OLDv);
05477
05478 SUMA_RETURNe;
05479 }
05480
05481
05482
05483
05484
05485
05486
05487
05488
05489
05490
05491
05492
05493
05494
05495
05496
05497
05498 DList * SUMA_OverlaysToOrderedList (SUMA_SurfaceObject *SO, int Opt)
05499 {
05500 static char FuncName[]={"SUMA_OverlaysToOrderedList"};
05501 DList *listop = NULL;
05502 DListElmt *Elmop=NULL;
05503 SUMA_OVERLAY_LIST_DATUM *OvD = NULL, *oOvD = NULL;
05504 int i, Shift, ShftPlaneOrder, oShftPlaneOrder;
05505 SUMA_OVERLAYS *oPlane=NULL;
05506 SUMA_Boolean Found, LocalHead = NOPE;
05507
05508 SUMA_ENTRY;
05509
05510 listop = (DList *)SUMA_malloc(sizeof(DList));
05511
05512 dlist_init(listop, SUMA_FreeOverlayListDatum);
05513 SUMA_LH("Considering loop");
05514 for (i=0; i < SO->N_Overlays; ++i) {
05515 SUMA_LH("In Loop");
05516 OvD = (SUMA_OVERLAY_LIST_DATUM *)SUMA_malloc(sizeof(SUMA_OVERLAY_LIST_DATUM));
05517 OvD->Overlay = SO->Overlays[i];
05518 if (!OvD->Overlay) {
05519 SUMA_LH("NULL Overlay");
05520 }
05521 SUMA_LH("Here");
05522 if (OvD->Overlay->isBackGrnd && Opt == 1) continue;
05523 if (!OvD->Overlay->isBackGrnd && Opt == -1) continue;
05524 if (!listop->size) {
05525 SUMA_LH("Very first");
05526 dlist_ins_next(listop, dlist_tail(listop), (void*)OvD);
05527 }else {
05528 Elmop = NULL;
05529 do {
05530 SUMA_LH("Searching");
05531 Found = NOPE;
05532 if (!Elmop) {
05533 Elmop = dlist_head(listop);
05534 } else {
05535 Elmop = dlist_next(Elmop);
05536 }
05537
05538 oOvD = (SUMA_OVERLAY_LIST_DATUM *)Elmop->data;
05539
05540
05541 Shift = SO->N_Overlays;
05542
05543 if (OvD->Overlay->isBackGrnd) ShftPlaneOrder = OvD->Overlay->PlaneOrder - Shift;
05544 else ShftPlaneOrder = OvD->Overlay->PlaneOrder;
05545
05546 if (oOvD->Overlay->isBackGrnd) oShftPlaneOrder = oOvD->Overlay->PlaneOrder - Shift;
05547 else oShftPlaneOrder = oOvD->Overlay->PlaneOrder;
05548
05549 if (ShftPlaneOrder <= oShftPlaneOrder) {
05550 SUMA_LH ("Ins Prev");
05551 dlist_ins_prev(listop, Elmop, (void *)OvD);
05552 Found = YUP;
05553 } else if (Elmop == dlist_tail(listop)) {
05554 SUMA_LH ("Ins Next");
05555
05556 dlist_ins_next(listop, Elmop, (void *)OvD);
05557 Found = YUP;
05558 }
05559 } while (!Found);
05560 }
05561 }
05562
05563
05564
05565
05566
05567 SUMA_LH("Changing list order to plane order");
05568 SUMA_ListOrderToPlaneOrder (listop);
05569
05570 SUMA_RETURN(listop);
05571 }
05572
05573
05574
05575
05576 SUMA_Boolean SUMA_ListOrderToPlaneOrder (DList *listop)
05577 {
05578 static char FuncName[]={"SUMA_ListOrderToPlaneOrder"};
05579 SUMA_OVERLAY_LIST_DATUM *OvD = NULL;
05580 int i, fg_shift = 0;
05581 DListElmt *Elmop=NULL;
05582
05583 SUMA_ENTRY;
05584
05585
05586 if (listop->size) {
05587 Elmop = NULL;
05588 i = 0;
05589 do {
05590 if (!Elmop) Elmop = dlist_head(listop);
05591 else Elmop = Elmop->next;
05592 OvD = (SUMA_OVERLAY_LIST_DATUM *)Elmop->data;
05593 if (OvD->Overlay->isBackGrnd) {
05594 OvD->Overlay->PlaneOrder = i;
05595 ++i;
05596 }
05597 } while (!dlist_is_tail(Elmop));
05598 }
05599
05600
05601 if (listop->size) {
05602 Elmop = NULL;
05603 i = 0;
05604 do {
05605 if (!Elmop) Elmop = dlist_head(listop);
05606 else Elmop = Elmop->next;
05607 OvD = (SUMA_OVERLAY_LIST_DATUM *)Elmop->data;
05608 if (!OvD->Overlay->isBackGrnd) {
05609 OvD->Overlay->PlaneOrder = i;
05610 ++i;
05611 }
05612 } while (!dlist_is_tail(Elmop));
05613 }
05614
05615
05616 SUMA_RETURN(YUP);
05617 }
05618
05619
05620
05621
05622 int SUMA_GetLargestBackroundOrder (DList *listop)
05623 {
05624 static char FuncName[]={"SUMA_GetLargestBackroundOrder"};
05625 int Order, i;
05626 DListElmt *Elmop=NULL;
05627 SUMA_OVERLAY_LIST_DATUM *OvD = NULL;
05628 SUMA_Boolean LocalHead = NOPE;
05629
05630 SUMA_ENTRY;
05631
05632 Order = 0;
05633 Elmop = NULL;
05634 do {
05635 if (!Elmop) Elmop = dlist_head(listop);
05636 else Elmop = Elmop->next;
05637 OvD = (SUMA_OVERLAY_LIST_DATUM *)Elmop->data;
05638 if (OvD->Overlay->isBackGrnd) {
05639 if (OvD->Overlay->PlaneOrder > Order) Order = OvD->Overlay->PlaneOrder;
05640 }
05641 ++i;
05642 } while (!dlist_is_tail(Elmop));
05643
05644 if (LocalHead) {
05645 fprintf (SUMA_STDERR,"%s: Highest background order found is %d\n", FuncName, Order);
05646 }
05647
05648 SUMA_RETURN(Order);
05649 }
05650
05651
05652
05653
05654 int SUMA_GetSmallestForegroundOrder (DList *listop)
05655 {
05656 static char FuncName[]={"SUMA_GetSmallestForegroundOrder"};
05657 int Order, i;
05658 DListElmt *Elmop=NULL;
05659 SUMA_OVERLAY_LIST_DATUM *OvD = NULL, *oOvD = NULL;
05660 SUMA_Boolean LocalHead = NOPE;
05661
05662 SUMA_ENTRY;
05663
05664 Order = listop->size -1 ;
05665 Elmop = NULL;
05666 do {
05667 if (!Elmop) Elmop = dlist_head(listop);
05668 else Elmop = Elmop->next;
05669 OvD = (SUMA_OVERLAY_LIST_DATUM *)Elmop->data;
05670 if (!OvD->Overlay->isBackGrnd) {
05671 if (OvD->Overlay->PlaneOrder < Order) Order = OvD->Overlay->PlaneOrder;
05672 }
05673 ++i;
05674 } while (!dlist_is_tail(Elmop));
05675
05676 if (LocalHead) {
05677 fprintf (SUMA_STDERR,"%s: Lowest foreground order found is %d\n", FuncName, Order);
05678 }
05679
05680 SUMA_RETURN(Order);
05681 }
05682
05683
05684
05685
05686 SUMA_Boolean SUMA_isOverlayOfSO (SUMA_SurfaceObject *SO, SUMA_OVERLAYS *Plane)
05687 {
05688 static char FuncName[]={"SUMA_isOverlayOfSO"};
05689 int i;
05690 SUMA_Boolean LocalHead = NOPE;
05691
05692 SUMA_ENTRY;
05693
05694 for (i=0; i< SO->N_Overlays; ++i) if (SO->Overlays[i] == Plane) SUMA_RETURN(YUP);
05695
05696 SUMA_RETURN(NOPE);
05697 }
05698
05699 void SUMA_Print_PlaneOrder (SUMA_SurfaceObject *SO, FILE *Out)
05700 {
05701 static char FuncName[]={"SUMA_Print_PlaneOrder"};
05702 char *s;
05703
05704 SUMA_ENTRY;
05705
05706 if (Out == NULL) Out = stdout;
05707
05708 s = SUMA_PlaneOrder_Info(SO);
05709
05710 if (s) {
05711 fprintf (Out, "%s", s);
05712 SUMA_free(s);
05713 }else {
05714 fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_PlaneOrder_Info.\n", FuncName);
05715 }
05716
05717 SUMA_RETURNe;
05718 }
05719
05720
05721
05722
05723 char * SUMA_PlaneOrder_Info (SUMA_SurfaceObject *SO)
05724 {
05725 static char FuncName[]={"SUMA_PlaneOrder_Info"};
05726 char stmp[1000], *s = NULL;
05727 SUMA_STRING *SS = NULL;
05728 DList *list=NULL;
05729 DListElmt *Elm=NULL;
05730 SUMA_OVERLAY_LIST_DATUM *OvD=NULL;
05731
05732 SUMA_ENTRY;
05733
05734
05735 SS = SUMA_StringAppend (NULL, NULL);
05736
05737 if (!(list = SUMA_OverlaysToOrderedList (SO, -1))) {
05738 SS = SUMA_StringAppend (SS,"NULL Background list\n");
05739 }else if (!list->size) {
05740 SS = SUMA_StringAppend (SS,"Empty Background list\n");
05741 } else {
05742 Elm=NULL;
05743 do {
05744 if (!Elm) Elm = dlist_head(list);
05745 else Elm = Elm->next;
05746 OvD = (SUMA_OVERLAY_LIST_DATUM *)Elm->data;
05747 sprintf (stmp,"BK: %s o%d (%s)\n", OvD->Overlay->Label, OvD->Overlay->PlaneOrder, OvD->Overlay->Name );
05748 SS = SUMA_StringAppend (SS,stmp);
05749 } while (Elm != dlist_tail(list));
05750 }
05751
05752 if (!(list = SUMA_OverlaysToOrderedList (SO, 1))) {
05753 SS = SUMA_StringAppend (SS,"NULL Foreground list\n");
05754 }else if (!list->size) {
05755 SS = SUMA_StringAppend (SS,"Empty Foreground list\n");
05756 } else {
05757 Elm=NULL;
05758 do {
05759 if (!Elm) Elm = dlist_head(list);
05760 else Elm = Elm->next;
05761 OvD = (SUMA_OVERLAY_LIST_DATUM *)Elm->data;
05762 sprintf (stmp,"FG: %s o%d (%s)\n", OvD->Overlay->Label, OvD->Overlay->PlaneOrder, OvD->Overlay->Name );
05763 SS = SUMA_StringAppend (SS,stmp);
05764 } while (Elm != dlist_tail(list));
05765 }
05766
05767 s = SS->s;
05768 SUMA_free(SS);
05769
05770 SUMA_RETURN (s);
05771 }
05772
05773
05774
05775
05776 SUMA_Boolean SUMA_MovePlaneUp (SUMA_SurfaceObject *SO, char *Name)
05777 {
05778 static char FuncName[]={"SUMA_MovePlaneUp"};
05779 SUMA_OVERLAYS *Overlay=NULL;
05780 SUMA_OVERLAY_LIST_DATUM *OvD=NULL;
05781 DList *list=NULL;
05782 DListElmt *Elm = NULL;
05783 int junk=0;
05784 SUMA_Boolean Found = NOPE, LocalHead = NOPE;
05785
05786 SUMA_ENTRY;
05787
05788
05789 SUMA_LH("Searching for plane");
05790 if (!(Overlay = SUMA_Fetch_OverlayPointer(SO->Overlays, SO->N_Overlays, Name, &junk))) {
05791 SUMA_S_Err("Plane does not exist in SO->Overlays. (identified by name)");
05792 SUMA_RETURN (NOPE);
05793 }
05794
05795
05796 SUMA_LH("Creating list");
05797 if (Overlay->isBackGrnd) list = SUMA_OverlaysToOrderedList (SO, -1);
05798 else list = SUMA_OverlaysToOrderedList (SO, 1);
05799 if (!list) {
05800 SUMA_S_Err("NULL list");
05801 SUMA_RETURN (NOPE);
05802 }
05803
05804
05805 SUMA_LH("Searching for plane in list");
05806 Found = NOPE;
05807 Elm = NULL;
05808 do {
05809 if (!Elm) Elm = dlist_head(list);
05810 else Elm = Elm->next;
05811 OvD = (SUMA_OVERLAY_LIST_DATUM *) Elm->data;
05812 if (OvD->Overlay == Overlay) Found = YUP;
05813 }while (Elm != dlist_tail(list) && !Found);
05814
05815 if (!Found) {
05816 SUMA_S_Err("Strange, real strange.");
05817 SUMA_RETURN(NOPE);
05818 }
05819
05820 SUMA_LH("Found element, inserting at new position");
05821 if (Elm != dlist_tail(list)) {
05822
05823 dlist_ins_next (list, Elm->next, Elm->data);
05824
05825 dlist_remove (list, Elm, (void *)(&OvD));
05826 } else {
05827 SUMA_LH("Reached the top");
05828 }
05829
05830 SUMA_LH("Compacting");
05831
05832 SUMA_ListOrderToPlaneOrder (list);
05833
05834
05835 SUMA_LH("Clean up");
05836 dlist_destroy(list); SUMA_free(list);
05837 SUMA_RETURN(YUP);
05838 }
05839
05840
05841
05842
05843 SUMA_Boolean SUMA_MovePlaneDown (SUMA_SurfaceObject *SO, char *Name)
05844 {
05845 static char FuncName[]={"SUMA_MovePlaneDown"};
05846 SUMA_OVERLAYS *Overlay=NULL;
05847 SUMA_OVERLAY_LIST_DATUM *OvD=NULL;
05848 DList *list=NULL;
05849 DListElmt *Elm = NULL;
05850 int junk=0;
05851 SUMA_Boolean Found = NOPE, LocalHead = NOPE;
05852
05853 SUMA_ENTRY;
05854
05855
05856 SUMA_LH("Searching for plane");
05857 if (!(Overlay = SUMA_Fetch_OverlayPointer(SO->Overlays, SO->N_Overlays, Name, &junk))) {
05858 SUMA_S_Err("Plane does not exist in SO->Overlays. (identified by name)");
05859 SUMA_RETURN (NOPE);
05860 }
05861
05862
05863 SUMA_LH("Creating list");
05864 if (Overlay->isBackGrnd) list = SUMA_OverlaysToOrderedList (SO, -1);
05865 else list = SUMA_OverlaysToOrderedList (SO, 1);
05866 if (!list) {
05867 SUMA_S_Err("NULL list");
05868 SUMA_RETURN (NOPE);
05869 }
05870
05871
05872 SUMA_LH("Searching for plane in list");
05873 Found = NOPE;
05874 Elm = NULL;
05875 do {
05876 if (!Elm) Elm = dlist_head(list);
05877 else Elm = Elm->next;
05878 OvD = (SUMA_OVERLAY_LIST_DATUM *) Elm->data;
05879 if (OvD->Overlay == Overlay) Found = YUP;
05880 }while (Elm != dlist_tail(list) && !Found);
05881
05882 if (!Found) {
05883 SUMA_S_Err("Strange, real strange.");
05884 SUMA_RETURN(NOPE);
05885 }
05886
05887 SUMA_LH("Found element, inserting at new position");
05888 if (Elm != dlist_head(list)) {
05889
05890 dlist_ins_prev (list, Elm->prev, Elm->data);
05891
05892 dlist_remove (list, Elm, (void *)(&OvD));
05893 } else {
05894 SUMA_LH("Reached the bottom");
05895 }
05896
05897 SUMA_LH("Compacting");
05898
05899 SUMA_ListOrderToPlaneOrder (list);
05900
05901
05902 SUMA_LH("Clean up");
05903 dlist_destroy(list); SUMA_free(list);
05904 SUMA_RETURN(YUP);
05905 }
05906
05907
05908
05909
05910
05911
05912
05913
05914
05915 SUMA_Boolean SUMA_AddNewPlane (SUMA_SurfaceObject *SO, SUMA_OVERLAYS *Overlay, SUMA_DO *dov, int N_dov, int DuplicateFlag)
05916 {
05917 static char FuncName[]={"SUMA_AddNewPlane"};
05918 DList *ForeList=NULL, *BackList = NULL;
05919 SUMA_OVERLAY_LIST_DATUM *OvD=NULL;
05920 int junk=0, i, OverInd;
05921 SUMA_SurfaceObject *SO2 = NULL;
05922 SUMA_Boolean LocalHead = NOPE;
05923
05924 SUMA_ENTRY;
05925
05926 if (!Overlay) {
05927 SUMA_S_Err("You sent me NULLS!");
05928 SUMA_RETURN (NOPE);
05929 }
05930
05931 if (SUMA_isOverlayOfSO(SO, Overlay)) {
05932 if (DuplicateFlag == 0) {
05933 SUMA_S_Err("Plane exists in SO->Overlays.");
05934 SUMA_RETURN (NOPE);
05935 } else {
05936 SUMA_S_Warn("Plane exists in SO->Overlays. Preserving old one.");
05937 SUMA_RETURN (YUP);
05938 }
05939 }
05940
05941
05942 if (SUMA_Fetch_OverlayPointer(SO->Overlays, SO->N_Overlays, Overlay->Name, &junk)) {
05943 if (DuplicateFlag == 0) {
05944 SUMA_S_Err("Plane exists in SO->Overlays (identified by name).");
05945 SUMA_RETURN (NOPE);
05946 } else {
05947 SUMA_S_Warn("Plane exists in SO->Overlays (identified by name). Preserving old one.");
05948 SUMA_RETURN (YUP);
05949 }
05950 }
05951
05952
05953 if (Overlay->OptScl) {
05954 if (Overlay->OptScl->BiasVect) {
05955 SUMA_SL_Err("New overlay plane cannot have coordinate bias.\nNot yet at least.\n");
05956
05957
05958
05959
05960 SUMA_RETURN(NOPE);
05961 }
05962 }
05963
05964 if (SO->N_Overlays+1 >= SUMA_MAX_OVERLAYS) {
05965 SUMA_SL_Crit("Too many color overlays.");
05966 SUMA_RETURN (NOPE);
05967 }
05968
05969
05970 if (!(ForeList = SUMA_OverlaysToOrderedList (SO, 1))) {
05971 SUMA_S_Err("NULL ForeList");
05972 SUMA_RETURN (NOPE);
05973 }
05974 if (!(BackList = SUMA_OverlaysToOrderedList (SO, -1))) {
05975 SUMA_S_Err("NULL BackList");
05976 SUMA_RETURN (NOPE);
05977 }
05978
05979 SUMA_LH("Adding to list...");
05980 OvD = (SUMA_OVERLAY_LIST_DATUM *) SUMA_malloc(sizeof(SUMA_OVERLAY_LIST_DATUM));
05981 OvD->Overlay = Overlay;
05982
05983 if (Overlay->isBackGrnd) {
05984 SUMA_LH("Back dude...");
05985 dlist_ins_next(BackList, dlist_tail(BackList), (void *)OvD);
05986 Overlay->PlaneOrder = BackList->size - 1;
05987 } else {
05988 SUMA_LH("Front dude...");
05989 dlist_ins_next(ForeList, dlist_tail(ForeList), (void *)OvD);
05990 Overlay->PlaneOrder = ForeList->size - 1;
05991 }
05992
05993 SUMA_LH("Out dude...");
05994
05995 SO->Overlays[SO->N_Overlays] = Overlay;
05996
05997 ++SO->N_Overlays;
05998
05999
06000 SUMA_LH("Destruction...");
06001 dlist_destroy(ForeList); SUMA_free(ForeList);
06002 dlist_destroy(BackList); SUMA_free(BackList);
06003
06004
06005 if (dov) {
06006 SUMA_LH("Registering plane with surfaces deserving it");
06007
06008
06009 for (i=0; i < N_dov; ++i) {
06010 if (SUMA_isSO(dov[i])) {
06011 SO2 = (SUMA_SurfaceObject *)dov[i].OP;
06012 if (SUMA_isRelated(SO, SO2, 1) && SO != SO2) {
06013
06014 if (!SUMA_Fetch_OverlayPointer (SO2->Overlays, SO2->N_Overlays, Overlay->Name, &OverInd)) {
06015
06016 SO2->Overlays[SO2->N_Overlays] = (SUMA_OVERLAYS *)SUMA_LinkToPointer((void*)SO->Overlays[SO->N_Overlays-1]);
06017
06018 ++SO2->N_Overlays;
06019 } else {
06020
06021 }
06022 }
06023 }
06024 }
06025 }
06026 SUMA_RETURN (YUP);
06027 }
06028
06029
06030
06031
06032
06033
06034
06035 SUMA_Boolean SUMA_MixColors (SUMA_SurfaceViewer *sv)
06036 {
06037 static char FuncName[]={"SUMA_MixColors"};
06038 int i, dov_id;
06039 SUMA_Boolean LocalHead = NOPE;
06040 SUMA_SurfaceObject *SO = NULL;
06041
06042 SUMA_ENTRY;
06043
06044 for (i=0; i<sv->N_ColList; ++i) {
06045 if (sv->ColList[i].Remix) {
06046 if (LocalHead) fprintf(SUMA_STDERR, "%s: Mixing colors (%s)...\n", FuncName, sv->ColList[i].idcode_str);
06047 dov_id = SUMA_findSO_inDOv (sv->ColList[i].idcode_str, SUMAg_DOv, SUMAg_N_DOv);
06048 if (dov_id < 0) {
06049 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_findSO_inDOv.\n", FuncName);
06050 SUMA_RETURN(NOPE);
06051 }
06052 SO = (SUMA_SurfaceObject *)SUMAg_DOv[dov_id].OP;
06053 if (!SUMA_Overlays_2_GLCOLAR4(SO, sv, sv->ColList[i].glar_ColorList)) {
06054 fprintf (SUMA_STDERR,"Error %s: Failed in SUMA_Overlays_2_GLCOLAR4.\n", FuncName);
06055 SUMA_RETURN(NOPE);
06056 }
06057 sv->ColList[i].Remix = NOPE;
06058 }
06059 }
06060
06061 SUMA_RETURN (YUP);
06062
06063 }
06064
06065
06066
06067
06068
06069
06070
06071
06072
06073
06074
06075
06076
06077
06078
06079
06080
06081 SUMA_Boolean SUMA_iRGB_to_OverlayPointer (SUMA_SurfaceObject *SO,
06082 char *Name, SUMA_OVERLAY_PLANE_DATA *sopd,
06083 int *PlaneInd, SUMA_DO *dov, int N_dov,
06084 DList *DsetList)
06085 {
06086 static char FuncName[]={"SUMA_iRGB_to_OverlayPointer"}, stmp[500];
06087 char *DsetName_tmp=NULL;
06088 int i, OverInd = -1, i_max, wrn_cnt = 0, i3 = 0, N_NodeDef = -1, *NodeDef = NULL;
06089 SUMA_SurfaceObject *SO2 = NULL;
06090 SUMA_OVERLAYS *Overlay=NULL;
06091 SUMA_DSET *dset = NULL;
06092 SUMA_Boolean LocalHead = NOPE;
06093
06094 SUMA_ENTRY;
06095
06096 SUMA_LH("Fetching Overlay Pointer");
06097
06098 if (!SUMA_Fetch_OverlayPointer (SO->Overlays, SO->N_Overlays, Name, &OverInd)) {
06099 SUMA_LH("pointer not found");
06100
06101 if (!SUMA_isLocalDomainParent(SO)) {
06102 if (sopd->Source == SES_Afni) {
06103
06104 fprintf(SUMA_STDERR,"Error %s: Surface %s (ID: %s) received from AFNI is not a local domain parent.\n", FuncName, SO->Label, SO->idcode_str);
06105 SUMA_RETURN(NOPE);
06106 } else {
06107 SUMA_SL_Warn ("Placing colors on surface \nnot a local domain parent.\nCase not tested.");
06108 }
06109 }
06110
06111 DsetName_tmp = SUMA_append_string(Name, SO->LocalDomainParentID);
06112 dset = SUMA_CreateDsetPointer (DsetName_tmp,
06113 SUMA_NODE_RGB,
06114 NULL,
06115 SO->idcode_str,
06116 SO->N_Node);
06117 SUMA_free(DsetName_tmp); DsetName_tmp = NULL;
06118
06119 if (!SUMA_InsertDsetPointer(dset, DsetList)) {
06120 SUMA_SL_Err("Failed to insert dset into list");
06121 SUMA_RETURN(NOPE);
06122 }
06123
06124 SUMA_AddDsetNelCol (dset, "node index", SUMA_NODE_INDEX, NULL, NULL, 1);
06125 SUMA_AddDsetNelCol (dset, "red", SUMA_NODE_R, NULL, NULL, 1);
06126 SUMA_AddDsetNelCol (dset, "green", SUMA_NODE_G, NULL, NULL, 1);
06127 SUMA_AddDsetNelCol (dset, "blue", SUMA_NODE_B, NULL, NULL, 1);
06128
06129 Overlay = SUMA_CreateOverlayPointer (SO->N_Node, Name, dset, SO->idcode_str);
06130 if (!Overlay) {
06131 fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_CreateOverlayPointer.\n", FuncName);
06132 SUMA_RETURN(NOPE);
06133 }
06134
06135
06136
06137 Overlay->Show = sopd->Show;
06138 Overlay->GlobalOpacity = sopd->GlobalOpacity;
06139 Overlay->isBackGrnd = sopd->isBackGrnd;
06140 Overlay->OptScl->BrightFact = sopd->DimFact;
06141 OverInd = SO->N_Overlays;
06142
06143
06144 if (!SUMA_AddNewPlane (SO, Overlay, dov, N_dov, 0)) {
06145 SUMA_SL_Crit("Failed in SUMA_AddNewPlane");
06146 SUMA_FreeOverlayPointer(Overlay);
06147 SUMA_RETURN (NOPE);
06148 }
06149
06150
06151 }else {
06152 SUMA_LH("Pointer found");
06153 }
06154
06155 if (LocalHead) fprintf (SUMA_STDERR, "%s: OverInd = %d, Loading colors to Overlay Plane...\n", FuncName, OverInd);
06156 if (sopd->N > SO->N_Node) {
06157 sprintf(stmp,"Number of nodes in colorplane (%d)\n" \
06158 "is larger than number of nodes in surface (%d)\n" \
06159 "Proceed if you know what you're doing.\n" \
06160 "Data from high node indices will be ignored.",
06161 sopd->N, SO->N_Node);
06162 SUMA_SLP_Warn(stmp);
06163 i_max = SO->N_Node;
06164 } else {
06165 i_max = sopd->N;
06166 }
06167
06168 SO->Overlays[OverInd]->DimFact = sopd->DimFact;
06169 SO->Overlays[OverInd]->cmapname = SUMA_copy_string("explicit");
06170 SO->Overlays[OverInd]->FullList = 0;
06171
06172
06173 if (LocalHead) fprintf (SUMA_STDERR,
06174 "%s: %d node colors are to be inserted.\n",
06175 FuncName, i_max);
06176
06177 COLP_N_NODEDEF(SO->Overlays[OverInd]) = i_max;
06178 SO->Overlays[OverInd]->dset_link->dnel->vec_filled = i_max;
06179
06180
06181 if (COLP_N_NODEDEF(SO->Overlays[OverInd])) {
06182 int *iv, N_i,*Nv;
06183 float *Rv, *Gv, *Bv;
06184 SUMA_DSET *dset;
06185 dset = SO->Overlays[OverInd]->dset_link;
06186
06187
06188 iv = SUMA_GetDsetColIndex (dset, SUMA_NODE_INDEX, &N_i);
06189 if (N_i != 1) { SUMA_SL_Err("Failed to find one column."); SUMA_free(iv); SUMA_RETURN(NOPE); }
06190 Nv = (int *)dset->dnel->vec[iv[0]]; SUMA_free(iv); iv = NULL;
06191 iv = SUMA_GetDsetColIndex (dset, SUMA_NODE_R, &N_i);
06192 if (N_i != 1) { SUMA_SL_Err("Failed to find one column."); SUMA_free(iv); SUMA_RETURN(NOPE); }
06193 Rv = (float *)dset->dnel->vec[iv[0]];SUMA_free(iv); iv = NULL;
06194 iv = SUMA_GetDsetColIndex (dset, SUMA_NODE_G, &N_i);
06195 if (N_i != 1) { SUMA_SL_Err("Failed to find one column."); SUMA_free(iv); SUMA_RETURN(NOPE); }
06196 Gv = (float *)dset->dnel->vec[iv[0]];SUMA_free(iv); iv = NULL;
06197 iv = SUMA_GetDsetColIndex (dset, SUMA_NODE_B, &N_i);
06198 if (N_i != 1) { SUMA_SL_Err("Failed to find one column."); SUMA_free(iv); SUMA_RETURN(NOPE); }
06199 Bv = (float *)dset->dnel->vec[iv[0]];SUMA_free(iv); iv = NULL;
06200
06201 switch (sopd->Type) {
06202 case SOPT_ibbb:
06203 {
06204 int *inel=NULL;
06205 byte *r=NULL, *g=NULL, *b=NULL, *a=NULL;
06206
06207 inel = (int *)sopd->i;
06208 r = (byte *)sopd->r;
06209 g = (byte *)sopd->g;
06210 b = (byte *)sopd->b;
06211 for (i=0; i < i_max; ++i) {
06212
06213 if (SO->N_Node > inel[i]) {
06214 Nv[i] = inel[i];
06215 Rv[i] = (float)(r[i]) / 255.0;
06216 Gv[i] = (float)(g[i]) / 255.0;
06217 Bv[i] = (float)(b[i]) / 255.0;
06218 } else {
06219 if (!wrn_cnt) {
06220 sprintf(stmp, "Color plane includes node indices (%d at %d)\n" \
06221 "that are >= number of nodes in surface (%d).\n"\
06222 "Other similar warnings will be muted.", inel[i], i, SO->N_Node);
06223 SUMA_SLP_Warn(stmp);
06224 }
06225 ++wrn_cnt;
06226 }
06227 }
06228 }
06229 break;
06230 case SOPT_ifff:
06231 {
06232 int *inel=NULL;
06233 float *r=NULL, *g=NULL, *b=NULL, *a=NULL;
06234
06235 inel = (int *)sopd->i;
06236 r = (float *)sopd->r;
06237 g = (float *)sopd->g;
06238 b = (float *)sopd->b;
06239 for (i=0; i < i_max; ++i) {
06240
06241 if (SO->N_Node > inel[i]) {
06242 Nv[i] = inel[i];
06243 Rv[i] = (float)(r[i]) ;
06244 Gv[i] = (float)(g[i]) ;
06245 Bv[i] = (float)(b[i]) ;
06246 } else {
06247 if (!wrn_cnt) {
06248 SUMA_SLP_Warn("Color plane includes node indices\n" \
06249 "that are >= number of nodes in surface.\n");
06250 }
06251 ++wrn_cnt;
06252 }
06253 }
06254 }
06255 break;
06256 default:
06257 SUMA_SLP_Err("Unknown color plane type");
06258 SUMA_RETURN(NOPE);
06259 break;
06260 }
06261 }
06262
06263
06264 if (!SUMA_ColorizePlane (SO->Overlays[OverInd])) {
06265 SUMA_SLP_Err("Failed to colorize plane.\n");
06266 SUMA_RETURN(NOPE);
06267 }
06268
06269
06270 if (LocalHead) fprintf (SUMA_STDERR, "%s: OverInd = %d. Returning.\n", FuncName, OverInd);
06271 *PlaneInd = OverInd;
06272
06273 SUMA_RETURN (YUP);
06274
06275 }
06276
06277
06278
06279
06280
06281
06282
06283 SUMA_Boolean SUMA_FlushPlaneNotInUse (char *PlaneName, SUMA_SurfaceObject *SO, SUMA_DO *dov, int N_dov)
06284 {
06285 static char FuncName[]={"SUMA_FlushPlaneNotInUse"};
06286 SUMA_DRAWN_ROI *D_ROI = NULL;
06287 int i, OverInd;
06288 SUMA_Boolean LocalHead = NOPE;
06289
06290 SUMA_ENTRY;
06291
06292 if (!PlaneName) SUMA_RETURN(YUP);
06293
06294
06295 for (i=0; i < N_dov; ++i) {
06296 switch (dov[i].ObjectType) {
06297 case ROIdO_type:
06298 D_ROI = (SUMA_DRAWN_ROI *)dov[i].OP;
06299 break;
06300 default:
06301 D_ROI = NULL;
06302 break;
06303 }
06304 if (D_ROI && SUMA_isdROIrelated (D_ROI, SO)) {
06305 if (strcmp(PlaneName, D_ROI->ColPlaneName) == 0) {
06306
06307 SUMA_RETURN (YUP);
06308 }
06309 }
06310 }
06311
06312
06313 if (!SUMA_Fetch_OverlayPointer (SO->Overlays, SO->N_Overlays, PlaneName, &OverInd)) {
06314 SUMA_SLP_Warn("No Overlay Plane Found!");
06315 SUMA_RETURN (YUP);
06316 }
06317
06318 SUMA_LH("Flushing meadows");
06319 #if 0
06320 SO->Overlays[OverInd]->N_NodeDef = 0;
06321 #else
06322 COLP_N_NODEDEF(SO->Overlays[OverInd]) = 0;
06323 #endif
06324 SUMA_RETURN (YUP);
06325 }
06326
06327
06328
06329
06330
06331
06332 void SUMA_RefreshDsetList (SUMA_SurfaceObject *SO)
06333 {
06334 static char FuncName[]={"SUMA_RefreshDsetList"};
06335 SUMA_LIST_WIDGET *LW = NULL;
06336 SUMA_Boolean LocalHead = NOPE;
06337
06338 SUMA_ENTRY;
06339
06340 LW = SO->SurfCont->SwitchDsetlst;
06341
06342 if (!LW) SUMA_RETURNe;
06343
06344 if (LW->ALS) {
06345
06346 if (LocalHead) SUMA_S_Err("Freeing the hag.");
06347 LW->ALS = SUMA_FreeAssembleListStruct(LW->ALS);
06348 }
06349
06350
06351
06352 LW->ALS = SUMA_AssembleColorPlaneList (SO);
06353
06354 if (!LW->ALS) {
06355 SUMA_SLP_Err("Error assembling list.");
06356 SUMA_RETURNe;
06357 }
06358
06359 if (LW->ALS->N_clist < 0) {
06360 SUMA_SL_Err("Failed in SUMA_AssembleColorPlaneList");
06361 SUMA_RETURNe;
06362 }
06363
06364 if (!LW->ALS->N_clist) {
06365 SUMA_SLP_Note ("No Color planes to choose from.");
06366 SUMA_RETURNe;
06367 }
06368
06369 if (LocalHead) {
06370 int i;
06371 for (i=0; i < LW->ALS->N_clist; ++i) fprintf (SUMA_STDERR,"%s: %s\n", FuncName, LW->ALS->clist[i]);
06372 }
06373 SUMA_CreateScrolledList ( LW->ALS->clist, LW->ALS->N_clist, NOPE,
06374 LW);
06375
06376 SUMA_RETURNe;
06377 }
06378
06379
06380
06381
06382
06383
06384
06385
06386
06387
06388
06389
06390 SUMA_ASSEMBLE_LIST_STRUCT * SUMA_AssembleColorPlaneList (SUMA_SurfaceObject *SO)
06391 {
06392 static char FuncName[]={"SUMA_AssembleColorPlaneList"};
06393 int i=-1, N_clist=-1;
06394 DList *list=NULL, *listop = NULL, *OverlayPlanelist = NULL;
06395 DListElmt *Elm = NULL, *Elmop = NULL, *Elm_OverlayPlanelist = NULL;
06396 char Label[SUMA_MAX_NAME_LENGTH], *store=NULL;
06397 char **clist=NULL;
06398 void **oplist=NULL;
06399 SUMA_ASSEMBLE_LIST_STRUCT *clist_str = NULL;
06400 SUMA_OVERLAY_LIST_DATUM *OvD=NULL, *oOvD=NULL;
06401 SUMA_Boolean SortByOrder = YUP;
06402 SUMA_Boolean Found = NOPE;
06403 SUMA_Boolean LocalHead = NOPE;
06404
06405 SUMA_ENTRY;
06406
06407
06408 OverlayPlanelist = SUMA_OverlaysToOrderedList (SO, 0);
06409
06410
06411 list = (DList *)SUMA_malloc(sizeof(DList));
06412 dlist_init(list, NULL);
06413
06414 listop = (DList *)SUMA_malloc(sizeof(DList));
06415 dlist_init(listop, NULL);
06416
06417 clist = NULL;
06418 N_clist = -1;
06419 Elm_OverlayPlanelist = NULL;
06420 do {
06421 if (!Elm_OverlayPlanelist) Elm_OverlayPlanelist = dlist_head(OverlayPlanelist);
06422 else Elm_OverlayPlanelist = Elm_OverlayPlanelist->next;
06423
06424 OvD = (SUMA_OVERLAY_LIST_DATUM *) Elm_OverlayPlanelist->data;
06425
06426 if (!OvD->Overlay->Label) sprintf (Label,"NULL");
06427 else sprintf (Label,"%s", OvD->Overlay->Label);
06428
06429 SUMA_LH(Label);
06430
06431 store = (char *)SUMA_calloc(strlen(Label)+10, sizeof(char));
06432 if (OvD->Overlay->isBackGrnd) {
06433 sprintf(store,"bk:%s", Label);
06434 } else {
06435 sprintf(store,"fg:%s", Label);
06436 }
06437
06438 if (SortByOrder) {
06439 SUMA_LH("Sorting by order");
06440
06441 dlist_ins_next(list, dlist_tail(list), (void*)store);
06442
06443 dlist_ins_next(listop, dlist_tail(listop), (void*)OvD);
06444 } else {
06445 SUMA_LH("Sorting by name");
06446 if (!list->size) {
06447 dlist_ins_next(list, dlist_tail(list), (void*)store);
06448 dlist_ins_next(listop, dlist_tail(listop), (void*)OvD);
06449 }else {
06450 Elm = NULL;
06451 Elmop = NULL;
06452 do {
06453 Found = NOPE;
06454 if (!Elm) {
06455 Elm = dlist_head(list);
06456 Elmop = dlist_head(listop);
06457 } else {
06458 Elm = Elm->next;
06459 Elmop = Elmop->next;
06460 }
06461
06462 if (strcmp(store, (char*)Elm->data) <= 0) {
06463 dlist_ins_prev(list, Elm, (void *)store);
06464 dlist_ins_prev(listop, Elmop, (void *)OvD);
06465 Found = YUP;
06466 } else if (Elm == dlist_tail(list)) {
06467
06468 dlist_ins_next(list, Elm, (void *)store);
06469 dlist_ins_next(listop, Elmop, (void *)OvD);
06470 Found = YUP;
06471 }
06472 } while (!Found);
06473 }
06474
06475 }
06476 } while (Elm_OverlayPlanelist != dlist_tail(OverlayPlanelist));
06477
06478 SUMA_LH("saving list.");
06479 if (!list->size) {
06480 SUMA_LH("Empty list");
06481 N_clist = 0;
06482 }else {
06483 Elm = NULL;
06484 Elmop = NULL;
06485 clist = (char **)SUMA_calloc(list->size, sizeof(char *));
06486 oplist = (void **)SUMA_calloc(list->size, sizeof(void *));
06487 for (i=0; i< list->size; ++i) {
06488 if (!Elm) {
06489 Elm = dlist_head(list);
06490 Elmop = dlist_head(listop);
06491 } else {
06492 Elm = dlist_next(Elm);
06493 Elmop = dlist_next(Elmop);
06494 }
06495 clist[i] = (char*)Elm->data;
06496 OvD = (SUMA_OVERLAY_LIST_DATUM *) Elmop->data;
06497 oplist[i] = (void *)OvD->Overlay;
06498 if (LocalHead) fprintf (SUMA_STDERR,"%s: Inserting %s with %s (%s).\n",
06499 FuncName, clist[i], OvD->Overlay->Label, OvD->Overlay->Name);
06500 }
06501
06502 N_clist = list->size;
06503
06504 dlist_destroy(list);
06505 dlist_destroy(listop);
06506 dlist_destroy(OverlayPlanelist);
06507 SUMA_free(list);
06508 SUMA_free(listop);
06509 SUMA_free(OverlayPlanelist);
06510 }
06511
06512 clist_str = SUMA_CreateAssembleListStruct();
06513 clist_str->clist = clist;
06514 clist_str->oplist = oplist;
06515 clist_str->N_clist = N_clist;
06516
06517
06518 SUMA_RETURN (clist_str);
06519 }
06520
06521
06522
06523
06524 SUMA_Boolean SUMA_isDsetRelated(SUMA_DSET *dset, SUMA_SurfaceObject *SO)
06525 {
06526 static char FuncName[]={"SUMA_isDsetRelated"};
06527 char *mp = NULL;
06528 int lmp = 0;
06529 SUMA_ENTRY;
06530
06531 if (!dset) SUMA_RETURN(NOPE);
06532 if (!SO) SUMA_RETURN(NOPE);
06533
06534 mp = SDSET_IDMDOM(dset); if (mp) lmp = strlen(mp); else lmp = 0;
06535
06536 if (mp && lmp) {
06537 if (strcmp(mp, SO->idcode_str) == 0) SUMA_RETURN(YUP);
06538 if (SO->DomainGrandParentID) {
06539 if (strcmp(mp, SO->DomainGrandParentID) == 0) SUMA_RETURN(YUP);
06540 }
06541 if (SO->LocalDomainParentID) {
06542 if (strcmp(mp, SO->LocalDomainParentID) == 0) SUMA_RETURN(YUP);
06543 }
06544 }
06545
06546 SUMA_RETURN(NOPE);
06547 }
06548
06549 SUMA_Boolean SUMA_isDsetColumn_inferred(SUMA_DSET *dset, int icol)
06550 {
06551 static char FuncName[]={"SUMA_isDsetColumn_inferred"};
06552 char *lblcp=NULL;
06553 SUMA_Boolean LocalHead = NOPE;
06554 SUMA_ENTRY;
06555
06556 lblcp = SUMA_DsetColLabelCopy(dset, icol, 0);
06557
06558 SUMA_LH(lblcp);
06559 if (lblcp) {
06560 if (strstr(lblcp, "(inferred)")) SUMA_RETURN(YUP);
06561 }
06562 SUMA_free(lblcp);
06563 SUMA_RETURN(NOPE);
06564 }
06565
06566
06567 SUMA_Boolean SUMA_AddNodeIndexColumn(SUMA_DSET *dset, SUMA_SurfaceObject *SO)
06568 {
06569 static char FuncName[]={"SUMA_AddNodeIndexColumn"};
06570 float range[2];
06571 int *iv=NULL, i, N_i;
06572 float *T = NULL;
06573 int *Ti = NULL;
06574 SUMA_Boolean OKfirstCol = NOPE;
06575 SUMA_Boolean LocalHead = NOPE;
06576
06577 SUMA_ENTRY;
06578
06579 if (!dset) SUMA_RETURN(NOPE);
06580 if (!SO) SUMA_RETURN(NOPE);
06581
06582 if (dset->dnel->vec_len > SO->N_Node) {
06583 SUMA_SL_Err("more values in dset than nodes in surface.");
06584 SUMA_RETURN(NOPE);
06585 }
06586
06587 iv = SUMA_GetDsetColIndex (dset, SUMA_NODE_INDEX, &N_i);
06588 if (!iv) {
06589 SUMA_LH("No node index column");
06590
06591 T = SUMA_DsetCol2Float (dset, 0, 0);
06592 OKfirstCol = NOPE;
06593 if (!T) { SUMA_LH("First column does not cut it"); OKfirstCol = NOPE;}
06594 else {
06595 Ti = (int *)SUMA_malloc(sizeof(int)*dset->dnel->vec_len);
06596 SUMA_LH("Testing if node indices can be in 1st column...");
06597
06598 i=0;
06599 OKfirstCol = YUP;
06600 while (i <dset->dnel->vec_len && OKfirstCol) {
06601 Ti[i] = (int)T[i];
06602 if ( (T[i] != Ti[i]) || (T[i] < 0) || (T[i] >= SO->N_Node) ) OKfirstCol = NOPE;
06603 ++i;
06604 }
06605
06606 if (!OKfirstCol) {
06607 SUMA_SLP_Note( "Assuming node indexing\n"
06608 "is explicit. \n"
06609 "1st row is for node 0\n"
06610 "2nd is for node 1, etc.\n" );
06611 for (i=0; i <dset->dnel->vec_len; ++i) Ti[i]=i;
06612 OKfirstCol = YUP;
06613 }else{
06614 char Name[500], Attr[500];
06615 SUMA_SLP_Note("Used column 0 as node indices.\nAdded a node index column nonetheless.");
06616
06617
06618 }
06619
06620 }
06621
06622 if (!OKfirstCol) {
06623 SUMA_LH("No node index could be created");
06624 if (Ti) SUMA_free(Ti); Ti = NULL;
06625 SUMA_RETURN(NOPE);
06626 }
06627
06628
06629
06630
06631 if (!SUMA_AddDsetNelCol (dset, "Node Index (inferred)", SUMA_NODE_INDEX, (void *)Ti, NULL, 1)) {
06632 SUMA_SL_Err("Failed to add column");
06633 if (Ti) SUMA_free(Ti); Ti = NULL;
06634 SUMA_RETURN(NOPE);
06635 }
06636
06637
06638 SUMA_LH("Added the index column, ciao");
06639 if (Ti) SUMA_free(Ti); Ti = NULL;
06640 SUMA_RETURN(YUP);
06641 } else {
06642 SUMA_LH("Node index column found");
06643 SUMA_free(iv); iv = NULL;
06644
06645 SUMA_RETURN(YUP);
06646 }
06647
06648 SUMA_SL_Err("why are you here ?");
06649 SUMA_RETURN(NOPE);
06650 }
06651
06652
06653
06654 SUMA_Boolean SUMA_OKassign(SUMA_DSET *dset, SUMA_SurfaceObject *SO)
06655 {
06656 static char FuncName[]={"SUMA_OKassign"};
06657 float range[2];
06658 int loc[2], *iv=NULL, N_i, lnp = 0;
06659 char *np = NULL, stmp[201];
06660 SUMA_Boolean LocalHead = NOPE;
06661
06662 SUMA_ENTRY;
06663
06664 if (!dset) SUMA_RETURN(NOPE);
06665 if (!SO) SUMA_RETURN(NOPE);
06666
06667
06668 np = SDSET_IDMDOM(dset); if (np) lnp = strlen(np); else lnp = 0;
06669 if (np && lnp) {
06670 SUMA_LH("Has IDMDOM");
06671
06672 if (SUMA_isDsetRelated(dset, SO)) { SUMA_LH("Is Related"); SUMA_RETURN(YUP); }
06673 else { SUMA_LH("Is NOT Related"); SUMA_RETURN(NOPE); }
06674 }
06675
06676 SUMA_LH("Has no parent, trying adoption");
06677
06678 iv = SUMA_GetDsetColIndex (dset, SUMA_NODE_INDEX, &N_i);
06679 if (!iv) {
06680 SUMA_LH("No node index column");
06681
06682 if (dset->dnel->vec_len <= SO->N_Node) {
06683 SUMA_LH("Number of values per column\n"
06684 "is less than the number \n"
06685 "of nodes in the surface.\n");
06686 if (dset->dnel->vec_filled != SO->N_Node) {
06687 SUMA_LH("Need to attach a node index column, if possible");
06688
06689 if (!SUMA_AddNodeIndexColumn(dset, SO)) {
06690 SUMA_LH(" Failed to add a node index column");
06691 SUMA_RETURN(NOPE);
06692 } else {
06693 SUMA_LH("Added Index Column");
06694 SUMA_RETURN(YUP);
06695 }
06696 }else {
06697 SUMA_LH( "Looks like a full list of values\n"
06698 "Techincally, there's no need for explicit node column.\n"
06699 "But at times, the data are not ordered by ascending node \n"
06700 "index which causes trouble.\nSo now I add a node index column"
06701 " always which would help point to the problem if it arises");
06702
06703 if (!SUMA_AddNodeIndexColumn(dset, SO)) {
06704 SUMA_LH(" Failed to add a node index column");
06705 SUMA_RETURN(NOPE);
06706 }
06707 SUMA_LH("Added Index Column");
06708 SUMA_RETURN(YUP);
06709 }
06710 } else {
06711 snprintf(stmp, 200*sizeof(char),
06712 "Number of values per column (%d)\n"
06713 "is larger than the number \n"
06714 "of nodes (%d) in the surface.", dset->dnel->vec_len, SO->N_Node);
06715 SUMA_SLP_Err(stmp);
06716 SUMA_RETURN(NOPE);
06717 }
06718 } else {
06719 SUMA_LH("Node index column found");
06720 if (N_i != 1) { SUMA_SL_Err("No support for multiple\nnode index columns"); SUMA_RETURN(NOPE); }
06721
06722 if (!SUMA_GetDsetColRange(dset, iv[0], range, loc)) {
06723 SUMA_SLP_Err("Unexpect error in SUMA_GetDsetColRange");
06724 SUMA_free(iv); iv = NULL;
06725 SUMA_RETURN(NOPE);
06726 }
06727 if (range[0] < 0 || range[1] > SO->N_Node) {
06728 SUMA_SLP_Err("Node index range outside\n"
06729 "0 and SO->N_Node");
06730 SUMA_free(iv); iv = NULL;
06731 SUMA_RETURN(NOPE);
06732 }
06733
06734 SUMA_RETURN(YUP);
06735 }
06736
06737 SUMA_SL_Err("Should not get here");
06738 SUMA_RETURN(NOPE);
06739 }
06740
06741
06742
06743
06744
06745
06746 void SUMA_LoadDsetFile (char *filename, void *data)
06747 {
06748 static char FuncName[]={"SUMA_LoadDsetFile"};
06749 SUMA_SurfaceObject *SO = NULL;
06750 SUMA_OVERLAY_PLANE_DATA sopd;
06751 SUMA_IRGB *irgb=NULL;
06752 int OverInd = -1, lnp=-1, loc[2];
06753 char *np=NULL;
06754 SUMA_DSET_FORMAT form;
06755 DList *list=NULL;
06756 SUMA_LIST_WIDGET *LW=NULL;
06757 SUMA_DSET *dset = NULL;
06758 SUMA_OVERLAYS *NewColPlane = NULL;
06759 SUMA_Boolean LocalHead = NOPE;
06760
06761 SUMA_ENTRY;
06762
06763 if (!data) {
06764 SUMA_SLP_Err("Null data");
06765 SUMA_RETURNe;
06766 }
06767
06768 SO = (SUMA_SurfaceObject *)data;
06769
06770 if (LocalHead) {
06771 fprintf (SUMA_STDERR,"%s: Received request to load %s for surface %s.\n", FuncName, filename, SO->Label);
06772 }
06773
06774
06775 if (!SUMA_filexists(filename)) {
06776 SUMA_SLP_Err("File not found");
06777 SUMA_RETURNe;
06778 }
06779
06780
06781 form = SUMA_GuessFormatFromExtension(filename);
06782
06783
06784
06785
06786
06787 if (SO->LocalDomainParentID) SUMA_SetParent_DsetToLoad(SO->LocalDomainParentID);
06788 else if (SO->idcode_str) SUMA_SetParent_DsetToLoad(SO->idcode_str);
06789 else SUMA_SetParent_DsetToLoad(NULL);
06790
06791 dset = SUMA_LoadDset (filename, &form, 0);
06792 if (!dset) { SUMA_SLP_Err( "Failed to load dataset.\n"
06793 "Make sure file exists\n"
06794 "and is of a supported\n"
06795 "format."); SUMA_RETURNe; }
06796 SUMA_SetParent_DsetToLoad(NULL);
06797
06798 if (LocalHead) {
06799 char *si = NULL;
06800 si = SUMA_DsetInfo(dset, 0);
06801 fprintf(SUMA_STDERR,"%s:\n----------------dset loaded ----------\n%s\n",FuncName, si);
06802 SUMA_free(si); si = NULL;
06803 }
06804
06805
06806
06807 np = SDSET_IDMDOM(dset); if (np) lnp = strlen(np) ; else lnp = 0;
06808 if (!np || lnp == 0) {
06809 SUMA_SL_Note("dset has no mesh parent, assigning SO");
06810 if (!SUMA_OKassign(dset, SO)) {
06811 SUMA_SLP_Err("Cannot assign dset to SO.\n");
06812 SUMA_FreeDset(dset); dset=NULL;
06813 SUMA_RETURNe;
06814 }
06815 NI_set_attribute(dset->ngr,"Parent_ID", SO->idcode_str);
06816 NI_set_attribute(dset->ngr,"GeomParent_idcode", SO->idcode_str);
06817 } else {
06818 SUMA_SL_Note("dset has a mesh parent, Checking relationship");
06819 if (!SUMA_isDsetRelated(dset, SO)) {
06820 SUMA_SLP_Err("Dset not related to SO");
06821 SUMA_FreeDset(dset); dset=NULL;
06822 SUMA_RETURNe;
06823 }
06824 }
06825
06826
06827 if (!SUMA_InsertDsetPointer(dset, SUMAg_CF->DsetList)) {
06828 SUMA_SLP_Err("Failed to add new dset to list");
06829
06830 SUMA_FreeDset(dset); dset = NULL;
06831 SUMA_RETURNe;
06832 }
06833
06834
06835 NewColPlane = SUMA_CreateOverlayPointer (dset->dnel->vec_len, filename, dset, SO->idcode_str);
06836 if (!NewColPlane) {
06837 fprintf (SUMA_STDERR, "Error %s: Failed in SUMA_CreateOverlayPointer.\n", FuncName);
06838 SUMA_RETURNe;
06839 }
06840
06841
06842 OverInd = SO->N_Overlays;
06843
06844
06845 if (!SUMA_AddNewPlane (SO, NewColPlane, SUMAg_DOv, SUMAg_N_DOv, 0)) {
06846 SUMA_SL_Crit("Failed in SUMA_AddNewPlane");
06847 SUMA_FreeOverlayPointer(NewColPlane);
06848 SUMA_FreeDset(dset); dset = NULL;
06849 SUMA_RETURNe;
06850 }
06851
06852
06853
06854 NewColPlane->GlobalOpacity = YUP;
06855 NewColPlane->Show = YUP;
06856 NewColPlane->OptScl->find = 0;
06857 NewColPlane->OptScl->tind = 0;
06858 NewColPlane->OptScl->bind = 0;
06859 SUMA_GetDsetColRange(dset, 0, NewColPlane->OptScl->IntRange, loc);
06860
06861
06862
06863
06864
06865
06866 SUMA_ColorizePlane(NewColPlane);
06867
06868
06869
06870
06871
06872
06873
06874
06875
06876
06877
06878
06879 SO->SurfCont->curColPlane = SO->Overlays[OverInd];
06880
06881
06882 if (!SUMA_RemixRedisplay (SO)) {
06883 SUMA_RETURNe;
06884 }
06885
06886 SUMA_LH("Refreshing Dset list");
06887
06888 LW = SO->SurfCont->SwitchDsetlst;
06889 if (LW) {
06890 if (!LW->isShaded) SUMA_RefreshDsetList (SO);
06891 }
06892
06893 if (LocalHead) fprintf (SUMA_STDERR,"%s: Updating Dset frame, OverInd=%d\n",
06894 FuncName, OverInd);
06895
06896 if (OverInd >= 0)
06897 SUMA_InitializeColPlaneShell(SO, SO->Overlays[OverInd]);
06898
06899 SUMA_RETURNe;
06900 }
06901
06902
06903
06904
06905
06906
06907 void SUMA_LoadColorPlaneFile (char *filename, void *data)
06908 {
06909 static char FuncName[]={"SUMA_LoadColorPlaneFile"};
06910 SUMA_SurfaceObject *SO = NULL;
06911 SUMA_OVERLAY_PLANE_DATA sopd;
06912 SUMA_IRGB *irgb=NULL;
06913 int OverInd = -1;
06914 DList *list=NULL;
06915 SUMA_LIST_WIDGET *LW=NULL;
06916 SUMA_Boolean LocalHead = NOPE;
06917
06918 SUMA_ENTRY;
06919
06920 if (!data) {
06921 SUMA_SLP_Err("Null data");
06922 SUMA_RETURNe;
06923 }
06924
06925 SO = (SUMA_SurfaceObject *)data;
06926
06927 if (LocalHead) {
06928 fprintf (SUMA_STDERR,"%s: Received request to load %s for surface %s.\n", FuncName, filename, SO->Label);
06929 }
06930
06931
06932 if (!SUMA_filexists(filename)) {
06933 SUMA_SLP_Err("File not found");
06934 SUMA_RETURNe;
06935 }
06936
06937 irgb = SUMA_Read_IRGB_file(filename);
06938 if (!irgb) {
06939 SUMA_SLP_Err("Failed to read file.");
06940 SUMA_RETURNe;
06941 }
06942
06943 sopd.N = irgb->N;
06944 sopd.Type = SOPT_ifff;
06945 sopd.Source = SES_Suma;
06946 sopd.GlobalOpacity = 0.3;
06947 sopd.isBackGrnd = NOPE;
06948 sopd.Show = YUP;
06949
06950 sopd.DimFact = 0.5;
06951 sopd.i = (void *)irgb->i;
06952 sopd.r = (void *)irgb->r;
06953 sopd.g = (void *)irgb->g;
06954 sopd.b = (void *)irgb->b;
06955 sopd.a = NULL;
06956
06957 if (!SUMA_iRGB_to_OverlayPointer ( SO, filename, &sopd, &OverInd,
06958 SUMAg_DOv, SUMAg_N_DOv, SUMAg_CF->DsetList)) {
06959 SUMA_SLP_Err("Failed to fetch or create overlay pointer.");
06960 SUMA_RETURNe;
06961 }
06962
06963
06964 irgb = SUMA_Free_IRGB(irgb);
06965
06966
06967 SO->SurfCont->curColPlane = SO->Overlays[OverInd];
06968
06969 if (!SUMA_RemixRedisplay (SO)) {
06970 SUMA_RETURNe;
06971 }
06972
06973 SUMA_LH("Refreshing color plane list");
06974
06975 LW = SO->SurfCont->SwitchDsetlst;
06976 if (LW) {
06977 if (!LW->isShaded) SUMA_RefreshDsetList (SO);
06978 }
06979
06980 if (LocalHead) fprintf (SUMA_STDERR,"%s: Updating color plane frame, OverInd=%d\n",
06981 FuncName, OverInd);
06982
06983 if (OverInd >= 0)
06984 SUMA_InitializeColPlaneShell(SO, SO->Overlays[OverInd]);
06985
06986 SUMA_RETURNe;
06987 }
06988
06989
06990
06991
06992
06993
06994
06995
06996
06997 #define SUMA_ISTARRED(s) ( (s)[0]=='*' && (s)[1]=='*' && (s)[2]=='*' )
06998
06999 #define SUMA_EOLSKIP \
07000 do{ for( ; fptr[0] != '\n' && fptr[0] != '\0' ; fptr++ ) ; \
07001 if( fptr[0] == '\0' ){ if (fbuf) free(fbuf) ; fbuf = NULL; goto donesection; } \
07002 fptr++ ; } while(0)
07003
07004 #define SUMA_GETSSS \
07005 do{ int nu=0,qq; \
07006 if( fptr-fbuf >= nbuf || fptr[0] == '\0' ){ if (fbuf) free(fbuf); fbuf = NULL; goto donesection; } \
07007 str[0]='\0'; qq=sscanf(fptr,"%127s%n",str,&nu); nused+=nu;fptr+=nu; \
07008 if( str[0]=='\0' || qq==0 || nu==0 ){ if (fbuf) free(fbuf); fbuf = NULL; goto donesection; } \
07009 } while(0)
07010
07011 #define SUMA_GETSTR \
07012 do{ SUMA_GETSSS ; \
07013 while(str[0]=='!' || (str[0]=='/' && str[1]=='/')){SUMA_EOLSKIP; SUMA_GETSSS;} \
07014 } while(0)
07015
07016 #define SUMA_GETEQN \
07017 do{ SUMA_GETSTR ; if(SUMA_ISTARRED(str)) goto SkipSection ; \
07018 strcpy(left,str) ; \
07019 SUMA_GETSTR ; if(SUMA_ISTARRED(str)) goto SkipSection ; \
07020 strcpy(middle,str) ; \
07021 SUMA_GETSTR ; if(SUMA_ISTARRED(str)) goto SkipSection ; \
07022 strcpy(right,str) ; } while(0)
07023
07024 #define SUMA_NSBUF 256
07025
07026
07027
07028
07029
07030
07031
07032
07033
07034
07035
07036
07037
07038
07039
07040
07041
07042 int SUMA_AFNI_Extract_Colors ( char *fname, SUMA_AFNI_COLORS *SAC )
07043 {
07044 static char FuncName[]={"SUMA_AFNI_Extract_Colors"};
07045 int nbuf , nused , ii, ngood = -1;
07046 float rgb[3];
07047 char * fbuf , * fptr ;
07048 char str[SUMA_NSBUF] , left[SUMA_NSBUF] , middle[SUMA_NSBUF] , right[SUMA_NSBUF] ;
07049 SUMA_STRING *SS = NULL;
07050 SUMA_COLOR_MAP *CM=NULL;
07051 SUMA_Boolean LocalHead = NOPE;
07052
07053 fbuf = AFNI_suck_file( fname ) ; if( fbuf == NULL ) {
07054 SUMA_SL_Warn("File could not be read");
07055 SUMA_RETURN(-1) ; }
07056 nbuf = strlen(fbuf) ; if( nbuf == 0 ) {
07057 SUMA_SL_Warn("Empty file");
07058 SUMA_RETURN(-1) ; }
07059
07060 fptr = fbuf ; nused = 0 ;
07061
07062
07063 ngood = 0;
07064
07065 str[0] = '\0' ;
07066
07067 if(LocalHead) {
07068 fprintf(SUMA_STDERR,"Reading AFNI setup file = %s (%d bytes)",fname,nbuf) ;
07069 }
07070
07071 while( nused < nbuf ){
07072
07073
07074
07075
07076 SkipSection: while( ! SUMA_ISTARRED(str) ){ SUMA_GETSTR; SUMA_LH(str);}
07077
07078
07079
07080 if( strcmp(str, "***COLORS") != 0 && strcmp(str, "***PALETTES") != 0){
07081 SUMA_GETSTR ;
07082 goto SkipSection ;
07083 }
07084
07085
07086 SS = SUMA_StringAppend (NULL, NULL);
07087
07088
07089
07090
07091 if( strcmp(str,"***COLORS") == 0 ){
07092 char label[SUMA_NSBUF] , defn[SUMA_NSBUF] ;
07093
07094 if (LocalHead) fprintf (SUMA_STDERR,"%s: Found ***COLORS\n", FuncName);
07095 while(1){
07096 SUMA_GETEQN ;
07097
07098 if (LocalHead) {
07099 fprintf (SUMA_STDERR,"\t %s%s%s\n", left, middle, right);
07100 }
07101
07102
07103
07104 if( !THD_filename_pure(left) ) continue ;
07105
07106 if( strcmp(left,"none")==0 || strcmp(right,"none")==0 ) {
07107 sprintf(left,"none");
07108 rgb[0] = rgb[1] = rgb[2] =-1.0;
07109 } else {
07110 if (!SUMA_Interpret_AFNIColor (right, rgb)) {
07111 fprintf(SUMA_STDERR,"Error %s: Failed to interpret color %s\n", FuncName, right);
07112 SUMA_RETURN(-1);
07113 }
07114 }
07115 SAC->Cv = SUMA_Add_Color (left,
07116 rgb[0], rgb[1], rgb[2], 1.0,
07117 SAC->Cv, &(SAC->N_cols));
07118 }
07119 continue ;
07120 }
07121
07122
07123
07124
07125 if( strcmp(str,"***PALETTES") == 0 ){
07126 char label[SUMA_NSBUF] = "NoThing" , ccc , * cpt ;
07127 PBAR_palette_array * ppar=NULL ;
07128 PBAR_palette ** ppp ;
07129 PBAR_palette * ppnew ;
07130 int npane , pmode , icol=0 , jj ;
07131 float val ;
07132
07133 if (LocalHead) fprintf (SUMA_STDERR,"enter ***PALETTES\n");
07134
07135
07136
07137 while(1){
07138 SUMA_GETSTR ; if( SUMA_ISTARRED(str) ) goto SkipSection ;
07139 if( fptr-fbuf >= nbuf ){ if (fbuf) free(fbuf) ; fbuf = NULL; SUMA_RETURN(-1) ; }
07140
07141 if( str[0] != '[' ){
07142 strcpy(label,str) ;
07143 if( !THD_filename_ok(label) ){
07144 fprintf(SUMA_STDERR,"Error %s: In setup file %s, bad palette label: %s.\n Ignoring palette.\n",
07145 FuncName, fname,label) ;
07146 if (fbuf) free(fbuf) ; fbuf = NULL;
07147 SUMA_RETURN(-1) ;
07148 }
07149
07150 if (LocalHead) {
07151 fprintf (SUMA_STDERR,"%s: found palette label=%s. [len=%d label[0]=%d]\nnbuf=%d fptr-fbuf=%d\n",
07152 FuncName, label,(int)strlen(label),(int)label[0],
07153 nbuf,fptr-fbuf);
07154 }
07155
07156
07157
07158 SUMA_GETSTR ; if( SUMA_ISTARRED(str) ) goto SkipSection ;
07159 }
07160
07161
07162 if( str[0] != '[' ){
07163 fprintf(SUMA_STDERR,"Error %s: In setup file %s, expected palette '[n]' here: %s.\n",
07164 FuncName, fname , str ) ;
07165 SUMA_RETURN(-1) ;
07166 }
07167
07168
07169 ii = sscanf( str , "[%d%c" , &npane , &ccc ) ;
07170 if( ii < 2 ){
07171 fprintf(SUMA_STDERR,"%s: In setup file %s, can't interpret palette %s\n",
07172 FuncName, fname , str ) ;
07173 SUMA_RETURN(-1) ;
07174 } else if( npane < NPANE_MIN || npane > NPANE_MAX ){
07175 fprintf(SUMA_STDERR,"%s: In setup file %s, illegal palette count %s.\n",
07176 FuncName, fname , str ) ;
07177 SUMA_RETURN(-1) ;
07178 }
07179
07180
07181 if (LocalHead) {
07182 fprintf(SUMA_STDERR,"%s: About to read %d panes.\n", FuncName, npane);
07183 }
07184
07185
07186 CM = (SUMA_COLOR_MAP *)SUMA_malloc(sizeof(SUMA_COLOR_MAP));
07187 if (CM == NULL) {
07188 SUMA_SL_Crit ("Failed to allocate for CM");
07189 SUMA_RETURN(-1);
07190 }
07191 CM->SO = NULL;
07192 CM->N_Col = npane;
07193 CM->cname = NULL;
07194
07195 if (ccc == '+') CM->Sgn = 1;
07196 else CM->Sgn = -1;
07197
07198
07199 CM->Name = (char *)SUMA_calloc(strlen(label)+10, sizeof(char));
07200 CM->frac = (float *)SUMA_calloc(CM->N_Col, sizeof(float));
07201 CM->M = (float**)SUMA_allocate2D (CM->N_Col, 3, sizeof(float));
07202 if ( CM->frac == NULL || CM->M == NULL || CM->Name == NULL ) {
07203 SUMA_SL_Crit ("Failed to allocate for fields of CM.");
07204 SUMA_RETURN (-1);
07205 }
07206 if (CM->Sgn == 1) sprintf(CM->Name, "%s_p%d", label, CM->N_Col);
07207 else sprintf(CM->Name, "%s_n%d", label, CM->N_Col);
07208
07209 for( ii=0 ; ii < npane ; ii++ ){
07210 SUMA_GETEQN ;
07211
07212 if (LocalHead) {
07213 fprintf(SUMA_STDERR,"%s: SUMA_GETEQN: %s %s %s\n",FuncName, left,middle,right) ;
07214 }
07215
07216
07217 icol = SUMA_Find_Color (right, SAC->Cv, SAC->N_cols);
07218 if (icol < 0) {
07219 fprintf(SUMA_STDERR,"Error %s: Color %s not found in dbase.\nUsing no-color in its place\n", FuncName, right);
07220 CM->M[npane - ii - 1][0] = CM->M[npane - ii - 1][1] = CM->M[npane - ii - 1][2] = -1.0;
07221 } else {
07222 CM->M[npane - ii - 1][0] = SAC->Cv[icol].r;
07223 CM->M[npane - ii - 1][1] = SAC->Cv[icol].g;
07224 CM->M[npane - ii - 1][2] = SAC->Cv[icol].b;
07225 }
07226 CM->frac[npane - ii - 1] = atof(left);
07227 }
07228
07229 SAC->CMv = SUMA_Add_ColorMap (CM, SAC->CMv, &(SAC->N_maps));
07230 if (SAC->CMv) ++ngood;
07231 continue ;
07232 }
07233 }
07234 SUMA_GETSTR ; goto SkipSection ;
07235
07236 }
07237
07238 donesection:
07239
07240 if (LocalHead) fprintf(SUMA_STDERR,"%s: Returning\n", FuncName);
07241 if (fbuf) free(fbuf) ;
07242 SUMA_RETURN (ngood);
07243
07244 }
07245
07246
07247
07248
07249
07250
07251
07252
07253
07254 SUMA_Boolean SUMA_Interpret_AFNIColor (char *Name, float RGB[3])
07255 {
07256 static char FuncName[]={"SUMA_Interpret_AFNIColor"};
07257 char *vargv[1]={ "SCALE_TO_MAP" };
07258 int cargc = 1;
07259 int r, g, b;
07260 char stmp[10];
07261 XVisualInfo vtmp, *vislist;
07262 XtAppContext app;
07263 Widget tl;
07264 Display *dpy=NULL;
07265 XColor color_closest, color_exact;
07266 Colormap cmap;
07267 SUMA_Boolean LocalHead = NOPE;
07268
07269 SUMA_ENTRY;
07270
07271 if (Name[0] == '#') {
07272 sprintf(stmp,"0x%c%c", Name[1], Name[2]);
07273 sscanf (stmp, "%x", &r);
07274 sprintf(stmp,"0x%c%c", Name[3], Name[4]);
07275 sscanf (stmp, "%x", &g);
07276 sprintf(stmp,"0x%c%c", Name[5], Name[6]);
07277 sscanf (stmp, "%x", &b);
07278 RGB[0] = (float)r/255.0;
07279 RGB[1] = (float)g/255.0;
07280 RGB[2] = (float)b/255.0;
07281
07282 } else {
07283
07284
07285 if (SUMAg_CF->isGraphical) {
07286 tl = XtAppInitialize(NULL, "ScaleToMap", NULL, 0, &cargc, vargv,
07287 SUMA_get_fallbackResources(), NULL, 0);
07288 dpy = XtDisplay(tl);
07289 cmap = DefaultColormap(dpy, DefaultScreen(dpy));
07290
07291 XParseColor(dpy, cmap, Name, &color_exact);
07292
07293
07294
07295 RGB[0] = (float)color_exact.red/255.0/257.0;
07296 RGB[1] = (float)color_exact.green/255.0/257.0;
07297 RGB[2] = (float)color_exact.blue/255.0/257.0;
07298
07299 XFreeColormap(dpy, cmap);
07300 XtDestroyWidget(tl);
07301 } else {
07302 if (LocalHead) fprintf(SUMA_STDERR,"%s: \n"
07303 "Xcolor %s cannot be resolved without \n"
07304 "trying to open X display.\n"
07305 "Returning color 0.5 0.5 0.5", FuncName, Name);
07306 RGB[0] = RGB[1] = RGB[2] = 0.5;
07307 }
07308 }
07309
07310
07311 if (LocalHead) {
07312 fprintf (SUMA_STDERR,"%s: %s = %f %f %f\n",
07313 FuncName, Name, RGB[0], RGB[1], RGB[2]);
07314 }
07315
07316 SUMA_RETURN (YUP);
07317 }
07318
07319
07320
07321
07322 int SUMA_ColorizePlane (SUMA_OVERLAYS *cp)
07323 {
07324 static char FuncName[]={"SUMA_ColorizePlane"};
07325 int i, i3, N_i, *iv, *Nv;
07326 float *Rv, *Bv, *Gv;
07327 SUMA_Boolean LocalHead = NOPE;
07328
07329 SUMA_ENTRY;
07330
07331 if (LocalHead) {
07332 SUMA_LH("Color Plane Pre Colorizing");
07333 SUMA_Show_ColorOverlayPlanes ( &cp, 1, 0);
07334 }
07335 if (!cp) { SUMA_SL_Err("NULL cp"); SUMA_RETURN(NOPE); }
07336 if (!cp->dset_link) { SUMA_SL_Err("Where's your dset_link?"); SUMA_RETURN(NOPE); }
07337 if (!cp->cmapname) { SUMA_SL_Err("Where's your cmapname?"); SUMA_RETURN(NOPE); }
07338 if (!cp->ColVec) { SUMA_SL_Err("NULL cV"); SUMA_RETURN(NOPE); }
07339
07340
07341 if (strcmp(cp->cmapname, "explicit") == 0) {
07342
07343 SUMA_LH("Explicit color specification");
07344
07345 if (SDSET_TYPE(cp->dset_link) != SUMA_NODE_RGB) {
07346 SUMA_SL_Err("Direct mapping is only supported for SUMA_NODE_RGB types");
07347 SUMA_RETURN(NOPE);
07348 }
07349 iv = SUMA_GetDsetColIndex (cp->dset_link, SUMA_NODE_INDEX, &N_i);
07350 if (N_i != 1) { SUMA_SL_Err("Failed to find index column."); SUMA_free(iv); SUMA_RETURN(NOPE); }
07351 Nv = (int *)cp->dset_link->dnel->vec[iv[0]]; SUMA_free(iv); iv = NULL;
07352 iv = SUMA_GetDsetColIndex (cp->dset_link, SUMA_NODE_R, &N_i);
07353 if (N_i != 1) { SUMA_SL_Err("Failed to find red column."); SUMA_free(iv); SUMA_RETURN(NOPE); }
07354 Rv = (float *)cp->dset_link->dnel->vec[iv[0]];SUMA_free(iv); iv = NULL;
07355 iv = SUMA_GetDsetColIndex (cp->dset_link, SUMA_NODE_G, &N_i);
07356 if (N_i != 1) { SUMA_SL_Err("Failed to find green column."); SUMA_free(iv); SUMA_RETURN(NOPE); }
07357 Gv = (float *)cp->dset_link->dnel->vec[iv[0]];SUMA_free(iv); iv = NULL;
07358 iv = SUMA_GetDsetColIndex (cp->dset_link, SUMA_NODE_B, &N_i);
07359 if (N_i != 1) { SUMA_SL_Err("Failed to find blue column."); SUMA_free(iv); SUMA_RETURN(NOPE); }
07360 Bv = (float *)cp->dset_link->dnel->vec[iv[0]];SUMA_free(iv); iv = NULL;
07361
07362
07363 if (LocalHead) {
07364 char *s = NULL;
07365 s = SUMA_DsetInfo(cp->dset_link, 0);
07366 SUMA_S_Note(s);
07367 SUMA_free(s);
07368 }
07369
07370 if (cp->DimFact == 1.0) {
07371 for (i=0; i < cp->dset_link->dnel->vec_filled; ++i) {
07372 i3 = 3 * i;
07373 cp->NodeDef[i] = Nv[i];
07374 cp->ColVec[i3] = Rv[i]; ++i3;
07375 cp->ColVec[i3] = Gv[i]; ++i3;
07376 cp->ColVec[i3] = Bv[i];
07377 }
07378 } else {
07379 for (i=0; i < cp->dset_link->dnel->vec_filled; ++i) {
07380 i3 = 3 * i;
07381 cp->NodeDef[i] = Nv[i];
07382 cp->ColVec[i3] = Rv[i] * cp->DimFact; ++i3;
07383 cp->ColVec[i3] = Gv[i] * cp->DimFact; ++i3;
07384 cp->ColVec[i3] = Bv[i] * cp->DimFact;
07385 }
07386 }
07387 cp->N_NodeDef = cp->dset_link->dnel->vec_filled;
07388 } else {
07389
07390 if (!SUMA_ScaleToMap_Interactive (cp)) {
07391 SUMA_SL_Err("Failed in SUMA_ScaleToMap_Interactive.");
07392 SUMA_RETURN(0);
07393 }
07394
07395 }
07396
07397
07398
07399 if (LocalHead) {
07400 SUMA_LH("Color Plane Post Colorizing");
07401 SUMA_Show_ColorOverlayPlanes ( &cp, 1, 0);
07402 }
07403 SUMA_RETURN(1);
07404 }
07405
07406
07407
07408
07409
07410
07411
07412
07413 SUMA_Boolean SUMA_SetConvexityPlaneDefaults(SUMA_SurfaceObject *SO, DList *DsetList)
07414 {
07415 static char FuncName[]={"SUMA_SetConvexityPlaneDefaults"};
07416 float IntRange[2], *Vsort = NULL;
07417 float *Cx=NULL;
07418 int junk;
07419 char *eee = NULL;
07420 int icmap;
07421 SUMA_OVERLAYS *ConvPlane;
07422 SUMA_Boolean LocalHead = NOPE;
07423
07424 SUMA_ENTRY;
07425
07426 if (!SUMAg_CF->scm) {
07427 SUMAg_CF->scm = SUMA_Build_Color_maps();
07428 if (!SUMAg_CF->scm) {
07429 SUMA_SL_Warn("No color maps set up.\n");
07430 SUMA_RETURN(YUP);
07431 }
07432 }
07433
07434 if (!(ConvPlane = SUMA_Fetch_OverlayPointer(SO->Overlays, SO->N_Overlays, "Convexity", &junk))) {
07435 SUMA_SL_Err("Failed to find overlay plane 'Convexity'");
07436 SUMA_RETURN(NOPE);
07437 }
07438
07439
07440 eee = getenv("SUMA_ConvColorMap");
07441 if (eee) {
07442 icmap = SUMA_Find_ColorMap ( eee, SUMAg_CF->scm->CMv, SUMAg_CF->scm->N_maps, -2 );
07443 if (icmap < 0) {
07444 SUMA_SL_Err("Colormap specified in\n"
07445 "environment variable SUMA_ConvColorMap\n"
07446 "was not found. Using ngray20.\n");
07447 SUMA_STRING_REPLACE(ConvPlane->cmapname, "ngray20");
07448 } else {
07449 SUMA_STRING_REPLACE(ConvPlane->cmapname, eee);
07450 }
07451 } else {
07452 SUMA_STRING_REPLACE(ConvPlane->cmapname, "ngray20");
07453 }
07454
07455 SUMA_LH("Deciding on brightness factor");
07456
07457 eee = getenv("SUMA_ConvBrightFactor");
07458 if (eee) {
07459 ConvPlane->OptScl->BrightFact = (float)strtod(eee, NULL);
07460 if (ConvPlane->OptScl->BrightFact < 0) {
07461 SUMA_SL_Err("Brightness factor specified in\n"
07462 "environment variable SUMA_ConvColorMap\n"
07463 "is negative. Using default.\n");
07464 ConvPlane->OptScl->BrightFact = SUMA_DIM_CONVEXITY_COLOR_FACTOR;
07465 }
07466 } else {
07467 ConvPlane->OptScl->BrightFact = SUMA_DIM_CONVEXITY_COLOR_FACTOR;
07468 }
07469
07470
07471 ConvPlane->GlobalOpacity = SUMA_CONVEXITY_COLORPLANE_OPACITY;
07472 ConvPlane->Show = YUP;
07473 ConvPlane->isBackGrnd = YUP;
07474
07475 SUMA_LH("Smoothing Cx");
07476
07477 ConvPlane->OptScl->interpmode = SUMA_NO_INTERP;
07478 ConvPlane->OptScl->ApplyClip = YUP;
07479
07480 IntRange[0] = 5; IntRange[1] = 95;
07481 Cx = (float *)SUMA_GetCx(SO->idcode_str, DsetList, 0);
07482 if (!Cx) { SUMA_SL_Err("Failed to find Cx\n"); SUMA_RETURN (NOPE); }
07483 Vsort = SUMA_PercRange (Cx, NULL, SO->N_Node, IntRange, IntRange, NULL);
07484 if (Vsort[0] < 0 && Vsort[SO->N_Node -1] > 0 ) {
07485
07486 if (fabs(IntRange[0]) > IntRange[1]) {
07487 IntRange[1] = -IntRange[0];
07488 } else {
07489 IntRange[0] = -IntRange[1];
07490 }
07491 } else {
07492
07493 }
07494 if (Vsort) SUMA_free(Vsort); Vsort = NULL;
07495
07496 ConvPlane->OptScl->find = 0;
07497 ConvPlane->OptScl->tind = 0;
07498 ConvPlane->OptScl->bind = 0;
07499 ConvPlane->OptScl->IntRange[0] = IntRange[0]; ConvPlane->OptScl->IntRange[1] = IntRange[1];
07500
07501 ConvPlane->ForceIntRange[0] = IntRange[0]; ConvPlane->ForceIntRange[1] = IntRange[1];
07502
07503 SUMA_RETURN(YUP);
07504 }
07505
07506
07507
07508
07509
07510
07511
07512 int SUMA_GetNodeOverInd (SUMA_OVERLAYS *Sover, int node)
07513 {
07514 static char FuncName[]={"SUMA_GetNodeOverInd"};
07515 int Found, i;
07516 SUMA_Boolean LocalHead = NOPE;
07517
07518 SUMA_ENTRY;
07519
07520
07521
07522 Found = -1;
07523 if (Sover->dset_link->dnel->vec_filled > node) {
07524 if (Sover->NodeDef[node] == node) {
07525 SUMA_LH("Good, found it easily");
07526
07527 if (node >= Sover->N_NodeDef) {
07528
07529
07530 SUMA_LH("Can't tell for sure");
07531 } else {
07532 SUMA_RETURN(node);
07533 }
07534 }
07535 }
07536 if (Found < 0) {
07537 SUMA_LH("The hard way");
07538 i=0;
07539 while (Found <0 && i<Sover->N_NodeDef) {
07540 if (Sover->NodeDef[i] == node) Found = i;
07541 ++i;
07542 }
07543 }
07544
07545 SUMA_RETURN(Found);
07546 }
07547
07548
07549