diff options
-rw-r--r-- | data/displaywindow.ui | 4 | ||||
-rw-r--r-- | src/displaywindow.c | 75 | ||||
-rw-r--r-- | src/displaywindow.h | 3 | ||||
-rw-r--r-- | src/image.c | 3 | ||||
-rw-r--r-- | src/image.h | 4 | ||||
-rw-r--r-- | src/peaks.c | 3 | ||||
-rw-r--r-- | src/render.c | 25 | ||||
-rw-r--r-- | src/render.h | 8 |
8 files changed, 101 insertions, 24 deletions
diff --git a/data/displaywindow.ui b/data/displaywindow.ui index a435c754..4ca3f737 100644 --- a/data/displaywindow.ui +++ b/data/displaywindow.ui @@ -10,7 +10,11 @@ <menu name="view" action="ViewAction"> <menuitem name="binning" action="BinningAction" /> <menuitem name="boostint" action="BoostIntAction" /> + <separator /> + <menuitem name="col" action="ColAction" /> <menuitem name="monoscale" action="MonoAction" /> + <menuitem name="invmonoscale" action="InvMonoAction" /> + <separator /> <menuitem name="colscale" action="ColScaleAction" /> </menu> diff --git a/src/displaywindow.c b/src/displaywindow.c index 2536c1ed..2501f38b 100644 --- a/src/displaywindow.c +++ b/src/displaywindow.c @@ -82,7 +82,7 @@ static void displaywindow_update(DisplayWindow *dw) if ( dw->col_scale != NULL ) { gdk_pixbuf_unref(dw->col_scale); } - dw->col_scale = render_get_colour_scale(20, dw->height, dw->monochrome); + dw->col_scale = render_get_colour_scale(20, dw->height, dw->scale); gdk_window_invalidate_rect(dw->drawingarea->window, NULL, FALSE); } @@ -411,25 +411,29 @@ static void load_features_from_file(struct image *image, const char *filename) do { char line[1024]; - float x, y, d, df; + float x, y, df; int r; + signed int h, k, l; rval = fgets(line, 1023, fh); if ( rval == NULL ) continue; chomp(line); /* Try long format (output of pattern_sim --near-bragg) */ - r = sscanf(line, "%f %f %f %f (at %f,%f)", - &d, &d, &d, &df, &x, &y); + r = sscanf(line, "%i %i %i %f (at %f,%f)", + &h, &k, &l, &df, &x, &y); if ( r == 6 ) { - image_add_feature(image->features, x, y, image, 1.0); + char name[32]; + snprintf(name, 31, "%i %i %i", h, k, l); + image_add_feature(image->features, x, y, image, 1.0, + strdup(name)); continue; } r = sscanf(line, "%f %f", &x, &y); if ( r != 2 ) continue; - image_add_feature(image->features, x, y, image, 1.0); + image_add_feature(image->features, x, y, image, 1.0, NULL); } while ( rval != NULL ); } @@ -521,14 +525,6 @@ static gint displaywindow_set_colscale(GtkWidget *widget, DisplayWindow *dw) } -static gint displaywindow_set_mono(GtkWidget *widget, DisplayWindow *dw) -{ - dw->monochrome = 1 - dw->monochrome; - displaywindow_update(dw); - return 0; -} - - static gint displaywindow_numbers_response(GtkWidget *widget, gint response, DisplayWindow *dw) { @@ -550,7 +546,9 @@ static gint displaywindow_show_numbers(GtkWidget *widget, DisplayWindow *dw) struct numberswindow *nw; GtkWidget *vbox; GtkWidget *hbox; + GtkWidget *hbox2; GtkWidget *table; + GtkWidget *label; unsigned int x, y; if ( dw->numbers_window != NULL ) { @@ -598,6 +596,13 @@ static gint displaywindow_show_numbers(GtkWidget *widget, DisplayWindow *dw) } } + hbox2 = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(hbox2), FALSE, FALSE, 5); + label = gtk_label_new("Feature:"); + gtk_box_pack_start(GTK_BOX(hbox2), GTK_WIDGET(label), FALSE, FALSE, 5); + nw->feat = gtk_label_new("-"); + gtk_box_pack_start(GTK_BOX(hbox2), GTK_WIDGET(nw->feat), FALSE, FALSE, 5); + g_signal_connect(G_OBJECT(nw->window), "response", G_CALLBACK(displaywindow_numbers_response), dw); g_signal_connect(G_OBJECT(nw->window), "destroy", @@ -613,6 +618,9 @@ static gint displaywindow_show_numbers(GtkWidget *widget, DisplayWindow *dw) static void numbers_update(DisplayWindow *dw) { int px, py; + int imin; + double dmin; + struct imagefeature *f; for ( px=0; px<17; px++ ) { for ( py=0; py<17; py++ ) { @@ -644,6 +652,18 @@ static void numbers_update(DisplayWindow *dw) } } + + if ( dw->image->features == NULL ) return; + + f = image_feature_closest(dw->image->features, dw->numbers_window->cx, + dw->numbers_window->cy, &dmin, &imin); + if ( dmin < 20.0 ) { + gtk_label_set_text(GTK_LABEL(dw->numbers_window->feat), + f->name); + } else { + gtk_label_set_text(GTK_LABEL(dw->numbers_window->feat), + "-"); + } } @@ -659,6 +679,16 @@ static void displaywindow_addui_callback(GtkUIManager *ui, GtkWidget *widget, } +static gint displaywindow_setscale(GtkWidget *widget, GtkRadioAction *action, + DisplayWindow *dw) +{ + dw->scale = gtk_radio_action_get_current_value(action); + displaywindow_update(dw); + + return 0; +} + + static void displaywindow_addmenubar(DisplayWindow *dw, GtkWidget *vbox) { GError *error = NULL; @@ -692,15 +722,26 @@ static void displaywindow_addmenubar(DisplayWindow *dw, GtkWidget *vbox) GtkToggleActionEntry toggles[] = { { "ColScaleAction", NULL, "Show Colour Scale", NULL, NULL, G_CALLBACK(displaywindow_set_colscale), FALSE }, - { "MonoAction", NULL, "Monochrome", NULL, NULL, - G_CALLBACK(displaywindow_set_mono), FALSE }, }; guint n_toggles = G_N_ELEMENTS(toggles); + GtkRadioActionEntry radios[] = { + { "ColAction", NULL, "Colour", NULL, NULL, + SCALE_COLOUR }, + { "MonoAction", NULL, "Monochrome", NULL, NULL, + SCALE_MONO }, + { "InvMonoAction", NULL, "Inverse Monochrome", NULL, NULL, + SCALE_INVMONO }, + }; + guint n_radios = G_N_ELEMENTS(radios); dw->action_group = gtk_action_group_new("hdfseedisplaywindow"); gtk_action_group_add_actions(dw->action_group, entries, n_entries, dw); gtk_action_group_add_toggle_actions(dw->action_group, toggles, n_toggles, dw); + gtk_action_group_add_radio_actions(dw->action_group, radios, n_radios, + SCALE_COLOUR, + G_CALLBACK(displaywindow_setscale), + dw); dw->ui = gtk_ui_manager_new(); gtk_ui_manager_insert_action_group(dw->ui, dw->action_group, 0); @@ -953,7 +994,7 @@ DisplayWindow *displaywindow_open(const char *filename, const char *peaks, dw->binning_dialog = NULL; dw->show_col_scale = 0; dw->col_scale = NULL; - dw->monochrome = 0; + dw->scale = SCALE_COLOUR; dw->boostint_dialog = NULL; dw->boostint = 1; dw->motion_callback = 0; diff --git a/src/displaywindow.h b/src/displaywindow.h index 1520a1b1..0ca59933 100644 --- a/src/displaywindow.h +++ b/src/displaywindow.h @@ -35,6 +35,7 @@ typedef struct { struct numberswindow { GtkWidget *window; GtkWidget *labels[17*17]; + GtkWidget *feat; unsigned int cx; unsigned int cy; }; @@ -65,7 +66,7 @@ typedef struct { int clean; /* Whether or not to clean the image */ int show_col_scale; - int monochrome; + int scale; GdkPixbuf *col_scale; } DisplayWindow; diff --git a/src/image.c b/src/image.c index b0869cce..d4b7fcb9 100644 --- a/src/image.c +++ b/src/image.c @@ -71,7 +71,7 @@ ImageList *image_list_new() void image_add_feature(ImageFeatureList *flist, double x, double y, - struct image *parent, double intensity) + struct image *parent, double intensity, const char *name) { if ( flist->features ) { flist->features = realloc(flist->features, @@ -88,6 +88,7 @@ void image_add_feature(ImageFeatureList *flist, double x, double y, flist->features[flist->n_features].parent = parent; flist->features[flist->n_features].partner = NULL; flist->features[flist->n_features].partner_d = 0.0; + flist->features[flist->n_features].name = name; flist->features[flist->n_features].valid = 1; flist->n_features++; diff --git a/src/image.h b/src/image.h index 16452a0f..5159d63e 100644 --- a/src/image.h +++ b/src/image.h @@ -47,6 +47,7 @@ struct imagefeature { /* Internal use only */ int valid; + const char *name; }; /* An opaque type representing a list of image features */ @@ -111,7 +112,8 @@ extern ImageFeatureList *image_feature_list_new(void); extern void image_feature_list_free(ImageFeatureList *flist); extern void image_add_feature(ImageFeatureList *flist, double x, double y, - struct image *parent, double intensity); + struct image *parent, double intensity, + const char *name); extern void image_remove_feature(ImageFeatureList *flist, int idx); diff --git a/src/peaks.c b/src/peaks.c index 5cbf0f17..d146ce24 100644 --- a/src/peaks.c +++ b/src/peaks.c @@ -426,7 +426,8 @@ void search_peaks(struct image *image) } /* Add using "better" coordinates */ - image_add_feature(image->features, fx, fy, image, intensity); + image_add_feature(image->features, fx, fy, image, intensity, + NULL); nacc++; } diff --git a/src/render.c b/src/render.c index 1ea36ea1..385944df 100644 --- a/src/render.c +++ b/src/render.c @@ -153,6 +153,14 @@ float *render_get_image_binned(DisplayWindow *dw, int binning, float *max) if ( val > max ) p = 1.0; \ r = 255.0*p; g = 255.0*p; b = 255.0*p; +#define RENDER_INVMONO \ + float p; \ + p = (float)val / (float)max; \ + p = 1.0 - p; \ + if ( val < 0.0 ) p = 1.0; \ + if ( val > max ) p = 0.0; \ + r = 255.0*p; g = 255.0*p; b = 255.0*p; + /* NB This function is shared between render_get_image() and * render_get_colour_scale() */ @@ -238,10 +246,23 @@ GdkPixbuf *render_get_image(DisplayWindow *dw) guchar r, g, b; val = hdr[x+w*y]; - if ( !dw->monochrome ) { + switch ( dw->scale ) { + case SCALE_COLOUR : { RENDER_RGB - } else { + break; + } + case SCALE_MONO : { RENDER_MONO + break; + } + case SCALE_INVMONO : { + RENDER_INVMONO + break; + } + default : { + RENDER_RGB; + break; + } } /* Stuff inside square brackets makes this pixel go to diff --git a/src/render.h b/src/render.h index e030f27b..29f69ec4 100644 --- a/src/render.h +++ b/src/render.h @@ -23,8 +23,14 @@ #include "displaywindow.h" +enum { + SCALE_COLOUR, + SCALE_MONO, + SCALE_INVMONO +}; + extern GdkPixbuf *render_get_image(DisplayWindow *dw); -extern GdkPixbuf *render_get_colour_scale(size_t w, size_t h, int monochrome); +extern GdkPixbuf *render_get_colour_scale(size_t w, size_t h, int scale); #endif /* RENDER_H */ |