sams last ladspa icons, libopus/vp9, mixer fixer, plugin resets, fmt frmsz, shm fixes
[goodguy/history.git] / cinelerra-5.1 / plugins / chromakeyhsv / chromakey.C
index 3541143cd180204f883e03aac90a68027c3f5289..b0a09757891033a0f96476aedc2b26accc8ff602 100644 (file)
@@ -2,21 +2,21 @@
 /*
  * CINELERRA
  * Copyright (C) 2012 Adam Williams <broadcast at earthling dot net>
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ *
  */
 
 #include "bcdisplayinfo.h"
@@ -30,7 +30,7 @@
 #include "language.h"
 #include "loadbalance.h"
 #include "playback3d.h"
-#include "cicolors.h"
+#include "bccolors.h"
 #include "pluginvclient.h"
 #include "vframe.h"
 
 
 
 ChromaKeyConfig::ChromaKeyConfig ()
+{
+       reset();
+}
+
+void ChromaKeyConfig::reset()
+
 {
   red = 0.0;
   green = 1.0;
@@ -149,11 +155,11 @@ ChromaKeyConfig::get_color ()
 
 
 ChromaKeyWindow::ChromaKeyWindow (ChromaKeyHSV * plugin)
- : PluginClientWindow(plugin, 
-          400, 
-          450, 
-          400, 
-          450, 
+ : PluginClientWindow(plugin,
+          400,
+          450,
+          400,
+          450,
           0)
 {
   this->plugin = plugin;
@@ -187,6 +193,8 @@ ChromaKeyWindow::create_objects ()
   add_subwindow (use_colorpicker =
                 new ChromaKeyUseColorPicker (plugin, this, x, y));
   y += use_colorpicker->get_h() + 10;
+
+  add_subwindow (new ChromaKeyReset (plugin, this, x2+240, y));
   add_subwindow (show_mask = new ChromaKeyShowMask (plugin, x2, y));
        y += show_mask->get_h() + 5;
 
@@ -287,6 +295,10 @@ ChromaKeyWindow::update_sample ()
   sample->flash ();
 }
 
+void ChromaKeyWindow::done_event(int result)
+{
+       color_thread->close_window();
+}
 
 
 ChromaKeyColor::ChromaKeyColor (ChromaKeyHSV * plugin,
@@ -461,6 +473,21 @@ ChromaKeyShowMask::handle_event ()
   return 1;
 }
 
+ChromaKeyReset::ChromaKeyReset (ChromaKeyHSV *plugin, ChromaKeyWindow *gui, int x, int y)
+ :BC_GenericButton(x, y, _("Reset"))
+{
+  this->plugin = plugin;
+  this->gui = gui;
+}
+
+int ChromaKeyReset::handle_event ()
+{
+  plugin->config.reset();
+  gui->update_gui();
+  plugin->send_configure_change();
+  return 1;
+}
+
 ChromaKeyUseColorPicker::ChromaKeyUseColorPicker (ChromaKeyHSV * plugin, ChromaKeyWindow * gui, int x, int y)
  : BC_GenericButton (x, y,
                  _
@@ -525,7 +552,7 @@ ChromaKeySpillAmount::handle_event ()
 
 
 ChromaKeyColorThread::ChromaKeyColorThread (ChromaKeyHSV * plugin, ChromaKeyWindow * gui)
- : ColorThread (1, _("Inner color"))
+ : ColorPicker (1, _("Inner color"))
 {
   this->plugin = plugin;
   this->gui = gui;
@@ -643,12 +670,12 @@ ChromaKeyUnit::ChromaKeyUnit (ChromaKeyHSV * plugin, ChromaKeyServer * server):L
                value_key);
 
 
-template <typename component_type> 
-void ChromaKeyUnit::process_chromakey(int components, 
-       component_type max, 
-       bool use_yuv, 
-       ChromaKeyPackage *pkg) 
-{      
+template <typename component_type>
+void ChromaKeyUnit::process_chromakey(int components,
+       component_type max,
+       bool use_yuv,
+       ChromaKeyPackage *pkg)
+{ 
        OUTER_VARIABLES
 
        int w = plugin->input->get_w();
@@ -693,17 +720,17 @@ void ChromaKeyUnit::process_chromakey(int components,
 
                        if (tolerance == 0)
                    ah = 1.0;
-                       else 
+                       else
                        if (ABS (h - hue_key) < tolerance_in * 180)
                    ah = 0;
-                       else 
+                       else
                        if ((out_slope != 0) && (ABS (h - hue_key) < tolerance * 180))
 /* we scale alpha between 0 and 1/2 */
-                   ah = ABS (h - hue_key) / tolerance / 360;   
-                       else 
+                   ah = ABS (h - hue_key) / tolerance / 360;
+                       else
                        if (ABS (h - hue_key) < tolerance_out * 180)
 /* we scale alpha between 1/2 and 1 */
-                   ah = ABS (h - hue_key) / tolerance_out / 360;       
+                   ah = ABS (h - hue_key) / tolerance_out / 360;
                        else
                    has_match = false;
 
@@ -756,7 +783,7 @@ void ChromaKeyUnit::process_chromakey(int components,
          if (has_match)
            a = MAX (MAX (ah, av), MAX (as, avm));
 
-         // Spill light processing       
+         // Spill light processing
          if ((ABS (h - hue_key) < spill_threshold * 180) ||
              ((ABS (h - hue_key) > 360)
               && (ABS (h - hue_key) - 360 < spill_threshold * 180)))
@@ -885,13 +912,13 @@ REGISTER_PLUGIN(ChromaKeyHSV)
 ChromaKeyHSV::ChromaKeyHSV(PluginServer *server)
  : PluginVClient(server)
 {
-       
+
        engine = 0;
 }
 
 ChromaKeyHSV::~ChromaKeyHSV()
 {
-       
+
        if(engine) delete engine;
 }
 
@@ -905,9 +932,9 @@ int ChromaKeyHSV::process_buffer(VFrame *frame,
        this->output = frame;
 
 
-       read_frame(frame, 
-               0, 
-               start_position, 
+       read_frame(frame,
+               0,
+               start_position,
                frame_rate,
                get_use_opengl());
        if(get_use_opengl()) return run_opengl();
@@ -999,22 +1026,27 @@ void ChromaKeyHSV::update_gui()
                load_configuration();
                ChromaKeyWindow *window = (ChromaKeyWindow*)thread->window;
                window->lock_window();
-               window->min_brightness->update(config.min_brightness);
-               window->max_brightness->update(config.max_brightness);
-               window->saturation->update(config.saturation);
-               window->min_saturation->update(config.min_saturation);
-               window->tolerance->update(config.tolerance);
-               window->in_slope->update(config.in_slope);
-               window->out_slope->update(config.out_slope);
-               window->alpha_offset->update(config.alpha_offset);
-               window->spill_threshold->update(config.spill_threshold);
-               window->spill_amount->update(config.spill_amount);
-               window->show_mask->update(config.show_mask);
-               window->update_sample();
+               window->update_gui();
                window->unlock_window();
        }
 }
 
+void ChromaKeyWindow::update_gui()
+{
+       ChromaKeyConfig &config = plugin->config;
+       min_brightness->update(config.min_brightness);
+       max_brightness->update(config.max_brightness);
+       saturation->update(config.saturation);
+       min_saturation->update(config.min_saturation);
+       tolerance->update(config.tolerance);
+       in_slope->update(config.in_slope);
+       out_slope->update(config.out_slope);
+       alpha_offset->update(config.alpha_offset);
+       spill_threshold->update(config.spill_threshold);
+       spill_amount->update(config.spill_amount);
+       show_mask->update(config.show_mask);
+       update_sample();
+}
 
 
 
@@ -1025,7 +1057,7 @@ int ChromaKeyHSV::handle_opengl()
        ChromaKeyHSV *plugin = this;
        OUTER_VARIABLES
 
-       static const char *yuv_shader = 
+       static const char *yuv_shader =
                "const vec3 black = vec3(0.0, 0.5, 0.5);\n"
                "\n"
                "vec4 yuv_to_rgb(vec4 color)\n"
@@ -1040,7 +1072,7 @@ int ChromaKeyHSV::handle_opengl()
                "       return color;\n"
                "}\n";
 
-       static const char *rgb_shader = 
+       static const char *rgb_shader =
                "const vec3 black = vec3(0.0, 0.0, 0.0);\n"
                "\n"
                "vec4 yuv_to_rgb(vec4 color)\n"
@@ -1052,7 +1084,7 @@ int ChromaKeyHSV::handle_opengl()
                "       return color;\n"
                "}\n";
 
-       static const char *hsv_shader = 
+       static const char *hsv_shader =
                "vec4 rgb_to_hsv(vec4 color)\n"
                "{\n"
                        RGB_TO_HSV_FRAG("color")
@@ -1066,19 +1098,19 @@ int ChromaKeyHSV::handle_opengl()
                "}\n"
                "\n";
 
-       static const char *show_rgbmask_shader = 
+       static const char *show_rgbmask_shader =
                "vec4 show_mask(vec4 color, vec4 color2)\n"
                "{\n"
                "       return vec4(1.0, 1.0, 1.0, min(color.a, color2.a));"
                "}\n";
 
-       static const char *show_yuvmask_shader = 
+       static const char *show_yuvmask_shader =
                "vec4 show_mask(vec4 color, vec4 color2)\n"
                "{\n"
                "       return vec4(1.0, 0.5, 0.5, min(color.a, color2.a));"
                "}\n";
 
-       static const char *nomask_shader = 
+       static const char *nomask_shader =
                "vec4 show_mask(vec4 color, vec4 color2)\n"
                "{\n"
                "       return vec4(color.rgb, min(color.a, color2.a));"
@@ -1099,7 +1131,7 @@ int ChromaKeyHSV::handle_opengl()
                case BC_YUVA8888:
                        shader_stack[0] = yuv_shader;
                        shader_stack[1] = hsv_shader;
-                       if(config.show_mask) 
+                       if(config.show_mask)
                                shader_stack[2] = show_yuvmask_shader;
                        else
                                shader_stack[2] = nomask_shader;
@@ -1109,7 +1141,7 @@ int ChromaKeyHSV::handle_opengl()
                default:
                        shader_stack[0] = rgb_shader;
                        shader_stack[1] = hsv_shader;
-                       if(config.show_mask) 
+                       if(config.show_mask)
                                shader_stack[2] = show_rgbmask_shader;
                        else
                                shader_stack[2] = nomask_shader;
@@ -1118,11 +1150,11 @@ int ChromaKeyHSV::handle_opengl()
        }
 
 
-       unsigned int frag = VFrame::make_shader(0, 
-               shader_stack[0], 
-               shader_stack[1], 
-               shader_stack[2], 
-               shader_stack[3], 
+       unsigned int frag = VFrame::make_shader(0,
+               shader_stack[0],
+               shader_stack[1],
+               shader_stack[2],
+               shader_stack[3],
                0);
 
        if(frag)