it* My version of sent Err codevoid.de 70 i Err codevoid.de 70 hgit clone git://git.codevoid.de/sent-sdk.git URL:git://git.codevoid.de/sent-sdk.git codevoid.de 70 1Log /git/sent-sdk/log.gph codevoid.de 70 1Files /git/sent-sdk/files.gph codevoid.de 70 1Refs /git/sent-sdk/refs.gph codevoid.de 70 1README /git/sent-sdk/file/README.md.gph codevoid.de 70 1LICENSE /git/sent-sdk/file/LICENSE.gph codevoid.de 70 i--- Err codevoid.de 70 1commit fd303ee9c1c969c4a50c6fcf0397973ea6f37dc7 /git/sent-sdk/commit/fd303ee9c1c969c4a50c6fcf0397973ea6f37dc7.gph codevoid.de 70 1parent 44a50ad94828d6375ebba9560109d06e9a163e5d /git/sent-sdk/commit/44a50ad94828d6375ebba9560109d06e9a163e5d.gph codevoid.de 70 hAuthor: Hiltjo Posthuma URL:mailto:hiltjo@codemadness.org codevoid.de 70 iDate: Sat, 4 Jun 2016 21:47:39 +0200 Err codevoid.de 70 i Err codevoid.de 70 iload slide image on-demand Err codevoid.de 70 i Err codevoid.de 70 iOn Sat, Jun 04, 2016 at 05:28:31PM +0200, Markus Teich wrote: Err codevoid.de 70 i> Hiltjo Posthuma wrote: Err codevoid.de 70 i> > previously an image file would be opened but only ffread when advancing to Err codevoid.de 70 i> > the slide, but when the slide was not used it gave an error: Err codevoid.de 70 i> > Err codevoid.de 70 i> > /usr/local/bin/2ff: failed to convert image/png Err codevoid.de 70 i> Err codevoid.de 70 i> Heyho Hiltjo, Err codevoid.de 70 i> Err codevoid.de 70 i> thanks for the patch. Unfortunately it does not work if the first slide contains Err codevoid.de 70 i> an image (ffopen is only called in advance). I think it would be good to merge Err codevoid.de 70 i> ffopen and ffread instead into a single function ffload. This makes the `LOADED` Err codevoid.de 70 i> state clearer and also enforces that the fd is closed in the same function where Err codevoid.de 70 i> it is opened. This ffload function should then be called in advance() replacing Err codevoid.de 70 i> the ffread() calls if the image is not loaded yet and once in load() for the Err codevoid.de 70 i> first slide if it is an image. Err codevoid.de 70 i> Err codevoid.de 70 i Err codevoid.de 70 iAh yes, sorry for the oversight. Err codevoid.de 70 i Err codevoid.de 70 i> If you want to take this new approach, go for it, otherwise I'll look into it Err codevoid.de 70 i> myself. Err codevoid.de 70 i> Err codevoid.de 70 i Err codevoid.de 70 iI have attached a patch that does this, I hope you'll like it. Err codevoid.de 70 i Err codevoid.de 70 iAlso I'm not sure if we need the below code in advance(), I have removed it in Err codevoid.de 70 itthe patch: Err codevoid.de 70 i Err codevoid.de 70 i if (slidecount > idx + 1 && slides[idx + 1].img) Err codevoid.de 70 i ffread(slides[idx + 1].img); Err codevoid.de 70 i if (0 < idx && slides[idx - 1].img) Err codevoid.de 70 i ffread(slides[idx - 1].img); Err codevoid.de 70 i Err codevoid.de 70 iThat seems to preload the next and previous slide image right? A minor issue I Err codevoid.de 70 inotice also is that images seem to flicker, it uses XPutImage directly to Err codevoid.de 70 ixw.win. Maybe it can be replaced with a backbuffer then XCopyArea? What do you Err codevoid.de 70 itthink? Err codevoid.de 70 i Err codevoid.de 70 iIn advance() it should also not always be needed to rescale the image. Err codevoid.de 70 i Err codevoid.de 70 i-- Err codevoid.de 70 iKind regards, Err codevoid.de 70 iHiltjo Err codevoid.de 70 i Err codevoid.de 70 iFrom 97bebdcab4003f9acdfdd4bdf424449299ffd61d Mon Sep 17 00:00:00 2001 Err codevoid.de 70 iFrom: Hiltjo Posthuma Err codevoid.de 70 iDate: Sat, 4 Jun 2016 21:34:25 +0200 Err codevoid.de 70 iSubject: [PATCH] merge ffread and ffopen into one function Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i M sent.c | 77 +++++++++++-------------------- Err codevoid.de 70 i Err codevoid.de 70 i1 file changed, 27 insertions(+), 50 deletions(-) Err codevoid.de 70 i--- Err codevoid.de 70 1diff --git a/sent.c b/sent.c /git/sent-sdk/file/sent.c.gph codevoid.de 70 it@@ -89,9 +89,8 @@ typedef struct { Err codevoid.de 70 i const Arg arg; Err codevoid.de 70 i } Shortcut; Err codevoid.de 70 i Err codevoid.de 70 i-static Image *ffopen(char *filename); Err codevoid.de 70 i static void fffree(Image *img); Err codevoid.de 70 i-static void ffread(Image *img); Err codevoid.de 70 i+static Image *ffread(char *filename); Err codevoid.de 70 i static void ffprepare(Image *img); Err codevoid.de 70 i static void ffscale(Image *img); Err codevoid.de 70 i static void ffdraw(Image *img); Err codevoid.de 70 it@@ -159,14 +158,27 @@ filter(int fd, const char *cmd) Err codevoid.de 70 i return fds[0]; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i+void Err codevoid.de 70 i+fffree(Image *img) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ free(img->buf); Err codevoid.de 70 i+ if (img->ximg) Err codevoid.de 70 i+ XDestroyImage(img->ximg); Err codevoid.de 70 i+ free(img); Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i Image * Err codevoid.de 70 i-ffopen(char *filename) Err codevoid.de 70 i+ffread(char *filename) Err codevoid.de 70 i { Err codevoid.de 70 i+ uint32_t y, x; Err codevoid.de 70 i+ uint16_t *row; Err codevoid.de 70 i+ uint8_t opac, fg_r, fg_g, fg_b, bg_r, bg_g, bg_b; Err codevoid.de 70 i+ size_t rowlen, off, nbytes, i; Err codevoid.de 70 i+ ssize_t count; Err codevoid.de 70 i unsigned char hdr[16]; Err codevoid.de 70 i char *bin = NULL; Err codevoid.de 70 i regex_t regex; Err codevoid.de 70 i Image *img; Err codevoid.de 70 i- size_t i; Err codevoid.de 70 i int tmpfd, fd; Err codevoid.de 70 i Err codevoid.de 70 i for (i = 0; i < LEN(filters); i++) { Err codevoid.de 70 it@@ -178,13 +190,11 @@ ffopen(char *filename) Err codevoid.de 70 i break; Err codevoid.de 70 i } Err codevoid.de 70 i } Err codevoid.de 70 i- Err codevoid.de 70 i if (!bin) Err codevoid.de 70 i return NULL; Err codevoid.de 70 i Err codevoid.de 70 i- if ((fd = open(filename, O_RDONLY)) < 0) { Err codevoid.de 70 i+ if ((fd = open(filename, O_RDONLY)) < 0) Err codevoid.de 70 i die("sent: Unable to open file %s:", filename); Err codevoid.de 70 i- } Err codevoid.de 70 i Err codevoid.de 70 i tmpfd = fd; Err codevoid.de 70 i fd = filter(fd, bin); Err codevoid.de 70 it@@ -192,10 +202,7 @@ ffopen(char *filename) Err codevoid.de 70 i die("sent: Unable to filter %s:", filename); Err codevoid.de 70 i close(tmpfd); Err codevoid.de 70 i Err codevoid.de 70 i- if (read(fd, hdr, 16) != 16) Err codevoid.de 70 i- return NULL; Err codevoid.de 70 i- Err codevoid.de 70 i- if (memcmp("farbfeld", hdr, 8)) Err codevoid.de 70 i+ if (read(fd, hdr, 16) != 16 || memcmp("farbfeld", hdr, 8)) Err codevoid.de 70 i return NULL; Err codevoid.de 70 i Err codevoid.de 70 i img = calloc(1, sizeof(Image)); Err codevoid.de 70 it@@ -203,31 +210,6 @@ ffopen(char *filename) Err codevoid.de 70 i img->bufwidth = ntohl(*(uint32_t *)&hdr[8]); Err codevoid.de 70 i img->bufheight = ntohl(*(uint32_t *)&hdr[12]); Err codevoid.de 70 i Err codevoid.de 70 i- return img; Err codevoid.de 70 i-} Err codevoid.de 70 i- Err codevoid.de 70 i-void Err codevoid.de 70 i-fffree(Image *img) Err codevoid.de 70 i-{ Err codevoid.de 70 i- free(img->buf); Err codevoid.de 70 i- if (img->ximg) Err codevoid.de 70 i- XDestroyImage(img->ximg); Err codevoid.de 70 i- free(img); Err codevoid.de 70 i-} Err codevoid.de 70 i- Err codevoid.de 70 i-void Err codevoid.de 70 i-ffread(Image *img) Err codevoid.de 70 i-{ Err codevoid.de 70 i- uint32_t y, x; Err codevoid.de 70 i- uint16_t *row; Err codevoid.de 70 i- uint8_t opac; Err codevoid.de 70 i- uint8_t fg_r, fg_g, fg_b, bg_r, bg_g, bg_b; Err codevoid.de 70 i- size_t rowlen, off, nbytes; Err codevoid.de 70 i- ssize_t count; Err codevoid.de 70 i- Err codevoid.de 70 i- if (img->state & LOADED) Err codevoid.de 70 i- return; Err codevoid.de 70 i- Err codevoid.de 70 i if (img->buf) Err codevoid.de 70 i free(img->buf); Err codevoid.de 70 i /* internally the image is stored in 888 format */ Err codevoid.de 70 it@@ -237,9 +219,8 @@ ffread(Image *img) Err codevoid.de 70 i /* scratch buffer to read row by row */ Err codevoid.de 70 i rowlen = img->bufwidth * 2 * strlen("RGBA"); Err codevoid.de 70 i row = malloc(rowlen); Err codevoid.de 70 i- if (!row) { Err codevoid.de 70 i+ if (!row) Err codevoid.de 70 i die("sent: Unable to malloc buffer for image row.\n"); Err codevoid.de 70 i- } Err codevoid.de 70 i Err codevoid.de 70 i /* extract window background color channels for transparency */ Err codevoid.de 70 i bg_r = (sc[ColBg].pixel >> 16) % 256; Err codevoid.de 70 it@@ -270,6 +251,8 @@ ffread(Image *img) Err codevoid.de 70 i free(row); Err codevoid.de 70 i close(img->fd); Err codevoid.de 70 i img->state |= LOADED; Err codevoid.de 70 i+ Err codevoid.de 70 i+ return img; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 it@@ -444,13 +427,11 @@ load(FILE *fp) Err codevoid.de 70 i memmove(s->lines[s->linecount], &s->lines[s->linecount][1], blen); Err codevoid.de 70 i s->linecount++; Err codevoid.de 70 i } while ((p = fgets(buf, sizeof(buf), fp)) && strcmp(buf, "\n") != 0); Err codevoid.de 70 i+ Err codevoid.de 70 i slidecount++; Err codevoid.de 70 i if (!p) Err codevoid.de 70 i break; Err codevoid.de 70 i } Err codevoid.de 70 i- Err codevoid.de 70 i- if (slidecount && slides[0].embed && slides[0].embed[0]) Err codevoid.de 70 i- slides[0].img = ffopen(slides[0].embed); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 it@@ -462,13 +443,7 @@ advance(const Arg *arg) Err codevoid.de 70 i if (slides[idx].img) Err codevoid.de 70 i slides[idx].img->state &= ~(DRAWN | SCALED); Err codevoid.de 70 i idx = new_idx; Err codevoid.de 70 i- if (!slides[idx].img && slides[idx].embed && slides[idx].embed[0]) Err codevoid.de 70 i- slides[idx].img = ffopen(slides[idx].embed); Err codevoid.de 70 i xdraw(); Err codevoid.de 70 i- if (slidecount > idx + 1 && slides[idx + 1].img) Err codevoid.de 70 i- ffread(slides[idx + 1].img); Err codevoid.de 70 i- if (0 < idx && slides[idx - 1].img) Err codevoid.de 70 i- ffread(slides[idx - 1].img); Err codevoid.de 70 i } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 it@@ -514,7 +489,11 @@ void Err codevoid.de 70 i xdraw() Err codevoid.de 70 i { Err codevoid.de 70 i unsigned int height, width, i; Err codevoid.de 70 i- Image *im = slides[idx].img; Err codevoid.de 70 i+ Image *im; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!slides[idx].img && slides[idx].embed && slides[idx].embed[0]) Err codevoid.de 70 i+ slides[idx].img = ffread(slides[idx].embed); Err codevoid.de 70 i+ im = slides[idx].img; Err codevoid.de 70 i Err codevoid.de 70 i getfontsize(&slides[idx], &width, &height); Err codevoid.de 70 i XClearWindow(xw.dpy, xw.win); Err codevoid.de 70 it@@ -532,8 +511,6 @@ xdraw() Err codevoid.de 70 i 0); Err codevoid.de 70 i drw_map(d, xw.win, 0, 0, xw.w, xw.h); Err codevoid.de 70 i } else { Err codevoid.de 70 i- if (!(im->state & LOADED)) Err codevoid.de 70 i- ffread(im); Err codevoid.de 70 i if (!(im->state & SCALED)) Err codevoid.de 70 i ffprepare(im); Err codevoid.de 70 i if (!(im->state & DRAWN)) Err codevoid.de 70 .