1 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */
3 /*----------------------------------------------------------------------
5 gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome
8 Copyright (C) 2002 Gerber van der Graaf
10 This file is part of gpiv.
12 Gpiv is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2, or (at your option)
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 ----------------------------------------------------------------------*/
29 * utility functions for gpiv
31 * Revision 1.1 2003-06-17 17:10:52 gerber
42 **alloc_gci_matrix(long nr
,
45 /*--------------------------------------------------------------------
46 Allocates 2-dimensional array for GnomeCanvasItem */
49 GnomeCanvasItem
**item
;
53 * allocate pointers to rows
55 item
= (GnomeCanvasItem
**) g_malloc((size_t)((nr
- 1) *
56 sizeof(GnomeCanvasItem
*)));
57 if (!item
) gpiv_error("%s: allocation failure 1 in g_malloc()",
62 * allocate rows and set pointers to them
64 item
[0] = (GnomeCanvasItem
*) g_malloc((size_t)((nr
* nc
- 1) *
65 sizeof(GnomeCanvasItem
)));
66 if (!item
[0]) gpiv_error("%s: allocation failure 2 in g_malloc()",
70 for(i
= 1; i
<= nr
; i
++) item
[i
] = item
[i
-1] + 1;
73 * return pointer to array of pointers to rows
79 free_gci_matrix(GnomeCanvasItem
**item
,
83 /*--------------------------------------------------------------------
84 Frees 2-dimensional array for GnomeCanvasItem */
86 assert(item
[0] != NULL
);
88 free((char*) (item
[0] - 1));
89 free((char*) (item
- 1));
95 free_all_bufmems(Display
* disp
97 /*-------------------------- Frees all dynamic memory of Buffer structure */
99 /* if (disp->mwin != NULL */
100 /* && GTK_WIDGET_VISIBLE(GTK_WIDGET(disp->mwin)) ) { */
101 /* gdk_window_show(GTK_WIDGET(disp->mwin)->window); */
102 /* gdk_window_raise(GTK_WIDGET(disp->mwin)->window); */
105 free_img_bufmems(disp
);
106 free_eval_bufmems(disp
);
107 free_post_bufmems(disp
);
113 free_img_bufmems(Display
* disp
115 /*--------------------------------------------------------------------
116 * Frees all dynamic memory of Buffer structure of img
119 g_snprintf(disp
->fname_base
, MAX_CHARS
,"");
121 if (disp
->img
.exist_img
) {
122 free_img(disp
->img
.img1
, image_par
);
123 /* g_free(disp->img.graybuf_img); */
124 if (image_par
.x_corr
== 1)
125 free_img(disp
->img
.img2
, image_par
);
126 /* g_free(disp->img.graybuf_img2); */
129 destroy_background(disp
);
130 if (disp
->intreg
.exist
)
131 destroy_all_intregs(disp
);
138 free_eval_bufmems(Display
* disp
140 /*--------------------------------------------------------------------
141 * Frees all dynamic memory of Buffer structure of evaluation processing
144 if (disp
->gpd
.exist_piv
) {
145 destroy_all_vectors(&disp
->gpd
);
146 gpiv_free_pivdata(&disp
->gpd
.piv_data
);
147 disp
->gpd
.exist_piv
= FALSE
;
150 if (disp
->gpd
.scaled_piv
) {
151 gpiv_free_pivdata(&disp
->gpd
.piv_data_scaled
);
152 disp
->gpd
.scaled_piv
= FALSE
;
159 free_post_bufmems(Display
* disp
161 /*--------------------------------------------------------------------
162 * Frees all dynamic memory of Buffer structure of post processing
166 if (disp
->gpd
.exist_vor
) {
167 destroy_all_scalars(&display_act
->gpd
.vor_data
, VORTICITY
);
168 gpiv_free_scdata(&disp
->gpd
.vor_data
);
169 display_act
->gpd
.exist_vor
= FALSE
;
170 display_act
->gpd
.piv_post_par
.diff_type_logic
= 0;
171 display_act
->gpd
.piv_post_par
.operator_vorstra_logic
= 0;
174 if (disp
->gpd
.exist_vor_scaled
) {
175 gpiv_free_scdata(&disp
->gpd
.vor_data_scaled
);
176 display_act
->gpd
.exist_vor_scaled
= FALSE
;
179 if (display_act
->gpd
.exist_sstrain
) {
180 destroy_all_scalars(&display_act
->gpd
.sstrain_data
, S_STRAIN
);
181 gpiv_free_scdata (&display_act
->gpd
.sstrain_data
);
182 display_act
->gpd
.exist_sstrain
= FALSE
;
183 display_act
->gpd
.piv_post_par
.diff_type_logic
= 0;
184 display_act
->gpd
.piv_post_par
.operator_vorstra_logic
= 0;
187 if (display_act
->gpd
.exist_sstrain_scaled
) {
188 gpiv_free_scdata (&display_act
->gpd
.sstrain_data_scaled
);
189 display_act
->gpd
.exist_sstrain_scaled
= FALSE
;
192 if (display_act
->gpd
.exist_nstrain
) {
193 destroy_all_scalars(&display_act
->gpd
.nstrain_data
, N_STRAIN
);
194 gpiv_free_scdata (&display_act
->gpd
.nstrain_data
);
195 display_act
->gpd
.exist_nstrain
= FALSE
;
196 display_act
->gpd
.piv_post_par
.diff_type_logic
= 0;
197 display_act
->gpd
.piv_post_par
.operator_vorstra_logic
= 0;
200 if (display_act
->gpd
.exist_nstrain_scaled
) {
201 gpiv_free_scdata (&display_act
->gpd
.nstrain_data_scaled
);
202 display_act
->gpd
.exist_nstrain_scaled
= FALSE
;
209 copy_img_par (ImagePar image_par_src
,
210 ImagePar
* image_par_dest
,
214 * copy image parameters from src to dest
217 if (image_par_src
.nrows_logic
&& !image_par_dest
->nrows_logic
) {
218 image_par_dest
->nrows
= image_par_src
.nrows
;
219 image_par_dest
->nrows_logic
= 1;
221 gpiv_warning("nrows = %d", image_par_dest
->nrows
);
224 if (image_par_src
.ncolumns_logic
&& !image_par_dest
->ncolumns_logic
) {
225 image_par_dest
->ncolumns
= image_par_src
.ncolumns
;
226 image_par_dest
->ncolumns_logic
= 1;
228 gpiv_warning("ncolumns = %d", image_par_dest
->ncolumns
);
231 if(image_par_src
.nbits_logic
&& !image_par_dest
->nbits_logic
) {
232 image_par_dest
->nbits
= image_par_src
.nbits
;
233 image_par_dest
->nbits_logic
= 1;
235 gpiv_warning("nbits = %d", image_par_dest
->nbits
);
238 if(image_par_src
.x_corr_logic
&& !image_par_dest
->x_corr_logic
) {
239 image_par_dest
->x_corr
= image_par_src
.x_corr
;
240 image_par_dest
->x_corr_logic
= 1;
242 gpiv_warning("x_corr = %d", image_par_dest
->x_corr
);
245 if (image_par_src
.s_scale_logic
&& !image_par_dest
->s_scale_logic
) {
246 image_par_dest
->s_scale
= image_par_src
.s_scale
;
247 image_par_dest
->s_scale_logic
= 1;
249 gpiv_warning("s_scale = %d", image_par_dest
->s_scale
);
252 if(image_par_src
.t_scale_logic
&& !image_par_dest
->t_scale_logic
) {
253 image_par_dest
->t_scale
= image_par_src
.t_scale
;
254 image_par_dest
->t_scale_logic
= 1;
256 gpiv_warning("t_scale = %d", image_par_dest
->t_scale
);
259 if (image_par_src
.z_off_logic
&& !image_par_dest
->z_off_logic
) {
260 image_par_dest
->z_off_x
= image_par_src
.z_off_x
;
261 image_par_dest
->z_off_y
= image_par_src
.z_off_y
;
262 image_par_dest
->z_off_logic
= 1;
264 gpiv_warning("z_off_x = %f", image_par_dest
->z_off_x
);
265 gpiv_warning("z_off_y = %f", image_par_dest
->z_off_x
);
269 if (image_par
.project_logic
&& !image_par_dest
->project_logic
) {
270 image_par_dest
->project_logic
= 1;
271 snprintf(image_par_dest
->project
, MAX_CHARS
, "%s",
272 image_par_src
.project
);
274 gpiv_warning("project = %S", image_par_dest
->project
);
278 if (image_par
.creation_date_logic
279 && !image_par_dest
->creation_date_logic
) {
280 image_par_dest
->creation_date_logic
= 1;
281 snprintf(image_par_dest
->creation_date
, MAX_CHARS
, "%s",
282 image_par_src
.creation_date
);
284 gpiv_warning("creation_date = %s", image_par_dest
->creation_date
);
286 char time_string
[MAX_CHARS
];
287 struct tm time_struct
;
290 time_struct
= *gmtime(&itime
);
291 strftime(time_string
, MAX_CHARS
, "%a %b %d %Y %T", &time_struct
);
293 gpiv_warning("Setting new time = %s", time_string
);
294 snprintf(image_par
.creation_date
, MAX_CHARS
, "%s", time_string
);
295 image_par_dest
->creation_date_logic
= 1;
299 if (image_par_src
.location_logic
&& !image_par_dest
->location_logic
) {
300 image_par_dest
->location_logic
= 1;
301 snprintf(image_par_dest
->location
, MAX_CHARS
, "%s",
302 image_par_src
.location
);
304 gpiv_warning("location = %s", image_par_dest
->location
);
308 if (image_par_src
.comment_logic
&& !image_par_dest
->comment_logic
) {
309 image_par_dest
->comment_logic
= 1;
310 snprintf(image_par_dest
->comment
, MAX_CHARS
, "%s",
311 image_par_src
.comment
);
313 gpiv_warning("comment = %s", image_par_dest
->comment
);
324 sensitive(GpivConsole
*gpiv
,
325 enum WidgetSet wi_set
,
327 /* ---------- Changes the sensitivity of a set of witgets ---------------*/
332 * Setting sensitivity of Image witgets
335 /* gtk_widget_set_sensitive(gpiv->imgh->label_name, sense); */
336 /* gtk_widget_set_sensitive(gpiv->imgh->entry_name, sense); */
337 /* gtk_widget_set_sensitive(gpiv->imgh->spinbutton_ncols, sense); */
339 gtk_widget_set_sensitive(gpiv
->imgh
->label_colpos
, sense
);
340 gtk_widget_set_sensitive(gpiv
->imgh
->label_sscale
, sense
);
341 gtk_widget_set_sensitive(gpiv
->imgh
->label_ncols
, sense
);
342 gtk_widget_set_sensitive(gpiv
->imgh
->label_nrows
, sense
);
343 gtk_widget_set_sensitive(gpiv
->imgh
->label_rowpos
, sense
);
344 gtk_widget_set_sensitive(gpiv
->imgh
->label_tscale
, sense
);
345 gtk_widget_set_sensitive(gpiv
->imgh
->label_crdate
, sense
);
346 gtk_widget_set_sensitive(gpiv
->imgh
->label_location
, sense
);
347 gtk_widget_set_sensitive(gpiv
->imgh
->label_project
, sense
);
348 gtk_widget_set_sensitive(gpiv
->imgh
->label_comment
, sense
);
349 gtk_widget_set_sensitive(gpiv
->imgh
->spinbutton_colpos
, sense
);
350 gtk_widget_set_sensitive(gpiv
->imgh
->spinbutton_sscale
, sense
);
351 gtk_widget_set_sensitive(gpiv
->imgh
->spinbutton_rowpos
, sense
);
352 gtk_widget_set_sensitive(gpiv
->imgh
->spinbutton_tscale
, sense
);
353 gtk_widget_set_sensitive(gpiv
->imgh
->entry_crdate
, sense
);
354 gtk_widget_set_sensitive(gpiv
->imgh
->entry_location
, sense
);
355 gtk_widget_set_sensitive(gpiv
->imgh
->entry_project
, sense
);
356 gtk_widget_set_sensitive(gpiv
->imgh
->entry_comment
, sense
);
361 * Setting sensitivity of Image Processing witgets
363 if (wi_set
== IMGPROC
) {
368 * Setting sensitivity of PIV witgets
370 if (wi_set
== EVAL
) {
371 gtk_widget_set_sensitive(gpiv
->piveval
->spinbutton_colstart
, sense
);
372 gtk_widget_set_sensitive(gpiv
->piveval
->spinbutton_colend
, sense
);
373 gtk_widget_set_sensitive(gpiv
->piveval
->spinbutton_preshiftcol
, sense
);
374 gtk_widget_set_sensitive(gpiv
->piveval
->spinbutton_rowstart
, sense
);
375 gtk_widget_set_sensitive(gpiv
->piveval
->spinbutton_rowend
, sense
);
376 gtk_widget_set_sensitive(gpiv
->piveval
->spinbutton_preshiftrow
, sense
);
378 /* gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize1_1, sense); */
379 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intsize1_2
, sense
);
380 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intsize1_3
, sense
);
382 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intsize1_4
, sense
);
383 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intsize1_5
, sense
);
385 /* gtk_widget_set_sensitive(gpiv->piveval->radiobutton_intsize2_1, sense); */
386 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intsize2_2
, sense
);
387 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intsize2_3
, sense
);
388 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intsize2_4
, sense
);
389 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intsize2_5
, sense
);
391 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intshift_1
, sense
);
392 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intshift_2
, sense
);
393 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intshift_3
, sense
);
394 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intshift_4
, sense
);
395 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_intshift_5
, sense
);
397 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_fit_none
, sense
);
398 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_fit_gauss
, sense
);
399 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_fit_power
, sense
);
400 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_fit_gravity
, sense
);
402 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_mouse_1
, sense
);
403 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_mouse_2
, sense
);
404 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_mouse_3
, sense
);
405 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_mouse_4
, sense
);
407 gtk_widget_set_sensitive(gpiv
->piveval
->checkbutton_disprocess
, sense
);
409 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_peak_1
, sense
);
410 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_peak_2
, sense
);
411 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_peak_3
, sense
);
413 gtk_widget_set_sensitive(gpiv
->piveval
->checkbutton_weightkernel
, sense
);
414 gtk_widget_set_sensitive(gpiv
->piveval
->checkbutton_zerooff
, sense
);
415 gtk_widget_set_sensitive(gpiv
->piveval
->checkbutton_centraldiff
, sense
);
417 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_cross_1
, sense
);
418 gtk_widget_set_sensitive(gpiv
->piveval
->radiobutton_cross_2
, sense
);
420 gtk_widget_set_sensitive(gpiv
->piveval
->button
, sense
);
425 * Setting sensitivity of a slection of PIV witgets
427 if (wi_set
== INTREGS
) {
428 /* if (piv_eval_par.int_size_1 >= 16) { */
429 /* gtk_widget_set_sensitive(GTK_WIDGET */
430 /* (gpiv->piveval->radiobutton_intsize2_1), sense); */
431 if (piv_eval_par
.int_size_1
>= 32) {
432 gtk_widget_set_sensitive(GTK_WIDGET
433 (gpiv
->piveval
->radiobutton_intsize2_2
),
435 if (piv_eval_par
.int_size_1
>= 64) {
436 gtk_widget_set_sensitive(GTK_WIDGET
437 (gpiv
->piveval
->radiobutton_intsize2_3
),
439 if (piv_eval_par
.int_size_1
>= 128) {
440 gtk_widget_set_sensitive(GTK_WIDGET
441 (gpiv
->piveval
->radiobutton_intsize2_4
),
452 * Setting sensitivity of Validation witgets
454 if (wi_set
== VALID
) {
455 gtk_widget_set_sensitive(gpiv
->pivvalid
->radiobutton_errvec_residu_1
, sense
);
456 gtk_widget_set_sensitive(gpiv
->pivvalid
->radiobutton_errvec_residu_2
, sense
);
457 gtk_widget_set_sensitive(gpiv
->pivvalid
->radiobutton_disable_1
, sense
);
458 gtk_widget_set_sensitive(gpiv
->pivvalid
->label_errvec_res
, sense
);
459 gtk_widget_set_sensitive(gpiv
->pivvalid
->spinbutton_errvec_res
, sense
);
460 gtk_widget_set_sensitive(gpiv
->pivvalid
->checkbutton_errvec_disres
, sense
);
461 gtk_widget_set_sensitive(gpiv
->pivvalid
->button_errvec_resstats
, sense
);
463 gtk_widget_set_sensitive(gpiv
->pivvalid
->radiobutton_errvec_subst_1
, sense
);
464 /* gtk_widget_set_sensitive(gpiv->pivvalid->radiobutton_errvec_subst_2, sense); */
465 gtk_widget_set_sensitive(gpiv
->pivvalid
->radiobutton_errvec_subst_3
, sense
);
466 gtk_widget_set_sensitive(gpiv
->pivvalid
->button_errvec
, sense
);
468 gtk_widget_set_sensitive(gpiv
->pivvalid
->spinbutton_peaklck_bins
, sense
);
469 gtk_widget_set_sensitive(gpiv
->pivvalid
->button_peaklck
, sense
);
474 * Setting sensitivity of Post processing witgets
476 if (wi_set
== POST
) {
477 gtk_widget_set_sensitive(gpiv
->pivpost
->radiobutton_vorstra_output_1
, sense
);
478 gtk_widget_set_sensitive(gpiv
->pivpost
->radiobutton_vorstra_output_2
, sense
);
479 gtk_widget_set_sensitive(gpiv
->pivpost
->radiobutton_vorstra_output_3
, sense
);
481 gtk_widget_set_sensitive(gpiv
->pivpost
->radiobutton_vorstra_diffscheme_1
,
483 gtk_widget_set_sensitive(gpiv
->pivpost
->radiobutton_vorstra_diffscheme_2
,
485 gtk_widget_set_sensitive(gpiv
->pivpost
->radiobutton_vorstra_diffscheme_3
,
487 gtk_widget_set_sensitive(gpiv
->pivpost
->radiobutton_vorstra_diffscheme_4
,
489 gtk_widget_set_sensitive(gpiv
->pivpost
->button_vorstra
, sense
);
496 void destroy(GtkWidget
* widget
, gpointer data
)
498 gtk_widget_destroy(widget
);
502 void gtk_warning(gchar
* msg
, ...)
504 GtkWidget
*gtk_warning_wi
;
506 char local_msg
[MAX_CHARS
];
509 vsnprintf (local_msg
, MAX_CHARS
, msg
, args
);
510 gtk_warning_wi
= create_messagebox(local_msg
);
511 gtk_widget_show(gtk_warning_wi
);
516 void gtk_error(gchar
* msg
, ...)
518 GtkWidget
*gtk_error_wi
;
520 char local_msg
[MAX_CHARS
];
523 vsnprintf (local_msg
, MAX_CHARS
, msg
, args
);
524 gtk_error_wi
= create_errorbox(local_msg
);
525 gtk_widget_show(gtk_error_wi
);