anonymous contribution for much improved ChromakeyHSV plugin menu with boxes to set...
[goodguy/cinelerra.git] / cinelerra-5.1 / plugins / gradient / gradient.C
index 826f817f6d0de267afad55418b796331e156dfa3..24bbdf727f0144bae9cfe5a55842e030f872bc62 100644 (file)
@@ -128,11 +128,11 @@ int GradientConfig::get_out_color()
        return result;
 }
 
-#define COLOR_W 100
-#define COLOR_H 30
+#define COLOR_W xS(100)
+#define COLOR_H yS(30)
 
 GradientWindow::GradientWindow(GradientMain *plugin)
- : PluginClientWindow(plugin, 350, 290, 350, 290, 0)
+ : PluginClientWindow(plugin, xS(350), yS(290), xS(350), yS(290), 0)
 {
        this->plugin = plugin;
        angle = 0;
@@ -141,20 +141,18 @@ GradientWindow::GradientWindow(GradientMain *plugin)
        center_y = 0;
        center_x_title = 0;
        center_y_title = 0;
-       in_color_thread = 0;
-       out_color_thread = 0;
 }
 GradientWindow::~GradientWindow()
 {
-       delete in_color_thread;
-       delete out_color_thread;
 }
 
 
 void GradientWindow::create_objects()
 {
+       int xs10 = xS(10);
+       int ys10 = yS(10);
        int margin = plugin->get_theme()->widget_border;
-       int x = 10, y = 10;
+       int x = xs10, y = ys10;
        BC_Title *title;
 
        add_subwindow(title = new BC_Title(x, y, _("Shape:")));
@@ -170,7 +168,7 @@ void GradientWindow::create_objects()
        add_subwindow(rate = new GradientRate(plugin,
                        x + title->get_w() + margin, y));
        rate->create_objects();
-       y += rate->get_h() + margin;
+       y += rate->get_h() + 3*margin;
 
        int x1 = x, y1 = y;
        BC_Title *title1;
@@ -179,40 +177,33 @@ 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;
        add_subwindow(in_radius = new GradientInRadius(plugin, x, y));
        y += in_radius->get_h() + margin;
        add_subwindow(out_radius = new GradientOutRadius(plugin, x, y));
-       y += out_radius->get_h() + margin;
+       y += out_radius->get_h() + 3*margin;
 
        x = x1;
-       y1 = y;
-       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;
-
-       in_color_x = x;
-       in_color_y = y;
-       y += COLOR_H + margin;
-       out_color_x = x;
-       out_color_y = y;
-       in_color_thread = new GradientInColorThread(plugin, this);
-       out_color_thread = new GradientOutColorThread(plugin, this);
-       update_in_color();
-       update_out_color();
+       add_subwindow(title1 = new BC_Title(x, y, _("Inner Color:")));
+       y1 = y + COLOR_H+4 + 2*margin;
+       add_subwindow(title2 = new BC_Title(x, y1, _("Outer Color:")));
+       int x2 = x + MAX(title1->get_w(), title2->get_w()) + margin;
+       int in_rgb = plugin->config.get_in_color();
+       int in_a = plugin->config.in_a;
+       add_subwindow(in_color = new GradientInColorButton(plugin, this, x2+2, y+2, in_rgb, in_a));
+       draw_3d_border(x2,y, COLOR_W+4,COLOR_H+4, 1);
+       in_color->create_objects();
+
+       int out_rgb = plugin->config.get_out_color();
+       int out_a = plugin->config.out_a;
+       add_subwindow(out_color = new GradientOutColorButton(plugin, this, x2+2, y1+2, out_rgb, out_a));
+       draw_3d_border(x2,y1, COLOR_W+4,COLOR_H+4, 1);
+       out_color->create_objects();
+       y = y1 + COLOR_H+4 + 3*margin;
+
+       add_subwindow(reset = new GradientReset(plugin, this, x, y));
        update_shape();
-
-       draw_3d_border(in_color_x - 2, in_color_y - 2,
-               COLOR_W + 4, COLOR_H + 4, 1);
-
-       draw_3d_border(out_color_x - 2, out_color_y - 2,
-               COLOR_W + 4, COLOR_H + 4, 1);
        show_window();
 }
 
@@ -227,7 +218,7 @@ void GradientWindow::update_shape()
                delete center_y;  center_y = 0;
                if( !angle ) {
                        add_subwindow(angle_title = new BC_Title(x, y, _("Angle:")));
-                       add_subwindow(angle = new GradientAngle(plugin, x + angle_title->get_w() + 10, y));
+                       add_subwindow(angle = new GradientAngle(plugin, x + angle_title->get_w() + xS(10), y));
                }
        }
        else {
@@ -236,40 +227,24 @@ void GradientWindow::update_shape()
                if( !center_x ) {
                        add_subwindow(center_x_title = new BC_Title(x, y, _("Center X:")));
                        add_subwindow(center_x = new GradientCenterX(plugin,
-                               x + center_x_title->get_w() + 10, y));
-                       x += center_x_title->get_w() + 10 + center_x->get_w() + 10;
+                               x + center_x_title->get_w() + xS(10), y));
+                       x += center_x_title->get_w() + xS(10) + center_x->get_w() + xS(10);
                        add_subwindow(center_y_title = new BC_Title(x, y, _("Center Y:")));
                        add_subwindow(center_y = new GradientCenterY(plugin,
-                               x + center_y_title->get_w() + 10, y));
+                               x + center_y_title->get_w() + xS(10), y));
                }
        }
        show_window();
 }
 
-void GradientWindow::update_in_color()
-{
-//printf("GradientWindow::update_in_color 1 %08x\n", plugin->config.get_in_color());
-       set_color(plugin->config.get_in_color());
-       draw_box(in_color_x, in_color_y, COLOR_W, COLOR_H);
-       flash(in_color_x, in_color_y, COLOR_W, COLOR_H);
-}
-
-void GradientWindow::update_out_color()
-{
-//printf("GradientWindow::update_out_color 1 %08x\n", plugin->config.get_in_color());
-       set_color(plugin->config.get_out_color());
-       draw_box(out_color_x, out_color_y, COLOR_W, COLOR_H);
-       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();
+       in_color->close_picker();
+       out_color->close_picker();
 }
 
 GradientShape::GradientShape(GradientMain *plugin, GradientWindow *gui, int x, int y)
- : BC_PopupMenu(x, y, 100, to_text(plugin->config.shape), 1)
+ : BC_PopupMenu(x, y, xS(100), to_text(plugin->config.shape), 1)
 {
        this->plugin = plugin;
        this->gui = gui;
@@ -302,7 +277,7 @@ int GradientShape::handle_event()
 
 
 GradientCenterX::GradientCenterX(GradientMain *plugin, int x, int y)
- : BC_FPot(x, y, plugin->config.center_x, 0, 100)
+ : BC_FPot(x, y, plugin->config.center_x, 0, xS(100))
 {
        this->plugin = plugin;
 }
@@ -315,7 +290,7 @@ int GradientCenterX::handle_event()
 
 
 GradientCenterY::GradientCenterY(GradientMain *plugin, int x, int y)
- : BC_FPot(x, y, plugin->config.center_y, 0, 100)
+ : BC_FPot(x, y, plugin->config.center_y, 0, xS(100))
 {
        this->plugin = plugin;
 }
@@ -343,7 +318,7 @@ int GradientAngle::handle_event()
 
 
 GradientRate::GradientRate(GradientMain *plugin, int x, int y)
- : BC_PopupMenu(x, y, 100, to_text(plugin->config.rate), 1)
+ : BC_PopupMenu(x, y, xS(100), to_text(plugin->config.rate), 1)
 {
        this->plugin = plugin;
 }
@@ -378,7 +353,7 @@ int GradientRate::handle_event()
 
 
 GradientInRadius::GradientInRadius(GradientMain *plugin, int x, int y)
- : BC_FSlider(x, y, 0, 200, 200,
+ : BC_FSlider(x, y, 0, xS(200), yS(200),
                0.f, 100.f, (float)plugin->config.in_radius)
 {
        this->plugin = plugin;
@@ -393,7 +368,7 @@ int GradientInRadius::handle_event()
 
 
 GradientOutRadius::GradientOutRadius(GradientMain *plugin, int x, int y)
- : BC_FSlider(x, y, 0, 200, 200,
+ : BC_FSlider(x, y, 0, xS(200), yS(200),
                0.f, 100.f, (float)plugin->config.out_radius)
 {
        this->plugin = plugin;
@@ -406,101 +381,84 @@ int GradientOutRadius::handle_event()
        return 1;
 }
 
-GradientInColorButton::GradientInColorButton(GradientMain *plugin, GradientWindow *window, int x, int y)
- : BC_GenericButton(x, y, _("Inner color:"))
+
+GradientInColorButton::GradientInColorButton(GradientMain *plugin, GradientWindow *gui,
+               int x, int y, int color, int alpha)
+ : ColorBoxButton(_("Inner color:"), x, y, COLOR_W, COLOR_H, color, alpha, 1)
 {
        this->plugin = plugin;
-       this->window = window;
+       this->gui = gui;
 }
 
-int GradientInColorButton::handle_event()
+GradientInColorButton::~GradientInColorButton()
 {
-       window->in_color_thread->start_window(
-               plugin->config.get_in_color(),
-               plugin->config.in_a);
-       return 1;
 }
 
-
-GradientOutColorButton::GradientOutColorButton(GradientMain *plugin, GradientWindow *window, int x, int y)
- : BC_GenericButton(x, y, _("Outer color:"))
+void GradientInColorButton::handle_done_event(int result)
 {
-       this->plugin = plugin;
-       this->window = window;
+       if( result ) {
+               gui->lock_window("GradientInColorButton::handle_done_event");
+               update_gui(orig_color, orig_alpha);
+               gui->unlock_window();
+               handle_new_color(orig_color, orig_alpha);
+       }
 }
 
-int GradientOutColorButton::handle_event()
+int GradientInColorButton::handle_new_color(int color, int alpha)
 {
-       window->out_color_thread->start_window(
-               plugin->config.get_out_color(),
-               plugin->config.out_a);
+       plugin->config.in_r = (color & 0xff0000) >> 16;
+       plugin->config.in_g = (color & 0xff00) >> 8;
+       plugin->config.in_b = (color & 0xff);
+       plugin->config.in_a = alpha;
+       plugin->send_configure_change();
        return 1;
 }
 
-GradientReset::GradientReset(GradientMain *plugin, GradientWindow *window, int x, int y)
- : BC_GenericButton(x, y, _("Reset"))
+GradientOutColorButton::GradientOutColorButton(GradientMain *plugin, GradientWindow *gui,
+               int x, int y, int color, int alpha)
+ : ColorBoxButton(_("Outer color:"), x, y, COLOR_W, COLOR_H, color, alpha, 1)
 {
        this->plugin = plugin;
-       this->window = window;
+       this->gui = gui;
 }
 
-int GradientReset::handle_event()
+GradientOutColorButton::~GradientOutColorButton()
 {
-       plugin->config.reset();
-       window->update_gui();
-       plugin->send_configure_change();
-       return 1;
 }
 
-GradientInColorThread::GradientInColorThread(GradientMain *plugin,
-       GradientWindow *window)
- : ColorPicker(1, _("Inner color"))
+void GradientOutColorButton::handle_done_event(int result)
 {
-       this->plugin = plugin;
-       this->window = window;
+       if( result ) {
+               gui->lock_window("GradientOutColorButton::handle_done_event");
+               update_gui(orig_color, orig_alpha);
+               gui->unlock_window();
+               handle_new_color(orig_color, orig_alpha);
+       }
 }
 
-int GradientInColorThread::handle_new_color(int output, int alpha)
+int GradientOutColorButton::handle_new_color(int color, int alpha)
 {
-       plugin->config.in_r = (output & 0xff0000) >> 16;
-       plugin->config.in_g = (output & 0xff00) >> 8;
-       plugin->config.in_b = (output & 0xff);
-       plugin->config.in_a = alpha;
-
-       window->lock_window("GradientInColorThread::handle_new_color");
-       window->update_in_color();
-       window->flush();
-       window->unlock_window();
+       plugin->config.out_r = (color & 0xff0000) >> 16;
+       plugin->config.out_g = (color & 0xff00) >> 8;
+       plugin->config.out_b = (color & 0xff);
+       plugin->config.out_a = alpha;
        plugin->send_configure_change();
-//printf("GradientInColorThread::handle_event 1 %d %d %d %d %d %d %d %d\n",
-// plugin->config.in_r, plugin->config.in_g, plugin->config.in_b, plugin->config.in_a,
-// plugin->config.out_r, plugin->config.out_g, plugin->config.out_b, plugin->config.out_a);
        return 1;
 }
 
 
-GradientOutColorThread::GradientOutColorThread(GradientMain *plugin,
-       GradientWindow *window)
- : ColorPicker(1, _("Outer color"))
+GradientReset::GradientReset(GradientMain *plugin, GradientWindow *window, int x, int y)
+ : BC_GenericButton(x, y, _("Reset"))
 {
        this->plugin = plugin;
        this->window = window;
 }
 
-int GradientOutColorThread::handle_new_color(int output, int alpha)
+int GradientReset::handle_event()
 {
-       plugin->config.out_r = (output & 0xff0000) >> 16;
-       plugin->config.out_g = (output & 0xff00) >> 8;
-       plugin->config.out_b = (output & 0xff);
-       plugin->config.out_a = alpha;
-       window->lock_window("GradientOutColorThread::handle_new_color");
-       window->update_out_color();
-       window->flush();
-       window->unlock_window();
+       plugin->config.reset();
+       window->update_gui();
        plugin->send_configure_change();
-//printf("GradientOutColorThread::handle_event 1 %d %d %d %d %d %d %d %d\n",
-// plugin->config.in_r, plugin->config.in_g, plugin->config.in_b, plugin->config.in_a,
-// plugin->config.out_r, plugin->config.out_g, plugin->config.out_b, plugin->config.out_a);
        return 1;
 }
 
@@ -606,10 +564,13 @@ void GradientMain::update_gui()
 {
        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();
+       thread->window->lock_window("GradientMain::update_gui");
+       if( load_configuration() ) {
+               GradientWindow *window = (GradientWindow *)thread->window;
+               window->update_gui();
+               window->flush();
+       }
+       thread->window->unlock_window();
 }
 
 void GradientWindow::update_gui()
@@ -622,13 +583,9 @@ void GradientWindow::update_gui()
        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");
+       in_color->update_gui(config.get_in_color(), config.in_a);
+       out_color->update_gui(config.get_out_color(), config.out_a);
 }
 
 
@@ -1090,9 +1047,9 @@ void GradientUnit::process_package(LoadPackage *package)
                int out1, out2, out3, out4;
                YUV::yuv.rgb_to_yuv_8(in_r,in_g,in_b, in1,in2,in3);
                in4 = plugin->config.in_a;
-               int out_r = plugin->config.in_r;
-               int out_g = plugin->config.in_g;
-               int out_b = plugin->config.in_b;
+               int out_r = plugin->config.out_r;
+               int out_g = plugin->config.out_g;
+               int out_b = plugin->config.out_b;
                YUV::yuv.rgb_to_yuv_8(out_r,out_g,out_b, out1,out2,out3);
                out4 = plugin->config.out_a;
                CREATE_GRADIENT(unsigned char, int, 3, 0xff)
@@ -1106,9 +1063,9 @@ void GradientUnit::process_package(LoadPackage *package)
                int out1, out2, out3, out4;
                YUV::yuv.rgb_to_yuv_8(in_r,in_g,in_b, in1,in2,in3);
                in4 = plugin->config.in_a;
-               int out_r = plugin->config.in_r;
-               int out_g = plugin->config.in_g;
-               int out_b = plugin->config.in_b;
+               int out_r = plugin->config.out_r;
+               int out_g = plugin->config.out_g;
+               int out_b = plugin->config.out_b;
                YUV::yuv.rgb_to_yuv_8(out_r,out_g,out_b, out1,out2,out3);
                out4 = plugin->config.out_a;
                CREATE_GRADIENT(unsigned char, int, 4, 0xff)