aboutsummaryrefslogtreecommitdiff
path: root/src/imagedisplay.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/imagedisplay.c')
-rw-r--r--src/imagedisplay.c70
1 files changed, 58 insertions, 12 deletions
diff --git a/src/imagedisplay.c b/src/imagedisplay.c
index 00b7285..42026d2 100644
--- a/src/imagedisplay.c
+++ b/src/imagedisplay.c
@@ -3,7 +3,7 @@
*
* Show raw and processed images
*
- * (c) 2007 Thomas White <taw27@cam.ac.uk>
+ * (c) 2007-2008 Thomas White <taw27@cam.ac.uk>
*
* dtr - Diffraction Tomography Reconstruction
*
@@ -23,6 +23,7 @@
#include "imagedisplay.h"
#include "utils.h"
+#include "mapping.h"
/* Free pixbuf data when reference count drops to zero */
static void imagedisplay_free_data(guchar *image_eightbit, ImageDisplay *imagedisplay) {
@@ -167,6 +168,33 @@ void imagedisplay_close(ImageDisplay *imagedisplay) {
}
}
+static void imagedisplay_add_scalebar(ImageDisplay *imagedisplay, GtkWidget *drawingarea,
+ double scale, double xoffs, double yoffs) {
+
+ PangoLayout *layout;
+ double sb;
+ PangoRectangle rect;
+ int bwidth, bheight;
+ int view_height = imagedisplay->view_height;
+
+ sb = mapping_scale_bar_length(&imagedisplay->imagerecord);
+ layout = gtk_widget_create_pango_layout(drawingarea, "1 nm^-1");
+ pango_layout_get_pixel_extents(layout, &rect, NULL);
+
+ bwidth = (sb*scale)+20;
+ bheight = rect.height+30;
+ if ( rect.width > bwidth ) bwidth = rect.width+20;
+ gdk_draw_rectangle(drawingarea->window, drawingarea->style->bg_gc[GTK_WIDGET_STATE(drawingarea)], TRUE,
+ xoffs+20, yoffs+view_height-20-bheight,
+ bwidth, bheight);
+ gdk_draw_line(drawingarea->window, imagedisplay->gc_scalebar,
+ xoffs+30, yoffs+view_height-30,
+ xoffs+30+(scale*sb), yoffs+view_height-30);
+ gdk_draw_layout(drawingarea->window, drawingarea->style->fg_gc[GTK_WIDGET_STATE(drawingarea)],
+ xoffs+30, yoffs+view_height-20-bheight+10, layout);
+
+}
+
#define imagedisplay_draw_line(gc,x1,y1,x2,y2) (gdk_draw_line(drawingarea->window,gc, \
xoffs+(x1), yoffs+imagedisplay->view_height-1-(y1), \
xoffs+(x2), yoffs+imagedisplay->view_height-1-(y2)))
@@ -181,7 +209,8 @@ static gboolean imagedisplay_redraw(GtkWidget *drawingarea, GdkEventExpose *even
yoffs = ((double)imagedisplay->drawingarea_height - imagedisplay->view_height) / 2;
scale = (double)imagedisplay->view_width/imagedisplay->imagerecord.width;
- gdk_draw_pixbuf(drawingarea->window, drawingarea->style->bg_gc[GTK_WIDGET_STATE(drawingarea)], imagedisplay->pixbuf_scaled,
+ gdk_draw_pixbuf(drawingarea->window, drawingarea->style->bg_gc[GTK_WIDGET_STATE(drawingarea)],
+ imagedisplay->pixbuf_scaled,
0, 0, xoffs, yoffs, imagedisplay->view_width, imagedisplay->view_height,
GDK_RGB_DITHER_NONE, 0, 0);
@@ -201,6 +230,9 @@ static gboolean imagedisplay_redraw(GtkWidget *drawingarea, GdkEventExpose *even
* tan(imagedisplay->imagerecord.omega)) * scale);
}
+ /* Add scale bar */
+ imagedisplay_add_scalebar(imagedisplay, drawingarea, scale, xoffs, yoffs);
+
/* NB This calls the function above, which sorts out stuff */
if ( imagedisplay->flags & IMAGEDISPLAY_SHOW_CENTRE ) {
imagedisplay_draw_line(imagedisplay->gc_centre,
@@ -245,8 +277,9 @@ static gboolean imagedisplay_redraw(GtkWidget *drawingarea, GdkEventExpose *even
default : gc = imagedisplay->gc_marks_1; break;
}
- if ( (cur->type == IMAGEDISPLAY_MARK_CIRCLE_1) || (cur->type == IMAGEDISPLAY_MARK_CIRCLE_2)
- || (cur->type == IMAGEDISPLAY_MARK_CIRCLE_3) ) {
+ if ( (cur->type == IMAGEDISPLAY_MARK_CIRCLE_1)
+ || (cur->type == IMAGEDISPLAY_MARK_CIRCLE_2)
+ || (cur->type == IMAGEDISPLAY_MARK_CIRCLE_3) ) {
double r;
@@ -307,6 +340,11 @@ static gint imagedisplay_realize(GtkWidget *widget, ImageDisplay *imagedisplay)
gdk_color_parse("#00ddff", &colour);
gdk_gc_set_rgb_fg_color(imagedisplay->gc_marks_3, &colour);
+ imagedisplay->gc_scalebar = gdk_gc_new(imagedisplay->drawingarea->window);
+ gdk_color_parse("#000000", &colour);
+ gdk_gc_set_rgb_fg_color(imagedisplay->gc_scalebar, &colour);
+ gdk_gc_set_line_attributes(imagedisplay->gc_scalebar, 5, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER);
+
imagedisplay->realised = TRUE;
return 0;
@@ -351,10 +389,14 @@ ImageDisplay *imagedisplay_new_nowindow(ImageRecord imagerecord, ImageDisplayFla
G_CALLBACK(imagedisplay->mouse_click_func), callback_data);
}
- g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "realize", G_CALLBACK(imagedisplay_realize), imagedisplay);
- g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "destroy", G_CALLBACK(imagedisplay_destroyed), imagedisplay);
- g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "configure_event", G_CALLBACK(imagedisplay_configure_event), imagedisplay);
- g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "expose-event", G_CALLBACK(imagedisplay_redraw), imagedisplay);
+ g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "realize",
+ G_CALLBACK(imagedisplay_realize), imagedisplay);
+ g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "destroy",
+ G_CALLBACK(imagedisplay_destroyed), imagedisplay);
+ g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "configure_event",
+ G_CALLBACK(imagedisplay_configure_event), imagedisplay);
+ g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "expose-event",
+ G_CALLBACK(imagedisplay_redraw), imagedisplay);
return imagedisplay;
@@ -362,7 +404,8 @@ ImageDisplay *imagedisplay_new_nowindow(ImageRecord imagerecord, ImageDisplayFla
/* Display an image */
ImageDisplay *imagedisplay_open_with_message(ImageRecord imagerecord, const char *title, const char *message,
- ImageDisplayFlags flags, GCallback mouse_click_func, gpointer callback_data) {
+ ImageDisplayFlags flags, GCallback mouse_click_func,
+ gpointer callback_data) {
ImageDisplay *imagedisplay;
GdkGeometry geom;
@@ -375,7 +418,8 @@ ImageDisplay *imagedisplay_open_with_message(ImageRecord imagerecord, const char
gtk_window_set_title(GTK_WINDOW(imagedisplay->window), imagedisplay->title);
geom.min_width = 128; geom.min_height = 128;
- gtk_window_set_geometry_hints(GTK_WINDOW(imagedisplay->window), GTK_WIDGET(imagedisplay->drawingarea), &geom, GDK_HINT_MIN_SIZE);
+ gtk_window_set_geometry_hints(GTK_WINDOW(imagedisplay->window), GTK_WIDGET(imagedisplay->drawingarea),
+ &geom, GDK_HINT_MIN_SIZE);
gtk_window_set_default_size(GTK_WINDOW(imagedisplay->window), 512, 512);
@@ -411,7 +455,8 @@ void imagedisplay_add_mark(ImageDisplay *imagedisplay, double x, double y, Image
}
-void imagedisplay_add_line(ImageDisplay *imagedisplay, double x1, double y1, double x2, double y2, ImageDisplayMarkType type) {
+void imagedisplay_add_line(ImageDisplay *imagedisplay, double x1, double y1,
+ double x2, double y2, ImageDisplayMarkType type) {
ImageDisplayMark *new;
@@ -436,6 +481,7 @@ void imagedisplay_add_line(ImageDisplay *imagedisplay, double x1, double y1, dou
void imagedisplay_force_redraw(ImageDisplay *imagedisplay) {
imagedisplay_rescale(imagedisplay, imagedisplay->drawingarea_width, imagedisplay->drawingarea_height);
- gtk_widget_queue_draw_area(imagedisplay->drawingarea, 0, 0, imagedisplay->drawingarea_width, imagedisplay->drawingarea_height);
+ gtk_widget_queue_draw_area(imagedisplay->drawingarea, 0, 0, imagedisplay->drawingarea_width,
+ imagedisplay->drawingarea_height);
}