aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commands.c9
-rw-r--r--config.def.h6
-rw-r--r--image.c58
-rw-r--r--image.h2
-rw-r--r--main.c7
-rw-r--r--options.c14
-rw-r--r--sxiv.116
7 files changed, 66 insertions, 46 deletions
diff --git a/commands.c b/commands.c
index 0e0029c..7562bd1 100644
--- a/commands.c
+++ b/commands.c
@@ -474,17 +474,10 @@ bool i_toggle_antialias(arg_t a)
}
}
-/* a < 0: decrease gamma
- * a == 0: reset gamma
- * a > 0: increase gamma
- */
bool i_change_gamma(arg_t a)
{
if (mode == MODE_IMAGE) {
- long val = (long) a;
- int delta = val > 0 ? 1 : (val < 0 ? -1 : -img.gamma);
- img_set_gamma(&img, img.gamma + delta);
- return true;
+ return img_change_gamma(&img, (long) a);
} else {
return false;
}
diff --git a/config.def.h b/config.def.h
index b877aa1..bc8e419 100644
--- a/config.def.h
+++ b/config.def.h
@@ -49,8 +49,8 @@ enum {
/* gamma correction: the user-visible ranges [-GAMMA_RANGE, 0] and
* (0, GAMMA_RANGE] are mapped to the ranges [0, 1], and (1, GAMMA_MAX].
* */
-static const double GAMMA_MAX = 10.0;
-static const int GAMMA_RANGE = 32;
+static const double GAMMA_MAX = 10.0;
+static const int GAMMA_RANGE = 32;
#endif
#ifdef _THUMBS_CONFIG
@@ -150,7 +150,7 @@ static const keymap_t keys[] = {
/* decrease/increase/reset gamma */
{ false, XK_braceleft, i_change_gamma, (arg_t) -1 },
{ false, XK_braceright, i_change_gamma, (arg_t) +1 },
- { true, XK_G, i_change_gamma, (arg_t) 0 },
+ { true, XK_G, i_change_gamma, (arg_t) 0 },
/* open current image with given program: */
{ true, XK_g, it_open_with, (arg_t) "gimp" },
diff --git a/image.c b/image.c
index b1c7851..cadbe45 100644
--- a/image.c
+++ b/image.c
@@ -39,11 +39,27 @@ enum { MIN_GIF_DELAY = 25 };
float zoom_min;
float zoom_max;
-int zoomdiff(float z1, float z2)
+static int zoomdiff(float z1, float z2)
{
return (int) (z1 * 1000.0 - z2 * 1000.0);
}
+static void img_apply_gamma(img_t *img)
+{
+ if (img == NULL || img->im == NULL || img->cmod == NULL)
+ return;
+
+ if (img->gamma == 0) {
+ imlib_context_set_color_modifier(NULL);
+ } else {
+ double range = img->gamma <= 0 ? 1.0 : GAMMA_MAX - 1.0;
+
+ imlib_context_set_color_modifier(img->cmod);
+ imlib_reset_color_modifier();
+ imlib_modify_color_modifier_gamma(1.0 + img->gamma * (range / GAMMA_RANGE));
+ }
+}
+
void img_init(img_t *img, win_t *win)
{
zoom_min = zoom_levels[0] / 100.0;
@@ -69,7 +85,7 @@ void img_init(img_t *img, win_t *win)
img->multi.animate = false;
img->cmod = imlib_create_color_modifier();
- img_set_gamma(img, options->gamma);
+ img->gamma = options->gamma;
}
void exif_auto_orientate(const fileinfo_t *file)
@@ -306,7 +322,7 @@ bool img_load(img_t *img, const fileinfo_t *file)
img_load_gif(img, file);
#endif
- img_set_gamma(img, img->gamma);
+ img_apply_gamma(img);
img->w = imlib_image_get_width();
img->h = imlib_image_get_height();
@@ -714,25 +730,31 @@ void img_toggle_antialias(img_t *img)
img->dirty = true;
}
-void img_set_gamma(img_t *img, int gamma)
+bool img_change_gamma(img_t *img, int d)
{
- if (img == NULL)
- return;
+ /* d < 0: decrease gamma
+ * d = 0: reset gamma
+ * d > 0: increase gamma
+ */
+ int gamma;
- img->gamma = MIN(MAX(gamma, -GAMMA_RANGE), GAMMA_RANGE);
+ if (img == NULL || img->im == NULL)
+ return false;
- if (img->im && img->cmod) {
- if (img->gamma == 0) {
- imlib_context_set_color_modifier(NULL);
- } else {
- double range = img->gamma <= 0 ? 1.0 : GAMMA_MAX - 1.0;
- imlib_context_set_color_modifier(img->cmod);
- imlib_reset_color_modifier();
- imlib_modify_color_modifier_gamma(
- 1.0 + (double) img->gamma
- * (range / (double) GAMMA_RANGE));
- }
+ if (d == 0)
+ gamma = 0;
+ else if (d < 0)
+ gamma = MAX(-GAMMA_RANGE, img->gamma - 1);
+ else
+ gamma = MIN(+GAMMA_RANGE, img->gamma + 1);
+
+ if (img->gamma != gamma) {
+ img->gamma = gamma;
+ img_apply_gamma(img);
img->dirty = true;
+ return true;
+ } else {
+ return false;
}
}
diff --git a/image.h b/image.h
index 7ed104e..09322c2 100644
--- a/image.h
+++ b/image.h
@@ -84,7 +84,7 @@ void img_flip(img_t*, flipdir_t);
void img_toggle_antialias(img_t*);
-void img_set_gamma(img_t*, int);
+bool img_change_gamma(img_t*, int);
bool img_frame_navigate(img_t*, int);
bool img_frame_animate(img_t*, bool);
diff --git a/main.c b/main.c
index dd26e01..b1140cb 100644
--- a/main.c
+++ b/main.c
@@ -345,14 +345,15 @@ void update_info(void)
ow_info = false;
}
} else {
- n = snprintf(rt, rlen, "%s%3d%% | ", mark, (int) (img.zoom * 100.0));
+ n = snprintf(rt, rlen, "%s", mark);
+ if (img.gamma != 0)
+ n += snprintf(rt + n, rlen - n, "G%+d | ", img.gamma);
+ n += snprintf(rt + n, rlen - n, "%3d%% | ", (int) (img.zoom * 100.0));
if (img.multi.cnt > 0) {
for (fn = 0, i = img.multi.cnt; i > 0; fn++, i /= 10);
n += snprintf(rt + n, rlen - n, "%0*d/%d | ",
fn, img.multi.sel + 1, img.multi.cnt);
}
- if (img.gamma != 0)
- n += snprintf(rt + n, rlen - n, "g%d | ", img.gamma);
n += snprintf(rt + n, rlen - n, "%0*d/%d", fw, sel + 1, filecnt);
ow_info = info.script == NULL;
}
diff --git a/options.c b/options.c
index 574f871..e4d597c 100644
--- a/options.c
+++ b/options.c
@@ -33,7 +33,7 @@ const options_t *options = (const options_t*) &_options;
void print_usage(void)
{
- printf("usage: sxiv [-bcdFfhioqrstvZ] [-g GEOMETRY] [-G GAMMA] [-n NUM] "
+ printf("usage: sxiv [-bcdFfhioqrstvZ] [-G GAMMA] [-g GEOMETRY] [-n NUM] "
"[-N name] [-z ZOOM] FILES...\n");
}
@@ -45,6 +45,7 @@ void print_version(void)
void parse_options(int argc, char **argv)
{
int opt, t, gamma;
+ char *end;
_options.from_stdin = false;
_options.to_stdout = false;
@@ -65,7 +66,7 @@ void parse_options(int argc, char **argv)
_options.thumb_mode = false;
_options.clean_cache = false;
- while ((opt = getopt(argc, argv, "bcdFfg:G:hin:N:oqrstvZz:")) != -1) {
+ while ((opt = getopt(argc, argv, "bcdFfG:g:hin:N:oqrstvZz:")) != -1) {
switch (opt) {
case '?':
print_usage();
@@ -85,17 +86,18 @@ void parse_options(int argc, char **argv)
case 'f':
_options.fullscreen = true;
break;
- case 'g':
- _options.geometry = optarg;
- break;
case 'G':
- if (sscanf(optarg, "%d", &gamma) <= 0) {
+ gamma = strtol(optarg, &end, 0);
+ if (*end != '\0') {
fprintf(stderr, "sxiv: invalid argument for option -G: %s\n",
optarg);
exit(EXIT_FAILURE);
}
_options.gamma = gamma;
break;
+ case 'g':
+ _options.geometry = optarg;
+ break;
case 'h':
print_usage();
exit(EXIT_SUCCESS);
diff --git a/sxiv.1 b/sxiv.1
index 4c29dbf..42ee155 100644
--- a/sxiv.1
+++ b/sxiv.1
@@ -4,12 +4,14 @@ sxiv \- Simple X Image Viewer
.SH SYNOPSIS
.B sxiv
.RB [ \-bcdFfhiopqrstvZ ]
+.RB [ \-G
+.IR GAMMA ]
.RB [ \-g
.IR GEOMETRY ]
-.RB [ \-n
-.IR NUM ]
.RB [ \-N
.IR NAME ]
+.RB [ \-n
+.IR NUM ]
.RB [ \-z
.IR ZOOM ]
.IR FILE ...
@@ -44,20 +46,20 @@ size-hints to the window width/height.
.B \-f
Start in fullscreen mode.
.TP
+.BI "\-G " GAMMA
+Set image gamma to GAMMA (-32..32).
+.TP
.BI "\-g " GEOMETRY
Set window position and size. See section GEOMETRY SPECIFICATIONS of X(7) for
more information on
.IR GEOMETRY .
.TP
-.BI "\-G " GAMMA
-Set gamma to GAMMA (-32..32).
+.BI "\-N " NAME
+Set the resource name of sxiv's X window to NAME.
.TP
.BI "\-n " NUM
Start at picture number NUM.
.TP
-.BI "\-N " NAME
-Set the resource name of sxiv's X window to NAME.
-.TP
.B \-h
Print brief usage information to standard output and exit.
.TP