diff options
Diffstat (limited to 'src/imagedisplay.c')
-rw-r--r-- | src/imagedisplay.c | 70 |
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); } |