aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw27@cam.ac.uk>2009-04-06 16:54:48 +0100
committerThomas White <taw27@cam.ac.uk>2009-04-06 16:54:48 +0100
commit1dca13f19111c01204abd7deb3a9f027a7a733a0 (patch)
tree0c388cbaf51ddd285ef3235b609fd6407e78976f
parent114a2e0b5ca587784bbb6f302b4786e32fbc885f (diff)
Make circles smaller, and remove trailing spaces
-rw-r--r--src/imagedisplay.c143
1 files changed, 71 insertions, 72 deletions
diff --git a/src/imagedisplay.c b/src/imagedisplay.c
index 8915c41..574e3f2 100644
--- a/src/imagedisplay.c
+++ b/src/imagedisplay.c
@@ -34,10 +34,10 @@ static void imagedisplay_rescale(ImageDisplay *imagedisplay, unsigned int v_w, u
unsigned int w, h;
float aspect_image, aspect_window;
-
+
w = imagedisplay->imagerecord.width;
h = imagedisplay->imagerecord.height;
-
+
/* Preserve aspect ratio */
aspect_image = (float)w/h;
aspect_window = (float)v_w/v_h;
@@ -46,16 +46,16 @@ static void imagedisplay_rescale(ImageDisplay *imagedisplay, unsigned int v_w, u
} else {
v_h = v_w/aspect_image;
}
-
+
if ( imagedisplay->pixbuf_scaled ) {
g_object_unref(imagedisplay->pixbuf_scaled);
}
-
+
/* Create the scaled pixbuf from the 8-bit display data */
imagedisplay->pixbuf_scaled = gdk_pixbuf_scale_simple(imagedisplay->pixbuf, v_w, v_h, GDK_INTERP_BILINEAR);
imagedisplay->view_width = v_w;
imagedisplay->view_height = v_h;
-
+
}
static gboolean imagedisplay_configure_event(GtkWidget *widget, GdkEventConfigure *event, ImageDisplay *imagedisplay) {
@@ -63,7 +63,7 @@ static gboolean imagedisplay_configure_event(GtkWidget *widget, GdkEventConfigur
imagedisplay->drawingarea_width = event->width;
imagedisplay->drawingarea_height = event->height;
imagedisplay_rescale(imagedisplay, event->width, event->height);
-
+
return FALSE;
}
@@ -75,14 +75,14 @@ void imagedisplay_put_data(ImageDisplay *imagedisplay, ImageRecord imagerecord)
int min, max;
double c, scale;
int b;
-
+
h = imagerecord.height;
w = imagerecord.width;
-
+
if ( imagedisplay->pixbuf ) {
g_object_unref(imagedisplay->pixbuf);
}
-
+
min = 2<<15; max = 0;
b = (h+w)/20; /* Number of pixels of ignored border */
for ( y=b; y<h-b; y++ ) {
@@ -93,33 +93,33 @@ void imagedisplay_put_data(ImageDisplay *imagedisplay, ImageRecord imagerecord)
if ( val < min ) min = val;
}
}
-
+
c = 0.1;
scale = 255.0 / log(1+c*(max-min));
-
+
/* Turn 16-bit image data into 8-bit display data */
imagedisplay->data = malloc(3*w*h);
for ( y=0; y<h; y++ ) {
for ( x=0; x<w; x++ ) {
-
+
uint16_t val16, val8;
-
+
val16 = imagerecord.image[x+w*y];
val8 = scale * log(1+c*(val16-min));
-
+
imagedisplay->data[3*( x+w*(h-1-y) )] = val8;
imagedisplay->data[3*( x+w*(h-1-y) )+1] = val8;
imagedisplay->data[3*( x+w*(h-1-y) )+2] = val8;
-
+
}
}
-
+
memcpy(&imagedisplay->imagerecord, &imagerecord, sizeof(ImageRecord));
-
+
/* Create the pixbuf from the 8-bit display data */
imagedisplay->pixbuf = gdk_pixbuf_new_from_data(imagedisplay->data, GDK_COLORSPACE_RGB, FALSE, 8, w, h, w*3,
(GdkPixbufDestroyNotify)imagedisplay_free_data, imagedisplay);
-
+
if ( imagedisplay->realised ) {
imagedisplay_force_redraw(imagedisplay);
}
@@ -127,9 +127,9 @@ void imagedisplay_put_data(ImageDisplay *imagedisplay, ImageRecord imagerecord)
}
void imagedisplay_clear_marks(ImageDisplay *imagedisplay) {
-
+
ImageDisplayMark *cur;
-
+
cur = imagedisplay->marks;
while ( cur ) {
ImageDisplayMark *next = cur->next;
@@ -137,28 +137,28 @@ void imagedisplay_clear_marks(ImageDisplay *imagedisplay) {
cur = next;
}
imagedisplay->marks = NULL;
-
+
}
static void imagedisplay_destroyed(GtkWidget *widget, ImageDisplay *imagedisplay) {
imagedisplay_clear_marks(imagedisplay);
-
+
if ( imagedisplay->flags & IMAGEDISPLAY_QUIT_IF_CLOSED ) {
gtk_exit(0);
}
-
+
g_object_unref(G_OBJECT(imagedisplay->gc_centre));
g_object_unref(G_OBJECT(imagedisplay->gc_tiltaxis));
g_object_unref(G_OBJECT(imagedisplay->gc_marks_1));
g_object_unref(G_OBJECT(imagedisplay->gc_marks_2));
-
+
if ( imagedisplay->flags & IMAGEDISPLAY_FREE ) {
free(imagedisplay->imagerecord.image);
}
free(imagedisplay);
-
+
}
void imagedisplay_close(ImageDisplay *imagedisplay) {
@@ -176,11 +176,11 @@ static void imagedisplay_add_scalebar(ImageDisplay *imagedisplay, GtkWidget *dra
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;
@@ -200,20 +200,20 @@ static void imagedisplay_add_scalebar(ImageDisplay *imagedisplay, GtkWidget *dra
xoffs+(x2), yoffs+imagedisplay->view_height-1-(y2)))
static gboolean imagedisplay_redraw(GtkWidget *drawingarea, GdkEventExpose *event, ImageDisplay *imagedisplay) {
-
+
double scale, xoffs, yoffs;
ImageDisplayMark *cur;
double max;
-
+
xoffs = ((double)imagedisplay->drawingarea_width - imagedisplay->view_width) / 2;
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,
0, 0, xoffs, yoffs, imagedisplay->view_width, imagedisplay->view_height,
GDK_RGB_DITHER_NONE, 0, 0);
-
+
if ( imagedisplay->flags & IMAGEDISPLAY_SHOW_TILT_AXIS ) {
/* This is nasty, but works */
imagedisplay_draw_line(imagedisplay->gc_tiltaxis,
@@ -229,12 +229,12 @@ static gboolean imagedisplay_redraw(GtkWidget *drawingarea, GdkEventExpose *even
(imagedisplay->imagerecord.y_centre - imagedisplay->imagerecord.width
* tan(imagedisplay->imagerecord.omega)) * scale);
}
-
+
/* Add scale bar */
if ( imagedisplay->flags & IMAGEDISPLAY_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,
@@ -253,23 +253,23 @@ static gboolean imagedisplay_redraw(GtkWidget *drawingarea, GdkEventExpose *even
cur = imagedisplay->marks;
max = 0.0;
while ( cur ) {
-
+
if ( cur->weight < 0.0 ) {
//printf("ID: Warning: ImageDisplayMark with negative weight\n");
cur = cur->next;
continue;
}
-
+
if ( log(1+0.1*cur->weight) > max ) max = log(1+0.1*cur->weight);
cur = cur->next;
-
+
}
-
+
cur = imagedisplay->marks;
while ( cur ) {
-
+
GdkGC *gc;
-
+
switch ( cur->type ) {
case IMAGEDISPLAY_MARK_CIRCLE_1 : gc = imagedisplay->gc_marks_1; break;
case IMAGEDISPLAY_MARK_CIRCLE_2 : gc = imagedisplay->gc_marks_2; break;
@@ -278,39 +278,39 @@ static gboolean imagedisplay_redraw(GtkWidget *drawingarea, GdkEventExpose *even
case IMAGEDISPLAY_MARK_LINE_2 : gc = imagedisplay->gc_marks_2; break;
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) ) {
-
+
double r;
-
+
if ( cur->weight < 0.0 ) {
cur = cur->next;
continue;
}
-
+
if ( cur->type == IMAGEDISPLAY_MARK_CIRCLE_1 ) {
r = 10.0;
} else {
- r = 20.0 * (log(1+0.1*cur->weight)/max);
+ r = 10.0 * (log(1+0.1*cur->weight)/max);
}
-
+
gdk_draw_arc(drawingarea->window, gc, FALSE,
xoffs + cur->x*scale - r,
yoffs + imagedisplay->view_height-1-cur->y*scale - r,
2*r, 2*r, 0, 64*360);
-
+
} else if ( (cur->type == IMAGEDISPLAY_MARK_LINE_1) || (cur->type == IMAGEDISPLAY_MARK_LINE_2) ) {
-
+
gdk_draw_line(drawingarea->window, gc,
xoffs + cur->x*scale,
yoffs + imagedisplay->view_height-1-cur->y*scale,
xoffs + cur->x2*scale,
yoffs + imagedisplay->view_height-1-cur->y2*scale );
-
+
}
-
+
cur = cur->next;
}
@@ -321,11 +321,11 @@ static gboolean imagedisplay_redraw(GtkWidget *drawingarea, GdkEventExpose *even
static gint imagedisplay_realize(GtkWidget *widget, ImageDisplay *imagedisplay) {
GdkColor colour;
-
+
imagedisplay->gc_centre = gdk_gc_new(imagedisplay->drawingarea->window);
gdk_color_parse("yellow", &colour);
gdk_gc_set_rgb_fg_color(imagedisplay->gc_centre, &colour);
-
+
imagedisplay->gc_tiltaxis = gdk_gc_new(imagedisplay->drawingarea->window);
gdk_color_parse("#6600dd", &colour);
gdk_gc_set_rgb_fg_color(imagedisplay->gc_tiltaxis, &colour);
@@ -350,14 +350,14 @@ static gint imagedisplay_realize(GtkWidget *widget, ImageDisplay *imagedisplay)
imagedisplay->realised = TRUE;
return 0;
-
+
}
ImageDisplay *imagedisplay_new_nowindow(ImageRecord imagerecord, ImageDisplayFlags flags, const char *message,
GCallback mouse_click_func, gpointer callback_data) {
ImageDisplay *imagedisplay;
-
+
imagedisplay = malloc(sizeof(ImageDisplay));
imagedisplay->imagerecord = imagerecord;
imagedisplay->view_width = 512;
@@ -370,27 +370,27 @@ ImageDisplay *imagedisplay_new_nowindow(ImageRecord imagerecord, ImageDisplayFla
imagedisplay->pixbuf_scaled = NULL;
imagedisplay->realised = FALSE;
imagedisplay->window = NULL;
-
+
imagedisplay_put_data(imagedisplay, imagerecord);
-
+
imagedisplay->vbox = gtk_vbox_new(FALSE, 0);
-
+
if ( message ) {
GtkWidget *label;
label = gtk_label_new(message);
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
gtk_box_pack_start(GTK_BOX(imagedisplay->vbox), label, FALSE, TRUE, 3);
}
-
+
imagedisplay->drawingarea = gtk_drawing_area_new();
gtk_box_pack_start(GTK_BOX(imagedisplay->vbox), imagedisplay->drawingarea, TRUE, TRUE, 0);
-
+
if ( imagedisplay->mouse_click_func ) {
gtk_widget_add_events(GTK_WIDGET(imagedisplay->drawingarea), GDK_BUTTON_PRESS_MASK);
g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "button-press-event",
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",
@@ -399,7 +399,7 @@ ImageDisplay *imagedisplay_new_nowindow(ImageRecord imagerecord, ImageDisplayFla
G_CALLBACK(imagedisplay_configure_event), imagedisplay);
g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "expose-event",
G_CALLBACK(imagedisplay_redraw), imagedisplay);
-
+
return imagedisplay;
}
@@ -411,24 +411,24 @@ ImageDisplay *imagedisplay_open_with_message(ImageRecord imagerecord, const char
ImageDisplay *imagedisplay;
GdkGeometry geom;
-
+
imagedisplay = imagedisplay_new_nowindow(imagerecord, flags, message, mouse_click_func, callback_data);
-
+
imagedisplay->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_add(GTK_CONTAINER(imagedisplay->window), imagedisplay->vbox);
imagedisplay->title = strdup(title);
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_default_size(GTK_WINDOW(imagedisplay->window), 512, 512);
-
+
gtk_widget_show_all(imagedisplay->window);
-
+
return imagedisplay;
-
+
}
ImageDisplay *imagedisplay_open(ImageRecord image, const char *title, ImageDisplayFlags flags) {
@@ -438,13 +438,13 @@ ImageDisplay *imagedisplay_open(ImageRecord image, const char *title, ImageDispl
void imagedisplay_add_mark(ImageDisplay *imagedisplay, double x, double y, ImageDisplayMarkType type, double weight) {
ImageDisplayMark *new;
-
+
new = malloc(sizeof(ImageDisplayMark));
new->x = x; new->y = y;
new->type = type;
new->weight = weight;
new->next = NULL;
-
+
if ( !imagedisplay->marks ) {
imagedisplay->marks = new;
} else {
@@ -461,14 +461,14 @@ void imagedisplay_add_line(ImageDisplay *imagedisplay, double x1, double y1,
double x2, double y2, ImageDisplayMarkType type) {
ImageDisplayMark *new;
-
+
new = malloc(sizeof(ImageDisplayMark));
new->x = x1; new->y = y1;
new->x2 = x2; new->y2 = y2;
new->type = type;
new->weight = 1.0; /* This field makes little sense for a line */
new->next = NULL;
-
+
if ( !imagedisplay->marks ) {
imagedisplay->marks = new;
} else {
@@ -486,4 +486,3 @@ void imagedisplay_force_redraw(ImageDisplay *imagedisplay) {
gtk_widget_queue_draw_area(imagedisplay->drawingarea, 0, 0, imagedisplay->drawingarea_width,
imagedisplay->drawingarea_height);
}
-