clean ffread and rename to ffload - sent - simple plaintext presentation tool | |
git clone git://git.suckless.org/sent | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 827f3de2e780b7eda5890e9ede7653f39a286d93 | |
parent fd303ee9c1c969c4a50c6fcf0397973ea6f37dc7 | |
Author: Markus Teich <[email protected]> | |
Date: Thu, 30 Jun 2016 16:42:34 +0200 | |
clean ffread and rename to ffload | |
- also remove unneeded memmove in load() | |
Diffstat: | |
M sent.c | 82 ++++++++++++++---------------… | |
1 file changed, 38 insertions(+), 44 deletions(-) | |
--- | |
diff --git a/sent.c b/sent.c | |
@@ -32,9 +32,8 @@ char *argv0; | |
typedef enum { | |
NONE = 0, | |
- LOADED = 1, | |
- SCALED = 2, | |
- DRAWN = 4 | |
+ SCALED = 1, | |
+ DRAWN = 2 | |
} imgstate; | |
typedef struct { | |
@@ -42,7 +41,6 @@ typedef struct { | |
unsigned int bufwidth, bufheight; | |
imgstate state; | |
XImage *ximg; | |
- int fd; | |
int numpasses; | |
} Image; | |
@@ -90,7 +88,7 @@ typedef struct { | |
} Shortcut; | |
static void fffree(Image *img); | |
-static Image *ffread(char *filename); | |
+static void ffload(Slide *s); | |
static void ffprepare(Image *img); | |
static void ffscale(Image *img); | |
static void ffdraw(Image *img); | |
@@ -167,8 +165,8 @@ fffree(Image *img) | |
free(img); | |
} | |
-Image * | |
-ffread(char *filename) | |
+void | |
+ffload(Slide *s) | |
{ | |
uint32_t y, x; | |
uint16_t *row; | |
@@ -177,9 +175,12 @@ ffread(char *filename) | |
ssize_t count; | |
unsigned char hdr[16]; | |
char *bin = NULL; | |
+ char *filename; | |
regex_t regex; | |
- Image *img; | |
- int tmpfd, fd; | |
+ int fdin, fdout; | |
+ | |
+ if (s->img || !(filename = s->embed) || !s->embed[0]) | |
+ return; /* already done */ | |
for (i = 0; i < LEN(filters); i++) { | |
if (regcomp(®ex, filters[i].regex, | |
@@ -191,33 +192,30 @@ ffread(char *filename) | |
} | |
} | |
if (!bin) | |
- return NULL; | |
+ die("sent: Unable to find matching filter for file %s", filena… | |
- if ((fd = open(filename, O_RDONLY)) < 0) | |
+ if ((fdin = open(filename, O_RDONLY)) < 0) | |
die("sent: Unable to open file %s:", filename); | |
- tmpfd = fd; | |
- fd = filter(fd, bin); | |
- if (fd < 0) | |
+ if ((fdout = filter(fdin, bin)) < 0) | |
die("sent: Unable to filter %s:", filename); | |
- close(tmpfd); | |
+ close(fdin); | |
- if (read(fd, hdr, 16) != 16 || memcmp("farbfeld", hdr, 8)) | |
- return NULL; | |
+ if (read(fdout, hdr, 16) != 16 || memcmp("farbfeld", hdr, 8)) | |
+ die("sent: Unable to filter %s into a valid farbfeld file", fi… | |
- img = calloc(1, sizeof(Image)); | |
- img->fd = fd; | |
- img->bufwidth = ntohl(*(uint32_t *)&hdr[8]); | |
- img->bufheight = ntohl(*(uint32_t *)&hdr[12]); | |
+ s->img = calloc(1, sizeof(Image)); | |
+ s->img->bufwidth = ntohl(*(uint32_t *)&hdr[8]); | |
+ s->img->bufheight = ntohl(*(uint32_t *)&hdr[12]); | |
- if (img->buf) | |
- free(img->buf); | |
+ if (s->img->buf) | |
+ free(s->img->buf); | |
/* internally the image is stored in 888 format */ | |
- if (!(img->buf = malloc(3 * img->bufwidth * img->bufheight))) | |
+ if (!(s->img->buf = malloc(3 * s->img->bufwidth * s->img->bufheight))) | |
die("sent: Unable to malloc buffer for image.\n"); | |
/* scratch buffer to read row by row */ | |
- rowlen = img->bufwidth * 2 * strlen("RGBA"); | |
+ rowlen = s->img->bufwidth * 2 * strlen("RGBA"); | |
row = malloc(rowlen); | |
if (!row) | |
die("sent: Unable to malloc buffer for image row.\n"); | |
@@ -227,10 +225,10 @@ ffread(char *filename) | |
bg_g = (sc[ColBg].pixel >> 8) % 256; | |
bg_b = (sc[ColBg].pixel >> 0) % 256; | |
- for (off = 0, y = 0; y < img->bufheight; y++) { | |
+ for (off = 0, y = 0; y < s->img->bufheight; y++) { | |
nbytes = 0; | |
while (nbytes < rowlen) { | |
- count = read(img->fd, (char *)row + nbytes, rowlen - n… | |
+ count = read(fdout, (char *)row + nbytes, rowlen - nby… | |
if (count < 0) | |
die("sent: Unable to read from pipe:"); | |
nbytes += count; | |
@@ -242,17 +240,14 @@ ffread(char *filename) | |
opac = ntohs(row[x + 3]) / 257; | |
/* blend opaque part of image data with window backgro… | |
* emulate transparency */ | |
- img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) … | |
- img->buf[off++] = (fg_g * opac + bg_g * (255 - opac)) … | |
- img->buf[off++] = (fg_b * opac + bg_b * (255 - opac)) … | |
+ s->img->buf[off++] = (fg_r * opac + bg_r * (255 - opac… | |
+ s->img->buf[off++] = (fg_g * opac + bg_g * (255 - opac… | |
+ s->img->buf[off++] = (fg_b * opac + bg_b * (255 - opac… | |
} | |
} | |
free(row); | |
- close(img->fd); | |
- img->state |= LOADED; | |
- | |
- return img; | |
+ close(fdout); | |
} | |
void | |
@@ -417,11 +412,9 @@ load(FILE *fp) | |
if (s->lines[s->linecount][blen-1] == '\n') | |
s->lines[s->linecount][blen-1] = '\0'; | |
- /* only make image slide if first line of a slide star… | |
- if (s->linecount == 0 && s->lines[0][0] == '@') { | |
- memmove(s->lines[0], &s->lines[0][1], blen); | |
- s->embed = s->lines[0]; | |
- } | |
+ /* mark as image slide if first line of a slide starts… | |
+ if (s->linecount == 0 && s->lines[0][0] == '@') | |
+ s->embed = &s->lines[0][1]; | |
if (s->lines[s->linecount][0] == '\\') | |
memmove(s->lines[s->linecount], &s->lines[s->l… | |
@@ -444,6 +437,10 @@ advance(const Arg *arg) | |
slides[idx].img->state &= ~(DRAWN | SCALED); | |
idx = new_idx; | |
xdraw(); | |
+ if (slidecount > idx + 1) | |
+ ffload(&slides[idx + 1]); | |
+ if (0 < idx) | |
+ ffload(&slides[idx - 1]); | |
} | |
} | |
@@ -489,11 +486,7 @@ void | |
xdraw() | |
{ | |
unsigned int height, width, i; | |
- Image *im; | |
- | |
- if (!slides[idx].img && slides[idx].embed && slides[idx].embed[0]) | |
- slides[idx].img = ffread(slides[idx].embed); | |
- im = slides[idx].img; | |
+ Image *im = slides[idx].img; | |
getfontsize(&slides[idx], &width, &height); | |
XClearWindow(xw.dpy, xw.win); | |
@@ -567,6 +560,7 @@ xinit() | |
XSetWindowBackground(xw.dpy, xw.win, sc[ColBg].pixel); | |
xloadfonts(); | |
+ ffload(&slides[0]); | |
XStringListToTextProperty(&argv0, 1, &prop); | |
XSetWMName(xw.dpy, xw.win, &prop); |