opengl colorspace + BT2020
[goodguy/history.git] / cinelerra-5.1 / plugins / colorbalance / colorbalance.C
index 31197408f29b76ac1d1450b972bbd66598308c95..16d26ef9fdb0bb96e814b476371d44c17d025e5e 100644 (file)
@@ -19,6 +19,7 @@
  *
  */
 
+#include "bccolors.h"
 #include "filexml.h"
 #include "clip.h"
 #include "colorbalance.h"
@@ -259,7 +260,7 @@ printf("PROCESS_F %f\n", cyan_f); \
                switch(input->get_color_model())
                {
                        case BC_RGB888:
-                               PROCESS(yuv.yuv_to_rgb_8, yuv.rgb_to_yuv_8,
+                               PROCESS(YUV::yuv.yuv_to_rgb_8, YUV::yuv.rgb_to_yuv_8,
                                        r_lookup_8, g_lookup_8, b_lookup_8,
                                        unsigned char, 0xff, 3, 0);
                                break;
@@ -269,7 +270,7 @@ printf("PROCESS_F %f\n", cyan_f); \
                                break;
 
                        case BC_YUV888:
-                               PROCESS(yuv.yuv_to_rgb_8, yuv.rgb_to_yuv_8,
+                               PROCESS(YUV::yuv.yuv_to_rgb_8, YUV::yuv.rgb_to_yuv_8,
                                        r_lookup_8, g_lookup_8, b_lookup_8,
                                        unsigned char, 0xff, 3, 1);
                                break;
@@ -279,25 +280,25 @@ printf("PROCESS_F %f\n", cyan_f); \
                                break;
 
                        case BC_RGBA8888:
-                               PROCESS(yuv.yuv_to_rgb_8, yuv.rgb_to_yuv_8,
+                               PROCESS(YUV::yuv.yuv_to_rgb_8, YUV::yuv.rgb_to_yuv_8,
                                        r_lookup_8, g_lookup_8, b_lookup_8,
                                        unsigned char, 0xff, 4, 0);
                                break;
 
                        case BC_YUVA8888:
-                               PROCESS(yuv.yuv_to_rgb_8, yuv.rgb_to_yuv_8,
+                               PROCESS(YUV::yuv.yuv_to_rgb_8, YUV::yuv.rgb_to_yuv_8,
                                        r_lookup_8, g_lookup_8, b_lookup_8,
                                        unsigned char, 0xff, 4, 1);
                                break;
 
                        case BC_YUV161616:
-                               PROCESS(yuv.yuv_to_rgb_16, yuv.rgb_to_yuv_16,
+                               PROCESS(YUV::yuv.yuv_to_rgb_16, YUV::yuv.rgb_to_yuv_16,
                                        r_lookup_16, g_lookup_16, b_lookup_16,
                                        u_int16_t, 0xffff, 3, 1);
                                break;
 
                        case BC_YUVA16161616:
-                               PROCESS(yuv.yuv_to_rgb_16, yuv.rgb_to_yuv_16,
+                               PROCESS(YUV::yuv.yuv_to_rgb_16, YUV::yuv.rgb_to_yuv_16,
                                        r_lookup_16, g_lookup_16, b_lookup_16,
                                        u_int16_t, 0xffff, 4, 1);
                                break;
@@ -402,27 +403,23 @@ int ColorBalanceMain::test_boundary(float &value)
 
 int ColorBalanceMain::synchronize_params(ColorBalanceSlider *slider, float difference)
 {
-       if(thread && config.lock_params)
-    {
-           if(slider != ((ColorBalanceWindow*)thread->window)->cyan)
-        {
-               config.cyan += difference;
-            test_boundary(config.cyan);
-               ((ColorBalanceWindow*)thread->window)->cyan->update((int64_t)config.cyan);
-        }
-           if(slider != ((ColorBalanceWindow*)thread->window)->magenta)
-        {
-               config.magenta += difference;
-            test_boundary(config.magenta);
-               ((ColorBalanceWindow*)thread->window)->magenta->update((int64_t)config.magenta);
-        }
-           if(slider != ((ColorBalanceWindow*)thread->window)->yellow)
-        {
-               config.yellow += difference;
-            test_boundary(config.yellow);
-               ((ColorBalanceWindow*)thread->window)->yellow->update((int64_t)config.yellow);
-        }
-    }
+       if(thread && config.lock_params) {
+               if(slider != ((ColorBalanceWindow*)thread->window)->cyan) {
+                       config.cyan += difference;
+                       test_boundary(config.cyan);
+                       ((ColorBalanceWindow*)thread->window)->cyan->update((int64_t)config.cyan);
+               }
+               if(slider != ((ColorBalanceWindow*)thread->window)->magenta) {
+                       config.magenta += difference;
+                       test_boundary(config.magenta);
+                       ((ColorBalanceWindow*)thread->window)->magenta->update((int64_t)config.magenta);
+               }
+               if(slider != ((ColorBalanceWindow*)thread->window)->yellow) {
+                       config.yellow += difference;
+                       test_boundary(config.yellow);
+                       ((ColorBalanceWindow*)thread->window)->yellow->update((int64_t)config.yellow);
+               }
+       }
        return 0;
 }
 
@@ -604,9 +601,14 @@ int ColorBalanceMain::handle_opengl()
        get_output()->to_texture();
        get_output()->enable_opengl();
 
-       unsigned int shader = 0;
-       const char *shader_stack[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
-       int current_shader = 0;
+        const char *shader_stack[16];
+        memset(shader_stack,0, sizeof(shader_stack));
+        int current_shader = 0;
+
+       int need_color_matrix = BC_CModels::is_yuv(get_output()->get_color_model()) ? 1 : 0;
+       if( need_color_matrix )
+               shader_stack[current_shader++] = bc_gl_colors;
+
        int aggregate_interpolate = 0;
        int aggregate_gamma = 0;
 
@@ -615,28 +617,18 @@ int ColorBalanceMain::handle_opengl()
 
 //printf("ColorBalanceMain::handle_opengl %d %d\n", aggregate_interpolate, aggregate_gamma);
        if(aggregate_interpolate)
-               INTERPOLATE_COMPILE(shader_stack, current_shader)
+               INTERPOLATE_COMPILE(shader_stack, current_shader);
 
        if(aggregate_gamma)
-               GAMMA_COMPILE(shader_stack, current_shader, aggregate_interpolate)
-
-       COLORBALANCE_COMPILE(shader_stack,
-               current_shader,
-               aggregate_gamma || aggregate_interpolate)
-
-       shader = VFrame::make_shader(0,
-               shader_stack[0],
-               shader_stack[1],
-               shader_stack[2],
-               shader_stack[3],
-               shader_stack[4],
-               shader_stack[5],
-               shader_stack[6],
-               shader_stack[7],
-               0);
-
-       if(shader > 0)
-       {
+               GAMMA_COMPILE(shader_stack, current_shader,
+                       aggregate_interpolate);
+
+       COLORBALANCE_COMPILE(shader_stack, current_shader,
+               aggregate_gamma || aggregate_interpolate);
+
+       shader_stack[current_shader] = 0;
+        unsigned int shader = VFrame::make_shader(shader_stack);
+       if( shader > 0 ) {
                glUseProgram(shader);
                glUniform1i(glGetUniformLocation(shader, "tex"), 0);
 
@@ -644,7 +636,7 @@ int ColorBalanceMain::handle_opengl()
                if(aggregate_gamma) GAMMA_UNIFORMS(shader);
 
                COLORBALANCE_UNIFORMS(shader);
-
+               if( need_color_matrix ) BC_GL_COLORS(shader);
        }
 
        get_output()->init_screen();