From dafe7eac742301952c088d68a455586b0225a7bd Mon Sep 17 00:00:00 2001 From: Bert Date: Fri, 25 Feb 2011 12:08:12 +0100 Subject: Refactored imlib context handling --- image.c | 74 ++++++++++++++++++++++++++++++++++------------------------------- 1 file changed, 39 insertions(+), 35 deletions(-) (limited to 'image.c') diff --git a/image.c b/image.c index 3d1cd0c..628f0a3 100644 --- a/image.c +++ b/image.c @@ -17,7 +17,6 @@ */ #include -#include #include "config.h" #include "icon.h" @@ -39,6 +38,7 @@ void img_init(img_t *img, win_t *win) { im_broken = imlib_create_image_using_data(32, 32, icon_broken); if (img) { + img->im = NULL; img->zoom = options->zoom; img->zoom = MAX(img->zoom, zoom_min); img->zoom = MIN(img->zoom, zoom_max); @@ -53,48 +53,38 @@ void img_init(img_t *img, win_t *win) { } void img_free(img_t* img) { - if (img && img->valid && imlib_context_get_image()) - imlib_free_image(); imlib_context_set_image(im_broken); imlib_free_image(); } -int _imlib_load_image(const char *filename) { +int img_check(const char *filename) { Imlib_Image *im; if (!filename) return 0; - if (access(filename, F_OK) || !(im = imlib_load_image(filename))) { + if (!access(filename, F_OK) && (im = imlib_load_image(filename))) { + imlib_context_set_image(im); + imlib_image_set_changes_on_disk(); + imlib_free_image(); + return 1; + } else { warn("could not open file: %s", filename); return 0; } - - imlib_context_set_image(im); - imlib_image_set_changes_on_disk(); - - return 1; -} - -int img_check(const char *filename) { - int ret; - - if ((ret = _imlib_load_image(filename))) - imlib_free_image(); - return ret; } int img_load(img_t *img, const char *filename) { if (!img || !filename) return 0; - if (img->valid && imlib_context_get_image()) - imlib_free_image(); - - if ((img->valid = _imlib_load_image(filename))) { + if (!access(filename, F_OK) && (img->im = imlib_load_image(filename))) { + imlib_context_set_image(img->im); + imlib_image_set_changes_on_disk(); imlib_context_set_anti_alias(img->aa); img->scalemode = options->scalemode; } else { + warn("could not open file: %s", filename); imlib_context_set_image(im_broken); imlib_context_set_anti_alias(0); img->scalemode = SCALE_DOWN; @@ -109,6 +99,14 @@ int img_load(img_t *img, const char *filename) { return 1; } +void img_close(img_t *img) { + if (img && img->im) { + imlib_context_set_image(img->im); + imlib_free_image(); + img->im = NULL; + } +} + void img_check_pan(img_t *img, win_t *win) { if (!img || !win) return; @@ -152,7 +150,7 @@ void img_render(img_t *img, win_t *win) { int sx, sy, sw, sh; int dx, dy, dw, dh; - if (!img || !win || !imlib_context_get_image()) + if (!img || !win) return; if (img->scalemode != SCALE_ZOOM) { @@ -198,6 +196,11 @@ void img_render(img_t *img, win_t *win) { win_clear(win); + if (img->im) + imlib_context_set_image(img->im); + else + imlib_context_set_image(im_broken); + imlib_context_set_drawable(win->pm); imlib_render_image_part_on_drawable_at_size(sx, sy, sw, sh, dx, dy, dw, dh); @@ -205,7 +208,7 @@ void img_render(img_t *img, win_t *win) { } int img_fit_win(img_t *img, win_t *win) { - if (!img || !img->valid || !win) + if (!img || !img->im || !win) return 0; img->scalemode = SCALE_FIT; @@ -228,7 +231,7 @@ int img_center(img_t *img, win_t *win) { } int img_zoom(img_t *img, float z) { - if (!img || !img->valid) + if (!img || !img->im) return 0; z = MAX(z, zoom_min); @@ -250,7 +253,7 @@ int img_zoom(img_t *img, float z) { int img_zoom_in(img_t *img) { int i; - if (!img || !img->valid) + if (!img || !img->im) return 0; for (i = 1; i < zl_cnt; ++i) { @@ -263,7 +266,7 @@ int img_zoom_in(img_t *img) { int img_zoom_out(img_t *img) { int i; - if (!img || !img->valid) + if (!img || !img->im) return 0; for (i = zl_cnt - 2; i >= 0; --i) { @@ -276,7 +279,7 @@ int img_zoom_out(img_t *img) { int img_move(img_t *img, win_t *win, int dx, int dy) { int ox, oy; - if (!img || !img->valid || !win) + if (!img || !img->im || !win) return 0; ox = img->x; @@ -291,7 +294,7 @@ int img_move(img_t *img, win_t *win, int dx, int dy) { } int img_pan(img_t *img, win_t *win, pandir_t dir) { - if (!img || !img->valid || !win) + if (!img || !img->im || !win) return 0; switch (dir) { @@ -311,12 +314,13 @@ int img_pan(img_t *img, win_t *win, pandir_t dir) { void img_rotate(img_t *img, win_t *win, int d) { int ox, oy, tmp; - if (!img || !img->valid || !win) + if (!img || !img->im || !win) return; ox = d == 1 ? img->x : win->w - img->x - img->w * img->zoom; oy = d == 3 ? img->y : win->h - img->y - img->h * img->zoom; + imlib_context_set_image(img->im); imlib_image_orientate(d); img->x = oy + (win->w - win->h) / 2; @@ -338,9 +342,9 @@ void img_rotate_right(img_t *img, win_t *win) { } void img_toggle_antialias(img_t *img) { - if (!img || !img->valid) - return; - - img->aa ^= 1; - imlib_context_set_anti_alias(img->aa); + if (img && img->im) { + img->aa ^= 1; + imlib_context_set_image(img->im); + imlib_context_set_anti_alias(img->aa); + } } -- cgit v1.2.3-54-g00ecf