aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2025-03-23 16:39:17 +0100
committerMattias Andrée <m@maandree.se>2025-03-23 16:39:17 +0100
commit7b15478612e981937a06a709d99b40d71abd6c20 (patch)
tree35177bbf38ed77d96d62d6b1e47c1d4ec15edf6f
parentadd display option + update doc about all screens being the default (diff)
downloadredshift-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.c5
-rw-r--r--src/colour.c16
-rw-r--r--src/common.h7
-rw-r--r--src/gamma-coopgamma.c1
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,\