Introduction
Introduction Statistics Contact Development Disclaimer Help
load slide image on-demand - sent - simple plaintext presentation tool
git clone git://git.suckless.org/sent
Log
Files
Refs
README
LICENSE
---
commit fd303ee9c1c969c4a50c6fcf0397973ea6f37dc7
parent 44a50ad94828d6375ebba9560109d06e9a163e5d
Author: Hiltjo Posthuma <[email protected]>
Date: Sat, 4 Jun 2016 21:47:39 +0200
load slide image on-demand
On Sat, Jun 04, 2016 at 05:28:31PM +0200, Markus Teich wrote:
> Hiltjo Posthuma wrote:
> > previously an image file would be opened but only ffread when advancing to
> > the slide, but when the slide was not used it gave an error:
> >
> > /usr/local/bin/2ff: failed to convert image/png
>
> Heyho Hiltjo,
>
> thanks for the patch. Unfortunately it does not work if the first slide conta…
> an image (ffopen is only called in advance). I think it would be good to merge
> ffopen and ffread instead into a single function ffload. This makes the `LOAD…
> state clearer and also enforces that the fd is closed in the same function wh…
> it is opened. This ffload function should then be called in advance() replaci…
> the ffread() calls if the image is not loaded yet and once in load() for the
> first slide if it is an image.
>
Ah yes, sorry for the oversight.
> If you want to take this new approach, go for it, otherwise I'll look into it
> myself.
>
I have attached a patch that does this, I hope you'll like it.
Also I'm not sure if we need the below code in advance(), I have removed it in
the patch:
if (slidecount > idx + 1 && slides[idx + 1].img)
ffread(slides[idx + 1].img);
if (0 < idx && slides[idx - 1].img)
ffread(slides[idx - 1].img);
That seems to preload the next and previous slide image right? A minor issue I
notice also is that images seem to flicker, it uses XPutImage directly to
xw.win. Maybe it can be replaced with a backbuffer then XCopyArea? What do you
think?
In advance() it should also not always be needed to rescale the image.
--
Kind regards,
Hiltjo
From 97bebdcab4003f9acdfdd4bdf424449299ffd61d Mon Sep 17 00:00:00 2001
From: Hiltjo Posthuma <[email protected]>
Date: Sat, 4 Jun 2016 21:34:25 +0200
Subject: [PATCH] merge ffread and ffopen into one function
Diffstat:
M sent.c | 77 +++++++++++------------------…
1 file changed, 27 insertions(+), 50 deletions(-)
---
diff --git a/sent.c b/sent.c
@@ -89,9 +89,8 @@ typedef struct {
const Arg arg;
} Shortcut;
-static Image *ffopen(char *filename);
static void fffree(Image *img);
-static void ffread(Image *img);
+static Image *ffread(char *filename);
static void ffprepare(Image *img);
static void ffscale(Image *img);
static void ffdraw(Image *img);
@@ -159,14 +158,27 @@ filter(int fd, const char *cmd)
return fds[0];
}
+void
+fffree(Image *img)
+{
+ free(img->buf);
+ if (img->ximg)
+ XDestroyImage(img->ximg);
+ free(img);
+}
+
Image *
-ffopen(char *filename)
+ffread(char *filename)
{
+ uint32_t y, x;
+ uint16_t *row;
+ uint8_t opac, fg_r, fg_g, fg_b, bg_r, bg_g, bg_b;
+ size_t rowlen, off, nbytes, i;
+ ssize_t count;
unsigned char hdr[16];
char *bin = NULL;
regex_t regex;
Image *img;
- size_t i;
int tmpfd, fd;
for (i = 0; i < LEN(filters); i++) {
@@ -178,13 +190,11 @@ ffopen(char *filename)
break;
}
}
-
if (!bin)
return NULL;
- if ((fd = open(filename, O_RDONLY)) < 0) {
+ if ((fd = open(filename, O_RDONLY)) < 0)
die("sent: Unable to open file %s:", filename);
- }
tmpfd = fd;
fd = filter(fd, bin);
@@ -192,10 +202,7 @@ ffopen(char *filename)
die("sent: Unable to filter %s:", filename);
close(tmpfd);
- if (read(fd, hdr, 16) != 16)
- return NULL;
-
- if (memcmp("farbfeld", hdr, 8))
+ if (read(fd, hdr, 16) != 16 || memcmp("farbfeld", hdr, 8))
return NULL;
img = calloc(1, sizeof(Image));
@@ -203,31 +210,6 @@ ffopen(char *filename)
img->bufwidth = ntohl(*(uint32_t *)&hdr[8]);
img->bufheight = ntohl(*(uint32_t *)&hdr[12]);
- return img;
-}
-
-void
-fffree(Image *img)
-{
- free(img->buf);
- if (img->ximg)
- XDestroyImage(img->ximg);
- free(img);
-}
-
-void
-ffread(Image *img)
-{
- uint32_t y, x;
- uint16_t *row;
- uint8_t opac;
- uint8_t fg_r, fg_g, fg_b, bg_r, bg_g, bg_b;
- size_t rowlen, off, nbytes;
- ssize_t count;
-
- if (img->state & LOADED)
- return;
-
if (img->buf)
free(img->buf);
/* internally the image is stored in 888 format */
@@ -237,9 +219,8 @@ ffread(Image *img)
/* scratch buffer to read row by row */
rowlen = img->bufwidth * 2 * strlen("RGBA");
row = malloc(rowlen);
- if (!row) {
+ if (!row)
die("sent: Unable to malloc buffer for image row.\n");
- }
/* extract window background color channels for transparency */
bg_r = (sc[ColBg].pixel >> 16) % 256;
@@ -270,6 +251,8 @@ ffread(Image *img)
free(row);
close(img->fd);
img->state |= LOADED;
+
+ return img;
}
void
@@ -444,13 +427,11 @@ load(FILE *fp)
memmove(s->lines[s->linecount], &s->lines[s->l…
s->linecount++;
} while ((p = fgets(buf, sizeof(buf), fp)) && strcmp(buf, "\n"…
+
slidecount++;
if (!p)
break;
}
-
- if (slidecount && slides[0].embed && slides[0].embed[0])
- slides[0].img = ffopen(slides[0].embed);
}
void
@@ -462,13 +443,7 @@ advance(const Arg *arg)
if (slides[idx].img)
slides[idx].img->state &= ~(DRAWN | SCALED);
idx = new_idx;
- if (!slides[idx].img && slides[idx].embed && slides[idx].embed…
- slides[idx].img = ffopen(slides[idx].embed);
xdraw();
- if (slidecount > idx + 1 && slides[idx + 1].img)
- ffread(slides[idx + 1].img);
- if (0 < idx && slides[idx - 1].img)
- ffread(slides[idx - 1].img);
}
}
@@ -514,7 +489,11 @@ void
xdraw()
{
unsigned int height, width, i;
- Image *im = slides[idx].img;
+ Image *im;
+
+ if (!slides[idx].img && slides[idx].embed && slides[idx].embed[0])
+ slides[idx].img = ffread(slides[idx].embed);
+ im = slides[idx].img;
getfontsize(&slides[idx], &width, &height);
XClearWindow(xw.dpy, xw.win);
@@ -532,8 +511,6 @@ xdraw()
0);
drw_map(d, xw.win, 0, 0, xw.w, xw.h);
} else {
- if (!(im->state & LOADED))
- ffread(im);
if (!(im->state & SCALED))
ffprepare(im);
if (!(im->state & DRAWN))
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.