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 8e81a9be0097719bfb30d7f5802d5e72fbfc2fa6 /git/sent-sdk/commit/8e81a9be0097719bfb30d7f5802d5e72fbfc2fa6.gph codevoid.de 70 1parent 982e80256045fcbe6e41dd057b21539480098a70 /git/sent-sdk/commit/982e80256045fcbe6e41dd057b21539480098a70.gph codevoid.de 70 hAuthor: c0dev0id URL:mailto:sh+github[at]codevoid[dot]de codevoid.de 70 iDate: Tue, 1 Dec 2020 20:41:55 +0100 Err codevoid.de 70 i Err codevoid.de 70 irework patches Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i D .gitignore | 30 ------------------------------ Err codevoid.de 70 i A config.h | 59 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i A patches/sent-bilinearscaling-1.0.d… | 88 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i A patches/sent-options-20190213-72d3… | 72 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i A patches/sent-progress-bar-1.0.diff | 31 +++++++++++++++++++++++++++++++ Err codevoid.de 70 i M sent.1 | 11 +++++++++++ Err codevoid.de 70 i M sent.c | 1084 +++++++++++++++++-------------- Err codevoid.de 70 i Err codevoid.de 70 i7 files changed, 841 insertions(+), 534 deletions(-) Err codevoid.de 70 i--- Err codevoid.de 70 1diff --git a/.gitignore b/.gitignore /git/sent-sdk/file/.gitignore.gph codevoid.de 70 it@@ -1,30 +0,0 @@ Err codevoid.de 70 i-# Object files Err codevoid.de 70 i-*.o Err codevoid.de 70 i-*.ko Err codevoid.de 70 i-*.obj Err codevoid.de 70 i-*.elf Err codevoid.de 70 i- Err codevoid.de 70 i-# Libraries Err codevoid.de 70 i-*.lib Err codevoid.de 70 i-*.a Err codevoid.de 70 i- Err codevoid.de 70 i-# Shared objects (inc. Windows DLLs) Err codevoid.de 70 i-*.dll Err codevoid.de 70 i-*.so Err codevoid.de 70 i-*.so.* Err codevoid.de 70 i-*.dylib Err codevoid.de 70 i- Err codevoid.de 70 i-# Executables Err codevoid.de 70 i-*.exe Err codevoid.de 70 i-*.out Err codevoid.de 70 i-*.app Err codevoid.de 70 i-*.i*86 Err codevoid.de 70 i-*.x86_64 Err codevoid.de 70 i-*.hex Err codevoid.de 70 i-/sent Err codevoid.de 70 i- Err codevoid.de 70 i-# vim Err codevoid.de 70 i-*.swp Err codevoid.de 70 i-*~ Err codevoid.de 70 i- Err codevoid.de 70 i-config.h Err codevoid.de 70 1diff --git a/config.h b/config.h /git/sent-sdk/file/config.h.gph codevoid.de 70 it@@ -0,0 +1,59 @@ Err codevoid.de 70 i+/* See LICENSE file for copyright and license details. */ Err codevoid.de 70 i+ Err codevoid.de 70 i+static char *fontfallbacks[] = { Err codevoid.de 70 i+ "dejavu sans", Err codevoid.de 70 i+ "roboto", Err codevoid.de 70 i+ "ubuntu", Err codevoid.de 70 i+}; Err codevoid.de 70 i+#define NUMFONTSCALES 42 Err codevoid.de 70 i+#define FONTSZ(x) ((int)(10.0 * powf(1.1288, (x)))) /* x in [0, NUMFONTSCALES-1] */ Err codevoid.de 70 i+ Err codevoid.de 70 i+static const char *colors[] = { Err codevoid.de 70 i+ "#226622", /* foreground color */ Err codevoid.de 70 i+ "#080808", /* background color */ Err codevoid.de 70 i+}; Err codevoid.de 70 i+ Err codevoid.de 70 i+static const float linespacing = 1.4; Err codevoid.de 70 i+ Err codevoid.de 70 i+/* how much screen estate is to be used at max for the content */ Err codevoid.de 70 i+static const float usablewidth = 0.75; Err codevoid.de 70 i+static const float usableheight = 0.75; Err codevoid.de 70 i+ Err codevoid.de 70 i+/* height of the presentation progress bar */ Err codevoid.de 70 i+static const int progressheight = 12; Err codevoid.de 70 i+ Err codevoid.de 70 i+static Mousekey mshortcuts[] = { Err codevoid.de 70 i+ /* button function argument */ Err codevoid.de 70 i+ { Button1, advance, {.i = +1} }, Err codevoid.de 70 i+ { Button3, advance, {.i = -1} }, Err codevoid.de 70 i+ { Button4, advance, {.i = -1} }, Err codevoid.de 70 i+ { Button5, advance, {.i = +1} }, Err codevoid.de 70 i+}; Err codevoid.de 70 i+ Err codevoid.de 70 i+static Shortcut shortcuts[] = { Err codevoid.de 70 i+ /* keysym function argument */ Err codevoid.de 70 i+ { XK_Escape, quit, {0} }, Err codevoid.de 70 i+ { XK_q, quit, {0} }, Err codevoid.de 70 i+ { XK_Right, advance, {.i = +1} }, Err codevoid.de 70 i+ { XK_Left, advance, {.i = -1} }, Err codevoid.de 70 i+ { XK_Return, advance, {.i = +1} }, Err codevoid.de 70 i+ { XK_space, advance, {.i = +1} }, Err codevoid.de 70 i+ { XK_BackSpace, advance, {.i = -1} }, Err codevoid.de 70 i+ { XK_l, advance, {.i = +1} }, Err codevoid.de 70 i+ { XK_h, advance, {.i = -1} }, Err codevoid.de 70 i+ { XK_j, advance, {.i = +1} }, Err codevoid.de 70 i+ { XK_k, advance, {.i = -1} }, Err codevoid.de 70 i+ { XK_Down, advance, {.i = +1} }, Err codevoid.de 70 i+ { XK_Up, advance, {.i = -1} }, Err codevoid.de 70 i+ { XK_Next, advance, {.i = +1} }, Err codevoid.de 70 i+ { XK_Prior, advance, {.i = -1} }, 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+ { XK_r, reload, {0} }, Err codevoid.de 70 i+}; Err codevoid.de 70 i+ Err codevoid.de 70 i+static Filter filters[] = { Err codevoid.de 70 i+ { "\\.ff$", "cat" }, Err codevoid.de 70 i+ { "\\.ff.bz2$", "bunzip2" }, Err codevoid.de 70 i+ { "\\.[a-z0-9]+$", "2ff" }, Err codevoid.de 70 i+}; Err codevoid.de 70 1diff --git a/patches/sent-bilinearscaling-1.0.diff b/patches/sent-bilinearscaling-1.0.diff /git/sent-sdk/file/patches/sent-bilinearscaling-1.0.diff.gph codevoid.de 70 it@@ -0,0 +1,88 @@ Err codevoid.de 70 i+diff --git a/sent.c b/sent.c Err codevoid.de 70 i+index 0da2bff..d92cf3b 100644 Err codevoid.de 70 i+--- a/sent.c Err codevoid.de 70 i++++ b/sent.c Err codevoid.de 70 i+@@ -282,27 +282,66 @@ ffprepare(Image *img) Err codevoid.de 70 i+ img->state |= SCALED; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i++static unsigned char double_to_uchar_clamp255(double dbl) Err codevoid.de 70 i++{ Err codevoid.de 70 i++ dbl = round(dbl); Err codevoid.de 70 i++ Err codevoid.de 70 i++ return Err codevoid.de 70 i++ (dbl < 0.0) ? 0 : Err codevoid.de 70 i++ (dbl > 255.0) ? 255 : (unsigned char)dbl; Err codevoid.de 70 i++} Err codevoid.de 70 i++ Err codevoid.de 70 i++static int int_clamp(int integer, int lower, int upper) Err codevoid.de 70 i++{ Err codevoid.de 70 i++ if (integer < lower) Err codevoid.de 70 i++ return lower; Err codevoid.de 70 i++ else if (integer >= upper) Err codevoid.de 70 i++ return upper - 1; Err codevoid.de 70 i++ else Err codevoid.de 70 i++ return integer; Err codevoid.de 70 i++} Err codevoid.de 70 i++ Err codevoid.de 70 i+ void Err codevoid.de 70 i+ 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 i+- unsigned int height = img->ximg->height; Err codevoid.de 70 i+- char* newBuf = img->ximg->data; Err codevoid.de 70 i+- unsigned char* ibuf; Err codevoid.de 70 i+- unsigned int jdy = img->ximg->bytes_per_line / 4 - width; Err codevoid.de 70 i+- unsigned int dx = (img->bufwidth << 10) / width; Err codevoid.de 70 i+- Err codevoid.de 70 i+- for (y = 0; y < height; y++) { Err codevoid.de 70 i+- unsigned int bufx = img->bufwidth / width; Err codevoid.de 70 i+- ibuf = &img->buf[y * img->bufheight / height * img->bufwidth * 3]; Err codevoid.de 70 i+- Err codevoid.de 70 i+- for (x = 0; x < width; x++) { Err codevoid.de 70 i+- *newBuf++ = (ibuf[(bufx >> 10)*3+2]); Err codevoid.de 70 i+- *newBuf++ = (ibuf[(bufx >> 10)*3+1]); Err codevoid.de 70 i+- *newBuf++ = (ibuf[(bufx >> 10)*3+0]); Err codevoid.de 70 i++ const unsigned width = img->ximg->width; Err codevoid.de 70 i++ const unsigned height = img->ximg->height; Err codevoid.de 70 i++ unsigned char* newBuf = (unsigned char*)img->ximg->data; Err codevoid.de 70 i++ const unsigned jdy = img->ximg->bytes_per_line / 4 - width; Err codevoid.de 70 i++ Err codevoid.de 70 i++ const double x_scale = ((double)img->bufwidth/(double)width); Err codevoid.de 70 i++ const double y_scale = ((double)img->bufheight/(double)height); Err codevoid.de 70 i++ Err codevoid.de 70 i++ for (unsigned y = 0; y < height; ++y) { Err codevoid.de 70 i++ const double old_y = (double)y * y_scale; Err codevoid.de 70 i++ const double y_factor = ceil(old_y) - old_y; Err codevoid.de 70 i++ const int old_y_int_0 = int_clamp((int)floor(old_y), 0, img->bufheight); Err codevoid.de 70 i++ const int old_y_int_1 = int_clamp((int)ceil(old_y), 0, img->bufheight); Err codevoid.de 70 i++ Err codevoid.de 70 i++ for (unsigned x = 0; x < width; ++x) { Err codevoid.de 70 i++ const double old_x = (double)x * x_scale; Err codevoid.de 70 i++ const double x_factor = ceil(old_x) - old_x; Err codevoid.de 70 i++ const int old_x_int_0 = int_clamp((int)floor(old_x), 0, img->bufwidth); Err codevoid.de 70 i++ const int old_x_int_1 = int_clamp((int)ceil(old_x), 0, img->bufwidth); Err codevoid.de 70 i++ Err codevoid.de 70 i++ const unsigned c00_pos = 3*((old_x_int_0) + ((old_y_int_0)*img->bufwidth)); Err codevoid.de 70 i++ const unsigned c01_pos = 3*((old_x_int_0) + ((old_y_int_1)*img->bufwidth)); Err codevoid.de 70 i++ const unsigned c10_pos = 3*((old_x_int_1) + ((old_y_int_0)*img->bufwidth)); Err codevoid.de 70 i++ const unsigned c11_pos = 3*((old_x_int_1) + ((old_y_int_1)*img->bufwidth)); Err codevoid.de 70 i++ Err codevoid.de 70 i++ for (int i = 2; i >= 0 ; --i) { Err codevoid.de 70 i++ const unsigned char c00 = img->buf[c00_pos + i]; Err codevoid.de 70 i++ const unsigned char c01 = img->buf[c01_pos + i]; Err codevoid.de 70 i++ const unsigned char c10 = img->buf[c10_pos + i]; Err codevoid.de 70 i++ const unsigned char c11 = img->buf[c11_pos + i]; Err codevoid.de 70 i++ Err codevoid.de 70 i++ const double x_result_0 = (double)c00*x_factor + (double)c10*(1.0 - x_factor); Err codevoid.de 70 i++ const double x_result_1 = (double)c01*x_factor + (double)c11*(1.0 - x_factor); Err codevoid.de 70 i++ const double result = x_result_0*y_factor + x_result_1*(1.0 - y_factor); Err codevoid.de 70 i++ Err codevoid.de 70 i++ *newBuf++ = double_to_uchar_clamp255(result); Err codevoid.de 70 i++ } Err codevoid.de 70 i+ newBuf++; Err codevoid.de 70 i+- bufx += dx; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ newBuf += jdy; Err codevoid.de 70 i+ } Err codevoid.de 70 1diff --git a/patches/sent-options-20190213-72d33d4.diff b/patches/sent-options-20190213-72d33d4.diff /git/sent-sdk/file/patches/sent-options-20190213-72d33d4.diff.gph codevoid.de 70 it@@ -0,0 +1,72 @@ Err codevoid.de 70 i+From 3a348cc15a97df8e8784b129800293dcfba28f3f Mon Sep 17 00:00:00 2001 Err codevoid.de 70 i+From: Sunur Efe Vural Err codevoid.de 70 i+Date: Wed, 13 Feb 2019 14:28:17 -0500 Err codevoid.de 70 i+Subject: [PATCH] Commandline Options Err codevoid.de 70 i+ Err codevoid.de 70 i+A simple patch that adds extra commandline options to sent. Err codevoid.de 70 i+--- Err codevoid.de 70 i+ sent.1 | 11 +++++++++++ Err codevoid.de 70 i+ sent.c | 11 ++++++++++- Err codevoid.de 70 i+ 2 files changed, 21 insertions(+), 1 deletion(-) Err codevoid.de 70 i+ Err codevoid.de 70 i+diff --git a/sent.1 b/sent.1 Err codevoid.de 70 i+index fabc614..5d55bf4 100644 Err codevoid.de 70 i+--- a/sent.1 Err codevoid.de 70 i++++ b/sent.1 Err codevoid.de 70 i+@@ -5,6 +5,9 @@ Err codevoid.de 70 i+ .Nd simple plaintext presentation tool Err codevoid.de 70 i+ .Sh SYNOPSIS Err codevoid.de 70 i+ .Nm Err codevoid.de 70 i++.Op Fl f Ar font Err codevoid.de 70 i++.Op Fl c Ar fgcolor Err codevoid.de 70 i++.Op Fl b Ar bgcolor Err codevoid.de 70 i+ .Op Fl v Err codevoid.de 70 i+ .Op Ar file Err codevoid.de 70 i+ .Sh DESCRIPTION Err codevoid.de 70 i+@@ -21,6 +24,14 @@ few minutes. Err codevoid.de 70 i+ .Bl -tag -width Ds Err codevoid.de 70 i+ .It Fl v Err codevoid.de 70 i+ Print version information to stdout and exit. Err codevoid.de 70 i++.It Fl f Ar font Err codevoid.de 70 i++Defines the Err codevoid.de 70 i++.Ar font Err codevoid.de 70 i++when sent is run. Err codevoid.de 70 i++.It Fl c Ar fgcolor Err codevoid.de 70 i++Defines the foreground color when sent is run. Err codevoid.de 70 i++.It Fl b Ar bgcolor Err codevoid.de 70 i++Defines the background color when sent is run. Err codevoid.de 70 i+ .El Err codevoid.de 70 i+ .Sh USAGE Err codevoid.de 70 i+ .Bl -tag -width Ds Err codevoid.de 70 i+diff --git a/sent.c b/sent.c Err codevoid.de 70 i+index c50a572..0b36e32 100644 Err codevoid.de 70 i+--- a/sent.c Err codevoid.de 70 i++++ b/sent.c Err codevoid.de 70 i+@@ -675,7 +675,7 @@ configure(XEvent *e) Err codevoid.de 70 i+ void Err codevoid.de 70 i+ usage() Err codevoid.de 70 i+ { Err codevoid.de 70 i+- die("usage: %s [file]", argv0); Err codevoid.de 70 i++ die("usage: %s [-c fgcolor] [-b bgcolor] [-f font] [file]", argv0); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ int Err codevoid.de 70 i+@@ -687,6 +687,15 @@ main(int argc, char *argv[]) Err codevoid.de 70 i+ case 'v': Err codevoid.de 70 i+ fprintf(stderr, "sent-"VERSION"\n"); Err codevoid.de 70 i+ return 0; Err codevoid.de 70 i++ case 'f': Err codevoid.de 70 i++ fontfallbacks[0] = EARGF(usage()); Err codevoid.de 70 i++ break; Err codevoid.de 70 i++ case 'c': Err codevoid.de 70 i++ colors[0] = EARGF(usage()); Err codevoid.de 70 i++ break; Err codevoid.de 70 i++ case 'b': Err codevoid.de 70 i++ colors[1] = EARGF(usage()); Err codevoid.de 70 i++ break; Err codevoid.de 70 i+ default: Err codevoid.de 70 i+ usage(); Err codevoid.de 70 i+ } ARGEND Err codevoid.de 70 i+-- Err codevoid.de 70 i+2.20.1 Err codevoid.de 70 i+ Err codevoid.de 70 1diff --git a/patches/sent-progress-bar-1.0.diff b/patches/sent-progress-bar-1.0.diff /git/sent-sdk/file/patches/sent-progress-bar-1.0.diff.gph codevoid.de 70 it@@ -0,0 +1,31 @@ Err codevoid.de 70 i+diff --git a/config.def.h b/config.def.h Err codevoid.de 70 i+index 60eb376..25d89e0 100644 Err codevoid.de 70 i+--- a/config.def.h Err codevoid.de 70 i++++ b/config.def.h Err codevoid.de 70 i+@@ -19,6 +19,9 @@ static const float linespacing = 1.4; Err codevoid.de 70 i+ static const float usablewidth = 0.75; Err codevoid.de 70 i+ static const float usableheight = 0.75; Err codevoid.de 70 i+ Err codevoid.de 70 i++/* height of the presentation progress bar */ Err codevoid.de 70 i++static const int progressheight = 5; Err codevoid.de 70 i++ Err codevoid.de 70 i+ static Mousekey mshortcuts[] = { Err codevoid.de 70 i+ /* button function argument */ Err codevoid.de 70 i+ { Button1, advance, {.i = +1} }, Err codevoid.de 70 i+diff --git a/sent.c b/sent.c Err codevoid.de 70 i+index c50a572..046466e 100644 Err codevoid.de 70 i+--- a/sent.c Err codevoid.de 70 i++++ b/sent.c Err codevoid.de 70 i+@@ -533,6 +533,12 @@ xdraw() Err codevoid.de 70 i+ 0, Err codevoid.de 70 i+ slides[idx].lines[i], Err codevoid.de 70 i+ 0); Err codevoid.de 70 i++ if (idx != 0 && progressheight != 0) { Err codevoid.de 70 i++ drw_rect(d, Err codevoid.de 70 i++ 0, xw.h - progressheight, Err codevoid.de 70 i++ (xw.w * idx)/(slidecount - 1), progressheight, Err codevoid.de 70 i++ 1, 0); Err codevoid.de 70 i++ } Err codevoid.de 70 i+ drw_map(d, xw.win, 0, 0, xw.w, xw.h); Err codevoid.de 70 i+ } else { Err codevoid.de 70 i+ if (!(im->state & SCALED)) Err codevoid.de 70 1diff --git a/sent.1 b/sent.1 /git/sent-sdk/file/sent.1.gph codevoid.de 70 it@@ -5,6 +5,9 @@ Err codevoid.de 70 i .Nd simple plaintext presentation tool Err codevoid.de 70 i .Sh SYNOPSIS Err codevoid.de 70 i .Nm Err codevoid.de 70 i+.Op Fl f Ar font Err codevoid.de 70 i+.Op Fl c Ar fgcolor Err codevoid.de 70 i+.Op Fl b Ar bgcolor Err codevoid.de 70 i .Op Fl v Err codevoid.de 70 i .Op Ar file Err codevoid.de 70 i .Sh DESCRIPTION Err codevoid.de 70 it@@ -21,6 +24,14 @@ few minutes. Err codevoid.de 70 i .Bl -tag -width Ds Err codevoid.de 70 i .It Fl v Err codevoid.de 70 i Print version information to stdout and exit. Err codevoid.de 70 i+.It Fl f Ar font Err codevoid.de 70 i+Defines the Err codevoid.de 70 i+.Ar font Err codevoid.de 70 i+when sent is run. Err codevoid.de 70 i+.It Fl c Ar fgcolor Err codevoid.de 70 i+Defines the foreground color when sent is run. Err codevoid.de 70 i+.It Fl b Ar bgcolor Err codevoid.de 70 i+Defines the background color when sent is run. Err codevoid.de 70 i .El Err codevoid.de 70 i .Sh USAGE Err codevoid.de 70 i .Bl -tag -width Ds Err codevoid.de 70 1diff --git a/sent.c b/sent.c /git/sent-sdk/file/sent.c.gph codevoid.de 70 it@@ -31,59 +31,59 @@ char *argv0; Err codevoid.de 70 i #define MAXFONTSTRLEN 128 Err codevoid.de 70 i Err codevoid.de 70 i typedef enum { Err codevoid.de 70 i- NONE = 0, Err codevoid.de 70 i- SCALED = 1, Err codevoid.de 70 i+ NONE = 0, Err codevoid.de 70 i+ SCALED = 1, Err codevoid.de 70 i } imgstate; Err codevoid.de 70 i Err codevoid.de 70 i typedef struct { Err codevoid.de 70 i- unsigned char *buf; 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 numpasses; Err codevoid.de 70 i+ unsigned char *buf; 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 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+ 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 i- char *embed; 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 i+ char *embed; Err codevoid.de 70 i } Slide; Err codevoid.de 70 i Err codevoid.de 70 i /* Purely graphic info */ Err codevoid.de 70 i typedef struct { Err codevoid.de 70 i- Display *dpy; Err codevoid.de 70 i- Window win; Err codevoid.de 70 i- Atom wmdeletewin, netwmname; Err codevoid.de 70 i- Visual *vis; Err codevoid.de 70 i- XSetWindowAttributes attrs; Err codevoid.de 70 i- int scr; Err codevoid.de 70 i- int w, h; Err codevoid.de 70 i- int uw, uh; /* usable dimensions for drawing text and images */ Err codevoid.de 70 i+ Display *dpy; Err codevoid.de 70 i+ Window win; Err codevoid.de 70 i+ Atom wmdeletewin, netwmname; Err codevoid.de 70 i+ Visual *vis; Err codevoid.de 70 i+ XSetWindowAttributes attrs; Err codevoid.de 70 i+ int scr; Err codevoid.de 70 i+ int w, h; Err codevoid.de 70 i+ int uw, uh; /* usable dimensions for drawing text and images */ Err codevoid.de 70 i } XWindow; Err codevoid.de 70 i Err codevoid.de 70 i typedef union { Err codevoid.de 70 i- int i; Err codevoid.de 70 i- unsigned int ui; Err codevoid.de 70 i- float f; Err codevoid.de 70 i- const void *v; Err codevoid.de 70 i+ int i; Err codevoid.de 70 i+ unsigned int ui; Err codevoid.de 70 i+ float f; Err codevoid.de 70 i+ const void *v; Err codevoid.de 70 i } Arg; Err codevoid.de 70 i Err codevoid.de 70 i typedef struct { Err codevoid.de 70 i- unsigned int b; Err codevoid.de 70 i- void (*func)(const Arg *); Err codevoid.de 70 i- const Arg arg; Err codevoid.de 70 i+ unsigned int b; Err codevoid.de 70 i+ void (*func)(const Arg *); Err codevoid.de 70 i+ const Arg arg; Err codevoid.de 70 i } Mousekey; Err codevoid.de 70 i Err codevoid.de 70 i typedef struct { Err codevoid.de 70 i- KeySym keysym; Err codevoid.de 70 i- void (*func)(const Arg *); Err codevoid.de 70 i- const Arg arg; Err codevoid.de 70 i+ KeySym keysym; Err codevoid.de 70 i+ void (*func)(const Arg *); 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 void fffree(Image *img); Err codevoid.de 70 it@@ -127,562 +127,638 @@ static Fnt *fonts[NUMFONTSCALES]; Err codevoid.de 70 i static int running = 1; Err codevoid.de 70 i Err codevoid.de 70 i static void (*handler[LASTEvent])(XEvent *) = { Err codevoid.de 70 i- [ButtonPress] = bpress, Err codevoid.de 70 i- [ClientMessage] = cmessage, Err codevoid.de 70 i- [ConfigureNotify] = configure, Err codevoid.de 70 i- [Expose] = expose, Err codevoid.de 70 i- [KeyPress] = kpress, Err codevoid.de 70 i+ [ButtonPress] = bpress, Err codevoid.de 70 i+ [ClientMessage] = cmessage, Err codevoid.de 70 i+ [ConfigureNotify] = configure, Err codevoid.de 70 i+ [Expose] = expose, Err codevoid.de 70 i+ [KeyPress] = kpress, Err codevoid.de 70 i }; Err codevoid.de 70 i Err codevoid.de 70 i-int filter(int fd, const char *cmd) 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- die("sent: Unable to create 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- die("sent: Unable to 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("sh", "sh", "-c", cmd, (char *)0); Err codevoid.de 70 i- fprintf(stderr, "sent: execlp sh -c '%s': %s\n", cmd, strerror(errno)); Err codevoid.de 70 i- _exit(1); 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+ int fds[2]; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (pipe(fds) < 0) Err codevoid.de 70 i+ die("sent: Unable to create 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+ die("sent: Unable to 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("sh", "sh", "-c", cmd, (char *)0); Err codevoid.de 70 i+ fprintf(stderr, "sent: execlp sh -c '%s': %s\n", cmd, strerror(errno)); Err codevoid.de 70 i+ _exit(1); 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-void fffree(Image *img) Err codevoid.de 70 i+void Err codevoid.de 70 i+fffree(Image *img) Err codevoid.de 70 i { 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+ 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-void ffload(Slide *s) 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 i- uint8_t opac, fg_r, fg_g, fg_b, bg_r, bg_g, bg_b; Err codevoid.de 70 i- size_t rowlen, off, nbytes, i; 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- 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 i- REG_NOSUB | REG_EXTENDED | REG_ICASE)) { Err codevoid.de 70 i- fprintf(stderr, "sent: Invalid regex '%s'\n", filters[i].regex); Err codevoid.de 70 i- continue; Err codevoid.de 70 i- } 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- regfree(®ex); Err codevoid.de 70 i- break; Err codevoid.de 70 i- } Err codevoid.de 70 i- regfree(®ex); Err codevoid.de 70 i- } Err codevoid.de 70 i- if (!bin) Err codevoid.de 70 i- die("sent: Unable to find matching filter for '%s'", filename); Err codevoid.de 70 i- Err codevoid.de 70 i- if ((fdin = open(filename, O_RDONLY)) < 0) Err codevoid.de 70 i- die("sent: Unable to open '%s':", filename); Err codevoid.de 70 i- 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(fdin); Err codevoid.de 70 i- Err codevoid.de 70 i- if (read(fdout, hdr, 16) != 16) Err codevoid.de 70 i- die("sent: Unable to read filtered file '%s':", filename); Err codevoid.de 70 i- if (memcmp("farbfeld", hdr, 8)) Err codevoid.de 70 i- die("sent: Filtered file '%s' has no valid farbfeld header", filename); Err codevoid.de 70 i- Err codevoid.de 70 i- s->img = ecalloc(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 (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- s->img->buf = ecalloc(s->img->bufwidth * s->img->bufheight, strlen("888")); Err codevoid.de 70 i- Err codevoid.de 70 i- /* scratch buffer to read row by row */ Err codevoid.de 70 i- rowlen = s->img->bufwidth * 2 * strlen("RGBA"); Err codevoid.de 70 i- row = ecalloc(1, rowlen); Err codevoid.de 70 i- Err codevoid.de 70 i- /* extract window background color channels for transparency */ Err codevoid.de 70 i- bg_r = (sc[ColBg].pixel >> 16) % 256; 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 < 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(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 i- } Err codevoid.de 70 i- for (x = 0; x < rowlen / 2; x += 4) { Err codevoid.de 70 i- fg_r = ntohs(row[x + 0]) / 257; Err codevoid.de 70 i- fg_g = ntohs(row[x + 1]) / 257; Err codevoid.de 70 i- fg_b = ntohs(row[x + 2]) / 257; 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- 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(fdout); Err codevoid.de 70 i+ uint32_t y, x; Err codevoid.de 70 i+ uint16_t *row; Err codevoid.de 70 i+ uint8_t opac, fg_r, fg_g, fg_b, bg_r, bg_g, bg_b; Err codevoid.de 70 i+ size_t rowlen, off, nbytes, i; 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+ 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 i+ REG_NOSUB | REG_EXTENDED | REG_ICASE)) { Err codevoid.de 70 i+ fprintf(stderr, "sent: Invalid regex '%s'\n", filters[i].regex); Err codevoid.de 70 i+ continue; Err codevoid.de 70 i+ } 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+ regfree(®ex); Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ regfree(®ex); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ if (!bin) Err codevoid.de 70 i+ die("sent: Unable to find matching filter for '%s'", filename); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if ((fdin = open(filename, O_RDONLY)) < 0) Err codevoid.de 70 i+ die("sent: Unable to open '%s':", filename); Err codevoid.de 70 i+ 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(fdin); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (read(fdout, hdr, 16) != 16) Err codevoid.de 70 i+ die("sent: Unable to read filtered file '%s':", filename); Err codevoid.de 70 i+ if (memcmp("farbfeld", hdr, 8)) Err codevoid.de 70 i+ die("sent: Filtered file '%s' has no valid farbfeld header", filename); Err codevoid.de 70 i+ Err codevoid.de 70 i+ s->img = ecalloc(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 (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+ s->img->buf = ecalloc(s->img->bufwidth * s->img->bufheight, strlen("888")); Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* scratch buffer to read row by row */ Err codevoid.de 70 i+ rowlen = s->img->bufwidth * 2 * strlen("RGBA"); Err codevoid.de 70 i+ row = ecalloc(1, rowlen); Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* extract window background color channels for transparency */ Err codevoid.de 70 i+ bg_r = (sc[ColBg].pixel >> 16) % 256; 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 < 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(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 i+ } Err codevoid.de 70 i+ for (x = 0; x < rowlen / 2; x += 4) { Err codevoid.de 70 i+ fg_r = ntohs(row[x + 0]) / 257; Err codevoid.de 70 i+ fg_g = ntohs(row[x + 1]) / 257; Err codevoid.de 70 i+ fg_b = ntohs(row[x + 2]) / 257; 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+ 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(fdout); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void ffprepare(Image *img) Err codevoid.de 70 i+void Err codevoid.de 70 i+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 i- int height = xw.uh; 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 i+ int height = xw.uh; Err codevoid.de 70 i Err codevoid.de 70 i- if (xw.uw * img->bufheight > xw.uh * img->bufwidth) Err codevoid.de 70 i- width = img->bufwidth * xw.uh / img->bufheight; Err codevoid.de 70 i- else Err codevoid.de 70 i- height = img->bufheight * xw.uw / img->bufwidth; Err codevoid.de 70 i+ if (xw.uw * img->bufheight > xw.uh * img->bufwidth) Err codevoid.de 70 i+ width = img->bufwidth * xw.uh / img->bufheight; Err codevoid.de 70 i+ else Err codevoid.de 70 i+ height = img->bufheight * xw.uw / img->bufwidth; Err codevoid.de 70 i Err codevoid.de 70 i- if (depth < 24) Err codevoid.de 70 i- die("sent: Display color depths < 24 not supported"); Err codevoid.de 70 i+ if (depth < 24) Err codevoid.de 70 i+ die("sent: Display color depths < 24 not supported"); Err codevoid.de 70 i Err codevoid.de 70 i- if (!(img->ximg = XCreateImage(xw.dpy, CopyFromParent, depth, ZPixmap, 0, Err codevoid.de 70 i- NULL, width, height, 32, 0))) Err codevoid.de 70 i- die("sent: Unable to create XImage"); Err codevoid.de 70 i+ if (!(img->ximg = XCreateImage(xw.dpy, CopyFromParent, depth, ZPixmap, 0, Err codevoid.de 70 i+ NULL, width, height, 32, 0))) Err codevoid.de 70 i+ die("sent: Unable to create XImage"); Err codevoid.de 70 i Err codevoid.de 70 i- img->ximg->data = ecalloc(height, img->ximg->bytes_per_line); Err codevoid.de 70 i- if (!XInitImage(img->ximg)) Err codevoid.de 70 i- die("sent: Unable to initiate XImage"); Err codevoid.de 70 i+ img->ximg->data = ecalloc(height, img->ximg->bytes_per_line); Err codevoid.de 70 i+ if (!XInitImage(img->ximg)) Err codevoid.de 70 i+ die("sent: Unable to initiate XImage"); Err codevoid.de 70 i Err codevoid.de 70 i- ffscale(img); Err codevoid.de 70 i- img->state |= SCALED; Err codevoid.de 70 i+ ffscale(img); Err codevoid.de 70 i+ img->state |= SCALED; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void ffscale(Image *img) Err codevoid.de 70 i+static unsigned char double_to_uchar_clamp255(double dbl) 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 i- unsigned int height = img->ximg->height; Err codevoid.de 70 i- char* newBuf = img->ximg->data; Err codevoid.de 70 i- unsigned char* ibuf; Err codevoid.de 70 i- unsigned int jdy = img->ximg->bytes_per_line / 4 - width; Err codevoid.de 70 i- unsigned int dx = (img->bufwidth << 10) / width; Err codevoid.de 70 i- Err codevoid.de 70 i- for (y = 0; y < height; y++) { Err codevoid.de 70 i- unsigned int bufx = img->bufwidth / width; Err codevoid.de 70 i- ibuf = &img->buf[y * img->bufheight / height * img->bufwidth * 3]; Err codevoid.de 70 i- Err codevoid.de 70 i- for (x = 0; x < width; x++) { Err codevoid.de 70 i- *newBuf++ = (ibuf[(bufx >> 10)*3+2]); Err codevoid.de 70 i- *newBuf++ = (ibuf[(bufx >> 10)*3+1]); Err codevoid.de 70 i- *newBuf++ = (ibuf[(bufx >> 10)*3+0]); Err codevoid.de 70 i- newBuf++; Err codevoid.de 70 i- bufx += dx; Err codevoid.de 70 i- } Err codevoid.de 70 i- newBuf += jdy; Err codevoid.de 70 i- } Err codevoid.de 70 i+ dbl = round(dbl); Err codevoid.de 70 i+ Err codevoid.de 70 i+ return Err codevoid.de 70 i+ (dbl < 0.0) ? 0 : Err codevoid.de 70 i+ (dbl > 255.0) ? 255 : (unsigned char)dbl; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+static int int_clamp(int integer, int lower, int upper) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ if (integer < lower) Err codevoid.de 70 i+ return lower; Err codevoid.de 70 i+ else if (integer >= upper) Err codevoid.de 70 i+ return upper - 1; Err codevoid.de 70 i+ else Err codevoid.de 70 i+ return integer; Err codevoid.de 70 i+} Err codevoid.de 70 i+ Err codevoid.de 70 i+void Err codevoid.de 70 i+ffscale(Image *img) Err codevoid.de 70 i+{ Err codevoid.de 70 i+ const unsigned width = img->ximg->width; Err codevoid.de 70 i+ const unsigned height = img->ximg->height; Err codevoid.de 70 i+ unsigned char* newBuf = (unsigned char*)img->ximg->data; Err codevoid.de 70 i+ const unsigned jdy = img->ximg->bytes_per_line / 4 - width; Err codevoid.de 70 i+ Err codevoid.de 70 i+ const double x_scale = ((double)img->bufwidth/(double)width); Err codevoid.de 70 i+ const double y_scale = ((double)img->bufheight/(double)height); Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (unsigned y = 0; y < height; ++y) { Err codevoid.de 70 i+ const double old_y = (double)y * y_scale; Err codevoid.de 70 i+ const double y_factor = ceil(old_y) - old_y; Err codevoid.de 70 i+ const int old_y_int_0 = int_clamp((int)floor(old_y), 0, img->bufheight); Err codevoid.de 70 i+ const int old_y_int_1 = int_clamp((int)ceil(old_y), 0, img->bufheight); Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (unsigned x = 0; x < width; ++x) { Err codevoid.de 70 i+ const double old_x = (double)x * x_scale; Err codevoid.de 70 i+ const double x_factor = ceil(old_x) - old_x; Err codevoid.de 70 i+ const int old_x_int_0 = int_clamp((int)floor(old_x), 0, img->bufwidth); Err codevoid.de 70 i+ const int old_x_int_1 = int_clamp((int)ceil(old_x), 0, img->bufwidth); Err codevoid.de 70 i+ Err codevoid.de 70 i+ const unsigned c00_pos = 3*((old_x_int_0) + ((old_y_int_0)*img->bufwidth)); Err codevoid.de 70 i+ const unsigned c01_pos = 3*((old_x_int_0) + ((old_y_int_1)*img->bufwidth)); Err codevoid.de 70 i+ const unsigned c10_pos = 3*((old_x_int_1) + ((old_y_int_0)*img->bufwidth)); Err codevoid.de 70 i+ const unsigned c11_pos = 3*((old_x_int_1) + ((old_y_int_1)*img->bufwidth)); Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (int i = 2; i >= 0 ; --i) { Err codevoid.de 70 i+ const unsigned char c00 = img->buf[c00_pos + i]; Err codevoid.de 70 i+ const unsigned char c01 = img->buf[c01_pos + i]; Err codevoid.de 70 i+ const unsigned char c10 = img->buf[c10_pos + i]; Err codevoid.de 70 i+ const unsigned char c11 = img->buf[c11_pos + i]; Err codevoid.de 70 i+ Err codevoid.de 70 i+ const double x_result_0 = (double)c00*x_factor + (double)c10*(1.0 - x_factor); Err codevoid.de 70 i+ const double x_result_1 = (double)c01*x_factor + (double)c11*(1.0 - x_factor); Err codevoid.de 70 i+ const double result = x_result_0*y_factor + x_result_1*(1.0 - y_factor); Err codevoid.de 70 i+ Err codevoid.de 70 i+ *newBuf++ = double_to_uchar_clamp255(result); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ newBuf++; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ newBuf += jdy; Err codevoid.de 70 i+ } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void ffdraw(Image *img) Err codevoid.de 70 i+void Err codevoid.de 70 i+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 i- XPutImage(xw.dpy, xw.win, d->gc, img->ximg, 0, 0, Err codevoid.de 70 i- xoffset, yoffset, img->ximg->width, img->ximg->height); Err codevoid.de 70 i- XFlush(xw.dpy); 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 i+ XPutImage(xw.dpy, xw.win, d->gc, img->ximg, 0, 0, Err codevoid.de 70 i+ xoffset, yoffset, img->ximg->width, img->ximg->height); Err codevoid.de 70 i+ XFlush(xw.dpy); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void getfontsize(Slide *s, unsigned int *width, unsigned int *height) Err codevoid.de 70 i+void Err codevoid.de 70 i+getfontsize(Slide *s, unsigned int *width, unsigned int *height) Err codevoid.de 70 i { Err codevoid.de 70 i- int i, j; Err codevoid.de 70 i- unsigned int curw, newmax; Err codevoid.de 70 i- float lfac = linespacing * (s->linecount - 1) + 1; Err codevoid.de 70 i- Err codevoid.de 70 i- /* fit height */ Err codevoid.de 70 i- for (j = NUMFONTSCALES - 1; j >= 0; j--) Err codevoid.de 70 i- if (fonts[j]->h * lfac <= xw.uh) Err codevoid.de 70 i- break; Err codevoid.de 70 i- LIMIT(j, 0, NUMFONTSCALES - 1); Err codevoid.de 70 i- drw_setfontset(d, fonts[j]); Err codevoid.de 70 i- Err codevoid.de 70 i- /* fit width */ Err codevoid.de 70 i- *width = 0; Err codevoid.de 70 i- for (i = 0; i < s->linecount; i++) { Err codevoid.de 70 i- curw = drw_fontset_getwidth(d, s->lines[i]); Err codevoid.de 70 i- newmax = (curw >= *width); Err codevoid.de 70 i- while (j > 0 && curw > xw.uw) { Err codevoid.de 70 i- drw_setfontset(d, fonts[--j]); Err codevoid.de 70 i- curw = drw_fontset_getwidth(d, s->lines[i]); Err codevoid.de 70 i- } Err codevoid.de 70 i- if (newmax) Err codevoid.de 70 i- *width = curw; Err codevoid.de 70 i- } Err codevoid.de 70 i- *height = fonts[j]->h * lfac; Err codevoid.de 70 i+ int i, j; Err codevoid.de 70 i+ unsigned int curw, newmax; Err codevoid.de 70 i+ float lfac = linespacing * (s->linecount - 1) + 1; Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* fit height */ Err codevoid.de 70 i+ for (j = NUMFONTSCALES - 1; j >= 0; j--) Err codevoid.de 70 i+ if (fonts[j]->h * lfac <= xw.uh) Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ LIMIT(j, 0, NUMFONTSCALES - 1); Err codevoid.de 70 i+ drw_setfontset(d, fonts[j]); Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* fit width */ Err codevoid.de 70 i+ *width = 0; Err codevoid.de 70 i+ for (i = 0; i < s->linecount; i++) { Err codevoid.de 70 i+ curw = drw_fontset_getwidth(d, s->lines[i]); Err codevoid.de 70 i+ newmax = (curw >= *width); Err codevoid.de 70 i+ while (j > 0 && curw > xw.uw) { Err codevoid.de 70 i+ drw_setfontset(d, fonts[--j]); Err codevoid.de 70 i+ curw = drw_fontset_getwidth(d, s->lines[i]); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ if (newmax) Err codevoid.de 70 i+ *width = curw; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ *height = fonts[j]->h * lfac; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void cleanup(int slidesonly) Err codevoid.de 70 i+void Err codevoid.de 70 i+cleanup(int slidesonly) Err codevoid.de 70 i { Err codevoid.de 70 i- unsigned int i, j; Err codevoid.de 70 i- Err codevoid.de 70 i- if (!slidesonly) { Err codevoid.de 70 i- for (i = 0; i < NUMFONTSCALES; i++) Err codevoid.de 70 i- drw_fontset_free(fonts[i]); Err codevoid.de 70 i- free(sc); Err codevoid.de 70 i- drw_free(d); Err codevoid.de 70 i- Err codevoid.de 70 i- XDestroyWindow(xw.dpy, xw.win); Err codevoid.de 70 i- XSync(xw.dpy, False); Err codevoid.de 70 i- XCloseDisplay(xw.dpy); Err codevoid.de 70 i- } Err codevoid.de 70 i- Err codevoid.de 70 i- if (slides) { Err codevoid.de 70 i- for (i = 0; i < slidecount; i++) { Err codevoid.de 70 i- for (j = 0; j < slides[i].linecount; j++) 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- fffree(slides[i].img); Err codevoid.de 70 i- } Err codevoid.de 70 i- if (!slidesonly) { Err codevoid.de 70 i- free(slides); Err codevoid.de 70 i- slides = NULL; Err codevoid.de 70 i- } Err codevoid.de 70 i- } Err codevoid.de 70 i+ unsigned int i, j; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!slidesonly) { Err codevoid.de 70 i+ for (i = 0; i < NUMFONTSCALES; i++) Err codevoid.de 70 i+ drw_fontset_free(fonts[i]); Err codevoid.de 70 i+ free(sc); Err codevoid.de 70 i+ drw_free(d); Err codevoid.de 70 i+ Err codevoid.de 70 i+ XDestroyWindow(xw.dpy, xw.win); Err codevoid.de 70 i+ XSync(xw.dpy, False); Err codevoid.de 70 i+ XCloseDisplay(xw.dpy); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (slides) { Err codevoid.de 70 i+ for (i = 0; i < slidecount; i++) { Err codevoid.de 70 i+ for (j = 0; j < slides[i].linecount; j++) 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+ fffree(slides[i].img); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ if (!slidesonly) { Err codevoid.de 70 i+ free(slides); Err codevoid.de 70 i+ slides = NULL; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void reload(const Arg *arg) Err codevoid.de 70 i+void Err codevoid.de 70 i+reload(const Arg *arg) Err codevoid.de 70 i { Err codevoid.de 70 i- FILE *fp = NULL; Err codevoid.de 70 i- unsigned int i; Err codevoid.de 70 i- Err codevoid.de 70 i- if (!fname) { Err codevoid.de 70 i- fprintf(stderr, "sent: Cannot reload from stdin. Use a file!\n"); Err codevoid.de 70 i- return; Err codevoid.de 70 i- } Err codevoid.de 70 i- Err codevoid.de 70 i- cleanup(1); Err codevoid.de 70 i- slidecount = 0; Err codevoid.de 70 i- Err codevoid.de 70 i- if (!(fp = fopen(fname, "r"))) Err codevoid.de 70 i- die("sent: Unable to open '%s' for reading:", fname); Err codevoid.de 70 i- load(fp); Err codevoid.de 70 i- fclose(fp); Err codevoid.de 70 i- Err codevoid.de 70 i- LIMIT(idx, 0, slidecount-1); Err codevoid.de 70 i- for (i = 0; i < slidecount; i++) Err codevoid.de 70 i- ffload(&slides[i]); Err codevoid.de 70 i- xdraw(); Err codevoid.de 70 i+ FILE *fp = NULL; Err codevoid.de 70 i+ unsigned int i; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!fname) { Err codevoid.de 70 i+ fprintf(stderr, "sent: Cannot reload from stdin. Use a file!\n"); Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ cleanup(1); Err codevoid.de 70 i+ slidecount = 0; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!(fp = fopen(fname, "r"))) Err codevoid.de 70 i+ die("sent: Unable to open '%s' for reading:", fname); Err codevoid.de 70 i+ load(fp); Err codevoid.de 70 i+ fclose(fp); Err codevoid.de 70 i+ Err codevoid.de 70 i+ LIMIT(idx, 0, slidecount-1); Err codevoid.de 70 i+ for ( Err codevoid.de 70 .