X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Flinearblur%2Flinearblur.C;h=dab0043a700d38c4d2d730c2405f7b0e69679fb1;hb=f7444a58936e4ab8fa7e7062281567cbc74e175f;hp=af6cb826510f8a8bdab291c01b25dc5b8a3e85ff;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/plugins/linearblur/linearblur.C b/cinelerra-5.1/plugins/linearblur/linearblur.C index af6cb826..dab0043a 100644 --- a/cinelerra-5.1/plugins/linearblur/linearblur.C +++ b/cinelerra-5.1/plugins/linearblur/linearblur.C @@ -19,6 +19,7 @@ * */ + #include #include #include @@ -27,170 +28,16 @@ #include "clip.h" #include "bchash.h" #include "filexml.h" +#include "linearblur.h" #include "keyframe.h" #include "language.h" #include "loadbalance.h" #include "pluginvclient.h" +#include "theme.h" #include "vframe.h" -class LinearBlurMain; -class LinearBlurEngine; - - - - - -class LinearBlurConfig -{ -public: - LinearBlurConfig(); - - int equivalent(LinearBlurConfig &that); - void copy_from(LinearBlurConfig &that); - void interpolate(LinearBlurConfig &prev, - LinearBlurConfig &next, - long prev_frame, - long next_frame, - long current_frame); - - int radius; - int steps; - int angle; - int r; - int g; - int b; - int a; -}; - - - -class LinearBlurSize : public BC_ISlider -{ -public: - LinearBlurSize(LinearBlurMain *plugin, - int x, - int y, - int *output, - int min, - int max); - int handle_event(); - LinearBlurMain *plugin; - int *output; -}; - -class LinearBlurToggle : public BC_CheckBox -{ -public: - LinearBlurToggle(LinearBlurMain *plugin, - int x, - int y, - int *output, - char *string); - int handle_event(); - LinearBlurMain *plugin; - int *output; -}; - -class LinearBlurWindow : public PluginClientWindow -{ -public: - LinearBlurWindow(LinearBlurMain *plugin); - ~LinearBlurWindow(); - - void create_objects(); - - LinearBlurSize *angle, *steps, *radius; - LinearBlurToggle *r, *g, *b, *a; - LinearBlurMain *plugin; -}; - - - - - -// Output coords for a layer of blurring -// Used for OpenGL only -class LinearBlurLayer -{ -public: - LinearBlurLayer() {}; - int x, y; -}; - -class LinearBlurMain : public PluginVClient -{ -public: - LinearBlurMain(PluginServer *server); - ~LinearBlurMain(); - - int process_buffer(VFrame *frame, - int64_t start_position, - double frame_rate); - int is_realtime(); - void save_data(KeyFrame *keyframe); - void read_data(KeyFrame *keyframe); - void update_gui(); - int handle_opengl(); - - PLUGIN_CLASS_MEMBERS(LinearBlurConfig) - - void delete_tables(); - VFrame *input, *output, *temp; - LinearBlurEngine *engine; - int **scale_y_table; - int **scale_x_table; - LinearBlurLayer *layer_table; - int table_entries; - int need_reconfigure; -// The accumulation buffer is needed because 8 bits isn't precise enough - unsigned char *accum; -}; - -class LinearBlurPackage : public LoadPackage -{ -public: - LinearBlurPackage(); - int y1, y2; -}; - -class LinearBlurUnit : public LoadClient -{ -public: - LinearBlurUnit(LinearBlurEngine *server, LinearBlurMain *plugin); - void process_package(LoadPackage *package); - LinearBlurEngine *server; - LinearBlurMain *plugin; -}; - -class LinearBlurEngine : public LoadServer -{ -public: - LinearBlurEngine(LinearBlurMain *plugin, - int total_clients, - int total_packages); - void init_packages(); - LoadClient* new_client(); - LoadPackage* new_package(); - LinearBlurMain *plugin; -}; - - - - - - - - - - - - - - - - @@ -198,15 +45,41 @@ REGISTER_PLUGIN(LinearBlurMain) + LinearBlurConfig::LinearBlurConfig() { - radius = 10; - angle = 0; - steps = 10; - r = 1; - g = 1; - b = 1; - a = 1; + reset(RESET_DEFAULT_SETTINGS); +} + +void LinearBlurConfig::reset(int clear) +{ + switch(clear) { + case RESET_ALL : + radius = 0; + angle = 0; + steps = 1; + r = 1; + g = 1; + b = 1; + a = 1; + break; + case RESET_RADIUS : radius = 0; + break; + case RESET_ANGLE : angle = 0; + break; + case RESET_STEPS : steps = 1; + break; + case RESET_DEFAULT_SETTINGS : + default: + radius = 10; + angle = 0; + steps = 10; + r = 1; + g = 1; + b = 1; + a = 1; + break; + } } int LinearBlurConfig::equivalent(LinearBlurConfig &that) @@ -262,10 +135,10 @@ void LinearBlurConfig::interpolate(LinearBlurConfig &prev, LinearBlurWindow::LinearBlurWindow(LinearBlurMain *plugin) : PluginClientWindow(plugin, - 230, - 290, - 230, - 290, + 280, + 320, + 280, + 320, 0) { this->plugin = plugin; @@ -278,18 +151,27 @@ LinearBlurWindow::~LinearBlurWindow() void LinearBlurWindow::create_objects() { int x = 10, y = 10; + int x1 = 0; int clrBtn_w = 50; + int defaultBtn_w = 100; add_subwindow(new BC_Title(x, y, _("Length:"))); y += 20; add_subwindow(radius = new LinearBlurSize(plugin, x, y, &plugin->config.radius, 0, 100)); + x1 = x + radius->get_w() + 10; + add_subwindow(radiusClr = new LinearBlurSliderClr(plugin, this, x1, y, clrBtn_w, RESET_RADIUS)); + y += 30; add_subwindow(new BC_Title(x, y, _("Angle:"))); y += 20; add_subwindow(angle = new LinearBlurSize(plugin, x, y, &plugin->config.angle, -180, 180)); + add_subwindow(angleClr = new LinearBlurSliderClr(plugin, this, x1, y, clrBtn_w, RESET_ANGLE)); + y += 30; add_subwindow(new BC_Title(x, y, _("Steps:"))); y += 20; add_subwindow(steps = new LinearBlurSize(plugin, x, y, &plugin->config.steps, 1, 200)); + add_subwindow(stepsClr = new LinearBlurSliderClr(plugin, this, x1, y, clrBtn_w, RESET_STEPS)); + y += 30; add_subwindow(r = new LinearBlurToggle(plugin, x, y, &plugin->config.r, _("Red"))); y += 30; @@ -298,13 +180,40 @@ void LinearBlurWindow::create_objects() add_subwindow(b = new LinearBlurToggle(plugin, x, y, &plugin->config.b, _("Blue"))); y += 30; add_subwindow(a = new LinearBlurToggle(plugin, x, y, &plugin->config.a, _("Alpha"))); - y += 30; + y += 40; + add_subwindow(reset = new LinearBlurReset(plugin, this, x, y)); + add_subwindow(default_settings = new LinearBlurDefaultSettings(plugin, this, + (280 - 10 - defaultBtn_w), y, defaultBtn_w)); show_window(); flush(); } +// for Reset button +void LinearBlurWindow::update_gui(int clear) +{ + switch(clear) { + case RESET_RADIUS : radius->update(plugin->config.radius); + break; + case RESET_ANGLE : angle->update(plugin->config.angle); + break; + case RESET_STEPS : steps->update(plugin->config.steps); + break; + case RESET_ALL : + case RESET_DEFAULT_SETTINGS : + default: + radius->update(plugin->config.radius); + angle->update(plugin->config.angle); + steps->update(plugin->config.steps); + r->update(plugin->config.r); + g->update(plugin->config.g); + b->update(plugin->config.b); + a->update(plugin->config.a); + break; + } +} + @@ -357,6 +266,62 @@ int LinearBlurSize::handle_event() } +LinearBlurReset::LinearBlurReset(LinearBlurMain *plugin, LinearBlurWindow *gui, int x, int y) + : BC_GenericButton(x, y, _("Reset")) +{ + this->plugin = plugin; + this->gui = gui; +} +LinearBlurReset::~LinearBlurReset() +{ +} +int LinearBlurReset::handle_event() +{ + plugin->config.reset(RESET_ALL); + gui->update_gui(RESET_ALL); + plugin->send_configure_change(); + return 1; +} + + +LinearBlurDefaultSettings::LinearBlurDefaultSettings(LinearBlurMain *plugin, LinearBlurWindow *gui, int x, int y, int w) + : BC_GenericButton(x, y, w, _("Default")) +{ + this->plugin = plugin; + this->gui = gui; +} +LinearBlurDefaultSettings::~LinearBlurDefaultSettings() +{ +} +int LinearBlurDefaultSettings::handle_event() +{ + plugin->config.reset(RESET_DEFAULT_SETTINGS); + gui->update_gui(RESET_DEFAULT_SETTINGS); + plugin->send_configure_change(); + return 1; +} + + +LinearBlurSliderClr::LinearBlurSliderClr(LinearBlurMain *plugin, LinearBlurWindow *gui, int x, int y, int w, int clear) + : BC_Button(x, y, w, plugin->get_theme()->get_image_set("reset_button")) +{ + this->plugin = plugin; + this->gui = gui; + this->clear = clear; +} +LinearBlurSliderClr::~LinearBlurSliderClr() +{ +} +int LinearBlurSliderClr::handle_event() +{ + // clear==1 ==> Radius slider + // clear==2 ==> Angle slider + // clear==3 ==> Steps slider + plugin->config.reset(clear); + gui->update_gui(clear); + plugin->send_configure_change(); + return 1; +}