edl plugin names eng, fix segv for opengl brender, renderfarm rework strategy, perf...
[goodguy/history.git] / cinelerra-5.1 / plugins / gradient / gradient.C
index a7d7828e4ae34601a87f1b9c8909daeaa0e986fc..1c4a956651181ce79875d307c707c25bdf457bd6 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdint.h>
 #include <string.h>
 
+#include "bccolors.h"
 #include "bcdisplayinfo.h"
 #include "clip.h"
 #include "bchash.h"
@@ -45,6 +46,12 @@ REGISTER_PLUGIN(GradientMain)
 
 
 GradientConfig::GradientConfig()
+{
+       reset();
+}
+
+void GradientConfig::reset()
+
 {
        angle = 0;
        in_radius = 0;
@@ -211,6 +218,8 @@ void GradientWindow::create_objects()
        BC_Title *title2;
        add_subwindow(title2 = new BC_Title(x, y, _("Outer radius:")));
 
+       add_subwindow(reset = new GradientReset(plugin, this, x, y+100));
+
        y = y1;
        x += MAX(title1->get_w(), title2->get_w()) + margin;
 
@@ -225,7 +234,6 @@ void GradientWindow::create_objects()
        add_subwindow(in_color = new GradientInColorButton(plugin, this, x, y));
        y += COLOR_H + margin;
 
-
        add_subwindow(out_color = new GradientOutColorButton(plugin, this, x, y));
        x += MAX(in_color->get_w(), out_color->get_w()) + margin;
        y = y1;
@@ -253,6 +261,7 @@ void GradientWindow::create_objects()
                COLOR_H + 4,
                1);
 
+
        show_window();
 }
 
@@ -296,6 +305,7 @@ void GradientWindow::update_shape()
                                y));
                }
        }
+       show_window();
 }
 
 
@@ -317,6 +327,12 @@ void GradientWindow::update_out_color()
        flash(out_color_x, out_color_y, COLOR_W, COLOR_H);
 }
 
+void GradientWindow::done_event(int result)
+{
+       in_color_thread->close_window();
+       out_color_thread->close_window();
+}
+
 
 
 
@@ -530,11 +546,24 @@ int GradientOutColorButton::handle_event()
        return 1;
 }
 
+GradientReset::GradientReset(GradientMain *plugin, GradientWindow *window, int x, int y)
+ : BC_GenericButton(x, y, _("Reset"))
+{
+       this->plugin = plugin;
+       this->window = window;
+}
 
+int GradientReset::handle_event()
+{
+       plugin->config.reset();
+       window->update_gui();
+       plugin->send_configure_change();
+       return 1;
+}
 
 GradientInColorThread::GradientInColorThread(GradientMain *plugin,
        GradientWindow *window)
- : ColorThread(1, _("Inner color"))
+ : ColorPicker(1, _("Inner color"))
 {
        this->plugin = plugin;
        this->window = window;
@@ -569,7 +598,7 @@ int GradientInColorThread::handle_new_color(int output, int alpha)
 
 GradientOutColorThread::GradientOutColorThread(GradientMain *plugin,
        GradientWindow *window)
- : ColorThread(1, _("Outer color"))
+ : ColorPicker(1, _("Outer color"))
 {
        this->plugin = plugin;
        this->window = window;
@@ -628,7 +657,7 @@ GradientMain::~GradientMain()
        if(overlayer) delete overlayer;
 }
 
-const char* GradientMain::plugin_title() { return _("Gradient"); }
+const char* GradientMain::plugin_title() { return N_("Gradient"); }
 int GradientMain::is_realtime() { return 1; }
 
 
@@ -682,12 +711,9 @@ int GradientMain::process_buffer(VFrame *frame,
                gradient = 0;
        }
 
-       if(!gradient) gradient = new VFrame(0,
-               -1,
-               input->get_w(),
-               input->get_h(),
-               gradient_cmodel,
-               -1);
+       if(!gradient)
+               gradient = new VFrame(input->get_w(), input->get_h(),
+                       gradient_cmodel, 0);
 
        if(!engine) engine = new GradientServer(this,
                get_project_smp() + 1,
@@ -720,32 +746,32 @@ int GradientMain::process_buffer(VFrame *frame,
 
 void GradientMain::update_gui()
 {
-       if(thread)
-       {
-               if(load_configuration())
-               {
-                       ((GradientWindow*)thread->window)->lock_window("GradientMain::update_gui");
-                       ((GradientWindow*)thread->window)->rate->set_text(GradientRate::to_text(config.rate));
-                       ((GradientWindow*)thread->window)->in_radius->update(config.in_radius);
-                       ((GradientWindow*)thread->window)->out_radius->update(config.out_radius);
-                       ((GradientWindow*)thread->window)->shape->set_text(GradientShape::to_text(config.shape));
-                       if(((GradientWindow*)thread->window)->angle)
-                               ((GradientWindow*)thread->window)->angle->update(config.angle);
-                       if(((GradientWindow*)thread->window)->center_x)
-                               ((GradientWindow*)thread->window)->center_x->update(config.center_x);
-                       if(((GradientWindow*)thread->window)->center_y)
-                               ((GradientWindow*)thread->window)->center_y->update(config.center_y);
-                       ((GradientWindow*)thread->window)->update_in_color();
-                       ((GradientWindow*)thread->window)->update_out_color();
-                       ((GradientWindow*)thread->window)->update_shape();
-                       ((GradientWindow*)thread->window)->unlock_window();
-                       ((GradientWindow*)thread->window)->in_color_thread->update_gui(config.get_in_color(), config.in_a);
-                       ((GradientWindow*)thread->window)->out_color_thread->update_gui(config.get_out_color(), config.out_a);
-               }
-       }
+       if( !thread ) return;
+       if( !load_configuration() ) return;
+       ((GradientWindow*)thread->window)->lock_window("GradientMain::update_gui");
+       GradientWindow *window = (GradientWindow *)thread->window;
+       window->update_gui();
+       window->unlock_window();
 }
 
-
+void GradientWindow::update_gui()
+{
+       GradientConfig &config = plugin->config;
+       rate->set_text(GradientRate::to_text(config.rate));
+       in_radius->update(config.in_radius);
+       out_radius->update(config.out_radius);
+       shape->set_text(GradientShape::to_text(config.shape));
+       if( angle ) angle->update(config.angle);
+       if( center_x ) center_x->update(config.center_x);
+       if( center_y ) center_y->update(config.center_y);
+       update_in_color();
+       update_out_color();
+       update_shape();
+       unlock_window();
+       in_color_thread->update_gui(config.get_in_color(), config.in_a);
+       out_color_thread->update_gui(config.get_out_color(), config.out_a);
+       lock_window("GradientWindow::update_gui");
+}
 
 
 void GradientMain::save_data(KeyFrame *keyframe)
@@ -869,132 +895,125 @@ int GradientMain::handle_opengl()
                "}\n";
 
 
-       const char *shader_stack[5] = { 0, 0, 0, 0, 0 };
-       shader_stack[0] = head_frag;
+       const char *shader_stack[16];
+       memset(shader_stack,0, sizeof(shader_stack));
+       int current_shader = 0;
 
-       switch(config.shape)
-       {
-               case GradientConfig::LINEAR:
-                       shader_stack[1] = linear_shape;
-                       break;
+       shader_stack[current_shader++] = head_frag;
 
-               default:
-                       shader_stack[1] = radial_shape;
-                       break;
+       const char *shape_frag = 0;
+       switch( config.shape ) {
+       case GradientConfig::LINEAR:
+               shape_frag = linear_shape;
+               break;
+       default:
+               shape_frag = radial_shape;
+               break;
        }
-
-       switch(config.rate)
-       {
-               case GradientConfig::LINEAR:
-                       shader_stack[2] = linear_rate;
-                       break;
-               case GradientConfig::LOG:
-                       shader_stack[2] = log_rate;
-                       break;
-               case GradientConfig::SQUARE:
-                       shader_stack[2] = square_rate;
-                       break;
+       if( shape_frag )
+               shader_stack[current_shader++] = shape_frag;
+
+       const char *rate_frag = 0;
+       switch(config.rate) {
+       case GradientConfig::LINEAR:
+               rate_frag = linear_rate;
+               break;
+       case GradientConfig::LOG:
+               rate_frag = log_rate;
+               break;
+       case GradientConfig::SQUARE:
+               rate_frag = square_rate;
+               break;
        }
+       if( rate_frag )
+               shader_stack[current_shader++] = rate_frag;
+
+       shader_stack[current_shader++] = tail_frag;
 
-       shader_stack[3] = tail_frag;
 // Force frame to create texture without copying to it if full alpha.
-       if(config.in_a >= 0xff &&
-               config.out_a >= 0xff)
+        if( config.in_a >= 0xff && config.out_a >= 0xff )
                get_output()->set_opengl_state(VFrame::TEXTURE);
        get_output()->to_texture();
        get_output()->enable_opengl();
        get_output()->init_screen();
        get_output()->bind_texture(0);
 
-       unsigned int frag = VFrame::make_shader(0,
-               shader_stack[0],
-               shader_stack[1],
-               shader_stack[2],
-               shader_stack[3],
-               0);
-
-       if(frag)
-       {
-               glUseProgram(frag);
+       shader_stack[current_shader] = 0;
+       unsigned int shader = VFrame::make_shader(shader_stack);
+       if( shader > 0 ) {
+               glUseProgram(shader);
                float w = get_output()->get_w();
                float h = get_output()->get_h();
                float texture_w = get_output()->get_texture_w();
                float texture_h = get_output()->get_texture_h();
-               glUniform1i(glGetUniformLocation(frag, "tex"), 0);
-               glUniform1f(glGetUniformLocation(frag, "half_w"), w / 2 / texture_w);
-               glUniform1f(glGetUniformLocation(frag, "half_h"), h / 2 / texture_h);
+               glUniform1i(glGetUniformLocation(shader, "tex"), 0);
+               glUniform1f(glGetUniformLocation(shader, "half_w"), w / 2 / texture_w);
+               glUniform1f(glGetUniformLocation(shader, "half_h"), h / 2 / texture_h);
                if(config.shape == GradientConfig::LINEAR)
                {
-                       glUniform1f(glGetUniformLocation(frag, "center_x"),
+                       glUniform1f(glGetUniformLocation(shader, "center_x"),
                                w / 2 / texture_w);
-                       glUniform1f(glGetUniformLocation(frag, "center_y"),
+                       glUniform1f(glGetUniformLocation(shader, "center_y"),
                                h / 2 / texture_h);
                }
                else
                {
-                       glUniform1f(glGetUniformLocation(frag, "center_x"),
+                       glUniform1f(glGetUniformLocation(shader, "center_x"),
                                (float)config.center_x * w / 100 / texture_w);
-                       glUniform1f(glGetUniformLocation(frag, "center_y"),
+                       glUniform1f(glGetUniformLocation(shader, "center_y"),
                                (float)config.center_y * h / 100 / texture_h);
                }
                float gradient_size = hypotf(w / texture_w, h / texture_h);
-               glUniform1f(glGetUniformLocation(frag, "half_gradient_size"),
+               glUniform1f(glGetUniformLocation(shader, "half_gradient_size"),
                        gradient_size / 2);
-               glUniform1f(glGetUniformLocation(frag, "sin_angle"),
+               glUniform1f(glGetUniformLocation(shader, "sin_angle"),
                        sin(config.angle * (M_PI / 180)));
-               glUniform1f(glGetUniformLocation(frag, "cos_angle"),
+               glUniform1f(glGetUniformLocation(shader, "cos_angle"),
                        cos(config.angle * (M_PI / 180)));
                float in_radius = (float)config.in_radius / 100 * gradient_size;
-               glUniform1f(glGetUniformLocation(frag, "in_radius"), in_radius);
+               glUniform1f(glGetUniformLocation(shader, "in_radius"), in_radius);
                float out_radius = (float)config.out_radius / 100 * gradient_size;
-               glUniform1f(glGetUniformLocation(frag, "out_radius"), out_radius);
-               glUniform1f(glGetUniformLocation(frag, "radius_diff"),
+               glUniform1f(glGetUniformLocation(shader, "out_radius"), out_radius);
+               glUniform1f(glGetUniformLocation(shader, "radius_diff"),
                        out_radius - in_radius);
 
-               switch(get_output()->get_color_model())
-               {
-                       case BC_YUV888:
-                       case BC_YUVA8888:
-                       {
-                               float in1, in2, in3, in4;
-                               float out1, out2, out3, out4;
-                               YUV::rgb_to_yuv_f((float)config.in_r / 0xff,
-                                       (float)config.in_g / 0xff,
-                                       (float)config.in_b / 0xff,
-                                       in1,
-                                       in2,
-                                       in3);
+               switch(get_output()->get_color_model()) {
+               case BC_YUV888:
+               case BC_YUVA8888: {
+                       float in1, in2, in3, in4;
+                       float out1, out2, out3, out4;
+                       YUV::yuv.rgb_to_yuv_f(
+                               (float)config.in_r / 0xff,
+                               (float)config.in_g / 0xff,
+                               (float)config.in_b / 0xff,
+                               in1, in2, in3);
                                in4 = (float)config.in_a / 0xff;
-                               YUV::rgb_to_yuv_f((float)config.out_r / 0xff,
-                                       (float)config.out_g / 0xff,
-                                       (float)config.out_b / 0xff,
-                                       out1,
-                                       out2,
-                                       out3);
-                               in2 += 0.5;
-                               in3 += 0.5;
-                               out2 += 0.5;
-                               out3 += 0.5;
-                               out4 = (float)config.out_a / 0xff;
-                               glUniform4f(glGetUniformLocation(frag, "out_color"),
-                                       out1, out2, out3, out4);
-                               glUniform4f(glGetUniformLocation(frag, "in_color"),
-                                       in1, in2, in3, in4);
-                               break;
-                       }
+                       YUV::yuv.rgb_to_yuv_f(
+                               (float)config.out_r / 0xff,
+                               (float)config.out_g / 0xff,
+                               (float)config.out_b / 0xff,
+                               out1, out2, out3);
+                       in2 += 0.5;   in3 += 0.5;
+                       out2 += 0.5;  out3 += 0.5;
+                       out4 = (float)config.out_a / 0xff;
+                       glUniform4f(glGetUniformLocation(shader, "out_color"),
+                               out1, out2, out3, out4);
+                       glUniform4f(glGetUniformLocation(shader, "in_color"),
+                               in1, in2, in3, in4);
+                       break; }
 
-                       default:
-                               glUniform4f(glGetUniformLocation(frag, "out_color"),
-                                       (float)config.out_r / 0xff,
-                                       (float)config.out_g / 0xff,
-                                       (float)config.out_b / 0xff,
-                                       (float)config.out_a / 0xff);
-                               glUniform4f(glGetUniformLocation(frag, "in_color"),
-                                       (float)config.in_r / 0xff,
-                                       (float)config.in_g / 0xff,
-                                       (float)config.in_b / 0xff,
-                                       (float)config.in_a / 0xff);
-                               break;
+               default:
+                       glUniform4f(glGetUniformLocation(shader, "out_color"),
+                               (float)config.out_r / 0xff,
+                               (float)config.out_g / 0xff,
+                               (float)config.out_b / 0xff,
+                               (float)config.out_a / 0xff);
+                       glUniform4f(glGetUniformLocation(shader, "in_color"),
+                               (float)config.in_r / 0xff,
+                               (float)config.in_g / 0xff,
+                               (float)config.in_b / 0xff,
+                               (float)config.in_a / 0xff);
+                       break;
                }
        }
 
@@ -1007,23 +1026,11 @@ int GradientMain::handle_opengl()
 }
 
 
-
-
-
-
-
-
-
-
-
 GradientPackage::GradientPackage()
  : LoadPackage()
 {
 }
 
-
-
-
 GradientUnit::GradientUnit(GradientServer *server, GradientMain *plugin)
  : LoadClient(server)
 {
@@ -1032,8 +1039,6 @@ GradientUnit::GradientUnit(GradientServer *server, GradientMain *plugin)
 }
 
 
-
-
 static float calculate_opacity(float mag,
        float in_radius, float out_radius, int rate)
 {
@@ -1302,14 +1307,14 @@ void GradientUnit::process_package(LoadPackage *package)
                {
                        int in1, in2, in3, in4;
                        int out1, out2, out3, out4;
-                       yuv.rgb_to_yuv_8(plugin->config.in_r,
+                       YUV::yuv.rgb_to_yuv_8(plugin->config.in_r,
                                plugin->config.in_g,
                                plugin->config.in_b,
                                in1,
                                in2,
                                in3);
                        in4 = plugin->config.in_a;
-                       yuv.rgb_to_yuv_8(plugin->config.out_r,
+                       YUV::yuv.rgb_to_yuv_8(plugin->config.out_r,
                                plugin->config.out_g,
                                plugin->config.out_b,
                                out1,
@@ -1324,14 +1329,14 @@ void GradientUnit::process_package(LoadPackage *package)
                {
                        int in1, in2, in3, in4;
                        int out1, out2, out3, out4;
-                       yuv.rgb_to_yuv_8(plugin->config.in_r,
+                       YUV::yuv.rgb_to_yuv_8(plugin->config.in_r,
                                plugin->config.in_g,
                                plugin->config.in_b,
                                in1,
                                in2,
                                in3);
                        in4 = plugin->config.in_a;
-                       yuv.rgb_to_yuv_8(plugin->config.out_r,
+                       YUV::yuv.rgb_to_yuv_8(plugin->config.out_r,
                                plugin->config.out_g,
                                plugin->config.out_b,
                                out1,