dynamic keyframes, textbox rework, andrea ffmpeg.opts, perpetual chkpt undo, lv2...
[goodguy/history.git] / cinelerra-5.1 / plugins / huesaturation / huesaturation.C
index f7f04f24c130c9c6ee6f07b2a601f0066b20bd37..727f54f26d28b5a12dee0925d12a454e7565b301 100644 (file)
@@ -19,6 +19,7 @@
  *
  */
 
+#include "bccolors.h"
 #include "bcdisplayinfo.h"
 #include "clip.h"
 #include "bchash.h"
@@ -128,7 +129,6 @@ public:
        HueUnit(HueEffect *plugin, HueEngine *server);
        void process_package(LoadPackage *package);
        HueEffect *plugin;
-       YUV yuv;
 };
 
 class HueEffect : public PluginVClient
@@ -399,9 +399,9 @@ HueUnit::HueUnit(HueEffect *plugin, HueEngine *server)
                                u = (int)in_row[1]; \
                                v = (int)in_row[2]; \
                                if(max == 0xffff) \
-                                       yuv.yuv_to_rgb_16(r_i, g_i, b_i, y, u, v); \
+                                       YUV::yuv.yuv_to_rgb_16(r_i, g_i, b_i, y, u, v); \
                                else \
-                                       yuv.yuv_to_rgb_8(r_i, g_i, b_i, y, u, v); \
+                                       YUV::yuv.yuv_to_rgb_8(r_i, g_i, b_i, y, u, v); \
                                HSV::rgb_to_hsv((float)r_i / max, \
                                        (float)g_i / max, \
                                        (float)b_i / max, \
@@ -568,7 +568,7 @@ int HueEffect::process_buffer(VFrame *frame,
        return 0;
 }
 
-const char* HueEffect::plugin_title() { return _("Hue saturation"); }
+const char* HueEffect::plugin_title() { return N_("Hue saturation"); }
 int HueEffect::is_realtime() { return 1; }
 
 NEW_WINDOW_MACRO(HueEffect, HueWindow)
@@ -578,7 +578,7 @@ LOAD_CONFIGURATION_MACRO(HueEffect, HueConfig)
 void HueEffect::save_data(KeyFrame *keyframe)
 {
        FileXML output;
-       output.set_shared_output(keyframe->get_data(), MESSAGESIZE);
+       output.set_shared_output(keyframe->xbuf);
        output.tag.set_title("HUESATURATION");
        output.tag.set_property("HUE", config.hue);
        output.tag.set_property("SATURATION", config.saturation);
@@ -592,7 +592,7 @@ void HueEffect::save_data(KeyFrame *keyframe)
 void HueEffect::read_data(KeyFrame *keyframe)
 {
        FileXML input;
-       input.set_shared_input(keyframe->get_data(), strlen(keyframe->get_data()));
+       input.set_shared_input(keyframe->xbuf);
        while(!input.read_tag())
        {
                if(input.tag.title_is("HUESATURATION"))
@@ -677,38 +677,26 @@ int HueEffect::handle_opengl()
        get_output()->to_texture();
        get_output()->enable_opengl();
 
-       unsigned int frag_shader = 0;
-       switch(get_output()->get_color_model())
-       {
-               case BC_YUV888:
-               case BC_YUVA8888:
-// This is a lousy approximation but good enough for the masker.
-                       if(EQUIV(config.hue, 0))
-                               frag_shader = VFrame::make_shader(0,
-                                       yuv_saturation_frag,
-                                       0);
-                       else
-                               frag_shader = VFrame::make_shader(0,
-                                       yuv_frag,
-                                       0);
-                       break;
-               default:
-                       frag_shader = VFrame::make_shader(0,
-                               rgb_frag,
-                               0);
-                       break;
-       }
-
-
-       if(frag_shader > 0)
-       {
-               glUseProgram(frag_shader);
-               glUniform1i(glGetUniformLocation(frag_shader, "tex"), 0);
-               glUniform1f(glGetUniformLocation(frag_shader, "h_offset"), config.hue);
-               glUniform1f(glGetUniformLocation(frag_shader, "s_offset"),
+       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;
+       shader_stack[current_shader++] = !need_color_matrix ? rgb_frag :
+               EQUIV(config.hue, 0) ? yuv_saturation_frag: yuv_frag ;
+
+       shader_stack[current_shader] = 0;
+        unsigned int shader = VFrame::make_shader(shader_stack);
+       if(shader > 0) {
+               glUseProgram(shader);
+               glUniform1i(glGetUniformLocation(shader, "tex"), 0);
+               glUniform1f(glGetUniformLocation(shader, "h_offset"), config.hue);
+               glUniform1f(glGetUniformLocation(shader, "s_offset"),
                        ((float)config.saturation - MINSATURATION) / MAXSATURATION);
-               glUniform1f(glGetUniformLocation(frag_shader, "v_offset"),
+               glUniform1f(glGetUniformLocation(shader, "v_offset"),
                        ((float)config.value - MINVALUE) / MAXVALUE);
+               if( need_color_matrix ) BC_GL_COLORS(shader);
        }
 
        get_output()->init_screen();