diff options
author | Thomas White <taw@physics.org> | 2020-07-03 14:14:32 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2020-07-29 18:53:45 +0200 |
commit | 92a3939402ee030755440af5b525e7af8155d34f (patch) | |
tree | 11943a9d03d3311c6babcecf080f74d5980c149f | |
parent | fc448f0933671135b149f2d151f8addc0bd73300 (diff) |
Let caller (rather than CrystFELImageView) own the image structure
-rw-r--r-- | src/crystfel_gui.c | 84 | ||||
-rw-r--r-- | src/crystfelimageview.c | 108 | ||||
-rw-r--r-- | src/crystfelimageview.h | 25 | ||||
-rw-r--r-- | src/gui_peaksearch.c | 45 | ||||
-rw-r--r-- | src/gui_project.c | 1 | ||||
-rw-r--r-- | src/gui_project.h | 1 |
6 files changed, 79 insertions, 185 deletions
diff --git a/src/crystfel_gui.c b/src/crystfel_gui.c index 45934f24..ec300072 100644 --- a/src/crystfel_gui.c +++ b/src/crystfel_gui.c @@ -115,13 +115,12 @@ static void update_imageview(struct crystfelproject *proj) char tmp[1024]; char *ev_str; char *ev_sep; + struct image *image; if ( proj->n_frames == 0 ) return; if ( proj->stream != NULL ) { - struct image *image; - if ( stream_select_chunk(proj->stream, proj->cur_frame) ) { @@ -141,47 +140,41 @@ static void update_imageview(struct crystfelproject *proj) return; } - if ( image->ev != NULL ) { - ev_str = image->ev; - ev_sep = " "; - } else { - ev_str = ""; - ev_sep = ""; - } - snprintf(tmp, 1023, "%s%s%s (frame %i of %i)", - image->filename, - ev_sep, - ev_str, - proj->cur_frame+1, - proj->n_frames); - gtk_label_set_text(GTK_LABEL(proj->image_info), tmp); - crystfel_image_view_set_image(CRYSTFEL_IMAGE_VIEW(proj->imageview), - image->filename, - image->ev); - - image_free(image); - } else { - if ( proj->events[proj->cur_frame] != NULL ) { - ev_str = proj->events[proj->cur_frame]; - ev_sep = " "; - } else { - ev_str = ""; - ev_sep = ""; + image = image_read(proj->dtempl, + proj->filenames[proj->cur_frame], + proj->events[proj->cur_frame]); + + if ( image == NULL ) { + ERROR("Failed to load image\n"); + return; } - snprintf(tmp, 1023, "%s%s%s (frame %i of %i)", - proj->filenames[proj->cur_frame], - ev_sep, - ev_str, - proj->cur_frame+1, - proj->n_frames); - gtk_label_set_text(GTK_LABEL(proj->image_info), tmp); - crystfel_image_view_set_image(CRYSTFEL_IMAGE_VIEW(proj->imageview), - proj->filenames[proj->cur_frame], - proj->events[proj->cur_frame]); } + + /* Give CrystFELImageView a chance to free resources */ + crystfel_image_view_set_image(CRYSTFEL_IMAGE_VIEW(proj->imageview), + NULL); + image_free(proj->cur_image); + proj->cur_image = image; + + if ( proj->cur_image->ev != NULL ) { + ev_str = proj->cur_image->ev; + ev_sep = " "; + } else { + ev_str = ""; + ev_sep = ""; + } + snprintf(tmp, 1023, "%s%s%s (frame %i of %i)", + proj->cur_image->filename, + ev_sep, + ev_str, + proj->cur_frame+1, + proj->n_frames); + gtk_label_set_text(GTK_LABEL(proj->image_info), tmp); + crystfel_image_view_set_image(CRYSTFEL_IMAGE_VIEW(proj->imageview), + proj->cur_image); } @@ -301,9 +294,7 @@ static void finddata_response_sig(GtkWidget *dialog, gint resp, /* Totally clean up the old list */ clear_project_files(proj); crystfel_image_view_set_image(CRYSTFEL_IMAGE_VIEW(proj->imageview), - NULL, NULL); - crystfel_image_view_set_datatemplate(CRYSTFEL_IMAGE_VIEW(proj->imageview), - NULL); + NULL); g_free(proj->geom_filename); proj->geom_filename = geom_filename; @@ -314,9 +305,6 @@ static void finddata_response_sig(GtkWidget *dialog, gint resp, g_free(proj->data_top_folder); proj->data_top_folder = g_file_get_path(top); - crystfel_image_view_set_datatemplate(CRYSTFEL_IMAGE_VIEW(proj->imageview), - proj->dtempl); - add_files(proj, top, proj->data_search_pattern, proj->dtempl); @@ -351,17 +339,13 @@ static void finddata_response_sig(GtkWidget *dialog, gint resp, clear_project_files(proj); crystfel_image_view_set_image(CRYSTFEL_IMAGE_VIEW(proj->imageview), - NULL, NULL); - crystfel_image_view_set_datatemplate(CRYSTFEL_IMAGE_VIEW(proj->imageview), - NULL); + NULL); stream_close(proj->stream); proj->stream = st; data_template_free(proj->dtempl); proj->dtempl = dtempl; - crystfel_image_view_set_datatemplate(CRYSTFEL_IMAGE_VIEW(proj->imageview), - proj->dtempl); /* Set some defaults for things we won't be using */ g_free(proj->geom_filename); @@ -889,8 +873,6 @@ int main(int argc, char *argv[]) if ( proj.geom_filename != NULL ) { dtempl = data_template_new_from_file(proj.geom_filename); if ( dtempl != NULL ) { - crystfel_image_view_set_datatemplate(CRYSTFEL_IMAGE_VIEW(proj.imageview), - dtempl); proj.dtempl = dtempl; } } diff --git a/src/crystfelimageview.c b/src/crystfelimageview.c index f36f0478..45a0bf96 100644 --- a/src/crystfelimageview.c +++ b/src/crystfelimageview.c @@ -45,9 +45,6 @@ #include "crystfelimageview.h" -static int rerender_image(CrystFELImageView *iv); - - static void scroll_interface_init(GtkScrollable *iface) { } @@ -89,8 +86,6 @@ static void cleanup_image(CrystFELImageView *iv) } free(iv->pixbufs); - image_free(iv->image); - iv->image = NULL; iv->pixbufs = NULL; } @@ -99,8 +94,6 @@ static void cleanup_image(CrystFELImageView *iv) static gint destroy_sig(GtkWidget *window, CrystFELImageView *iv) { cleanup_image(iv); - free(iv->filename); - free(iv->event); return FALSE; } @@ -417,7 +410,6 @@ static void draw_peaks(cairo_t *cr, CrystFELImageView *iv, static gint draw_sig(GtkWidget *window, cairo_t *cr, CrystFELImageView *iv) { - int i; cairo_matrix_t m; cairo_save(cr); @@ -444,12 +436,8 @@ static gint draw_sig(GtkWidget *window, cairo_t *cr, CrystFELImageView *iv) } } - for ( i=0; i<iv->num_peaklists; i++ ){ - if ( (iv->peaklists[i] != NULL) - && (iv->image != NULL) ) - { - draw_peaks(cr, iv , iv->peaklists[i]); - } + if ( iv->show_peaks ) { + draw_peaks(cr, iv, iv->image->features); } cairo_restore(cr); @@ -592,11 +580,8 @@ GtkWidget *crystfel_image_view_new() iv->detector_w = 1.0; iv->detector_h = 1.0; iv->zoom = -1.0; - iv->filename = NULL; - iv->event = NULL; iv->image = NULL; - iv->num_peaklists = 0; - iv->peaklists = NULL; + iv->show_peaks = 0; iv->brightness = 1.0; iv->pixbufs = NULL; @@ -761,23 +746,6 @@ static double auto_scale_top(const struct image *image) } -static int reload_image(CrystFELImageView *iv) -{ - if ( iv->dtempl == NULL ) return 0; - if ( iv->filename == NULL ) return 0; - - cleanup_image(iv); - - iv->image = image_read(iv->dtempl, iv->filename, iv->event); - if ( iv->image == NULL ) { - ERROR("Failed to load image\n"); - return 1; - } - - return rerender_image(iv); -} - - static int rerender_image(CrystFELImageView *iv) { int i; @@ -785,6 +753,9 @@ static int rerender_image(CrystFELImageView *iv) double border; double scale_top; + if ( iv->image == NULL ) return 0; + if ( iv->image->detgeom == NULL ) return 0; + if ( iv->pixbufs == NULL ) { iv->pixbufs = calloc(iv->image->detgeom->n_panels, sizeof(GdkPixbuf *)); @@ -827,71 +798,26 @@ static int rerender_image(CrystFELImageView *iv) } -int crystfel_image_view_set_datatemplate(CrystFELImageView *iv, - DataTemplate *dtempl) -{ - iv->dtempl = dtempl; - return reload_image(iv); -} - - int crystfel_image_view_set_image(CrystFELImageView *iv, - const char *filename, - const char *event) -{ - int i; - - free(iv->filename); - free(iv->event); - - /* Dump peak lists, because image is changing */ - for ( i=0; i<iv->num_peaklists; i++ ) { - image_feature_list_free(iv->peaklists[i]); - } - free(iv->peaklists); - iv->peaklists = NULL; - iv->num_peaklists = 0; - - iv->filename = safe_strdup(filename); - iv->event = safe_strdup(event); - return reload_image(iv); -} - - -struct image *crystfel_image_view_get_image_struct(CrystFELImageView *iv) + const struct image *image) { - return iv->image; + cleanup_image(iv); + iv->image = image; + return rerender_image(iv); } -void crystfel_image_view_set_peaks(CrystFELImageView *iv, - ImageFeatureList *peaks, - int list_num) +void crystfel_image_view_set_brightness(CrystFELImageView *iv, + double brightness) { - int i; - if ( list_num >= iv->num_peaklists ) { - ImageFeatureList **n_fl; - n_fl = realloc(iv->peaklists, - (list_num+1)*sizeof(ImageFeatureList*)); - if ( n_fl == NULL ) return; - for ( i=iv->num_peaklists; i<list_num+1; i++ ) { - n_fl[i] = NULL; - } - iv->peaklists = n_fl; - iv->num_peaklists = list_num+1; - } - if ( iv->peaklists[list_num] != NULL ) { - image_feature_list_free(iv->peaklists[list_num]); - } - iv->peaklists[list_num] = image_feature_list_copy(peaks); - - redraw(iv); + iv->brightness = brightness; + rerender_image(iv); } -void crystfel_image_view_set_brightness(CrystFELImageView *iv, - double brightness) +void crystfel_image_view_set_show_peaks(CrystFELImageView *iv, + int show_peaks) { - iv->brightness = brightness; + iv->show_peaks = show_peaks; rerender_image(iv); } diff --git a/src/crystfelimageview.h b/src/crystfelimageview.h index eafb0c44..d17f394f 100644 --- a/src/crystfelimageview.h +++ b/src/crystfelimageview.h @@ -81,16 +81,12 @@ struct _crystfelimageview double offs_x; double offs_y; - DataTemplate *dtempl; - char *filename; - char *event; - struct image *image; - GdkPixbuf **pixbufs; + const struct image *image; - int num_peaklists; - ImageFeatureList **peaklists; + GdkPixbuf **pixbufs; double brightness; + int show_peaks; }; struct _crystfelimageviewclass @@ -104,20 +100,13 @@ typedef struct _crystfelimageviewclass CrystFELImageViewClass; extern GType crystfel_image_view_get_type(void); extern GtkWidget *crystfel_image_view_new(void); -extern int crystfel_image_view_set_datatemplate(CrystFELImageView *iv, - DataTemplate *dtempl); - extern int crystfel_image_view_set_image(CrystFELImageView *iv, - const char *filename, - const char *event); - -extern struct image *crystfel_image_view_get_image_struct(CrystFELImageView *iv); - -extern void crystfel_image_view_set_peaks(CrystFELImageView *iv, - ImageFeatureList *peaks, - int list_num); + const struct image *image); extern void crystfel_image_view_set_brightness(CrystFELImageView *iv, double brightness); +extern void crystfel_image_view_set_show_peaks(CrystFELImageView *iv, + int show_peaks); + #endif /* CRYSTFELIMAGEVIEW_H */ diff --git a/src/gui_peaksearch.c b/src/gui_peaksearch.c index eedb558d..7a147278 100644 --- a/src/gui_peaksearch.c +++ b/src/gui_peaksearch.c @@ -48,23 +48,19 @@ void update_peaks(struct crystfelproject *proj) { - if ( proj->n_frames == 0 ) return; - if ( proj->show_peaks ) { - - struct image *image; + if ( proj->cur_image == NULL ) return; - image = crystfel_image_view_get_image_struct(CRYSTFEL_IMAGE_VIEW(proj->imageview)); - if ( image == NULL ) return; + if ( proj->show_peaks ) { - image_feature_list_free(image->features); - image->features = NULL; + image_feature_list_free(proj->cur_image->features); + proj->cur_image->features = NULL; switch ( proj->peak_search_params.method ) { - case PEAK_ZAEF: - search_peaks(image, + case PEAK_ZAEF: + search_peaks(proj->cur_image, proj->peak_search_params.threshold, proj->peak_search_params.min_sq_gradient, proj->peak_search_params.min_snr, @@ -74,8 +70,8 @@ void update_peaks(struct crystfelproject *proj) 1); break; - case PEAK_PEAKFINDER8: - search_peaks_peakfinder8(image, 2048, + case PEAK_PEAKFINDER8: + search_peaks_peakfinder8(proj->cur_image, 2048, proj->peak_search_params.threshold, proj->peak_search_params.min_snr, proj->peak_search_params.min_pix_count, @@ -86,14 +82,14 @@ void update_peaks(struct crystfelproject *proj) 1); break; - case PEAK_HDF5: - case PEAK_CXI: - image->features = image_read_peaks(proj->dtempl, - image->filename, - image->ev, - proj->peak_search_params.half_pixel_shift); + case PEAK_HDF5: + case PEAK_CXI: + proj->cur_image->features = image_read_peaks(proj->dtempl, + proj->cur_image->filename, + proj->cur_image->ev, + proj->peak_search_params.half_pixel_shift); if ( proj->peak_search_params.revalidate ) { - validate_peaks(image, + validate_peaks(proj->cur_image, proj->peak_search_params.min_snr, proj->peak_search_params.pk_inn, proj->peak_search_params.pk_mid, @@ -102,18 +98,17 @@ void update_peaks(struct crystfelproject *proj) } break; - default: + default: ERROR("This peak detection method not implemented!\n"); break; } - crystfel_image_view_set_peaks(CRYSTFEL_IMAGE_VIEW(proj->imageview), - image->features, 0); + crystfel_image_view_set_show_peaks(CRYSTFEL_IMAGE_VIEW(proj->imageview), + 1); - } else { - crystfel_image_view_set_peaks(CRYSTFEL_IMAGE_VIEW(proj->imageview), - NULL, 0); + crystfel_image_view_set_image(CRYSTFEL_IMAGE_VIEW(proj->imageview), + proj->cur_image); } } diff --git a/src/gui_project.c b/src/gui_project.c index f803c103..9f610420 100644 --- a/src/gui_project.c +++ b/src/gui_project.c @@ -416,6 +416,7 @@ void default_project(struct crystfelproject *proj) proj->stream_filename = NULL; proj->stream = NULL; proj->dtempl = NULL; + proj->cur_image = NULL; /* Default parameter values */ proj->show_peaks = 0; diff --git a/src/gui_project.h b/src/gui_project.h index c2d540a9..aad71e2e 100644 --- a/src/gui_project.h +++ b/src/gui_project.h @@ -79,6 +79,7 @@ struct crystfelproject { int unsaved; int cur_frame; + struct image *cur_image; char *geom_filename; char *stream_filename; |