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+
53100static 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