#include "SUMA_suma.h" SUMA_SurfaceViewer *SUMAg_cSV = NULL; /*!< Global pointer to current Surface Viewer structure*/ SUMA_SurfaceViewer *SUMAg_SVv = NULL; /*!< Global pointer to the vector containing the various Surface Viewer Structures SUMAg_SVv contains SUMA_MAX_SURF_VIEWERS structures */ int SUMAg_N_SVv = 0; /*!< Number of SVs realized by X */ SUMA_DO *SUMAg_DOv = NULL; /*!< Global pointer to Displayable Object structure vector*/ int SUMAg_N_DOv = 0; /*!< Number of DOs stored in DOv */ SUMA_CommonFields *SUMAg_CF = NULL; /*!< Global pointer to structure containing info common to all viewers */ void SUMA_MakeColorMap_usage () { static char FuncName[]={"SUMA_MakeColorMap_usage"}; char * s = NULL; SUMA_ENTRY; s = SUMA_help_basics(); fprintf (SUMA_STDOUT, "\n" "Usage1: \n" "MakeColorMap <-fn Fiducials_Ncol> [-pos] [-ah prefix] [-h/-help]\n" " Creates a colormap of N colors that contains the fiducial colors.\n" " -fn Fiducials_Ncol: Fiducial colors and their indices in the color\n" " map are listed in file Fiducials_Ncol.\n" " Each row contains 4 tab delimited values:\n" " R G B i\n" " R G B values are between 0 and 1 and represent the \n" " i-th color in the colormap. i should be between 0 and\n" " N-1, N being the total number of colors in the colormap.\n" "\n" "Usage2: \n" "MakeColorMap <-f Fiducials> <-nc N> [-sl] [-ah prefix] [-h/-help]\n" " Creates a colormap of N colors that contains the fiducial colors.\n" " -f Fiducials: Fiducial colors are listed in an ascii file Fiducials. \n" " Each row contains 3 tab delimited R G B values between 0 and 1.\n" " -nc N: Total number of colors in the color map.\n" " -sl: (optional, default is NO) if used, the last color in the Fiducial \n" " list is omitted. This is useful in creating cyclical color maps.\n" "\n" "Usage3: \n" "MakeColorMap <-std MapName>\n" " Returns one of SUMA's standard colormaps. Choose from:\n" " rgybr20, ngray20, gray20, bw20, bgyr19, \n" " matlab_default_byr64, roi128, roi256, roi64\n" "\n" "Common options to all usages:\n" " -ah prefix: (optional, Afni Hex format.\n" " default is RGB values in decimal form)\n" " use this option if you want a color map formatted to fit \n" " in AFNI's .afnirc file. The colormap is written out as \n" " prefix_01 = #xxxxxxx \n prefix_02 = #xxxxxxx\n etc...\n" " -h or -help: displays this help message.\n" " -flipud: Flip the map upside down. If the colormap is being \n" " created for interactive loading into SUMA with the 'New'\n" " button from the 'Surface Controller' you will need\n" " to flip it upside down. \n" "\n" "Example Usage 1: Creating a colormap of 20 colors that goes from \n" "Red to Green to Blue to Yellow to Red.\n" "\n" " The file FidCol_Nind contains the following:\n" " 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" "\n" " The following command will generate the RGB colormap in decimal form:\n" " MakeColorMap -fn FidCol_Nind \n" "\n" " The following command will generate the colormap and write it as \n" " an AFNI color palette file:\n" " MakeColorMap -fn FidCol_Nind -ah TestPalette > TestPalette.pal\n" "\n" "Example Usage 2: Creating a cyclical version of the colormap in usage 1:\n" "\n" " The file FidCol contains the following:\n" " 1 0 0\n 0 1 0\n 0 0 1\n 1 1 0\n 1 0 0\n" "\n" " The following command will generate the RGB colormap in decimal form:\n" " MakeColorMap -f FidCol -sl -nc 20 \n" "\n" "Example Usage 3: MakeColorMap -std ngray20 \n" "\n" "To read in a new colormap into AFNI, either paste the contents of \n" "TestPalette.pal in your .afnirc file or read the .pal file using \n" "AFNI as follows:\n" "1- run afni\n2- Define Function --> right click on Inten (over colorbar) \n" " --> Read in palette (choose TestPalette.pal)\n" "3- set the #colors chooser (below colorbar) to 20 (the number of colors in \n" " TestPalette.pal).\n" "%s",s); SUMA_free(s); s = NULL; s = SUMA_New_Additions(0, 1); printf("%s\n", s);SUMA_free(s); s = NULL; fprintf (SUMA_STDOUT, " Ziad S. Saad & Rick R. Reynolds SSCC/NIMH/NIH saadz@mail.nih.gov Tue Apr 23 14:14:48 EDT 2002\n\n"); SUMA_RETURNe; } int main (int argc,char *argv[]) {/* Main */ static char FuncName[]={"MakeColorMap"}; char *FidName = NULL, *Prfx = NULL, h[9], *StdType=NULL; int Ncols = 0, N_Fid = 0, kar, i, ifact, *Nind = NULL; float **Fid=NULL, **M=NULL; MRI_IMAGE *im = NULL; float *far=NULL; SUMA_Boolean brk, SkipLast, AfniHex, PosMap, Usage1, Usage2, Usage3, flipud, LocalHead = NOPE; SUMA_COLOR_MAP *SM=NULL; SUMA_STANDALONE_INIT; SUMA_mainENTRY; if (argc < 2) { SUMA_MakeColorMap_usage(); exit (1); } kar = 1; brk = NOPE; SkipLast = NOPE; AfniHex = NOPE; PosMap = NOPE; Usage1 = NOPE; Usage2 = NOPE; Usage3 = NOPE; flipud = NOPE; while (kar < argc) { /* loop accross command ine options */ if (strcmp(argv[kar], "-h") == 0 || strcmp(argv[kar], "-help") == 0) { SUMA_MakeColorMap_usage(); exit (1); } SUMA_SKIP_COMMON_OPTIONS(brk, kar); if (!brk && (strcmp(argv[kar], "-v") == 0)) { LocalHead = NOPE; brk = YUP; } if (!brk && (strcmp(argv[kar], "-flipud") == 0)) { flipud = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-f") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -f "); exit (1); } FidName = argv[kar]; Usage1 = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-fn") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -fn "); exit (1); } FidName = argv[kar]; Usage2 = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-nc") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -nc "); exit (1); } Ncols = atoi(argv[kar]); Usage1 = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-ah") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -ah "); exit (1); } Prfx = argv[kar]; AfniHex = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-std") == 0)) { kar ++; if (kar >= argc) { fprintf (SUMA_STDERR, "need argument after -std "); exit (1); } StdType = argv[kar]; Usage3 = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-sl") == 0)) { SkipLast = YUP; brk = YUP; } if (!brk && (strcmp(argv[kar], "-pos") == 0)) { /* obsolete */ PosMap = YUP; brk = YUP; } if (!brk) { fprintf (SUMA_STDERR,"Error %s: Option %s not understood. Try -help for usage\n", FuncName, argv[kar]); exit (1); } else { brk = NOPE; kar ++; } }/* loop accross command ine options */ /* check input */ if ( (Usage1 && Usage2) || (Usage1 && Usage3) || (Usage2 && Usage3)) { fprintf (SUMA_STDERR,"Error %s: Mixing options from multiple usage modes.\n", FuncName); exit(1); } if (!Usage1 && !Usage2 && !Usage3) { fprintf (SUMA_STDERR,"Error %s: One of these options must be used:\n-f -fn or -std.\n", FuncName); exit(1); } if (Usage1 || Usage2) { if (!SUMA_filexists (FidName)) { fprintf (SUMA_STDERR,"Error %s: File %s could not be found.\n", FuncName, FidName); exit(1); } /* read the fiducials file */ im = mri_read_1D (FidName); if (!im) { SUMA_S_Err("Failed to read file"); exit(1); } far = MRI_FLOAT_PTR(im); N_Fid = im->nx * im->ny; } if (PosMap) { fprintf (SUMA_STDERR,"\nWarning %s: -pos option is obsolete.\n", FuncName); } /* allocate for fiducials */ if (Usage1) { if (N_Fid % 3) { fprintf (SUMA_STDERR,"Error %s: Not all rows in %s appear to have RGB triplets.\n", FuncName, FidName); exit (1); } Fid = (float **) SUMA_allocate2D (N_Fid / 3, 3, sizeof(float)); if (Fid == NULL) { fprintf (SUMA_STDERR,"Error %s: Could not allocate for Fid.\n", FuncName); exit(1); } for (i=0; i < im->nx; ++i) { Fid[i][0] = far[i]; Fid[i][1] = far[i+im->nx]; Fid[i][2] = far[i+2*im->nx]; } mri_free(im); im = NULL; /* now create the color map */ SM = SUMA_MakeColorMap (Fid, N_Fid/3, Ncols, SkipLast, FuncName); if (SM == NULL) { fprintf (SUMA_STDERR,"Error %s: Error in SUMA_MakeColorMap.\n", FuncName); exit(1); } } if (Usage2) { /* second usage */ if (N_Fid % 4) { fprintf (SUMA_STDERR,"Error %s: Not all rows in %s appear to have RGB N quadruplets.\n", FuncName, FidName); exit (1); } Fid = (float **) SUMA_allocate2D (N_Fid / 4, 3, sizeof(float)); Nind = (int *) SUMA_calloc (N_Fid/4, sizeof(int)); if (Fid == NULL || !Nind) { fprintf (SUMA_STDERR,"Error %s: Could not allocate for Fid or Nind.\n", FuncName); exit(1); } for (i=0; i < im->nx; ++i) { Fid[i][0] = far[i]; Fid[i][1] = far[i+im->nx]; Fid[i][2] = far[i+2*im->nx]; Nind[i] = (int)far[i+3*im->nx]; } mri_free(im); im = NULL; /* now create the color map */ SM = SUMA_MakeColorMap_v2 (Fid, N_Fid/4, Nind, SkipLast, FuncName); if (SM == NULL) { fprintf (SUMA_STDERR,"Error %s: Error in SUMA_MakeColorMap.\n", FuncName); exit(1); } Ncols = SM->N_Col; } if (Usage3) { /* third usage */ SM = SUMA_GetStandardMap (SUMA_StandardMapCode(StdType)); if (SM == NULL) { fprintf (SUMA_STDERR,"Error %s: Error in SUMA_MakeColorMap.\n", FuncName); exit(1); } Ncols = SM->N_Col; } if (flipud) { SUMA_Flip_Color_Map (SM); } M = SM->M; if (AfniHex && Ncols > 200) { fprintf (SUMA_STDERR,"Error %s: Cannot write a colormap of more than 200 colors in Afni's hex format.\n", FuncName); exit(1); } if (!AfniHex) SUMA_disp_mat (M, Ncols, 3, 1); else { fprintf (stdout, "\n***COLORS\n"); for (i=0; i < Ncols; ++i) { /* Now create the hex form */ r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][0]*255)), 1, 0); if (i<10) fprintf (stdout, "%s_0%d = #%s", Prfx, i, h); else fprintf (stdout, "%s_%d = #%s", Prfx, i, h); r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][1]*255)), 1, 0); fprintf (stdout, "%s", h); r_sprintf_long_to_hex (h, (unsigned long)rint((M[i][2]*255)), 1, 0); fprintf (stdout, "%s\n", h); } /* color map */ fprintf (stdout, "\n***PALETTES %s [%d]\n//1 to -1 range\n", Prfx, Ncols); ifact = 2; for (i=0; i < Ncols; ++i) { fprintf (stdout, "%f -> ", 1.0 - (float)(ifact*i)/Ncols); if (i<10) fprintf (stdout, "%s_0%d\n", Prfx, i); else fprintf (stdout, "%s_%d\n", Prfx, i); } fprintf (stdout, "\n***PALETTES %s [%d+]\n//1 to 0 range\n", Prfx, Ncols); ifact = 1; for (i=0; i < Ncols; ++i) { fprintf (stdout, "%f -> ", 1.0 - (float)(ifact*i)/Ncols); if (i<10) fprintf (stdout, "%s_0%d\n", Prfx, i); else fprintf (stdout, "%s_%d\n", Prfx, i); } } /* free allocated space */ if (Usage1) { if (Fid) SUMA_free2D((char **)Fid, N_Fid / 3); } else { if (Fid) SUMA_free2D((char **)Fid, N_Fid / 4); if (Nind) SUMA_free(Nind); } if (SM) SUMA_Free_ColorMap(SM); if (!SUMA_Free_CommonFields(SUMAg_CF)) { SUMA_SL_Err("Failed to free commonfields."); } SUMA_RETURN (0); }