From 88a480c9388d698f123bf892f33197d7bd1cfb9b Mon Sep 17 00:00:00 2001 From: NRK Date: Wed, 17 Aug 2022 20:54:14 +0600 Subject: [PATCH] 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 --- config.def.h | 13 ++++++----- etc/nsxiv.1 | 5 +++++ image.c | 2 +- nsxiv.h | 1 + options.c | 61 +++++++++++++++++++++++++++++++--------------------- 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 */ @@ -64,6 +59,14 @@ static const int CACHE_SIZE_MEM_PERCENTAGE = 3; /* use 3% of total memo 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 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 +#include #include #include #include @@ -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; } }