Skip to content

Commit e0c6288

Browse files
committed
refactor to calc_lift_gamma_gain()
1 parent 605f2a0 commit e0c6288

1 file changed

Lines changed: 76 additions & 61 deletions

File tree

src/modules/plus/filter_lift_gamma_gain.c

Lines changed: 76 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* filter_lift_gamma_gain.cpp
2+
* filter_lift_gamma_gain.c
33
* Copyright (C) 2014-2025 Meltytech, LLC
44
*
55
* This library is free software; you can redistribute it and/or
@@ -50,6 +50,53 @@ typedef struct
5050
uint16_t *blut16;
5151
} sliced_desc;
5252

53+
// Helper function to calculate lift-gamma-gain to a normalized [0.0, 1.0] value
54+
static inline void calc_lift_gamma_gain(double normalized,
55+
double *r,
56+
double *g,
57+
double *b,
58+
double rlift,
59+
double glift,
60+
double blift,
61+
double rgamma,
62+
double ggamma,
63+
double bgamma,
64+
double rgain,
65+
double ggain,
66+
double bgain)
67+
{
68+
// Convert to gamma 2.2
69+
double gamma22 = pow(normalized, 1.0 / 2.2);
70+
*r = gamma22;
71+
*g = gamma22;
72+
*b = gamma22;
73+
74+
// Apply lift
75+
*r += rlift * (1.0 - *r);
76+
*g += glift * (1.0 - *g);
77+
*b += blift * (1.0 - *b);
78+
79+
// Clamp negative values
80+
*r = MAX(*r, 0.0);
81+
*g = MAX(*g, 0.0);
82+
*b = MAX(*b, 0.0);
83+
84+
// Apply gamma
85+
*r = pow(*r, 2.2 / rgamma);
86+
*g = pow(*g, 2.2 / ggamma);
87+
*b = pow(*b, 2.2 / bgamma);
88+
89+
// Apply gain
90+
*r *= pow(rgain, 1.0 / rgamma);
91+
*g *= pow(ggain, 1.0 / ggamma);
92+
*b *= pow(bgain, 1.0 / bgamma);
93+
94+
// Clamp values
95+
*r = CLAMP(*r, 0.0, 1.0);
96+
*g = CLAMP(*g, 0.0, 1.0);
97+
*b = CLAMP(*b, 0.0, 1.0);
98+
}
99+
53100
static int refresh_lut(mlt_filter filter, mlt_frame frame, mlt_image_format format)
54101
{
55102
private_data *self = (private_data *) filter->child;
@@ -109,36 +156,20 @@ static int refresh_lut(mlt_filter filter, mlt_frame frame, mlt_image_format form
109156
}
110157

111158
for (int i = 0; i < 256; i++) {
112-
// Convert to gamma 2.2
113-
double gamma22 = pow((double) i / 255.0, 1.0 / 2.2);
114-
double r = gamma22;
115-
double g = gamma22;
116-
double b = gamma22;
117-
118-
// Apply lift
119-
r += rlift * (1.0 - r);
120-
g += glift * (1.0 - g);
121-
b += blift * (1.0 - b);
122-
123-
// Clamp negative values
124-
r = MAX(r, 0.0);
125-
g = MAX(g, 0.0);
126-
b = MAX(b, 0.0);
127-
128-
// Apply gamma
129-
r = pow(r, 2.2 / rgamma);
130-
g = pow(g, 2.2 / ggamma);
131-
b = pow(b, 2.2 / bgamma);
132-
133-
// Apply gain
134-
r *= pow(rgain, 1.0 / rgamma);
135-
g *= pow(ggain, 1.0 / ggamma);
136-
b *= pow(bgain, 1.0 / bgamma);
137-
138-
// Clamp values
139-
r = CLAMP(r, 0.0, 1.0);
140-
g = CLAMP(g, 0.0, 1.0);
141-
b = CLAMP(b, 0.0, 1.0);
159+
double r, g, b;
160+
calc_lift_gamma_gain((double) i / 255.0,
161+
&r,
162+
&g,
163+
&b,
164+
rlift,
165+
glift,
166+
blift,
167+
rgamma,
168+
ggamma,
169+
bgamma,
170+
rgain,
171+
ggain,
172+
bgain);
142173

143174
// Update 8-bit LUT
144175
self->rlut[i] = lrint(r * 255.0);
@@ -165,36 +196,20 @@ static int refresh_lut(mlt_filter filter, mlt_frame frame, mlt_image_format form
165196
}
166197

167198
for (int i = 0; i < 65536; i++) {
168-
// Convert to gamma 2.2
169-
double gamma22 = pow((double) i / 65535.0, 1.0 / 2.2);
170-
double r = gamma22;
171-
double g = gamma22;
172-
double b = gamma22;
173-
174-
// Apply lift
175-
r += rlift * (1.0 - r);
176-
g += glift * (1.0 - g);
177-
b += blift * (1.0 - b);
178-
179-
// Clamp negative values
180-
r = MAX(r, 0.0);
181-
g = MAX(g, 0.0);
182-
b = MAX(b, 0.0);
183-
184-
// Apply gamma
185-
r = pow(r, 2.2 / rgamma);
186-
g = pow(g, 2.2 / ggamma);
187-
b = pow(b, 2.2 / bgamma);
188-
189-
// Apply gain
190-
r *= pow(rgain, 1.0 / rgamma);
191-
g *= pow(ggain, 1.0 / ggamma);
192-
b *= pow(bgain, 1.0 / bgamma);
193-
194-
// Clamp values
195-
r = CLAMP(r, 0.0, 1.0);
196-
g = CLAMP(g, 0.0, 1.0);
197-
b = CLAMP(b, 0.0, 1.0);
199+
double r, g, b;
200+
calc_lift_gamma_gain((double) i / 65535.0,
201+
&r,
202+
&g,
203+
&b,
204+
rlift,
205+
glift,
206+
blift,
207+
rgamma,
208+
ggamma,
209+
bgamma,
210+
rgain,
211+
ggain,
212+
bgain);
198213

199214
// Update 16-bit LUT
200215
self->rlut16[i] = lrint(r * 65535.0);

0 commit comments

Comments
 (0)