aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/displaywindow.ui4
-rw-r--r--src/displaywindow.c75
-rw-r--r--src/displaywindow.h3
-rw-r--r--src/image.c3
-rw-r--r--src/image.h4
-rw-r--r--src/peaks.c3
-rw-r--r--src/render.c25
-rw-r--r--src/render.h8
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 */