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 b516f468faa3a80c31932cbcb1ea8ccd1468ffc1 /git/sent-sdk/commit/b516f468faa3a80c31932cbcb1ea8ccd1468ffc1.gph codevoid.de 70 1parent 7e558105e6e46a6a2592f2ee15220b99922cd1f0 /git/sent-sdk/commit/7e558105e6e46a6a2592f2ee15220b99922cd1f0.gph codevoid.de 70 hAuthor: sin URL:mailto:sin@2f30.org codevoid.de 70 iDate: Wed, 18 Nov 2015 10:41:02 +0000 Err codevoid.de 70 i Err codevoid.de 70 iSupport farbfeld as an intermediate format Err codevoid.de 70 i Err codevoid.de 70 iSent now uses farbfeld[0] as an intermediate format. A series of Err codevoid.de 70 ifilters is specified in config.h that matches file extensions to Err codevoid.de 70 ifilter programs. The programs will convert between formats such as Err codevoid.de 70 ipng to farbfeld. Internally in sent we do not need to worry on how Err codevoid.de 70 itto parse png or any other format. Err codevoid.de 70 i Err codevoid.de 70 iThis also works with jpg and gif and others. The 2ff wrapper will Err codevoid.de 70 iuse imagemagick conversion tools. This is temporary as jpg2ff and Err codevoid.de 70 igif2ff will also be implemented. Err codevoid.de 70 i Err codevoid.de 70 iTo make this work, you will have to clone[0] and put png2ff and 2ff Err codevoid.de 70 iin your PATH. Err codevoid.de 70 i Err codevoid.de 70 it[0] http://git.2f30.org/farbfeld/ Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i M LICENSE | 2 -- Err codevoid.de 70 i M README.md | 1 - Err codevoid.de 70 i M config.def.h | 5 +++++ Err codevoid.de 70 i M config.mk | 2 +- Err codevoid.de 70 i M example | 1 - Err codevoid.de 70 i M sent.c | 204 +++++++++++++++++-------------- Err codevoid.de 70 i Err codevoid.de 70 i6 files changed, 119 insertions(+), 96 deletions(-) Err codevoid.de 70 i--- Err codevoid.de 70 1diff --git a/LICENSE b/LICENSE /git/sent-sdk/file/LICENSE.gph codevoid.de 70 it@@ -2,8 +2,6 @@ The MIT License (MIT) Err codevoid.de 70 i Err codevoid.de 70 i Copyright (c) 2014-2015 Markus Teich Err codevoid.de 70 i Err codevoid.de 70 i-png handling stuff adapted from meh by John Hawthorn Err codevoid.de 70 i- Err codevoid.de 70 i Permission is hereby granted, free of charge, to any person obtaining a copy Err codevoid.de 70 i of this software and associated documentation files (the "Software"), to deal Err codevoid.de 70 i in the Software without restriction, including without limitation the rights Err codevoid.de 70 1diff --git a/README.md b/README.md /git/sent-sdk/file/README.md.gph codevoid.de 70 it@@ -33,7 +33,6 @@ presentation file could look like this: Err codevoid.de 70 i Err codevoid.de 70 i depends on Err codevoid.de 70 i - Xlib Err codevoid.de 70 i- - libpng Err codevoid.de 70 i Err codevoid.de 70 i sent FILENAME Err codevoid.de 70 i one slide per paragraph Err codevoid.de 70 1diff --git a/config.def.h b/config.def.h /git/sent-sdk/file/config.def.h.gph codevoid.de 70 it@@ -45,3 +45,8 @@ static Shortcut shortcuts[] = { Err codevoid.de 70 i { XK_n, advance, {.i = +1} }, Err codevoid.de 70 i { XK_p, advance, {.i = -1} }, Err codevoid.de 70 i }; Err codevoid.de 70 i+ Err codevoid.de 70 i+static Filter filters[] = { Err codevoid.de 70 i+ { "\\.png$", "png2ff" }, Err codevoid.de 70 i+ { "\\.(jpg|gif)$", "2ff" }, Err codevoid.de 70 i+}; Err codevoid.de 70 1diff --git a/config.mk b/config.mk /git/sent-sdk/file/config.mk.gph codevoid.de 70 it@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib Err codevoid.de 70 i Err codevoid.de 70 i # includes and libs Err codevoid.de 70 i INCS = -I. -I/usr/include -I/usr/include/freetype2 -I${X11INC} Err codevoid.de 70 i-LIBS = -L/usr/lib -lc -lm -L${X11LIB} -lXft -lfontconfig -lX11 -lpng Err codevoid.de 70 i+LIBS = -L/usr/lib -lc -lm -L${X11LIB} -lXft -lfontconfig -lX11 Err codevoid.de 70 i Err codevoid.de 70 i # flags Err codevoid.de 70 i CPPFLAGS = -DVERSION=\"${VERSION}\" -D_XOPEN_SOURCE=600 Err codevoid.de 70 1diff --git a/example b/example /git/sent-sdk/file/example.gph codevoid.de 70 it@@ -20,7 +20,6 @@ easy to use Err codevoid.de 70 i Err codevoid.de 70 i depends on Err codevoid.de 70 i ♽ Xlib Err codevoid.de 70 i-☢ libpng Err codevoid.de 70 i Err codevoid.de 70 i ~1000 lines of code 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@@ -1,12 +1,17 @@ Err codevoid.de 70 i /* See LICENSE for licence details. */ Err codevoid.de 70 i+#include Err codevoid.de 70 i+#include Err codevoid.de 70 i+ Err codevoid.de 70 i #include Err codevoid.de 70 i+#include Err codevoid.de 70 i #include Err codevoid.de 70 i-#include Err codevoid.de 70 i+#include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 i+#include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 i #include Err codevoid.de 70 it@@ -36,13 +41,16 @@ 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- FILE *f; Err codevoid.de 70 i- png_structp png_ptr; Err codevoid.de 70 i- png_infop info_ptr; 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 i typedef struct { Err codevoid.de 70 i+ char *regex; Err codevoid.de 70 i+ char *bin; Err codevoid.de 70 i+} Filter; Err codevoid.de 70 i+ Err codevoid.de 70 i+typedef struct { Err codevoid.de 70 i unsigned int linecount; Err codevoid.de 70 i char **lines; Err codevoid.de 70 i Image *img; Err codevoid.de 70 it@@ -79,12 +87,12 @@ typedef struct { Err codevoid.de 70 i const Arg arg; Err codevoid.de 70 i } Shortcut; Err codevoid.de 70 i Err codevoid.de 70 i-static Image *pngopen(char *filename); Err codevoid.de 70 i-static void pngfree(Image *img); Err codevoid.de 70 i-static int pngread(Image *img); Err codevoid.de 70 i-static int pngprepare(Image *img); Err codevoid.de 70 i-static void pngscale(Image *img); Err codevoid.de 70 i-static void pngdraw(Image *img); Err codevoid.de 70 i+static Image *ffopen(char *filename); Err codevoid.de 70 i+static void fffree(Image *img); Err codevoid.de 70 i+static int ffread(Image *img); Err codevoid.de 70 i+static int 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 i Err codevoid.de 70 i static void getfontsize(Slide *s, unsigned int *width, unsigned int *height); Err codevoid.de 70 i static void cleanup(); Err codevoid.de 70 it@@ -128,56 +136,87 @@ static void (*handler[LASTEvent])(XEvent *) = { Err codevoid.de 70 i [KeyPress] = kpress, Err codevoid.de 70 i }; Err codevoid.de 70 i Err codevoid.de 70 i-Image *pngopen(char *filename) Err codevoid.de 70 i+int Err codevoid.de 70 i+filter(int fd, const char *cmd) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ int fds[2]; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (pipe(fds) < 0) Err codevoid.de 70 i+ eprintf("pipe:"); Err codevoid.de 70 i+ Err codevoid.de 70 i+ switch (fork()) { Err codevoid.de 70 i+ case -1: Err codevoid.de 70 i+ eprintf("fork:"); Err codevoid.de 70 i+ case 0: Err codevoid.de 70 i+ dup2(fd, 0); Err codevoid.de 70 i+ dup2(fds[1], 1); Err codevoid.de 70 i+ close(fds[0]); Err codevoid.de 70 i+ close(fds[1]); Err codevoid.de 70 i+ execlp(cmd, cmd, (char *)0); Err codevoid.de 70 i+ eprintf("execlp %s:", cmd); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ close(fds[1]); Err codevoid.de 70 i+ return fds[0]; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+Image *ffopen(char *filename) Err codevoid.de 70 i { Err codevoid.de 70 i- FILE *f; Err codevoid.de 70 i- unsigned char buf[8]; Err codevoid.de 70 i+ unsigned char hdr[16]; Err codevoid.de 70 i+ char *bin; Err codevoid.de 70 i+ regex_t regex; Err codevoid.de 70 i Image *img; Err codevoid.de 70 i+ size_t i; Err codevoid.de 70 i+ int tmpfd, fd; Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (bin = NULL, i = 0; i < LEN(filters); i++) { Err codevoid.de 70 i+ if (regcomp(®ex, filters[i].regex, Err codevoid.de 70 i+ REG_NOSUB | REG_EXTENDED | REG_ICASE)) Err codevoid.de 70 i+ continue; Err codevoid.de 70 i+ if (!regexec(®ex, filename, 0, NULL, 0)) { Err codevoid.de 70 i+ bin = filters[i].bin; Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i Err codevoid.de 70 i- if (!(f = fopen(filename, "rb"))) { Err codevoid.de 70 i+ if ((fd = open(filename, O_RDONLY)) < 0) { Err codevoid.de 70 i eprintf("Unable to open file %s:", filename); Err codevoid.de 70 i return NULL; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i- if (fread(buf, 1, 8, f) != 8 || png_sig_cmp(buf, 1, 8)) Err codevoid.de 70 i- return NULL; 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+ eprintf("could not filter %s:", filename); Err codevoid.de 70 i+ close(tmpfd); Err codevoid.de 70 i Err codevoid.de 70 i- img = malloc(sizeof(Image)); Err codevoid.de 70 i- memset(img, 0, sizeof(Image)); Err codevoid.de 70 i- if (!(img->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, Err codevoid.de 70 i- NULL, NULL))) { Err codevoid.de 70 i- free(img); Err codevoid.de 70 i+ if (read(fd, hdr, 16) != 16) Err codevoid.de 70 i return NULL; Err codevoid.de 70 i- } Err codevoid.de 70 i- if (!(img->info_ptr = png_create_info_struct(img->png_ptr)) Err codevoid.de 70 i- || setjmp(png_jmpbuf(img->png_ptr))) { Err codevoid.de 70 i- pngfree(img); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (memcmp("farbfeld", hdr, 8)) Err codevoid.de 70 i return NULL; Err codevoid.de 70 i- } Err codevoid.de 70 i Err codevoid.de 70 i- img->f = f; Err codevoid.de 70 i- rewind(f); Err codevoid.de 70 i- png_init_io(img->png_ptr, f); Err codevoid.de 70 i- png_read_info(img->png_ptr, img->info_ptr); Err codevoid.de 70 i- img->bufwidth = png_get_image_width(img->png_ptr, img->info_ptr); Err codevoid.de 70 i- img->bufheight = png_get_image_height(img->png_ptr, img->info_ptr); 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 Err codevoid.de 70 i return img; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void pngfree(Image *img) Err codevoid.de 70 i+void fffree(Image *img) Err codevoid.de 70 i { Err codevoid.de 70 i- png_destroy_read_struct(&img->png_ptr, img->info_ptr ? &img->info_ptr : NULL, NULL); Err codevoid.de 70 i free(img->buf); Err codevoid.de 70 i if (img->ximg) Err codevoid.de 70 i XDestroyImage(img->ximg); Err codevoid.de 70 i free(img); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-int pngread(Image *img) Err codevoid.de 70 i+int ffread(Image *img) Err codevoid.de 70 i { Err codevoid.de 70 i- unsigned int y; Err codevoid.de 70 i- png_bytepp row_pointers; Err codevoid.de 70 i+ uint32_t y, x; Err codevoid.de 70 i+ uint16_t *row; Err codevoid.de 70 i+ size_t rowlen, off, nbytes; Err codevoid.de 70 i+ ssize_t r; Err codevoid.de 70 i Err codevoid.de 70 i if (!img) Err codevoid.de 70 i return 0; Err codevoid.de 70 it@@ -187,59 +226,42 @@ int pngread(Image *img) 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+ /* 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 return 0; Err codevoid.de 70 i Err codevoid.de 70 i- if (setjmp(png_jmpbuf(img->png_ptr))) { Err codevoid.de 70 i- png_destroy_read_struct(&img->png_ptr, &img->info_ptr, NULL); 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+ row = malloc(rowlen); Err codevoid.de 70 i+ if (!row) { Err codevoid.de 70 i+ free(img->buf); Err codevoid.de 70 i+ img->buf = NULL; Err codevoid.de 70 i return 0; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i- { Err codevoid.de 70 i- int color_type = png_get_color_type(img->png_ptr, img->info_ptr); Err codevoid.de 70 i- int bit_depth = png_get_bit_depth(img->png_ptr, img->info_ptr); Err codevoid.de 70 i- if (color_type == PNG_COLOR_TYPE_PALETTE) Err codevoid.de 70 i- png_set_expand(img->png_ptr); Err codevoid.de 70 i- if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) Err codevoid.de 70 i- png_set_expand(img->png_ptr); Err codevoid.de 70 i- if (png_get_valid(img->png_ptr, img->info_ptr, PNG_INFO_tRNS)) Err codevoid.de 70 i- png_set_expand(img->png_ptr); Err codevoid.de 70 i- if (bit_depth == 16) Err codevoid.de 70 i- png_set_strip_16(img->png_ptr); Err codevoid.de 70 i- if (color_type == PNG_COLOR_TYPE_GRAY Err codevoid.de 70 i- || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) Err codevoid.de 70 i- png_set_gray_to_rgb(img->png_ptr); Err codevoid.de 70 i- Err codevoid.de 70 i- png_color_16 my_background = {.red = 0xff, .green = 0xff, .blue = 0xff}; Err codevoid.de 70 i- png_color_16p image_background; Err codevoid.de 70 i- Err codevoid.de 70 i- if (png_get_bKGD(img->png_ptr, img->info_ptr, &image_background)) Err codevoid.de 70 i- png_set_background(img->png_ptr, image_background, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); Err codevoid.de 70 i- else Err codevoid.de 70 i- png_set_background(img->png_ptr, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, 2, 1.0); Err codevoid.de 70 i- Err codevoid.de 70 i- if (png_get_interlace_type(img->png_ptr, img->info_ptr) == PNG_INTERLACE_ADAM7) Err codevoid.de 70 i- img->numpasses = png_set_interlace_handling(img->png_ptr); Err codevoid.de 70 i- else Err codevoid.de 70 i- img->numpasses = 1; Err codevoid.de 70 i- png_read_update_info(img->png_ptr, img->info_ptr); Err codevoid.de 70 i+ for (off = 0, y = 0; y < img->bufheight; y++) { Err codevoid.de 70 i+ nbytes = 0; Err codevoid.de 70 i+ while (nbytes < rowlen) { Err codevoid.de 70 i+ r = read(img->fd, (char *)row + nbytes, rowlen - nbytes); Err codevoid.de 70 i+ if (r < 0) Err codevoid.de 70 i+ eprintf("read:"); Err codevoid.de 70 i+ nbytes += r; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ for (x = 0; x < rowlen / 2; x += 4) { Err codevoid.de 70 i+ img->buf[off++] = ntohs(row[x + 0]) / 257; Err codevoid.de 70 i+ img->buf[off++] = ntohs(row[x + 1]) / 257; Err codevoid.de 70 i+ img->buf[off++] = ntohs(row[x + 2]) / 257; Err codevoid.de 70 i+ } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i- row_pointers = (png_bytepp)malloc(img->bufheight * sizeof(png_bytep)); Err codevoid.de 70 i- for (y = 0; y < img->bufheight; y++) Err codevoid.de 70 i- row_pointers[y] = img->buf + y * img->bufwidth * 3; Err codevoid.de 70 i- Err codevoid.de 70 i- png_read_image(img->png_ptr, row_pointers); Err codevoid.de 70 i- free(row_pointers); Err codevoid.de 70 i- Err codevoid.de 70 i- png_destroy_read_struct(&img->png_ptr, &img->info_ptr, NULL); Err codevoid.de 70 i- fclose(img->f); 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 1; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-int pngprepare(Image *img) Err codevoid.de 70 i+int ffprepare(Image *img) Err codevoid.de 70 i { Err codevoid.de 70 i int depth = DefaultDepth(xw.dpy, xw.scr); Err codevoid.de 70 i int width = xw.uw; Err codevoid.de 70 it@@ -276,12 +298,12 @@ int pngprepare(Image *img) Err codevoid.de 70 i return 0; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i- pngscale(img); Err codevoid.de 70 i+ ffscale(img); Err codevoid.de 70 i img->state |= SCALED; Err codevoid.de 70 i return 1; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void pngscale(Image *img) Err codevoid.de 70 i+void ffscale(Image *img) Err codevoid.de 70 i { Err codevoid.de 70 i unsigned int x, y; Err codevoid.de 70 i unsigned int width = img->ximg->width; Err codevoid.de 70 it@@ -306,7 +328,7 @@ void pngscale(Image *img) Err codevoid.de 70 i } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void pngdraw(Image *img) Err codevoid.de 70 i+void ffdraw(Image *img) Err codevoid.de 70 i { Err codevoid.de 70 i int xoffset = (xw.w - img->ximg->width) / 2; Err codevoid.de 70 i int yoffset = (xw.h - img->ximg->height) / 2; Err codevoid.de 70 it@@ -364,7 +386,7 @@ void cleanup() Err codevoid.de 70 i free(slides[i].lines[j]); Err codevoid.de 70 i free(slides[i].lines); Err codevoid.de 70 i if (slides[i].img) Err codevoid.de 70 i- pngfree(slides[i].img); Err codevoid.de 70 i+ fffree(slides[i].img); Err codevoid.de 70 i } Err codevoid.de 70 i free(slides); Err codevoid.de 70 i slides = NULL; Err codevoid.de 70 it@@ -443,7 +465,7 @@ void load(FILE *fp) 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->img = pngopen(s->lines[0]); Err codevoid.de 70 i+ s->img = ffopen(s->lines[0]); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i if (s->lines[s->linecount][0] == '\\') Err codevoid.de 70 it@@ -465,10 +487,10 @@ void 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 && slides[idx + 1].img && !pngread(slides[idx + 1].img)) Err codevoid.de 70 i- die("Unable to read image %s.", slides[idx + 1].lines[0]); Err codevoid.de 70 i- if (0 < idx && slides[idx - 1].img && !pngread(slides[idx - 1].img)) Err codevoid.de 70 i- die("Unable to read image %s.", slides[idx - 1].lines[0]); Err codevoid.de 70 i+ if (slidecount > idx + 1 && slides[idx + 1].img && !ffread(slides[idx + 1].img)) Err codevoid.de 70 i+ die("Unable to read image %s", slides[idx + 1].lines[0]); Err codevoid.de 70 i+ if (0 < idx && slides[idx - 1].img && !ffread(slides[idx - 1].img)) Err codevoid.de 70 i+ die("Unable to read image %s", slides[idx - 1].lines[0]); Err codevoid.de 70 i } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 it@@ -532,12 +554,12 @@ void xdraw() Err codevoid.de 70 i slides[idx].lines[i], Err codevoid.de 70 i 0); Err codevoid.de 70 i drw_map(d, xw.win, 0, 0, xw.w, xw.h); Err codevoid.de 70 i- } else if (!(im->state & LOADED) && !pngread(im)) { Err codevoid.de 70 i- eprintf("Unable to read image %s.", slides[idx].lines[0]); Err codevoid.de 70 i- } else if (!(im->state & SCALED) && !pngprepare(im)) { Err codevoid.de 70 i- eprintf("Unable to prepare image %s for drawing.", slides[idx].lines[0]); Err codevoid.de 70 i+ } else if (!(im->state & LOADED) && !ffread(im)) { Err codevoid.de 70 i+ eprintf("Unable to read image %s", slides[idx].lines[0]); Err codevoid.de 70 i+ } else if (!(im->state & SCALED) && !ffprepare(im)) { Err codevoid.de 70 i+ eprintf("Unable to prepare image %s for drawing", slides[idx].lines[0]); Err codevoid.de 70 i } else if (!(im->state & DRAWN)) { Err codevoid.de 70 i- pngdraw(im); Err codevoid.de 70 i+ ffdraw(im); Err codevoid.de 70 i } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 .