From bcc70bd7cbcdf56e84984929d9f8c6f1776f2204 Mon Sep 17 00:00:00 2001 From: Bert Date: Thu, 17 Feb 2011 11:04:58 +0100 Subject: [PATCH] Who needs threads to load thumbnails? --- Makefile | 4 +-- main.c | 20 ++++++----- thumbs.c | 104 +++++++++++++++++++------------------------------------ thumbs.h | 6 ++-- 4 files changed, 52 insertions(+), 82 deletions(-) diff --git a/Makefile b/Makefile index dd4427f..1a6c8a4 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ all: sxiv -VERSION=git-20110216 +VERSION=git-20110217 CC?=gcc PREFIX?=/usr/local CFLAGS+= -Wall -pedantic -DVERSION=\"$(VERSION)\" LDFLAGS+= -LIBS+= -lX11 -lImlib2 -lpthread +LIBS+= -lX11 -lImlib2 SRCFILES=$(wildcard *.c) OBJFILES=$(SRCFILES:.c=.o) diff --git a/main.c b/main.c index 2fccf7a..ec770e6 100644 --- a/main.c +++ b/main.c @@ -54,6 +54,8 @@ const char **filenames; int filecnt, fileidx; size_t filesize; +int tns_loaded; + #define TITLE_LEN 256 char win_title[TITLE_LEN]; @@ -128,13 +130,13 @@ int main(int argc, char **argv) { win_open(&win); img_init(&img, &win); - if (options->thumbnails) - tns_load(&tns, &win, filenames, filecnt); + if (options->thumbnails) { + tns_loaded = 0; + tns_init(&tns, filecnt); + } if (options->thumbnails == 2) { mode = MODE_THUMBS; - tns.first = tns.sel = 0; - tns_render(&tns, &win); } else { mode = MODE_NORMAL; load_image(); @@ -473,7 +475,12 @@ void run() { timeout = 0; while (1) { - if (timeout || (mode == MODE_THUMBS && !tns.loaded)) { + if (mode == MODE_THUMBS && tns_loaded < filecnt) { + tns_load(&tns, &win, filenames[tns_loaded++]); + tns_render(&tns, &win); + if (!XPending(win.env.dpy)) + continue; + } else if (timeout) { t.tv_sec = 0; t.tv_usec = 250; xfd = ConnectionNumber(win.env.dpy); @@ -486,9 +493,6 @@ void run() { img_render(&img, &win); else tns_render(&tns, &win); - - if (mode == MODE_THUMBS && !tns.loaded && !XPending(win.env.dpy)) - continue; } } diff --git a/thumbs.c b/thumbs.c index d8de3e8..9a8791f 100644 --- a/thumbs.c +++ b/thumbs.c @@ -18,7 +18,6 @@ #include #include -#include #include @@ -26,75 +25,14 @@ #include "thumbs.h" #include "util.h" -typedef struct tload_s { - const char **filenames; - tns_t *tns; - win_t *win; -} tload_t; - const int thumb_dim = THUMB_SIZE + 10; -pthread_t loader; -tload_t tinfo; - -void* thread_load(void *arg) { - int i, w, h; - float z, zw, zh; - tload_t *tl; - thumb_t *t; - Imlib_Image *im; - - tl = (tload_t*) arg; - - for (i = 0; i < tl->tns->cnt; ++i) { - if (!(im = imlib_load_image(tl->filenames[i]))) - continue; - - imlib_context_set_image(im); - - w = imlib_image_get_width(); - h = imlib_image_get_height(); - zw = (float) THUMB_SIZE / (float) w; - zh = (float) THUMB_SIZE / (float) h; - z = MIN(zw, zh); - - t = &tl->tns->thumbs[i]; - t->w = z * w; - t->h = z * h; - - t->pm = win_create_pixmap(tl->win, t->w, t->h); - imlib_context_set_drawable(t->pm); - imlib_render_image_part_on_drawable_at_size(0, 0, w, h, - 0, 0, t->w, t->h); - t->loaded = 1; - imlib_free_image(); - } - - tl->tns->loaded = 1; - - return 0; -} - -void tns_load(tns_t *tns, win_t *win, const char **fnames, int fcnt) { - pthread_attr_t tattr; - - if (!tns || !win || !fnames || !fcnt) +void tns_init(tns_t *tns, int cnt) { + if (!tns) return; - - tns->thumbs = (thumb_t*) s_malloc(fcnt * sizeof(thumb_t)); - memset(tns->thumbs, 0, fcnt * sizeof(thumb_t)); - tns->cnt = fcnt; - tns->loaded = 0; - tinfo.filenames = fnames; - tinfo.tns = tns; - tinfo.win = win; - - pthread_attr_init(&tattr); - pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_JOINABLE); - - if (pthread_create(&loader, &tattr, thread_load, (void*) &tinfo)) - die("could not create thread"); + tns->cnt = tns->first = tns->sel = 0; + tns->thumbs = (thumb_t*) s_malloc(cnt * sizeof(thumb_t)); } void tns_free(tns_t *tns, win_t *win) { @@ -110,6 +48,37 @@ void tns_free(tns_t *tns, win_t *win) { tns->thumbs = NULL; } +void tns_load(tns_t *tns, win_t *win, const char *filename) { + int w, h; + float z, zw, zh; + thumb_t *t; + Imlib_Image *im; + + if (!tns || !win || !filename) + return; + + if (!(im = imlib_load_image(filename))) + return; + + imlib_context_set_image(im); + + w = imlib_image_get_width(); + h = imlib_image_get_height(); + zw = (float) THUMB_SIZE / (float) w; + zh = (float) THUMB_SIZE / (float) h; + z = MIN(zw, zh); + + t = &tns->thumbs[tns->cnt++]; + t->w = z * w; + t->h = z * h; + + t->pm = win_create_pixmap(win, t->w, t->h); + imlib_context_set_drawable(t->pm); + imlib_render_image_part_on_drawable_at_size(0, 0, w, h, + 0, 0, t->w, t->h); + imlib_free_image(); +} + void tns_render(tns_t *tns, win_t *win) { int i, cnt, x, y; @@ -130,9 +99,6 @@ void tns_render(tns_t *tns, win_t *win) { i = tns->first; while (i < cnt) { - if (!tns->thumbs[i].loaded) - continue; - tns->thumbs[i].x = x + (THUMB_SIZE - tns->thumbs[i].w) / 2; tns->thumbs[i].y = y + (THUMB_SIZE - tns->thumbs[i].h) / 2; win_draw_pixmap(win, tns->thumbs[i].pm, tns->thumbs[i].x, diff --git a/thumbs.h b/thumbs.h index bfc6573..170be27 100644 --- a/thumbs.h +++ b/thumbs.h @@ -27,12 +27,10 @@ typedef struct thumb_s { int w; int h; Pixmap pm; - unsigned char loaded; } thumb_t; typedef struct tns_s { thumb_t *thumbs; - unsigned char loaded; int cnt; int cols; int rows; @@ -42,9 +40,11 @@ typedef struct tns_s { extern const int thumb_dim; -void tns_load(tns_t*, win_t*, const char**, int); +void tns_init(tns_t*, int); void tns_free(tns_t*, win_t*); +void tns_load(tns_t*, win_t*, const char*); + void tns_render(tns_t*, win_t*); #endif /* THUMBS_H */