diff options
author | nirav <nirav@teisuu.com> | 2018-09-09 12:13:13 +0530 |
---|---|---|
committer | Dandelion <nirav@teisuu.com> | 2018-09-09 12:46:57 +0530 |
commit | e54d8327819e310b7b148e45c15fca197be845c7 (patch) | |
tree | 04e513d52ed2191364e6b9472cd0f3882a60da4a /src/image.c | |
parent | 661756c9237a26562cae102f53b12aa0b403fde1 (diff) | |
download | im-e54d8327819e310b7b148e45c15fca197be845c7.tar.gz im-e54d8327819e310b7b148e45c15fca197be845c7.zip |
Moved source files to src dir, updated makefile
Diffstat (limited to 'src/image.c')
-rw-r--r-- | src/image.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/image.c b/src/image.c new file mode 100644 index 0000000..d4765fd --- /dev/null +++ b/src/image.c @@ -0,0 +1,97 @@ +#include "image.h" +#include "window.h" +#include <gtk-3.0/gtk/gtk.h> + +GtkWidget *new_image() +{ + image = gtk_image_new(); + return image; +} + +int load_image(char *file_name) +{ + GError *error = NULL; + if (pixbuf != NULL) + g_object_unref(pixbuf); + pixbuf = gdk_pixbuf_new_from_file(file_name, &error); + if (error) + return -1; + curr_pixbuf_width = pixbuf_width = gdk_pixbuf_get_width(GDK_PIXBUF(pixbuf)); + curr_pixbuf_height = pixbuf_height = + gdk_pixbuf_get_height(GDK_PIXBUF(pixbuf)); + aspect_ratio = (double)pixbuf_width / (double)pixbuf_height; + curr_zoom = 1.0; + fit_image(); + set_window_title(g_path_get_basename(file_name)); + return 1; +} + +void update_pixbuf() +{ + if (curr_pixbuf != NULL) + g_object_unref(curr_pixbuf); + if (pixbuf == NULL) + return; + curr_pixbuf = + gdk_pixbuf_scale_simple(GDK_PIXBUF(pixbuf), curr_pixbuf_width, + curr_pixbuf_height, GDK_INTERP_BILINEAR); + gtk_image_set_from_pixbuf(GTK_IMAGE(image), GDK_PIXBUF(curr_pixbuf)); +} + +void fit_image() +{ + gint win_width, win_height; + get_curr_win_size(&win_width, &win_height); + curr_scale_mod = fit; + if (pixbuf == NULL || win_width < 1 || win_height < 1) + return; + if (win_width < pixbuf_width && win_height > pixbuf_height) { + curr_pixbuf_width = win_width; + curr_pixbuf_height = (double)curr_pixbuf_width / aspect_ratio; + } else if (win_width > pixbuf_width && win_height < pixbuf_height) { + curr_pixbuf_height = win_height; + curr_pixbuf_width = (double)curr_pixbuf_height * aspect_ratio; + } else if (win_width < pixbuf_width && win_height < pixbuf_height) { + if (((double)win_width / (double)win_height) > aspect_ratio) { + curr_pixbuf_height = win_height; + curr_pixbuf_width = ((double)curr_pixbuf_height * aspect_ratio); + } else { + curr_pixbuf_width = win_width; + curr_pixbuf_height = (double)curr_pixbuf_width / aspect_ratio; + } + } else { + curr_pixbuf_width = pixbuf_width; + curr_pixbuf_height = pixbuf_height; + } + + curr_zoom = (double)curr_pixbuf_width / (double)pixbuf_width; + if (curr_pixbuf_width < 1 || curr_pixbuf_height < 1) + return; + + update_pixbuf(); +} + +void zoom(int type) +{ + curr_scale_mod = zoomed; + if (pixbuf == NULL) + return; + if (type == 0) { + if (curr_zoom == 1.0) + return; + curr_zoom = 1.0; + } else if (type < 0) { + if (curr_zoom < 0.2) + return; + curr_zoom -= 0.1; + } else if (type > 0) { + if (curr_zoom > 2) + return; + curr_zoom += 0.1; + } + + curr_pixbuf_width = curr_zoom * (double)pixbuf_width; + curr_pixbuf_height = curr_zoom * (double)pixbuf_height; + + update_pixbuf(); +} |