[hackers] [sent] clean ffread and rename to ffload || Markus Teich

From: <git_AT_suckless.org>
Date: Thu, 30 Jun 2016 16:48:00 +0200 (CEST)

commit 827f3de2e780b7eda5890e9ede7653f39a286d93
Author: Markus Teich <markus.teich_AT_stusta.mhn.de>
AuthorDate: Thu Jun 30 16:42:34 2016 +0200
Commit: Markus Teich <markus.teich_AT_stusta.mhn.de>
CommitDate: Thu Jun 30 16:42:34 2016 +0200

    clean ffread and rename to ffload
    
    - also remove unneeded memmove in load()

diff --git a/sent.c b/sent.c
index 605a7c3..e4bea31 100644
--- a/sent.c
+++ b/sent.c
_AT_@ -32,9 +32,8 @@ char *argv0;
 
 typedef enum {
         NONE = 0,
- LOADED = 1,
- SCALED = 2,
- DRAWN = 4
+ SCALED = 1,
+ DRAWN = 2
 } imgstate;
 
 typedef struct {
_AT_@ -42,7 +41,6 @@ typedef struct {
         unsigned int bufwidth, bufheight;
         imgstate state;
         XImage *ximg;
- int fd;
         int numpasses;
 } Image;
 
_AT_@ -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);
_AT_@ -167,8 +165,8 @@ fffree(Image *img)
         free(img);
 }
 
-Image *
-ffread(char *filename)
+void
+ffload(Slide *s)
 {
         uint32_t y, x;
         uint16_t *row;
_AT_@ -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(&regex, filters[i].regex,
_AT_@ -191,33 +192,30 @@ ffread(char *filename)
                 }
         }
         if (!bin)
- return NULL;
+ die("sent: Unable to find matching filter for file %s", filename);
 
- 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", filename);
 
- 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");
_AT_@ -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 - nbytes);
+ count = read(fdout, (char *)row + nbytes, rowlen - nbytes);
                         if (count < 0)
                                 die("sent: Unable to read from pipe:");
                         nbytes += count;
_AT_@ -242,17 +240,14 @@ ffread(char *filename)
                         opac = ntohs(row[x + 3]) / 257;
                         /* blend opaque part of image data with window background color to
                          * emulate transparency */
- img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) / 255;
- img->buf[off++] = (fg_g * opac + bg_g * (255 - opac)) / 255;
- img->buf[off++] = (fg_b * opac + bg_b * (255 - opac)) / 255;
+ s->img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) / 255;
+ s->img->buf[off++] = (fg_g * opac + bg_g * (255 - opac)) / 255;
+ s->img->buf[off++] = (fg_b * opac + bg_b * (255 - opac)) / 255;
                 }
         }
 
         free(row);
- close(img->fd);
- img->state |= LOADED;
-
- return img;
+ close(fdout);
 }
 
 void
_AT_@ -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 starts with _AT_ */
- if (s->linecount == 0 && s->lines[0][0] == '_AT_') {
- 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 with _AT_ */
+ if (s->linecount == 0 && s->lines[0][0] == '_AT_')
+ s->embed = &s->lines[0][1];
 
                         if (s->lines[s->linecount][0] == '\\')
                                 memmove(s->lines[s->linecount], &s->lines[s->linecount][1], blen);
_AT_@ -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]);
         }
 }
 
_AT_@ -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);
_AT_@ -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);
Received on Thu Jun 30 2016 - 16:48:00 CEST

This archive was generated by hypermail 2.3.0 : Thu Jun 30 2016 - 16:48:20 CEST