dynamic keyframes, textbox rework, andrea ffmpeg.opts, perpetual chkpt undo, lv2...
[goodguy/history.git] / cinelerra-5.1 / plugins / colorbalance / colorbalance.C
index c5e4db0ce8b04b97031f85523f6640f5180ac01e..7b8f0cffd01161201786b006221c299cad595e19 100644 (file)
@@ -336,7 +336,7 @@ ColorBalanceMain::~ColorBalanceMain()
        }
 }
 
-const char* ColorBalanceMain::plugin_title() { return _("Color Balance"); }
+const char* ColorBalanceMain::plugin_title() { return N_("Color Balance"); }
 int ColorBalanceMain::is_realtime() { return 1; }
 
 
@@ -403,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;
 }
 
@@ -537,7 +533,7 @@ void ColorBalanceMain::save_data(KeyFrame *keyframe)
        FileXML output;
 
 // cause data to be stored directly in text
-       output.set_shared_output(keyframe->get_data(), MESSAGESIZE);
+       output.set_shared_output(keyframe->xbuf);
        output.tag.set_title("COLORBALANCE");
        output.tag.set_property("CYAN", config.cyan);
        output.tag.set_property("MAGENTA",  config.magenta);
@@ -555,7 +551,7 @@ void ColorBalanceMain::read_data(KeyFrame *keyframe)
 {
        FileXML input;
 
-       input.set_shared_input(keyframe->get_data(), strlen(keyframe->get_data()));
+       input.set_shared_input(keyframe->xbuf);
 
        int result = 0;
 
@@ -605,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;
 
@@ -616,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);
 
@@ -645,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();