clean ffread and rename to ffload
- also remove unneeded memmove in load()
This commit is contained in:
parent
fd303ee9c1
commit
827f3de2e7
82
sent.c
82
sent.c
@ -32,9 +32,8 @@ char *argv0;
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NONE = 0,
|
NONE = 0,
|
||||||
LOADED = 1,
|
SCALED = 1,
|
||||||
SCALED = 2,
|
DRAWN = 2
|
||||||
DRAWN = 4
|
|
||||||
} imgstate;
|
} imgstate;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -42,7 +41,6 @@ typedef struct {
|
|||||||
unsigned int bufwidth, bufheight;
|
unsigned int bufwidth, bufheight;
|
||||||
imgstate state;
|
imgstate state;
|
||||||
XImage *ximg;
|
XImage *ximg;
|
||||||
int fd;
|
|
||||||
int numpasses;
|
int numpasses;
|
||||||
} Image;
|
} Image;
|
||||||
|
|
||||||
@ -90,7 +88,7 @@ typedef struct {
|
|||||||
} Shortcut;
|
} Shortcut;
|
||||||
|
|
||||||
static void fffree(Image *img);
|
static void fffree(Image *img);
|
||||||
static Image *ffread(char *filename);
|
static void ffload(Slide *s);
|
||||||
static void ffprepare(Image *img);
|
static void ffprepare(Image *img);
|
||||||
static void ffscale(Image *img);
|
static void ffscale(Image *img);
|
||||||
static void ffdraw(Image *img);
|
static void ffdraw(Image *img);
|
||||||
@ -167,8 +165,8 @@ fffree(Image *img)
|
|||||||
free(img);
|
free(img);
|
||||||
}
|
}
|
||||||
|
|
||||||
Image *
|
void
|
||||||
ffread(char *filename)
|
ffload(Slide *s)
|
||||||
{
|
{
|
||||||
uint32_t y, x;
|
uint32_t y, x;
|
||||||
uint16_t *row;
|
uint16_t *row;
|
||||||
@ -177,9 +175,12 @@ ffread(char *filename)
|
|||||||
ssize_t count;
|
ssize_t count;
|
||||||
unsigned char hdr[16];
|
unsigned char hdr[16];
|
||||||
char *bin = NULL;
|
char *bin = NULL;
|
||||||
|
char *filename;
|
||||||
regex_t regex;
|
regex_t regex;
|
||||||
Image *img;
|
int fdin, fdout;
|
||||||
int tmpfd, fd;
|
|
||||||
|
if (s->img || !(filename = s->embed) || !s->embed[0])
|
||||||
|
return; /* already done */
|
||||||
|
|
||||||
for (i = 0; i < LEN(filters); i++) {
|
for (i = 0; i < LEN(filters); i++) {
|
||||||
if (regcomp(®ex, filters[i].regex,
|
if (regcomp(®ex, filters[i].regex,
|
||||||
@ -191,33 +192,30 @@ ffread(char *filename)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!bin)
|
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);
|
die("sent: Unable to open file %s:", filename);
|
||||||
|
|
||||||
tmpfd = fd;
|
if ((fdout = filter(fdin, bin)) < 0)
|
||||||
fd = filter(fd, bin);
|
|
||||||
if (fd < 0)
|
|
||||||
die("sent: Unable to filter %s:", filename);
|
die("sent: Unable to filter %s:", filename);
|
||||||
close(tmpfd);
|
close(fdin);
|
||||||
|
|
||||||
if (read(fd, hdr, 16) != 16 || memcmp("farbfeld", hdr, 8))
|
if (read(fdout, hdr, 16) != 16 || memcmp("farbfeld", hdr, 8))
|
||||||
return NULL;
|
die("sent: Unable to filter %s into a valid farbfeld file", filename);
|
||||||
|
|
||||||
img = calloc(1, sizeof(Image));
|
s->img = calloc(1, sizeof(Image));
|
||||||
img->fd = fd;
|
s->img->bufwidth = ntohl(*(uint32_t *)&hdr[8]);
|
||||||
img->bufwidth = ntohl(*(uint32_t *)&hdr[8]);
|
s->img->bufheight = ntohl(*(uint32_t *)&hdr[12]);
|
||||||
img->bufheight = ntohl(*(uint32_t *)&hdr[12]);
|
|
||||||
|
|
||||||
if (img->buf)
|
if (s->img->buf)
|
||||||
free(img->buf);
|
free(s->img->buf);
|
||||||
/* internally the image is stored in 888 format */
|
/* 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");
|
die("sent: Unable to malloc buffer for image.\n");
|
||||||
|
|
||||||
/* scratch buffer to read row by row */
|
/* scratch buffer to read row by row */
|
||||||
rowlen = img->bufwidth * 2 * strlen("RGBA");
|
rowlen = s->img->bufwidth * 2 * strlen("RGBA");
|
||||||
row = malloc(rowlen);
|
row = malloc(rowlen);
|
||||||
if (!row)
|
if (!row)
|
||||||
die("sent: Unable to malloc buffer for image row.\n");
|
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_g = (sc[ColBg].pixel >> 8) % 256;
|
||||||
bg_b = (sc[ColBg].pixel >> 0) % 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;
|
nbytes = 0;
|
||||||
while (nbytes < rowlen) {
|
while (nbytes < rowlen) {
|
||||||
count = read(img->fd, (char *)row + nbytes, rowlen - nbytes);
|
count = read(fdout, (char *)row + nbytes, rowlen - nbytes);
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
die("sent: Unable to read from pipe:");
|
die("sent: Unable to read from pipe:");
|
||||||
nbytes += count;
|
nbytes += count;
|
||||||
@ -242,17 +240,14 @@ ffread(char *filename)
|
|||||||
opac = ntohs(row[x + 3]) / 257;
|
opac = ntohs(row[x + 3]) / 257;
|
||||||
/* blend opaque part of image data with window background color to
|
/* blend opaque part of image data with window background color to
|
||||||
* emulate transparency */
|
* emulate transparency */
|
||||||
img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) / 255;
|
s->img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) / 255;
|
||||||
img->buf[off++] = (fg_g * opac + bg_g * (255 - opac)) / 255;
|
s->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_b * opac + bg_b * (255 - opac)) / 255;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(row);
|
free(row);
|
||||||
close(img->fd);
|
close(fdout);
|
||||||
img->state |= LOADED;
|
|
||||||
|
|
||||||
return img;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -417,11 +412,9 @@ load(FILE *fp)
|
|||||||
if (s->lines[s->linecount][blen-1] == '\n')
|
if (s->lines[s->linecount][blen-1] == '\n')
|
||||||
s->lines[s->linecount][blen-1] = '\0';
|
s->lines[s->linecount][blen-1] = '\0';
|
||||||
|
|
||||||
/* only make image slide if first line of a slide starts with @ */
|
/* mark as image slide if first line of a slide starts with @ */
|
||||||
if (s->linecount == 0 && s->lines[0][0] == '@') {
|
if (s->linecount == 0 && s->lines[0][0] == '@')
|
||||||
memmove(s->lines[0], &s->lines[0][1], blen);
|
s->embed = &s->lines[0][1];
|
||||||
s->embed = s->lines[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->lines[s->linecount][0] == '\\')
|
if (s->lines[s->linecount][0] == '\\')
|
||||||
memmove(s->lines[s->linecount], &s->lines[s->linecount][1], blen);
|
memmove(s->lines[s->linecount], &s->lines[s->linecount][1], blen);
|
||||||
@ -444,6 +437,10 @@ advance(const Arg *arg)
|
|||||||
slides[idx].img->state &= ~(DRAWN | SCALED);
|
slides[idx].img->state &= ~(DRAWN | SCALED);
|
||||||
idx = new_idx;
|
idx = new_idx;
|
||||||
xdraw();
|
xdraw();
|
||||||
|
if (slidecount > idx + 1)
|
||||||
|
ffload(&slides[idx + 1]);
|
||||||
|
if (0 < idx)
|
||||||
|
ffload(&slides[idx - 1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,11 +486,7 @@ void
|
|||||||
xdraw()
|
xdraw()
|
||||||
{
|
{
|
||||||
unsigned int height, width, i;
|
unsigned int height, width, i;
|
||||||
Image *im;
|
Image *im = slides[idx].img;
|
||||||
|
|
||||||
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);
|
getfontsize(&slides[idx], &width, &height);
|
||||||
XClearWindow(xw.dpy, xw.win);
|
XClearWindow(xw.dpy, xw.win);
|
||||||
@ -567,6 +560,7 @@ xinit()
|
|||||||
XSetWindowBackground(xw.dpy, xw.win, sc[ColBg].pixel);
|
XSetWindowBackground(xw.dpy, xw.win, sc[ColBg].pixel);
|
||||||
|
|
||||||
xloadfonts();
|
xloadfonts();
|
||||||
|
ffload(&slides[0]);
|
||||||
|
|
||||||
XStringListToTextProperty(&argv0, 1, &prop);
|
XStringListToTextProperty(&argv0, 1, &prop);
|
||||||
XSetWMName(xw.dpy, xw.win, &prop);
|
XSetWMName(xw.dpy, xw.win, &prop);
|
||||||
|
Loading…
Reference in New Issue
Block a user