1 /*****************************************************************************
2    Major portions of this software are copyrighted by the Medical College
3    of Wisconsin, 1994-2000, and are released under the Gnu General Public
4    License, Version 2.  See the file README.Copyright for details.
5 ******************************************************************************/
6 
7 /***********************************************************************
8  * plug_roiedit.h		- see plug_roiedit.c v1.7
9  ***********************************************************************
10 */
11 
12 #define rWARNING( string ) fprintf( stderr, "\033[1m%s\033[0m\n", string )
13 #define rERROR( string ) fprintf( stderr, "\007\033[2m%s\033[0m\n", string )
14 
15 #define R_BOUND_VAL    -250
16 #define R_HL_BAD_VAL   -280
17 #define R_BUTTON_SPACE    4
18 #define R_DIST_STEP     0.1
19 #define R_FILE_L	128
20 
21 #ifdef LINUX
22 
23 #define R_HOSTID_MASK	0xffff00ff
24 #define R_HOSTID_VAL	0x6a8d006a
25 
26 #else
27 
28 #define R_HOSTID_MASK	0xffffff00
29 #define R_HOSTID_VAL	0x8d6a6a00
30 
31 #endif
32 
33 typedef struct
34 {
35     int   x, y, z;
36 } r_ipt_t;
37 
38 typedef struct
39 {
40     int * points;
41     int   used;
42     int   M;
43 } points_t;
44 
45 typedef struct
46 {
47     Display * display;
48 
49     /* main widgets */
50 
51     Widget    main;
52     Widget    mainForm;
53 
54     int       main_is_open;
55 
56     Widget    save_as_file_d;	/* dialog with save as info           */
57 
58     /* white/grey widgets */
59 
60     Widget    wtgr_main;        /* main white/grey widget */
61     Widget    wtgr_mainRC;      /* main row/column widget */
62 
63     Widget    wt_diag_conn_w;   /* widget for diagonal connect level  */
64     Widget    wt_fill_val_w;    /* widget for user fill value         */
65     Widget    wt_min_nbrs_w;    /* widget for minimum neighbors value */
66     Widget    wt_range_min_w;   /* minimum value in search range      */
67     Widget    wt_range_max_w;   /* maximum value in search range      */
68 
69     Widget    gr_range_min_w;   /* minimum value in search range      */
70     Widget    gr_range_max_w;   /* maximum value in search range      */
71     Widget    gr_fill_val_w;    /* widget for user fill value         */
72 
73     XmStringCharSet charset;
74 } r_X_s;
75 
76 typedef struct
77 {
78     /* general */
79     int     point_value;        /* value at initial fill point */
80     int     point_coord;        /* location of initial fill point */
81     int     adjust_point;       /* boolean - should we adjust initial point */
82 
83     char    save_as_name[ R_FILE_L ];	/* string to save a copy as      */
84 
85 
86     /* white matter filler info */
87     int     wt_fill_val;                /* value to use in fill process  */
88     int     wt_range_min;
89     int     wt_range_max;
90     int     wt_diag_connect;            /* level of diagonal connection */
91 
92     /* grey matter filler info */
93     int     gr_fill_val;                /* value to use in fill process  */
94     int     gr_range_min;
95     int     gr_range_max;
96 
97     int     gr_max_dist;                /* max distance in grey search */
98 
99 
100     /* afni */
101     THD_3dim_dataset * anat;    /* background anatomy data for searching  */
102     THD_3dim_dataset * func;    /* foreground functional data for display */
103 
104     short * adata;              /* pointer to anatomical background data */
105     short * fdata;              /* pointer to functional foreground data */
106     float   factor;
107 
108     int     nx, ny, nz;         /* dimensions of data */
109     int     nxy;
110     int     nvox;               /* total size of data */
111 
112 
113     /* boundary stuff */
114     points_t Bold;
115     points_t Bnew;
116     points_t border;
117 
118     short  * neighbors;
119     short  * undo_data;		/* always contains previous image 	*/
120 
121     int      min_nbrs;
122     int      strong_borders;
123 } r_alg_s;
124 
125 typedef struct
126 {
127     Widget    main;             /* main application widget */
128     Widget    mainRC;           /* main rowcolumn widget   */
129 
130     Widget    fillval_w;        /* widget holding integer  */
131 
132     int       fill_val;         /* value to fill with      */
133     int       afni_undo;        /* flag denoting when afni is undoing a curve */
134     points_t  A, B;             /* two point structures for interpolation */
135 } interp_s;
136 
137 typedef struct
138 {
139     Widget   main;
140     Widget   mainRC;
141 
142     Widget   fillval_w;
143     Widget   maxsize_w;
144 
145     int      max_size;
146     int      fill_val;
147 
148     points_t wtgr_edge;
149     points_t gr_edge;
150     points_t filled;
151 } holes_s;
152 
153 typedef struct
154 {
155     points_t  plist;
156     r_ipt_t   source;
157     r_ipt_t   dest;
158 
159     int       cur_pt;           /* flag denoting first or second point */
160 } r_pt_conn_s;
161 
162 
163 r_X_s       gRX;                /* X structure for RCR                      */
164 r_alg_s     gRA;                /* algorithm structure                      */
165 interp_s    gRI;                /* interpolation structure (both X and alg) */
166 holes_s     gRH;                /* hole filling structure  (both X and alg) */
167 r_pt_conn_s gRCP;               /* point connection structure               */
168 char        gRmessage[ 1024 ];  /* error messgae memory                     */
169 
170 
171 static int      r_afni_set_fill_point    ( int *, r_alg_s * );
172 static void     r_any_cb_apply           ( Widget, XtPointer, XtPointer );
173 static void     r_any_cb_fill_stats      ( Widget, XtPointer, XtPointer );
174 static void     r_any_cb_hide            ( Widget, char *, XtPointer );
175 static void     r_any_cb_raise           ( Widget, char *, XtPointer );
176 static void     r_any_cb_undo            ( Widget, XtPointer, XtPointer );
177 static void     r_any_cb_unfill          ( Widget, XtPointer, XtPointer );
178 static void     r_main_cb_help           ( Widget, XtPointer, XtPointer );
179 static void     r_main_cb_quit           ( void );
180 static void     r_main_cb_show_structs   ( void );
181 static void     r_main_cb_saveas         ( Widget, int, XtPointer );
182 static void     r_main_mk_main_shell     ( void );
183 static void     r_main_mk_save_as_fr	 ( Widget );
184 static void     r_main_mk_show_buttons   ( void );
185 static void	r_main_show_alg_vals     ( r_alg_s * );
186 static void	r_main_show_HOL_vals     ( holes_s * );
187 static void	r_main_show_INT_vals     ( interp_s * );
188 static void	r_main_show_pt_conn_vals ( r_pt_conn_s * );
189 
190 static int      r_add_to_boundary        ( points_t *, int );
191 static int	r_check_host		 ( void );
192 static void     r_histogram              ( r_alg_s *, int, int, int );
193 static r_ipt_t  r_index2pt               ( int, int, int, int );
194 static double   r_p_distance             ( r_ipt_t, r_ipt_t );
195 static int	r_save_dataset_as	 ( char *, int );
196 
197 static void     r_init_afni_vars         ( r_alg_s *, THD_3dim_dataset * );
198 static int      r_init_Alg_values        ( r_alg_s * );
199 static int      r_init_holes_vals        ( holes_s * );
200 static int      r_init_interp_vals       ( interp_s * );
201 static int      r_init_pt_conn_s         ( r_pt_conn_s * );
202 
203 static void     r_HL_cb_fill             ( Widget, XtPointer, XtPointer );
204 static void     r_HL_cb_set_fill_val     ( Widget, XtPointer, XtPointer );
205 static void     r_HL_cb_set_maxsize      ( Widget, XtPointer, XtPointer );
206 static int	r_HL_check_neighbors     ( points_t *, int );
207 static Widget   r_HL_mk_buttons          ( holes_s *, Widget );
208 static Widget   r_HL_mk_fillval_fr       ( holes_s *, Widget );
209 static void     r_HL_mk_main_shell       ( holes_s * );
210 static Widget   r_HL_mk_maxsize_fr       ( holes_s *, Widget );
211 
212 static void     r_INT_cb_fill            ( Widget, XtPointer, XtPointer );
213 static void     r_INT_cb_set_fill_val    ( Widget, XtPointer, XtPointer );
214 static Widget   r_INT_mk_app_buttons     ( interp_s *, Widget );
215 static Widget   r_INT_mk_fillval_fr      ( interp_s *, Widget );
216 static void     r_INT_mk_main_shell      ( interp_s * );
217 
218 static void     r_gr_cb_fill             ( Widget, XtPointer, XtPointer );
219 static void     r_gr_cb_set_max_dist     ( Widget, XtPointer, XtPointer );
220 static void     r_gr_cb_set_range        ( Widget, XtPointer, XtPointer );
221 static void     r_gr_set_fill_val        ( Widget, XtPointer, XtPointer );
222 static int      r_gr_check_insert        ( r_alg_s *, points_t *, int );
223 static Widget   r_gr_mk_fill_buttons     ( r_X_s *, Widget );
224 static Widget   r_gr_mk_fillval_fr       ( r_X_s *, Widget );
225 static Widget   r_gr_mk_main_frame       ( r_X_s *, Widget );
226 static void     r_gr_mk_misc_buttons     ( r_X_s *, Widget );
227 static Widget   r_gr_mk_max_dist_w       ( r_X_s *, Widget );
228 static Widget   r_gr_mk_range_fr         ( r_X_s *, Widget );
229 
230 static int      r_wtgr_calc_max_frm_val  ( int value );
231 static int      r_wtgr_calc_min_frm_val  ( int value );
232 static void     r_wtgr_cb_suggest_limits ( Widget, XtPointer, XtPointer );
233 static void     r_wtgr_mk_main_shell     ( r_X_s * );
234 
235 static int      r_wt_bad_ngbr_exists     ( r_alg_s *, int, int );
236 static void     r_wt_cb_activate_SA      ( void );
237 static void     r_wt_cb_fill             ( Widget, XtPointer, XtPointer );
238 static void     r_wt_cb_SB_toggle        ( Widget, XtPointer, XtPointer );
239 static void     r_wt_cb_set_diag_conn    ( Widget, XtPointer, XtPointer );
240 static void     r_wt_cb_set_fill_val     ( Widget, XtPointer, XtPointer );
241 static void     r_wt_cb_set_min_nbrs     ( Widget, XtPointer, XtPointer );
242 static void     r_wt_cb_set_range        ( Widget, XtPointer, XtPointer );
243 static int      r_wt_check_insert        ( r_alg_s *, int );
244 static Widget   r_wt_mk_diag_conn_fr     ( r_X_s *, Widget );
245 static void     r_wt_mk_fill_buttons     ( r_X_s *, Widget );
246 static Widget   r_wt_mk_fillval_fr       ( r_X_s *, Widget );
247 static Widget   r_wt_mk_main_frame       ( r_X_s *, Widget );
248 static void     r_wt_mk_misc_buttons     ( r_X_s *, Widget );
249 static Widget   r_wt_mk_nbrs_fr          ( r_X_s *, Widget );
250 static Widget   r_wt_mk_range_fr         ( r_X_s *, Widget );
251 static Widget   r_wt_mk_strong_bord_fr   ( r_X_s *, Widget );
252 static void     r_wt_set_neighbors       ( r_alg_s * );
253 
254 static Widget   r_mk_scale_bar           ( Widget, char *, int, int,
255                                           int, int, XtCallbackProc );
256 
257 static void r_junk (void);
258 
259 
260 /*-----------------  for logging of messages  ---------------------------*/
261 /*#define R_LOG_INFO_D*/
262 #ifdef R_LOG_INFO_D
263 
264 
265 #define R_LOG_FILE	"/var/tmp/.rickr.log.GF"
266 
267 #define R_LOG( string ) fprintf( stderr, "\007\033[2m%s\033[0m\n", string )
268 
269 
270 FILE * gr_logfile
271 
272 
273 static int	r_open_log_file		( void );
274 
275 #endif
276