diff options
author | Mattias Andrée <m@maandree.se> | 2025-03-23 16:39:17 +0100 |
---|---|---|
committer | Mattias Andrée <m@maandree.se> | 2025-03-23 16:39:17 +0100 |
commit | 7b15478612e981937a06a709d99b40d71abd6c20 (patch) | |
tree | 35177bbf38ed77d96d62d6b1e47c1d4ec15edf6f | |
parent | add display option + update doc about all screens being the default (diff) | |
download | redshift-ng-7b15478612e981937a06a709d99b40d71abd6c20.tar.gz redshift-ng-7b15478612e981937a06a709d99b40d71abd6c20.tar.bz2 redshift-ng-7b15478612e981937a06a709d99b40d71abd6c20.tar.xz |
Restore support for preserve-gamma, with corrected order of application
Signed-off-by: Mattias Andrée <m@maandree.se>
-rw-r--r-- | src/backend-direct.c | 5 | ||||
-rw-r--r-- | src/colour.c | 16 | ||||
-rw-r--r-- | src/common.h | 7 | ||||
-rw-r--r-- | src/gamma-coopgamma.c | 1 |
4 files changed, 24 insertions, 5 deletions
diff --git a/src/backend-direct.c b/src/backend-direct.c index dd381fb..ea60676 100644 --- a/src/backend-direct.c +++ b/src/backend-direct.c @@ -571,7 +571,7 @@ direct_start(struct gamma_state *state) int -direct_apply(struct gamma_state *state, const struct colour_setting *setting, int preserve /* TODO */) +direct_apply(struct gamma_state *state, const struct colour_setting *setting, int preserve) { size_t i, err_count = 0, crtc, part; const char *errstr; @@ -584,6 +584,9 @@ direct_apply(struct gamma_state *state, const struct colour_setting *setting, in fill_ramps_##SUFFIX(state->crtcs[i].gamma_ramps.RAMPS.red,\ state->crtcs[i].gamma_ramps.RAMPS.green,\ state->crtcs[i].gamma_ramps.RAMPS.blue,\ + preserve ? state->crtcs[i].saved_gamma_ramps.RAMPS.red : NULL,\ + preserve ? state->crtcs[i].saved_gamma_ramps.RAMPS.green : NULL,\ + preserve ? state->crtcs[i].saved_gamma_ramps.RAMPS.blue : NULL,\ state->crtcs[i].gamma_ramps.size.red,\ state->crtcs[i].gamma_ramps.size.green,\ state->crtcs[i].gamma_ramps.size.blue,\ diff --git a/src/colour.c b/src/colour.c index ad65b5f..4d85cb5 100644 --- a/src/colour.c +++ b/src/colour.c @@ -49,6 +49,7 @@ colour_setting_diff_is_major(const struct colour_setting *a, const struct colour * Fill a gamma ramp * * @param ramp The gamma ramp + * @param saved Saved gamma ramp with calibrations to preserver, or `NULL` * @param size The gamma ramp size (number of stops) * @param brightness The brightness (between 0 and 1) of the channel, which is * the overall applied brightness multiplied but the effect @@ -56,7 +57,7 @@ colour_setting_diff_is_major(const struct colour_setting *a, const struct colour * @param gamma The gamma to apply to the channel */\ static void\ - fill_ramp_##SUFFIX(TYPE *ramp, size_t size, double brightness, double gamma)\ + fill_ramp_##SUFFIX(TYPE *ramp, const TYPE *saved, size_t size, double brightness, double gamma)\ {\ size_t i;\ double v;\ @@ -72,18 +73,25 @@ colour_setting_diff_is_major(const struct colour_setting *a, const struct colour ramp[i] = (TYPE)v;\ }\ }\ + if (saved) {\ + for (i = 0; i < size; i++) {\ + v = (double)ramp[i] / (MAX) * (size - 1U);\ + ramp[i] = saved[(size_t)v];\ + }\ + }\ }\ \ void\ fill_ramps_##SUFFIX(TYPE *gamma_r, TYPE *gamma_g, TYPE *gamma_b,\ + const TYPE *saved_r, const TYPE *saved_g, const TYPE *saved_b,\ size_t size_r, size_t size_g, size_t size_b,\ const struct colour_setting *setting)\ {\ double r = 1, g = 1, b = 1;\ libred_get_colour(setting->temperature, &r, &g, &b);\ - fill_ramp_##SUFFIX(gamma_r, size_r, setting->brightness * r, setting->gamma[0]);\ - fill_ramp_##SUFFIX(gamma_g, size_g, setting->brightness * g, setting->gamma[1]);\ - fill_ramp_##SUFFIX(gamma_b, size_b, setting->brightness * b, setting->gamma[2]);\ + fill_ramp_##SUFFIX(gamma_r, saved_r, size_r, setting->brightness * r, setting->gamma[0]);\ + fill_ramp_##SUFFIX(gamma_g, saved_g, size_g, setting->brightness * g, setting->gamma[1]);\ + fill_ramp_##SUFFIX(gamma_b, saved_b, size_b, setting->brightness * b, setting->gamma[2]);\ } LIST_RAMPS_STOP_VALUE_TYPES(X,) diff --git a/src/common.h b/src/common.h index dc0312b..e6e1339 100644 --- a/src/common.h +++ b/src/common.h @@ -1327,12 +1327,19 @@ int colour_setting_diff_is_major(const struct colour_setting *a, const struct co * @param gamma_r The gamma ramp for the red channel * @param gamma_g The gamma ramp for the green channel * @param gamma_b The gamma ramp for the blue channel + * @param saved_r Saved gamma ramp with calibrations for + * the red channel to preserve, or `NULL` + * @param saved_g Saved gamma ramp with calibrations for + * the green channel to preserve, or `NULL` + * @param saved_b Saved gamma ramp with calibrations for + * the blue channel to preserve, or `NULL` * @param size_r The number of stops in `gamma_r` * @param size_g The number of stops in `gamma_g` * @param size_b The number of stops in `gamma_b` * @param settings The colour settings to apply (temperature, brightness, gamma) */\ void fill_ramps_##SUFFIX(TYPE *gamma_r, TYPE *gamma_g, TYPE *gamma_b,\ + const TYPE *saved_r, const TYPE *saved_g, const TYPE *saved_b,\ size_t size_r, size_t size_g, size_t size_b,\ const struct colour_setting *setting) LIST_RAMPS_STOP_VALUE_TYPES(X, ;); diff --git a/src/gamma-coopgamma.c b/src/gamma-coopgamma.c index 9818a88..6025da7 100644 --- a/src/gamma-coopgamma.c +++ b/src/gamma-coopgamma.c @@ -517,6 +517,7 @@ coopgamma_apply(struct gamma_state *state, const struct colour_setting *setting, fill_ramps_##SUFFIX((void *)(filter->ramps.u8.red),\ (void *)(filter->ramps.u8.green),\ (void *)(filter->ramps.u8.blue),\ + NULL, NULL, NULL,\ filter->ramps.u8.red_size,\ filter->ramps.u8.green_size,\ filter->ramps.u8.blue_size,\ |