1 #ifndef SUMA_CREATEDO_INCLUDED
2 #define SUMA_CREATEDO_INCLUDED
3 typedef struct {
4    char *idcode_str; /* copied by value */
5    char *LocalDomainParent; /* copied by value */
6    char *LocalDomainParentID;  /* copied by value */
7    SUMA_SO_File_Format FileFormat; /*defaults to  SUMA_ASCII*/
8    SUMA_SO_File_Type FileType; /*defaults to SUMA_FT_NOT_SPECIFIED*/
9    byte DoNormals; /* calculate normals ?*/
10    byte DoMetrics; /* calculate metrics? */
11    byte DoCenter; /* calculate center ? */
12    float LargestBoxSize;
13 } SUMA_NEW_SO_OPT;
14 
15 typedef struct {
16    char state_s[32]; /*!< state name */
17    char now_s[16]; /*!< current value in string format*/
18    char init_s[16]; /*!< initial value in string format*/
19    int now_i;
20    int init_i;
21    float now_f4[4];
22    float init_f4[4];
23    char whodunit[32]; /*!< Who wanted this state tracked */
24 } SUMA_GL_STEL;
25 
26 typedef struct {
27    char *idcode_str;
28    float *NodeList;
29    int N_Node;
30    int *NodeIndex;
31 
32    float AvgLe;
33    byte err;
34 } SUMA_DUMB_DO;   /* A structure to hold pointer copies for use by drawing
35                      functions. Nothing in here should be allocated for.
36                      All use of this structure should be temporary to the
37                      drawing function */
38 
39 /* A structure to create a hash table for locating NIML elements
40    for a certain edge in a graph dataset */
41 typedef struct {
42     int id;    /* keep it named 'id' to facilitate use of convenience
43                   macros in uthash . The integer id of an edge: its index*/
44     int ngrindex; /* the index into ngr->part of the ni element in question.
45                      ngr is the AFNI_dataset group element */
46     UT_hash_handle hh;  /* keep it named 'hh' for same reasons  */
47 }  SUMA_NGR_INDEX_HASH_DATUM;
48 
49 /*! Graph dataset Auxiliary structure for SUMA's use */
50 typedef struct {
51    DList *DisplayUpdates;
52    SUMA_SegmentDO *SDO;
53    SUMA_NIDO *nido;
54    SUMA_SurfaceObject *FrameSO; /*!< Matrix's holder surface object */
55    SUMA_OVERLAYS *Overlay;
56    SUMA_X_SurfCont *DOCont;/*!< Displayable object controller */
57    SUMA_PICK_RESULT *PR;
58    SUMA_Boolean *isColored; /*!< is the datum receiving color? Not masked say
59                                  by thresholds etc. */
60    NI_group *net; /*!< A network group holding tract indexed in thd.
61                        if net is NULL, then thd indexes into dset->ngr*/
62    SUMA_NGR_INDEX_HASH_DATUM *thd; /*! A hash table pointing to niml element
63                                        containing tract to represent path
64                                        between two points */
65    SUMA_Boolean ShowBundles; /*!< Show bundles instead of edge if possible */
66    SUMA_Boolean ShowUncon; /*!< Show graph points (nodes) even if not
67                                   connected */
68    SUMA_Boolean IgnoreSelection; /*!< Ignore selection mode when displaying
69                                       Currently used to show all graph, even
70                                       when one node is selected */
71    float *Center_G3D; /* Geometric center of all points in 3D variant*/
72    float *Range_G3D;  /* Min Max of X, Y, and Z of all points in 3D variant*/
73    float *Center_GMATRIX; /* Geometric center of all points in MATRIX
74                              variant*/
75    float *Range_GMATRIX;  /* Min Max of X, Y, and Z of all points in MATRIX
76                              variant*/
77 } SUMA_GRAPH_SAUX;
78 
79 /*! A Tract object's Auxiliary structure for SUMA's use */
80 typedef struct {
81    DList *DisplayUpdates;
82    SUMA_X_SurfCont *DOCont;/*!< Displayable object controller */
83    SUMA_PICK_RESULT *PR;
84    SUMA_OVERLAYS **Overlays;
85    int N_Overlays;
86    SUMA_Boolean *isColored; /*!< is the datum receiving color? Not masked say
87                                  by thresholds etc. */
88    int TractMask;
89    float MaskGray;
90    float *tract_lengths;
91 
92    float *Center; /* Geometric center of all points */
93    float *Range;  /* Min Max of X, Y, and Z of all points */
94 } SUMA_TRACT_SAUX;
95 
96 /*! A CIFTI object's Auxiliary structure for SUMA's use */
97 typedef struct {
98    DList *DisplayUpdates;
99    SUMA_X_SurfCont *DOCont;/*!< Displayable object controller */
100    SUMA_PICK_RESULT *PR;
101    SUMA_OVERLAYS **Overlays;
102    int N_Overlays;
103    SUMA_Boolean *isColored; /*!< is the datum receiving color? Not masked say
104                                  by thresholds etc. */
105 
106    float *Center; /* Geometric center of all points */
107    float *Range;  /* Min Max of X, Y, and Z of all points */
108 } SUMA_CIFTI_SAUX;
109 
110 /*! A Mask object's Auxiliary structure for SUMA's use */
111 typedef struct {
112    DList *DisplayUpdates;
113    SUMA_X_SurfCont *DOCont;/*!< Displayable object controller */
114    SUMA_PICK_RESULT *PR;
115    SUMA_OVERLAYS **Overlays;
116    int N_Overlays;
117    SUMA_Boolean *isColored; /*!< is the datum receiving color? Not masked say
118                                  by thresholds etc. */
119 } SUMA_MASK_SAUX;
120 
121 
122 /*! A Surface object's Auxiliary structure for SUMA's use */
123 typedef struct {
124    #if 0 /* Not in use yet*/
125    DList *DisplayUpdates;
126    SUMA_X_SurfCont *DOCont;/*!< Displayable object controller */
127    #endif
128    SUMA_PICK_RESULT *PR;
129    #if 0 /* Not in use yet*/
130    SUMA_OVERLAYS **Overlays;
131    int N_Overlays;
132    SUMA_Boolean *isColored; /*!< is the datum receiving color? Not masked say
133                                  by thresholds etc. */
134    #endif
135 } SUMA_SURF_SAUX;
136 
137 typedef struct {
138    float Eq[4];
139    int slc_num;
140    char variant[16];
141 } SUMA_RENDERED_SLICE; /*!< Information about a rendered slice */
142 
143 /*! A volume object's Aux structure for SUMA's use */
144 typedef struct {
145    DList *DisplayUpdates;
146    SUMA_X_SurfCont *DOCont;/*!< Displayable object controller */
147    SUMA_PICK_RESULT *PR;
148    SUMA_PICK_RESULT *PRc;
149    SUMA_OVERLAYS **Overlays;
150    int N_Overlays;
151    SUMA_Boolean *isColored; /*!< is the datum receiving color? Not masked say
152                                  by thresholds etc. */
153    DList *slcl; /* Rendered slices, top slice rendered last */
154    DList *vrslcl;
155 
156    char *State; /* Normally the state of a volume is ANY_ANATOMICAL,
157       	           but when it is a domain of a CIFTI object, we will
158 		   change its state to reflect that fact. If we don't
159 		   do that, the volume itself would get registered
160 		   (and therefore displayed) in any anatomically correct state
161 		   with complete disregard for its lineage. We want to
162 		   display the volume only when the CIFTI object is being
163 		   displayed. */
164    int ShowAxSlc;
165    int ShowSaSlc;
166    int ShowCoSlc;
167    int ShowVrSlc;
168    int VrSelect;
169 
170    int SlicesAtCrosshair; /* Make three slices jump to location of crosshair */
171    SUMA_ATRANS_MODES TransMode; /*!< polygon transparency  */
172 } SUMA_VOL_SAUX;
173 
174 #define SDSET_GSAUX(dset) ( ( (dset) && (dset)->Aux && (dset)->Aux->Saux &&   \
175                                SUMA_isGraphDset(dset) ) ? \
176                            (SUMA_GRAPH_SAUX *)((dset)->Aux->Saux):NULL )
177 
178 #define SDSET_GOVERLAY(dset) (( (dset) && (dset)->Aux && (dset)->Aux->Saux &&   \
179                                SUMA_isGraphDset(dset) ) ? \
180                   ((SUMA_GRAPH_SAUX *)(dset)->Aux->Saux)->Overlay:NULL )
181 #define SDSET_COVERLAY(dset) (( (dset) && (dset)->Aux && (dset)->Aux->Saux &&   \
182                                SUMA_isCIFTIDset(dset) ) ? \
183                   ((SUMA_CIFTI_SAUX *)(dset)->Aux->Saux)->Overlay:NULL )
184 
185 #define SDSET_GMATSO(dset) (( (dset) && (dset)->Aux && (dset)->Aux->Saux &&   \
186                                SUMA_isGraphDset(dset) ) ? \
187                   ((SUMA_GRAPH_SAUX *)(dset)->Aux->Saux)->FrameSO:NULL )
188 
189 #define TDO_HAS_GRID(tdo) ( ((tdo) && (tdo)->net && (tdo)->net->grid) ? \
190                               (tdo)->net->grid : NULL )
191 
192 #define TDO_N_BUNDLES(tdo) ( ((tdo) && (tdo)->net ) ? (tdo)->net->N_tbv : -1 )
193 #define TDO_N_TRACTS(tdo) ( ((tdo) ) ? Network_N_tracts((tdo)->net, 0) : -1 )
194 
195 #define TDO_BUNDLE(tdo, tbi) ( ((tdo) && (tdo)->net && (tdo)->net->tbv && \
196                                  tbi >= 0 && tbi < (tdo)->net->N_tbv) ? \
197                                                    (tdo)->net->tbv[tbi] : NULL )
198 #define TDO_TSAUX(tdo) ( (tdo) ? (SUMA_TRACT_SAUX *)(tdo)->Saux:NULL )
199 #define CDO_CSAUX(cdo) ( (cdo) ? (SUMA_CIFTI_SAUX *)(cdo)->Saux:NULL )
200 #define VDO_VSAUX(vo) ( (vo) ? (SUMA_VOL_SAUX *)(vo)->Saux:NULL )
201 #define SDO_SSAUX(so) ( (so) ? (SUMA_SURF_SAUX *)(so)->Saux:NULL )
202 #define MDO_MSAUX(mo) ( (mo) ? (SUMA_MASK_SAUX *)(mo)->Saux:NULL )
203 
204 #define VE_NX(ve) SUMA_VE_Ni(&ve, 0)
205 #define VE_NY(ve) SUMA_VE_Nj(&ve, 0)
206 #define VE_NZ(ve) SUMA_VE_Nk(&ve, 0)
207 #define VE_NXY(ve) SUMA_VE_Niy(&ve, 0)
208 #define VE_NVOX(ve) SUMA_VE_Nvox(&ve, 0)
209 
210 #define VO_NI(vo) ( (vo) ?  \
211                         SUMA_VE_Ni((vo)->VE, 0) : -1 )
212 #define VO_NIJ(vo) ( (vo) ?  \
213                         SUMA_VE_Nij((vo)->VE, 0) : -1 )
214 #define VO_NJ(vo) ( (vo) ?  \
215                         SUMA_VE_Nj((vo)->VE, 0) : -1 )
216 #define VO_NK(vo) ( (vo) ?  \
217                         SUMA_VE_Nk((vo)->VE, 0) : -1 )
218 #define VO_NVOX(vo) ( (vo)  ?  \
219                         SUMA_VE_Nvox((vo)->VE, 0) : -1 )
220 #define VO_N_VOLS(vo) ( SUMA_VO_NumVE(vo) )
221 
222 #define MDO_IS_SHADOW(MDO) ( ((MDO) && (MDO)->mtype[0] == 'C' && \
223                                        (MDO)->mtype[1] == 'A' && \
224                                        (MDO)->mtype[2] == 'S' && \
225                                        (MDO)->mtype[3] == 'P' && \
226                                        (MDO)->mtype[4] == 'E' && \
227                                        (MDO)->mtype[5] == 'R' && \
228                                        (MDO)->mtype[6] == '\0' ) ? 1:0 )
229 #define MDO_IS_BOX(MDO) ( ((MDO) && (!strcasecmp((MDO)->mtype,"box") || \
230                                      !strcasecmp((MDO)->mtype,"cube"))) ? 1:0 )
231 #define MDO_IS_SPH(MDO) ( ((MDO) && (!strcasecmp((MDO)->mtype,"ball") || \
232                                      !strcasecmp((MDO)->mtype,"sphere"))) ? 1:0 )
233 #define MDO_IS_SURF(MDO) ( ((MDO) && (!strcasecmp((MDO)->mtype,"surf"))) ? 1:0 )
234 
235 SUMA_Boolean SUMA_DrawDO_UL_FullMonty(DList *dl);
236 SUMA_Boolean SUMA_ADO_UL_Add(SUMA_ALL_DO *ado, char *com, int replace);
237 SUMA_Boolean SUMA_DrawDO_UL_Add(DList *dl, char *com, int replace);
238 DListElmt *SUMA_DrawDO_UL_Find(DList *dl, char *com);
239 SUMA_Boolean SUMA_DrawDO_UL_EmptyList(DList *dl, DListElmt *del);
240 SUMA_Boolean SUMA_DestroyNgrHashDatum(SUMA_NGR_INDEX_HASH_DATUM *thd);
241 void SUMA_Free_GSaux(void *vSaux);
242 void SUMA_Free_SSaux(void *vSaux);
243 void SUMA_Free_TSaux(void *vSaux);
244 void SUMA_Free_MSaux(void *vSaux);
245 void SUMA_Free_VSaux(void *vSaux);
246 void SUMA_Free_CSaux(void *vSaux);
247 void SUMA_Free_Saux_DisplayUpdates_datum(void *ddd);
248 SUMA_Boolean SUMA_AddTractSaux(SUMA_TractDO *tdo);
249 SUMA_Boolean SUMA_AddCIFTISaux(SUMA_CIFTI_DO *cdo);
250 float SUMA_TDO_tract_length(SUMA_TractDO *tdo, int tt);
251 SUMA_Boolean SUMA_AddVolSaux(SUMA_VolumeObject *vo);
252 void SUMA_Free_SliceListDatum(void *data);
253 SUMA_Boolean SUMA_AddMaskSaux(SUMA_MaskDO *mdo);
254 SUMA_Boolean SUMA_AddDsetSaux(SUMA_DSET *dset);
255 SUMA_Boolean SUMA_Load_Dumb_DO(SUMA_ALL_DO *ado, SUMA_DUMB_DO *DDO);
256 SUMA_Boolean SUMA_SetDrawVariant(SUMA_DSET *dset, char *variant);
257 char *SUMA_GetDrawVariant(SUMA_DSET *dset);
258 SUMA_Boolean SUMA_UnSetDrawVariant(SUMA_DSET *dset);
259 SUMA_Boolean SUMA_SetDrawVariant(SUMA_DSET *dset, char *variant);
260 SUMA_Boolean SUMA_isDrawVariant(SUMA_DSET *dset, char *variant);
261 int SUMA_GDSET_edgeij_to_GMATRIX_XYZ(SUMA_DSET *dset,
262                                         int ei, int ej, float *XYZ, int FC);
263 int SUMA_GDSET_GMATRIX_CellPixSize(SUMA_DSET *dset, SUMA_SurfaceViewer *sv,
264                                    float *Sz);
265 float *SUMA_GDSET_NodeList(SUMA_DSET *dset, int *N_Node, int recompute,
266                            int **ind, char *thisvariant);
267 float *SUMA_CDOM_NodeList(SUMA_CIFTI_DO *CO, int *N_Node, int recompute,
268                            int **ind);
269 NI_element * SUMA_SO_NIDO_Node_Texture (  SUMA_SurfaceObject *SO, SUMA_DO* dov,
270                                           int N_do, SUMA_SurfaceViewer *sv );
271 SUMA_NEW_SO_OPT *SUMA_NewNewSOOpt(void);
272 SUMA_NEW_SO_OPT *SUMA_FreeNewSOOpt(SUMA_NEW_SO_OPT *nsopt);
273 SUMA_SurfaceObject *SUMA_NewSO(float **NodeList, int N_Node, int **FaceSetList, int N_FaceSet, SUMA_NEW_SO_OPT *nsooptu);
274 SUMA_SurfaceObject *SUMA_CreateChildSO(SUMA_SurfaceObject * SO,
275                                        float *NodeList, int N_Node,
276                                        int *FaceSetList, int N_FaceSet,
277                                        SUMA_Boolean replace);
278 SUMA_Axis* SUMA_Alloc_Axis (const char *Name, SUMA_DO_Types type);
279 void SUMA_Free_Axis (SUMA_Axis *Ax);
280 SUMA_Boolean SUMA_DrawAxis (SUMA_Axis* Ax, SUMA_SurfaceViewer *csv);
281 void SUMA_MeshAxisStandard (SUMA_Axis* Ax, SUMA_ALL_DO *cso);
282 void SUMA_EyeAxisStandard (SUMA_Axis* Ax, SUMA_SurfaceViewer *csv);
283 void SUMA_Free_CrossHair (SUMA_CrossHair *Ch);
284 SUMA_CrossHair* SUMA_Alloc_CrossHair (void);
285 SUMA_Boolean SUMA_DrawCrossHair (SUMA_SurfaceViewer *csv);
286 void SUMA_Free_SphereMarker (SUMA_SphereMarker *SM);
287 SUMA_SphereMarker* SUMA_Alloc_SphereMarker (void);
288 SUMA_Boolean SUMA_DrawFaceSetMarker (SUMA_FaceSetMarker* FM,
289                                      SUMA_SurfaceViewer *sv);
290 SUMA_Boolean SUMA_ScreenPlane_WorldSpace(SUMA_SurfaceViewer *sv, float *cen,
291                                          float *PlEq);
292 SUMA_FaceSetMarker* SUMA_Alloc_FaceSetMarker (void);
293 void SUMA_Free_FaceSetMarker (SUMA_FaceSetMarker* FM);
294 int SUMA_NodeMask_to_FaceMask(SUMA_SurfaceObject *SO, byte *nodemask,
295                               int N_nz_nodemask,
296                               int *triblock, byte **facemask,
297                               int minhits);
298 int SUMA_Prep_SO_DrawPatches(SUMA_SurfaceObject *SO, SUMA_SurfaceViewer *sv);
299 SUMA_DrawPatch *SUMA_New_DrawPatchDatum(SUMA_SurfaceObject *SO, int *triblock,
300                                         int N_Faces, byte *facemask);
301 void SUMA_Free_DrawPatchDatum(void *data);
302 int SUMA_ComplimentaryPatches(SUMA_SurfaceObject *SO, int *triblock,
303                               int N_Faces, byte *facemask,
304                               SUMA_DrawPatch **ptch0,
305                               SUMA_DrawPatch **ptch1);
306 void SUMA_DrawMesh_mask(SUMA_SurfaceObject *SurfObj, SUMA_SurfaceViewer *sv);
307 void SUMA_DrawMesh(SUMA_SurfaceObject *SurfObj, SUMA_SurfaceViewer *csv);
308 void SUMA_SimpleDrawMesh(SUMA_SurfaceObject *SurfObj,
309                          GLfloat *colp, SUMA_SurfaceViewer *sv);
310 SUMA_VIS_XFORM_DATUM *SUMA_NewVisXdatum(char *label);
311 void SUMA_FreeVisXdatum (void *vxd);
312 
313 int SUMA_EmptyVisXform(SUMA_VIS_XFORM *vx);
314 int SUMA_ApplyVisXform(SUMA_SurfaceObject *SO, char *which,
315        SUMA_VISX_XFORM_DIRECTIONS direction, int recompute_norm);
316 float *SUMA_VisX_CoordPointer(SUMA_SurfaceObject *SO);
317 SUMA_Boolean SUMA_VisX_Pointers4Display(SUMA_SurfaceObject *SO, int fordisp);
318 int SUMA_AllowPrying(SUMA_SurfaceViewer *sv, int *RegSO);
319 SUMA_Boolean SUMA_ResetPrying(SUMA_SurfaceViewer *svu);
320 SUMA_Boolean SUMA_ApplyPrying(SUMA_SurfaceViewer *sv, float val[3], char *units,
321                               int recompute_norm);
322 SUMA_Boolean SUMA_RecomputeNormsPrying(SUMA_SurfaceViewer *svu);
323 int SUMA_LeftShownOnLeft(SUMA_SurfaceViewer *sv,
324                          SUMA_SurfaceObject *SO1, SUMA_SurfaceObject *SO2,
325                          int useParents, int applyViewingXform);
326 int SUMA_ComputeVisX(SUMA_SurfaceObject *SO1, SUMA_SurfaceObject *SO2,
327                      SUMA_SurfaceViewer *csv, char *which, int recompute_norm );
328 char *SUMA_SO_AnatomicalStructurePrimary(SUMA_SurfaceObject *SO);
329 char *SUMA_SO_GeometricType(SUMA_SurfaceObject *SO);
330 char *SUMA_SO_AnatomicalStructureSecondary(SUMA_SurfaceObject *SO);
331 char *SUMA_SO_TopologicalType(SUMA_SurfaceObject *SO);
332 SUMA_Boolean SUMA_MergeAfniSO_In_SumaSO(NI_group **aSOp,
333                                         SUMA_SurfaceObject *SO);
334 NI_group *SUMA_ExtractAfniSO_FromSumaSO( SUMA_SurfaceObject *SO,
335                                                    int CopyData);
336 SUMA_Boolean SUMA_Blank_AfniSO_Coord_System(NI_group *aSO);
337 char *SUMA_SideName(SUMA_SO_SIDE ss);
338 SUMA_SO_SIDE SUMA_SideType(char *s);
339 SUMA_Boolean SUMA_Free_Surface_Object (SUMA_SurfaceObject *SO);
340 SUMA_Boolean SUMA_FreeDrawMasks(SUMA_DRAW_MASKS * DW);
341 SUMA_Boolean SUMA_EmptyDrawMasks(SUMA_DRAW_MASKS * DW);
342 SUMA_VolumeObject *SUMA_FreeVolumeObject(SUMA_VolumeObject *VO);
343 SUMA_CIFTI_DO *SUMA_FreeCIFTIObject(SUMA_CIFTI_DO *CO);
344 SUMA_CIFTI_DO *SUMA_CreateCIFTIObject(char *Label);
345 void SUMA_Print_Surface_Object(SUMA_SurfaceObject *SO, FILE *Out);
346 char *SUMA_VisX_XformType2Name(SUMA_VISX_XFORM_TYPE tt);
347 char *SUMA_VisX_Info(SUMA_VIS_XFORM VisX, int N_Node, char *mumble);
348 char *SUMA_SurfaceObject_Info (SUMA_SurfaceObject *SO, DList *DsetList);
349 char *SUMA_ADO_Info(SUMA_ALL_DO *ado, DList *DsetList, int detail);
350 SUMA_SurfaceObject *SUMA_Alloc_SurfObject_Struct(int N);
351 int SUMA_VO_NumVE(SUMA_VolumeObject *VO);
352 SUMA_DSET *SUMA_VO_dset(SUMA_VolumeObject *VO);
353 SUMA_DSET *SUMA_VE_dset(SUMA_VolumeElement **VE, int idset);
354 SUMA_VolumeObject *SUMA_CreateVolumeObject(char *label);
355 SUMA_Boolean SUMA_AddDsetVolumeObject( SUMA_VolumeObject *VO,
356                                        THD_3dim_dataset **dsetp);
357 SUMA_DRAWN_ROI * SUMA_AllocateDrawnROI (char *Parent_idcode_str,
358                            SUMA_ROI_DRAWING_STATUS DrawStatus,
359                            SUMA_ROI_DRAWING_TYPE Type, char * label, int ilabel);
360 SUMA_ROI * SUMA_AllocateROI (char *Parent_idcode_str, SUMA_ROI_TYPE Type,
361                              char * label, int N_ElInd, int *ElInd);
362 SUMA_Boolean SUMA_freeDrawnROI (SUMA_DRAWN_ROI *D_ROI);
363 SUMA_Boolean SUMA_freeROI (SUMA_ROI *ROI);
364 SUMA_Boolean SUMA_Draw_SO_ROI (SUMA_SurfaceObject *SO, SUMA_DO* dov, int N_dov,
365                                SUMA_SurfaceViewer *csv);
366 SUMA_Boolean SUMA_Draw_SO_Dset_Contours(SUMA_SurfaceObject *SO,
367                                SUMA_SurfaceViewer *sv);
368 SUMA_DO_Types SUMA_Guess_DO_Type(char *s);
369 SUMA_MaskDO *SUMA_SymMaskDO(char *s, char *mtype, char *hid, byte mtypeonly);
370 SUMA_Boolean SUMA_MDO_OkVarName(char *this);
371 SUMA_Boolean SUMA_MDO_SetVarName(SUMA_MaskDO *mdo, char *this);
372 SUMA_MaskDO *SUMA_MDO_GetVar(char *vn);
373 SUMA_Boolean SUMA_AccessorizeMDO(SUMA_MaskDO *MDO);
374 SUMA_Boolean SUMA_isSymMaskDO(char *s, char *mtype);
375 SUMA_Boolean SUMA_Ok_Sym_MaskDO_Type(char *mtype);
376 SUMA_Boolean SUMA_Guess_Str_MaskDO_Type(char *s, char *mtype);
377 SUMA_Boolean SUMA_Set_MaskDO_Type(SUMA_MaskDO *mdo, char *mtype);
378 SUMA_Boolean SUMA_Set_MaskDO_Cen(SUMA_MaskDO *mdo, float *cen);
379 SUMA_Boolean SUMA_Set_MaskDO_Dim(SUMA_MaskDO *mdo, float *dim);
380 SUMA_Boolean SUMA_Set_MaskDO_Trans(SUMA_MaskDO *mdo, SUMA_TRANS_MODES T);
381 SUMA_Boolean SUMA_Set_MaskDO_Alpha(SUMA_MaskDO *mdo, float alpha);
382 SUMA_Boolean SUMA_Set_MaskDO_Color(SUMA_MaskDO *mdo, float *col, float dim);
383 SUMA_Boolean SUMA_Set_MaskDO_Label(SUMA_MaskDO *mdo, char *lab);
384 #define SUMA_MDO_New_Cen(mdo, cen) \
385             SUMA_MDO_New_Params((mdo), (cen), NULL, NULL, NULL, NULL, \
386                                  -1, STM_N_TransModes, -1)
387 #define SUMA_MDO_New_Type(mdo, ttype) \
388             SUMA_MDO_New_Params((mdo), NULL, NULL, NULL, NULL, (ttype), \
389                                  -1, STM_N_TransModes, -1)
390 #define SUMA_MDO_New_Label(mdo, ttype) \
391             SUMA_MDO_New_Params((mdo), NULL, NULL, NULL, (ttype), NULL, \
392                                  -1, STM_N_TransModes, -1)
393 #define SUMA_MDO_New_Dim(mdo, dim) \
394             SUMA_MDO_New_Params((mdo), NULL, (dim), NULL, NULL, NULL, \
395                                  -1, STM_N_TransModes, -1)
396 #define SUMA_MDO_New_Color(mdo, col) \
397             SUMA_MDO_New_Params((mdo), NULL, NULL, (col), NULL, NULL, \
398                                  -1, STM_N_TransModes, -1)
399 #define SUMA_MDO_New_Trans(mdo, tran) \
400             SUMA_MDO_New_Params((mdo), NULL, NULL, NULL, NULL, NULL, \
401                                  -1, tran, -1)
402 #define SUMA_MDO_New_Alpha(mdo, alpha) \
403             SUMA_MDO_New_Params((mdo), NULL, NULL, NULL, NULL, NULL, \
404                                  alpha, STM_N_TransModes, -1)
405 #define SUMA_MDO_New_CDim(mdo, cdim) \
406             SUMA_MDO_New_Params((mdo), NULL, NULL, NULL, NULL, NULL, \
407                                  -1, STM_N_TransModes, cdim)
408 int SUMA_MDO_New_Doppel(SUMA_MaskDO *mdo, float *xyz);
409 int SUMA_MDO_New_parent(SUMA_MaskDO *mdo, char *parent_id, int parent_datum_id);
410 int SUMA_MDO_New_Params(SUMA_MaskDO *mdo, float *cen, float *dim,
411                         float *col, char *Label, char *Type,
412                         float alpha, SUMA_TRANS_MODES tran, float cdim);
413 SUMA_NIDO * SUMA_Alloc_NIDO (char *idcode_str, char *Label,
414                              char *Parent_idcode_str);
415 SUMA_NIDO *SUMA_free_NIDO(SUMA_NIDO *NIDO);
416 int SUMA_ProcessDODrawMask(SUMA_SurfaceViewer *sv,
417                                     SUMA_SurfaceObject *SO,
418                                     byte **mask, int *ncross);
419 SUMA_SegmentDO * SUMA_Alloc_SegmentDO (int N_n, char *Label, int oriented,
420                                       char *parent_idcode,
421                                       int NodeBased, SUMA_DO_Types type,
422                                     SUMA_DO_Types P_type, char *DrawnDO_variant);
423 void SUMA_free_SegmentDO (SUMA_SegmentDO * SDO);
424 SUMA_MaskDO *SUMA_Alloc_MaskDO ( int N_obj, char *Label, char *hash_label,
425                                  char *parent_ADO_id,
426                                  int withcol);
427 void SUMA_free_MaskDO (SUMA_MaskDO * MDO);
428 int SUMA_Set_N_SegNodes_SegmentDO(SUMA_SegmentDO * SDO, int N);
429 int SUMA_Set_N_AllNodes_SegmentDO(SUMA_SegmentDO * SDO, int N);
430 SUMA_Boolean SUMA_DrawSegmentDO (SUMA_SegmentDO *SDO, SUMA_SurfaceViewer *sv);
431 SUMA_Boolean SUMA_DrawGSegmentDO (SUMA_GRAPH_SAUX *GSaux,
432                                   SUMA_SurfaceViewer *sv);
433 SUMA_Boolean SUMA_DrawTractDO (SUMA_TractDO *TDO, SUMA_SurfaceViewer *sv);
434 SUMA_Boolean SUMA_DrawMaskDO (SUMA_MaskDO *MDO, SUMA_SurfaceViewer *sv);
435 float *SUMA_ADO_Center(SUMA_ALL_DO *ado, float *here);
436 float *SUMA_ADO_Range(SUMA_ALL_DO *ado, float *here);
437 float *SUMA_TDO_Grid_Center(SUMA_TractDO *tdo, float *here);
438 float *SUMA_MDO_Center(SUMA_MaskDO *MDO, float *here);
439 float *SUMA_VO_Grid_Center(SUMA_VolumeObject *vo, float *here);
440 int SUMA_TDO_N_tracts(SUMA_TractDO *tdo);
441 int SUMA_TDO_Max_N_tracts(SUMA_TractDO *tdo);
442 int SUMA_VE_Nk(SUMA_VolumeElement **VE, int ivo);
443 int SUMA_VE_Nj(SUMA_VolumeElement **VE, int ivo);
444 int SUMA_VE_Ni(SUMA_VolumeElement **VE, int ivo);
445 int SUMA_VE_Niy(SUMA_VolumeElement **VE, int ivo);
446 int SUMA_VE_Nvox(SUMA_VolumeElement **VE, int ivo);
447 int SUMA_VO_N_Slices(SUMA_VolumeObject *VO, char *variant);
448 int SUMA_VE_N_Slices(SUMA_VolumeElement **VE, int ivo, char *variant);
449 char * SUMA_VO_orcode(SUMA_VolumeObject *VO);
450 char *SUMA_VE_orcode(SUMA_VolumeElement **VE, int ivo);
451 char * SUMA_VE_Headname(SUMA_VolumeElement **VE, int ivo);
452 SUMA_Boolean SUMA_VE_Set_Dims(SUMA_VolumeElement **VE, int ive);
453 float *SUMA_TDO_Points_Center(SUMA_TractDO *tdo, float *here);
454 float *SUMA_TDO_XYZ_Range(SUMA_TractDO *tdo, float *here);
455 float *SUMA_SDO_XYZ_Range(SUMA_SurfaceObject *so, float *here);
456 float *SUMA_CIFTI_DO_XYZ_Range(SUMA_CIFTI_DO *co, float *here);
457 float *SUMA_VO_XYZ_Range(SUMA_VolumeObject *VO, float *here);
458 float *SUMA_MDO_XYZ_Range(SUMA_MaskDO *MDO, float *here);
459 SUMA_SphereDO * SUMA_Alloc_SphereDO (int N_n, char *Label, char *parent_idcode,
460                                      SUMA_DO_Types type);
461 SUMA_TractDO * SUMA_Alloc_TractDO (char *Label, char *parent_idcode);
462 SUMA_PlaneDO * SUMA_Alloc_PlaneDO (int N_n, char *Label, SUMA_DO_Types type);
463 SUMA_Boolean SUMA_DrawGraphDO_G3D (SUMA_GraphLinkDO *gldo,
464                                    SUMA_SurfaceViewer *sv);
465 SUMA_Boolean SUMA_BordFrac_to_GB(int BF, int *G, int *B);
466 SUMA_NIDO * SUMA_GDSET_matrix_nido(SUMA_DSET *dset);
467 SUMA_Boolean SUMA_GDSET_clear_matrix_nido(SUMA_DSET *dset, int clear_SO);
468 SUMA_Boolean SUMA_GDSET_refresh_matrix_nido(SUMA_DSET *dset, int also_SO);
469 SUMA_Boolean SUMA_DrawGraphDO_GMATRIX (SUMA_GraphLinkDO *gldo,
470                                        SUMA_SurfaceViewer *sv);
471 SUMA_Boolean SUMA_DrawGraphDO_GRELIEF (SUMA_GraphLinkDO *gldo,
472                                        SUMA_SurfaceViewer *sv);
473 SUMA_SurfaceObject *SUMA_Surface_Of_NIDO_Matrix(SUMA_NIDO *nido);
474 void SUMA_free_SphereDO (SUMA_SphereDO * SDO);
475 void SUMA_free_TractDO (SUMA_TractDO * SDO);
476 void SUMA_free_PlaneDO (SUMA_PlaneDO * SDO);
477 void SUMA_free_GraphLinkDO (SUMA_GraphLinkDO * GLDO);
478 SUMA_GraphLinkDO * SUMA_Alloc_GraphLinkDO (  char *variant,
479                                              SUMA_DSET *ParentGraph);
480 SUMA_GraphLinkDO *SUMA_find_Dset_GLDO(SUMA_DSET *dset, char *variant,
481                                       int *ifound);
482 SUMA_DSET *SUMA_find_GLDO_Dset(SUMA_GraphLinkDO *GLDO);
483 SUMA_Boolean SUMA_Remove_From_Pick_Colid_list(SUMA_SurfaceViewer *sv,
484                                               char *idcode_str);
485 DListElmt * SUMA_Find_In_Pick_Colid_list(SUMA_SurfaceViewer *sv,
486                                          char *idcode_str, char *primitive);
487 void *SUMA_Picked_reference_object(SUMA_COLID_OFFSET_DATUM *cod,
488                                SUMA_DO_Types *do_type);
489 int SUMA_Picked_DO_ID(SUMA_COLID_OFFSET_DATUM *cod);
490 SUMA_Boolean SUMA_CreateGraphDOs(SUMA_DSET *dset);
491 SUMA_Boolean SUMA_RegisterGraphDOs(SUMA_DSET *dset, SUMA_SurfaceViewer *sv);
492 SUMA_Boolean SUMA_DrawGraphDO (SUMA_GraphLinkDO *gldo, SUMA_SurfaceViewer *sv,
493                                char *variant);
494 SUMA_Boolean SUMA_DrawGraphLinkDO (SUMA_GraphLinkDO *GLDO,
495                                    SUMA_SurfaceViewer *sv);
496 SUMA_Boolean SUMA_isGLDO_AnatCorrect(SUMA_GraphLinkDO *GLDO);
497 char *SUMA_iDO_state(int i);
498 char *SUMA_DO_state(SUMA_DO *DO);
499 char *SUMA_iDO_group(int i);
500 char *SUMA_DO_group(SUMA_DO *DO);
501 int SUMA_ADO_is_AnatCorrect(SUMA_ALL_DO *ado);
502 int SUMA_isDO_AnatCorrect(SUMA_DO *DO);
503 int  SUMA_is_iDO_AnatCorrect(int dov_id);
504 SUMA_Boolean SUMA_DrawSphereDO (SUMA_SphereDO *SDO, SUMA_SurfaceViewer *sv);
505 SUMA_Boolean SUMA_DrawPointDO (SUMA_SphereDO *SDO, SUMA_SurfaceViewer *sv);
506 SUMA_Boolean SUMA_DrawPlaneDO (SUMA_PlaneDO *SDO, SUMA_SurfaceViewer *sv);
507 SUMA_Boolean SUMA_DrawPlanes( float **PlEq, float **cen, float *sz,
508                               int N_pl, SUMA_SurfaceViewer *sv);
509 SUMA_Boolean SUMA_isROIdequal (SUMA_ROI_DATUM *ROId1, SUMA_ROI_DATUM *ROId2);
510 void SUMA_FreeROIDatum (void * data);
511 SUMA_ROI_DATUM * SUMA_AllocROIDatum (void);
512 SUMA_Boolean SUMA_PrependToROIdatum (SUMA_ROI_DATUM *ROId1,
513                                      SUMA_ROI_DATUM *ROId2);
514 void SUMA_ShowDrawnROI (SUMA_DRAWN_ROI *D_ROI, FILE *out,
515                         SUMA_Boolean ShortVersion);
516 void SUMA_ShowDrawnROIDatum (SUMA_ROI_DATUM *ROId, FILE *out,
517                              SUMA_Boolean ShortVersion);
518 SUMA_Boolean SUMA_AppendToROIdatum (SUMA_ROI_DATUM *ROId1,
519                                     SUMA_ROI_DATUM *ROId2);
520 SUMA_ROI_DATUM * SUMA_FillToMask(SUMA_SurfaceObject *SO, int *ROI_Mask,
521                                  int FirstSurfNode);
522 void SUMA_FillToMask_Engine (SUMA_NODE_FIRST_NEIGHB *FN, int *Visited, int *ROI_mask, int seed, int *N_Visited, int N_Node);
523 void SUMA_FillToMask_Engine_old (SUMA_NODE_FIRST_NEIGHB *FN, int *Visited, int *ROI_mask, int seed, int *N_Visited);
524 SUMA_DRAWN_ROI **SUMA_Find_ROIrelatedtoSO (SUMA_SurfaceObject *SO, SUMA_DO* dov, int N_do, int *N_ROI);
525 SUMA_DRAWN_ROI **SUMA_Find_ROIonSO (SUMA_SurfaceObject *SO, SUMA_DO* dov, int N_do, int *N_ROI);
526 SUMA_Boolean SUMA_Paint_SO_ROIplanes (SUMA_SurfaceObject *SO,
527                                        SUMA_DO* dov, int N_do,
528                                        SUMA_Boolean *MakeNel,
529                                        NI_element ***nelvp, int *N_nelv);
530 SUMA_Boolean SUMA_Paint_SO_ROIplanes_w (SUMA_SurfaceObject *SO,
531                                        SUMA_DO* dov, int N_do);
532 void SUMA_Free_ROI_PlaneData (void *da);
533 DList * SUMA_Addto_ROIplane_List (DList *ROIplaneListIn, SUMA_DO *dov, int idov);
534 int * SUMA_NodesInROI (SUMA_DRAWN_ROI *D_ROI, int *N_Nodes, SUMA_Boolean Unique);
535 SUMA_DRAWN_ROI * SUMA_1DROI_to_DrawnROI ( int *Node, int N_Node, int Value,
536                      char *Parent_idcode_str,
537                      char *Label, char *ColPlaneName,
538                      float *FillColor, float *EdgeColor, int EdgeThickness ,
539                      SUMA_DO *dov, int N_dov, SUMA_Boolean ForDisplay);
540 SUMA_SegmentDO * SUMA_ReadNBVecDO (char *s, int oriented, char *parent_SO_id);
541 SUMA_SphereDO * SUMA_ReadNBSphDO (char *s, char *parent_SO_id);
542 SUMA_SegmentDO * SUMA_ReadDirDO (char *s, int oriented, char *parent_SO_id);
543 SUMA_TractDO *SUMA_ReadTractDO(char *s, char *parent_SO_id);
544 SUMA_TractDO *SUMA_Net2TractDO(TAYLOR_NETWORK *net, char *Label,
545                                char *parent_SO_id);
546 GLushort SUMA_int_to_stipplemask(int i);
547 GLushort SUMA_int_to_stipplemask_cont(int i);
548 SUMA_SegmentDO * SUMA_ReadSegDO (char *s, int oriented, char *soid);
549 SUMA_SegmentDO * SUMA_ReadNBSegDO (char *s, int oriented, char *soid);
550 SUMA_SphereDO * SUMA_ReadSphDO (char *s);
551 SUMA_SphereDO * SUMA_ReadPntDO (char *s);
552 SUMA_PlaneDO * SUMA_ReadPlaneDO (char *s);
553 SUMA_MaskDO * SUMA_ReadMaskDO (char *s, char *parent_ADO_id);
554 SUMA_NIDO *SUMA_ReadNIDO(char *s, char *soid);
555 SUMA_NIDO *SUMA_BlankNIDO (char *idcode_str, char *Label,
556                            char *parent_so_id, char *coord_type,
557                            char *font_name);
558 SUMA_SegmentDO *SUMA_CreateSegmentDO(  int N_n, int oriented, int NodeBased,
559                                        int Stipple,
560                                        char *Label, char *idcode_str,
561                            char *Parent_idcode_str, SUMA_DO_Types Parent_do_type,
562                                        char *DrawnDO_variant,
563                                        float LineWidth, float *LineCol,
564                                        int *NodeId, int *NodeId1,
565                                        float *n0, float *n1,
566                                        float *colv, float *thickv
567                                        );
568 SUMA_DO * SUMA_Multiply_NodeObjects ( SUMA_SurfaceObject *SO,
569                                       SUMA_DO *DO );
570 SUMA_NIDO ** SUMA_Multiply_NodeNIDOObjects ( SUMA_SurfaceObject *SO,
571                                       SUMA_DO *DO, int *NodeID, int N_Node);
572 SUMA_Boolean SUMA_ApplyDataToNodeObjects(
573             SUMA_SurfaceObject *SurfObj, SUMA_SurfaceViewer *sv);
574 SUMA_SurfaceObject *SUMA_Cmap_To_SO (SUMA_COLOR_MAP *Cmap, float orig[3],
575                                        float topright[3], int verb);
576 SUMA_Boolean SUMA_PrepForNIDOnelPlacement (  SUMA_SurfaceViewer *sv,
577                                              NI_element *nel,
578                                              SUMA_SurfaceObject *default_SO,
579                                              int default_node,
580                                              float *txloc, float *txcoord,
581                                              int *sz,
582                                              int *orthoreset,
583                                              SUMA_DO_CoordUnits coord_units,
584                                              float *xyzoffset, int *jw);
585 SUMA_Boolean SUMA_DrawImageNIDOnel( NI_element *nel,
586                                     SUMA_SurfaceObject *SO,
587                                     SUMA_DO_CoordUnits default_coord_type,
588                                     float *default_txcol,
589                                     void *default_font, int default_node,
590                                     SUMA_SurfaceViewer *sv) ;
591 SUMA_Boolean SUMA_DrawTextNIDOnel(  NI_element *nel,
592                                     SUMA_SurfaceObject *SO,
593                                     SUMA_DO_CoordUnits default_coord_type,
594                                     float *default_txcol,
595                                     void *default_font, int default_node,
596                                     SUMA_SurfaceViewer *sv) ;
597 SUMA_Boolean SUMA_DrawSphereNIDOnel(  NI_element *nel,
598                                     SUMA_SurfaceObject *SO,
599                                     SUMA_DO_CoordUnits default_coord_type,
600                                     float *default_txcol, int default_node,
601                                     SUMA_SurfaceViewer *sv) ;
602 SUMA_Boolean SUMA_DrawNIDO (SUMA_NIDO *SDO, SUMA_SurfaceViewer *sv);
603 SUMA_Boolean SUMA_DrawLineAxis ( SUMA_AxisSegmentInfo *ASIp, SUMA_Axis *Ax,
604                                  SUMA_Boolean AddText);
605 DList *SUMA_SortedAxisSegmentList ( SUMA_SurfaceViewer *sv, SUMA_Axis *Ax,
606                                     SUMA_SORT_BOX_AXIS_OPTION opt);
607 void SUMA_WorldAxisStandard (SUMA_Axis* Ax, SUMA_SurfaceViewer *sv);
608 SUMA_Boolean SUMA_AxisText(SUMA_AxisSegmentInfo *ASIp, double *Ps);
609 SUMA_Boolean SUMA_DrawText(char *txt, float *Ps);
610 void SUMA_ReportDrawnROIDatumLength(SUMA_SurfaceObject *SO, SUMA_ROI_DATUM *ROId, FILE *out, SUMA_WIDGET_INDEX_DRAWROI_WHATDIST option);
611 SUMA_SurfaceObject *SUMA_HJS_Surface(int ipart);
612 SUMA_SurfaceObject *SUMA_head_01_surface(void);
613 SUMA_SurfaceObject *SUMA_cube_surface(float sz, float *cen);
614 SUMA_SurfaceObject *SUMA_box_surface(float *sz3, float *cen,
615                                      float *col, int n_obj);
616 SUMA_SurfaceObject *SUMA_ball_surface(float *hd3, float *cen, float *col,
617                                      int n_obj);
618 NI_group *SUMA_SDO2niSDO(SUMA_SegmentDO *SDO);
619 SUMA_SegmentDO *SUMA_niSDO2SDO(NI_group *ngr);
620 SUMA_Boolean SUMA_isSODimInitialized(SUMA_SurfaceObject *SO) ;
621 SUMA_Boolean SUMA_nixSODim(SUMA_SurfaceObject *SO);
622 SUMA_Boolean SUMA_SetSODims(SUMA_SurfaceObject *SO);
623 SUMA_Boolean SUMA_MinMaxNodesInROI (SUMA_DRAWN_ROI *D_ROI,
624                                     int MinMax[]);
625 SUMA_Boolean SUMA_TextBoxSize(char *txt, int *w, int *h, int *nl, void *font);
626 byte *SUMA_WordOverlapMask(int Nwidth, int Nheight, int N_n, char **names,
627                            void *fontGL, float *xyz, float maxoverlap,
628                            byte *usethesewords);
629 int SUMA_WordBoxSize (char **txt, int N_txt, int *w, void *font);
630 int SUMA_glutBitmapFontHeight(void *font) ;
631 int *SUMA_NIDOtext_LineWidth(char *string, void *font, int *N_lines);
632 
633 static void *FontPointerList[] =
634          {  GLUT_BITMAP_8_BY_13, GLUT_BITMAP_9_BY_15,
635             GLUT_BITMAP_TIMES_ROMAN_10 , GLUT_BITMAP_TIMES_ROMAN_24,
636             GLUT_BITMAP_HELVETICA_10, GLUT_BITMAP_HELVETICA_12,
637             GLUT_BITMAP_HELVETICA_18, NULL };
638 
639 void * SUMA_glutBitmapFont(char *fontname);
640 char * SUMA_glutBitmapFontName(void * font);
641 char *SUMA_CoordTypeName (SUMA_DO_CoordType tp);
642 SUMA_DO_CoordType SUMA_CoordType (char *atr);
643 int SUMA_NodeRange_DrawnROI (SUMA_DRAWN_ROI *ROI, int *min, int *max);
644 int SUMA_NIDO_TexEnvMode(NI_element *nel, int def);
645 const GLubyte *SUMA_StippleMask(int transp);
646 const GLubyte *SUMA_StippleMask_rand(int transp);
647 const GLubyte *SUMA_StippleMask_shift(int transp, int btp);
648 GLushort SUMA_StippleLineMask_rand(int transp, int chunkwidth, int rseed);
649 void SUMA_StippleMaskResest(void);
650 SUMA_GL_STEL *SUMA_FindStateTrackEl(char *state, DList *stu);
651 void SUMA_FreeStateTrackEl(void *stel);
652 SUMA_GL_STEL *SUMA_NewStateTrackEl(char *state, char *progenitor);
653 int SUMA_SetTrackElVal(SUMA_GL_STEL *stel, void *val, char *act);
654 char *SUMA_EnumToGLstate(int glpar);
655 int SUMA_GLstateToEnum(char *state);
656 int SUMA_GLStateTrack(char *action, DList **stu, char *progenitor,
657                       char *state, void *val);
658 void SUMA_free_colid_offset_datum (void *vv);
659 GLubyte *SUMA_New_colid(SUMA_SurfaceViewer *sv,
660                 char *Label, char *idcode_str, char *primitive, char *variant,
661                 char *reference_idcode_str, SUMA_DO_Types ref_do_type,
662                 int N_n);
663 GLubyte *SUMA_DO_get_pick_colid(SUMA_ALL_DO *DO, char *idcode_str,
664                            char *primitive, char *variant,
665                            char *ref_idcode_str,SUMA_DO_Types ref_do_type,
666                                    SUMA_SurfaceViewer *sv);
667 NI_element *SUMA_GDSET_Edge_Bundle(SUMA_DSET *gset, SUMA_GRAPH_SAUX *GSaux,
668                                    int edge_id, int alt_edge_id);
669 NI_group *SUMA_MDO_to_NIMDO(SUMA_MaskDO *mdo, NI_group *cont);
670 SUMA_MaskDO *SUMA_NIMDO_to_MDO(NI_group *);
671 
672 /*! Following DO_ macros are for setting states up for colorid picking
673     and restoring states at exit.
674     Note that some of these are overkill. They were added in a attempt
675     to remedy what looked like antialiasing in the rendered image.
676     It turned out the problem was caused by the visual not having an
677     alpha size of 0. */
678 #define DO_PICK_VARS int pgllst=0, pgllsm=0, pgllight=0, pglblend=0, \
679                          pgldith=0, pgltex2=0, pgltex3=0
680 
681 #define DO_PICK_RESTORE {  \
682    if (pgllst) glEnable(GL_LINE_STIPPLE);  \
683    if (pgllsm) glEnable(GL_LINE_SMOOTH);   \
684    if (pgllight) glEnable(GL_LIGHTING);    \
685    if (pglblend) glEnable(GL_BLEND);       \
686    if (pgldith)  glEnable(GL_DITHER);      \
687    if (pgltex2)  glEnable(GL_TEXTURE_2D);  \
688    if (pgltex3)  glEnable(GL_TEXTURE_3D);  \
689 }
690 
691 #define DO_PICK_DISABLES {   \
692    if ((pgllst = glIsEnabled(GL_LINE_STIPPLE))) glDisable(GL_LINE_STIPPLE); \
693    if ((pgllsm = glIsEnabled(GL_LINE_SMOOTH)) ) glDisable(GL_LINE_SMOOTH);  \
694    if ((pgllight = glIsEnabled(GL_LIGHTING))) glDisable(GL_LIGHTING);       \
695    if ((pglblend = glIsEnabled(GL_BLEND))) glDisable(GL_BLEND);             \
696    if ((pgldith = glIsEnabled(GL_DITHER))) glDisable(GL_DITHER);            \
697    if ((pgltex2 = glIsEnabled(GL_TEXTURE_2D))) glDisable(GL_TEXTURE_2D);    \
698    if ((pgltex3 = glIsEnabled(GL_TEXTURE_3D))) glDisable(GL_TEXTURE_3D);    \
699 }
700 
701 
702 /*!
703    NO Guarantee that certain nodes might
704    get counted twice !
705 */
706 #define SUMA_ROI_CRUDE_COUNT_NODES(m_D_ROI, m_N_max)  \
707 {  \
708    DListElmt *m_NextElm = NULL;  \
709    SUMA_ROI_DATUM *m_ROId = NULL; \
710    int m_LastOfPreSeg = -1; \
711    \
712    m_N_max = 0;\
713    m_NextElm = NULL;\
714    m_LastOfPreSeg = -1;  \
715    do {  \
716       if (!m_NextElm) m_NextElm = dlist_head(m_D_ROI->ROIstrokelist);   \
717       else m_NextElm = dlist_next(m_NextElm);   \
718       m_ROId = (SUMA_ROI_DATUM *)m_NextElm->data; \
719       if (m_ROId->nPath[0] == m_LastOfPreSeg) {  \
720          m_N_max += m_ROId->N_n - 1; \
721       }  else {   \
722          m_N_max += m_ROId->N_n; \
723       }  \
724       m_LastOfPreSeg = m_ROId->nPath[m_ROId->N_n - 1];   \
725    }while (m_NextElm != dlist_tail(m_D_ROI->ROIstrokelist));   \
726    \
727 }
728 
729 #endif
730 
731 
732