aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNRK <nrk@disroot.org>2022-08-17 16:54:14 +0200
committerNRK <nrk@disroot.org>2022-09-10 15:43:07 +0200
commit88a480c9388d698f123bf892f33197d7bd1cfb9b (patch)
treeaa0e9e3075c0d3f8f71355e0fde9cfa7025b1e75
parent7e3e6008fec8f7de8fa3c3545a76d5380ba48944 (diff)
downloadnsxiv-88a480c9388d698f123bf892f33197d7bd1cfb9b.tar.zst
allow disabling anti-aliasing via cli flag
simply running nsxiv with `--anti-alias` will enable anti-aliasing, and running it with `--anti-alias=no` will disable it. the cli flag will overwrite the config.h default. Closes: https://codeberg.org/nsxiv/nsxiv/issues/349
-rw-r--r--config.def.h13
-rw-r--r--etc/nsxiv.15
-rw-r--r--image.c2
-rw-r--r--nsxiv.h1
-rw-r--r--options.c61
5 files changed, 52 insertions, 30 deletions
diff --git a/config.def.h b/config.def.h
index 9ac3e9b..00f1f22 100644
--- a/config.def.h
+++ b/config.def.h
@@ -42,11 +42,6 @@ static const int GAMMA_RANGE = 32;
/* command i_scroll pans image 1/PAN_FRACTION of screen width/height */
static const int PAN_FRACTION = 5;
-/* if false, pixelate images at zoom level != 100%,
- * toggled with 'a' key binding
- */
-static const bool ANTI_ALIAS = true;
-
/* if true, use a checkerboard background for alpha layer,
* toggled with 'A' key binding
*/
@@ -65,6 +60,14 @@ static const int CACHE_SIZE_LIMIT = 256 * 1024 * 1024; /* but not above 256MiB
static const int CACHE_SIZE_FALLBACK = 32 * 1024 * 1024; /* fallback to 32MiB if we can't determine total memory */
#endif
+#ifdef INCLUDE_OPTIONS_CONFIG
+
+/* if false, pixelate images at zoom level != 100%,
+ * toggled with 'a' key binding (overwritten via `--anti-alias` option)
+ */
+static const bool ANTI_ALIAS = true;
+
+#endif
#ifdef INCLUDE_THUMBS_CONFIG
/* thumbnail sizes in pixels (width == height): */
diff --git a/etc/nsxiv.1 b/etc/nsxiv.1
index 3155958..3109075 100644
--- a/etc/nsxiv.1
+++ b/etc/nsxiv.1
@@ -114,6 +114,11 @@ Set zoom level to ZOOM percent.
.B "\-0, \-\-null"
Use NULL-separator. With this option, output of \-o and file-list sent to the
key-handler and the input of \-i will be separated by a NULL character.
+.TP
+.BI "\-\-anti\-alias" [=no]
+Enables anti-aliasing, when given
+.I no
+as an argument, disables it instead.
.SH KEYBOARD COMMANDS
.SS General
The following keyboard commands are available in both image and thumbnail modes:
diff --git a/image.c b/image.c
index ab95232..d8f0221 100644
--- a/image.c
+++ b/image.c
@@ -80,7 +80,7 @@ void img_init(img_t *img, win_t *win)
img->zoom = MIN(img->zoom, ZOOM_MAX);
img->checkpan = false;
img->dirty = false;
- img->aa = ANTI_ALIAS;
+ img->aa = options->aa;
img->alpha = ALPHA_LAYER;
img->multi.cap = img->multi.cnt = 0;
img->multi.animate = options->animate;
diff --git a/nsxiv.h b/nsxiv.h
index 7262e1e..17a28b0 100644
--- a/nsxiv.h
+++ b/nsxiv.h
@@ -237,6 +237,7 @@ struct opt {
scalemode_t scalemode;
float zoom;
bool animate;
+ bool aa;
int gamma;
int slideshow;
int framerate;
diff --git a/options.c b/options.c
index 812a01a..bf9bb99 100644
--- a/options.c
+++ b/options.c
@@ -19,8 +19,11 @@
#include "nsxiv.h"
#include "version.h"
+#define INCLUDE_OPTIONS_CONFIG
+#include "config.h"
#include <assert.h>
+#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -63,31 +66,35 @@ static void print_version(void)
void parse_options(int argc, char **argv)
{
+ enum { /* ensure these can't be represented in a single byte */
+ OPT_AA = UCHAR_MAX + 1
+ };
static const struct optparse_long longopts[] = {
- { "framerate", 'A', OPTPARSE_REQUIRED },
- { "animate", 'a', OPTPARSE_NONE },
- { "no-bar", 'b', OPTPARSE_NONE },
- { "clean-cache", 'c', OPTPARSE_NONE },
- { "embed", 'e', OPTPARSE_REQUIRED },
- { "fullscreen", 'f', OPTPARSE_NONE },
- { "gamma", 'G', OPTPARSE_REQUIRED },
- { "geometry", 'g', OPTPARSE_REQUIRED },
- { "help", 'h', OPTPARSE_NONE },
- { "stdin", 'i', OPTPARSE_NONE },
- { "class", 'N', OPTPARSE_REQUIRED },
- { "start-at", 'n', OPTPARSE_REQUIRED },
- { "stdout", 'o', OPTPARSE_NONE },
- { "private", 'p', OPTPARSE_NONE },
- { "quiet", 'q', OPTPARSE_NONE },
- { "recursive", 'r', OPTPARSE_NONE },
- { "ss-delay", 'S', OPTPARSE_REQUIRED },
- { "scale-mode", 's', OPTPARSE_REQUIRED },
- { NULL, 'T', OPTPARSE_REQUIRED },
- { "thumbnail", 't', OPTPARSE_NONE },
- { "version", 'v', OPTPARSE_NONE },
- { "zoom-100", 'Z', OPTPARSE_NONE },
- { "zoom", 'z', OPTPARSE_REQUIRED },
- { "null", '0', OPTPARSE_NONE },
+ { "framerate", 'A', OPTPARSE_REQUIRED },
+ { "animate", 'a', OPTPARSE_NONE },
+ { "no-bar", 'b', OPTPARSE_NONE },
+ { "clean-cache", 'c', OPTPARSE_NONE },
+ { "embed", 'e', OPTPARSE_REQUIRED },
+ { "fullscreen", 'f', OPTPARSE_NONE },
+ { "gamma", 'G', OPTPARSE_REQUIRED },
+ { "geometry", 'g', OPTPARSE_REQUIRED },
+ { "help", 'h', OPTPARSE_NONE },
+ { "stdin", 'i', OPTPARSE_NONE },
+ { "class", 'N', OPTPARSE_REQUIRED },
+ { "start-at", 'n', OPTPARSE_REQUIRED },
+ { "stdout", 'o', OPTPARSE_NONE },
+ { "private", 'p', OPTPARSE_NONE },
+ { "quiet", 'q', OPTPARSE_NONE },
+ { "recursive", 'r', OPTPARSE_NONE },
+ { "ss-delay", 'S', OPTPARSE_REQUIRED },
+ { "scale-mode", 's', OPTPARSE_REQUIRED },
+ { NULL, 'T', OPTPARSE_REQUIRED },
+ { "thumbnail", 't', OPTPARSE_NONE },
+ { "version", 'v', OPTPARSE_NONE },
+ { "zoom-100", 'Z', OPTPARSE_NONE },
+ { "zoom", 'z', OPTPARSE_REQUIRED },
+ { "null", '0', OPTPARSE_NONE },
+ { "anti-alias", OPT_AA, OPTPARSE_OPTIONAL },
{ 0 }, /* end */
};
@@ -106,6 +113,7 @@ void parse_options(int argc, char **argv)
_options.scalemode = SCALE_DOWN;
_options.zoom = 1.0;
+ _options.aa = ANTI_ALIAS;
_options.animate = false;
_options.gamma = 0;
_options.slideshow = 0;
@@ -233,6 +241,11 @@ void parse_options(int argc, char **argv)
case '0':
_options.using_null = true;
break;
+ case OPT_AA:
+ if (op.optarg != NULL && !STREQ(op.optarg, "no"))
+ error(EXIT_FAILURE, 0, "Invalid argument for option --anti-alias: %s", op.optarg);
+ _options.aa = op.optarg == NULL;
+ break;
}
}