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 827f3de2e780b7eda5890e9ede7653f39a286d93 /git/sent-sdk/commit/827f3de2e780b7eda5890e9ede7653f39a286d93.gph codevoid.de 70 1parent fd303ee9c1c969c4a50c6fcf0397973ea6f37dc7 /git/sent-sdk/commit/fd303ee9c1c969c4a50c6fcf0397973ea6f37dc7.gph codevoid.de 70 hAuthor: Markus Teich URL:mailto:markus.teich@stusta.mhn.de codevoid.de 70 iDate: Thu, 30 Jun 2016 16:42:34 +0200 Err codevoid.de 70 i Err codevoid.de 70 iclean ffread and rename to ffload Err codevoid.de 70 i Err codevoid.de 70 i- also remove unneeded memmove in load() Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i M sent.c | 82 ++++++++++++++----------------- Err codevoid.de 70 i Err codevoid.de 70 i1 file changed, 38 insertions(+), 44 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@@ -32,9 +32,8 @@ char *argv0; Err codevoid.de 70 i Err codevoid.de 70 i typedef enum { Err codevoid.de 70 i NONE = 0, Err codevoid.de 70 i- LOADED = 1, Err codevoid.de 70 i- SCALED = 2, Err codevoid.de 70 i- DRAWN = 4 Err codevoid.de 70 i+ SCALED = 1, Err codevoid.de 70 i+ DRAWN = 2 Err codevoid.de 70 i } imgstate; Err codevoid.de 70 i Err codevoid.de 70 i typedef struct { Err codevoid.de 70 it@@ -42,7 +41,6 @@ typedef struct { Err codevoid.de 70 i unsigned int bufwidth, bufheight; Err codevoid.de 70 i imgstate state; Err codevoid.de 70 i XImage *ximg; Err codevoid.de 70 i- int fd; Err codevoid.de 70 i int numpasses; Err codevoid.de 70 i } Image; Err codevoid.de 70 i Err codevoid.de 70 it@@ -90,7 +88,7 @@ typedef struct { Err codevoid.de 70 i } Shortcut; Err codevoid.de 70 i Err codevoid.de 70 i static void fffree(Image *img); Err codevoid.de 70 i-static Image *ffread(char *filename); Err codevoid.de 70 i+static void ffload(Slide *s); 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@@ -167,8 +165,8 @@ fffree(Image *img) 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-ffread(char *filename) Err codevoid.de 70 i+void Err codevoid.de 70 i+ffload(Slide *s) 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 it@@ -177,9 +175,12 @@ ffread(char *filename) 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+ char *filename; Err codevoid.de 70 i regex_t regex; Err codevoid.de 70 i- Image *img; Err codevoid.de 70 i- int tmpfd, fd; Err codevoid.de 70 i+ int fdin, fdout; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (s->img || !(filename = s->embed) || !s->embed[0]) Err codevoid.de 70 i+ return; /* already done */ Err codevoid.de 70 i Err codevoid.de 70 i for (i = 0; i < LEN(filters); i++) { Err codevoid.de 70 i if (regcomp(®ex, filters[i].regex, Err codevoid.de 70 it@@ -191,33 +192,30 @@ ffread(char *filename) 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+ die("sent: Unable to find matching filter for file %s", filename); Err codevoid.de 70 i Err codevoid.de 70 i- if ((fd = open(filename, O_RDONLY)) < 0) Err codevoid.de 70 i+ if ((fdin = 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- tmpfd = fd; Err codevoid.de 70 i- fd = filter(fd, bin); Err codevoid.de 70 i- if (fd < 0) Err codevoid.de 70 i+ if ((fdout = filter(fdin, bin)) < 0) Err codevoid.de 70 i die("sent: Unable to filter %s:", filename); Err codevoid.de 70 i- close(tmpfd); Err codevoid.de 70 i+ close(fdin); Err codevoid.de 70 i 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+ if (read(fdout, hdr, 16) != 16 || memcmp("farbfeld", hdr, 8)) Err codevoid.de 70 i+ die("sent: Unable to filter %s into a valid farbfeld file", filename); Err codevoid.de 70 i Err codevoid.de 70 i- img = calloc(1, sizeof(Image)); Err codevoid.de 70 i- img->fd = fd; 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+ s->img = calloc(1, sizeof(Image)); Err codevoid.de 70 i+ s->img->bufwidth = ntohl(*(uint32_t *)&hdr[8]); Err codevoid.de 70 i+ s->img->bufheight = ntohl(*(uint32_t *)&hdr[12]); 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+ if (s->img->buf) Err codevoid.de 70 i+ free(s->img->buf); Err codevoid.de 70 i /* internally the image is stored in 888 format */ Err codevoid.de 70 i- if (!(img->buf = malloc(3 * img->bufwidth * img->bufheight))) Err codevoid.de 70 i+ if (!(s->img->buf = malloc(3 * s->img->bufwidth * s->img->bufheight))) Err codevoid.de 70 i die("sent: Unable to malloc buffer for image.\n"); Err codevoid.de 70 i 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+ rowlen = s->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 die("sent: Unable to malloc buffer for image row.\n"); Err codevoid.de 70 it@@ -227,10 +225,10 @@ ffread(char *filename) Err codevoid.de 70 i bg_g = (sc[ColBg].pixel >> 8) % 256; Err codevoid.de 70 i bg_b = (sc[ColBg].pixel >> 0) % 256; Err codevoid.de 70 i Err codevoid.de 70 i- for (off = 0, y = 0; y < img->bufheight; y++) { Err codevoid.de 70 i+ for (off = 0, y = 0; y < s->img->bufheight; y++) { Err codevoid.de 70 i nbytes = 0; Err codevoid.de 70 i while (nbytes < rowlen) { Err codevoid.de 70 i- count = read(img->fd, (char *)row + nbytes, rowlen - nbytes); Err codevoid.de 70 i+ count = read(fdout, (char *)row + nbytes, rowlen - nbytes); Err codevoid.de 70 i if (count < 0) Err codevoid.de 70 i die("sent: Unable to read from pipe:"); Err codevoid.de 70 i nbytes += count; Err codevoid.de 70 it@@ -242,17 +240,14 @@ ffread(char *filename) Err codevoid.de 70 i opac = ntohs(row[x + 3]) / 257; Err codevoid.de 70 i /* blend opaque part of image data with window background color to Err codevoid.de 70 i * emulate transparency */ Err codevoid.de 70 i- img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) / 255; Err codevoid.de 70 i- img->buf[off++] = (fg_g * opac + bg_g * (255 - opac)) / 255; Err codevoid.de 70 i- img->buf[off++] = (fg_b * opac + bg_b * (255 - opac)) / 255; Err codevoid.de 70 i+ s->img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) / 255; Err codevoid.de 70 i+ s->img->buf[off++] = (fg_g * opac + bg_g * (255 - opac)) / 255; Err codevoid.de 70 i+ s->img->buf[off++] = (fg_b * opac + bg_b * (255 - opac)) / 255; Err codevoid.de 70 i } Err codevoid.de 70 i } Err codevoid.de 70 i 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+ close(fdout); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void Err codevoid.de 70 it@@ -417,11 +412,9 @@ load(FILE *fp) Err codevoid.de 70 i if (s->lines[s->linecount][blen-1] == '\n') Err codevoid.de 70 i s->lines[s->linecount][blen-1] = '\0'; Err codevoid.de 70 i Err codevoid.de 70 i- /* only make image slide if first line of a slide starts with @ */ Err codevoid.de 70 i- if (s->linecount == 0 && s->lines[0][0] == '@') { Err codevoid.de 70 i- memmove(s->lines[0], &s->lines[0][1], blen); Err codevoid.de 70 i- s->embed = s->lines[0]; Err codevoid.de 70 i- } Err codevoid.de 70 i+ /* mark as image slide if first line of a slide starts with @ */ Err codevoid.de 70 i+ if (s->linecount == 0 && s->lines[0][0] == '@') Err codevoid.de 70 i+ s->embed = &s->lines[0][1]; Err codevoid.de 70 i Err codevoid.de 70 i if (s->lines[s->linecount][0] == '\\') Err codevoid.de 70 i memmove(s->lines[s->linecount], &s->lines[s->linecount][1], blen); Err codevoid.de 70 it@@ -444,6 +437,10 @@ advance(const Arg *arg) Err codevoid.de 70 i slides[idx].img->state &= ~(DRAWN | SCALED); Err codevoid.de 70 i idx = new_idx; Err codevoid.de 70 i xdraw(); Err codevoid.de 70 i+ if (slidecount > idx + 1) Err codevoid.de 70 i+ ffload(&slides[idx + 1]); Err codevoid.de 70 i+ if (0 < idx) Err codevoid.de 70 i+ ffload(&slides[idx - 1]); Err codevoid.de 70 i } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 it@@ -489,11 +486,7 @@ 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; 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+ Image *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@@ -567,6 +560,7 @@ xinit() Err codevoid.de 70 i XSetWindowBackground(xw.dpy, xw.win, sc[ColBg].pixel); Err codevoid.de 70 i Err codevoid.de 70 i xloadfonts(); Err codevoid.de 70 i+ ffload(&slides[0]); Err codevoid.de 70 i Err codevoid.de 70 i XStringListToTextProperty(&argv0, 1, &prop); Err codevoid.de 70 i XSetWMName(xw.dpy, xw.win, &prop); Err codevoid.de 70 .