X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fboxblur%2Fboxblur.C;h=132c1d987f4c6744ab676ea92051fcd916506ffa;hb=98d1bfa28f082b49eddf01f583e0af16d3a28ba4;hp=ec8bf7673f0f5d3920ceb55cbe6162978cfb81be;hpb=82931d63c508e5953e9d5a19be76b60ec0e146c5;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/plugins/boxblur/boxblur.C b/cinelerra-5.1/plugins/boxblur/boxblur.C index ec8bf767..132c1d98 100644 --- a/cinelerra-5.1/plugins/boxblur/boxblur.C +++ b/cinelerra-5.1/plugins/boxblur/boxblur.C @@ -37,6 +37,10 @@ #include class BoxBlurConfig; +class BoxBlurNumISlider; +class BoxBlurNumIText; +class BoxBlurNumClear; +class BoxBlurNum; class BoxBlurRadius; class BoxBlurPower; class BoxBlurDrag; @@ -58,6 +62,7 @@ public: void interpolate(BoxBlurConfig &prev, BoxBlurConfig &next, int64_t prev_frame, int64_t next_frame, int64_t current_frame); void reset(); + void preset(); int horz_radius, vert_radius, power; float box_x, box_y; @@ -66,24 +71,67 @@ public: }; -class BoxBlurRadius : public BC_ISlider +class BoxBlurNumISlider : public BC_ISlider { public: - BoxBlurRadius(BoxBlurWindow *gui, int x, int y, int w, int *radius); + BoxBlurNumISlider(BoxBlurNum *num, int x, int y); int handle_event(); + BoxBlurNum *num; +}; - BoxBlurWindow *gui; - int *radius; +class BoxBlurNumIText : public BC_TumbleTextBox +{ +public: + BoxBlurNumIText(BoxBlurNum *num, int x, int y); + int handle_event(); + BoxBlurNum *num; }; -class BoxBlurPower : public BC_ISlider +class BoxBlurNumClear : public BC_Button { public: - BoxBlurPower(BoxBlurWindow *gui, int x, int y, int w, int *power); + BoxBlurNumClear(BoxBlurNum *num, int x, int y); + static int calculate_w(BoxBlurNum *num); int handle_event(); + BoxBlurNum *num; +}; + +class BoxBlurNum +{ +public: + BoxBlurNum(BoxBlurWindow *gui, int x, int y, int w, + const char *name, int *iv, int imn, int imx); + ~BoxBlurNum(); + void create_objects(); + void update(int value); + int get_w(); + int get_h(); + BoxBlurWindow *gui; - int *power; + int x, y, w, h; + const char *name; + int imn, imx, *ivalue; + int title_w, text_w, slider_w; + BC_Title *title; + BoxBlurNumIText *text; + BoxBlurNumISlider *slider; + BoxBlurNumClear *clear; +}; + + +class BoxBlurRadius : public BoxBlurNum +{ +public: + BoxBlurRadius(BoxBlurWindow *gui, int x, int y, int w, + const char *name, int *radius); +}; + +class BoxBlurPower : public BoxBlurNum +{ +public: + BoxBlurPower(BoxBlurWindow *gui, int x, int y, int w, + const char *name, int *power); }; class BoxBlurX : public BC_TumbleTextBox @@ -123,12 +171,13 @@ public: void update_gui(); Track *get_drag_track(); int64_t get_drag_position(); + static int calculate_w(BoxBlurWindow *gui); BoxBlurWindow *gui; BoxBlurEffect *plugin; }; -class BoxBlurReset : public BC_Button +class BoxBlurReset : public BC_GenericButton { public: BoxBlurReset(BoxBlurWindow *gui, int x, int y); @@ -138,6 +187,16 @@ public: BoxBlurWindow *gui; }; +class BoxBlurPreset : public BC_GenericButton +{ +public: + BoxBlurPreset(BoxBlurWindow *gui, int x, int y); + int handle_event(); + static int calculate_w(BoxBlurWindow *gui); + + BoxBlurWindow *gui; +}; + class BoxBlurWindow : public PluginClientWindow { public: @@ -149,6 +208,7 @@ public: BoxBlurEffect *plugin; BoxBlurReset *reset; + BoxBlurPreset *preset; BoxBlurRadius *blur_horz; BoxBlurRadius *blur_vert; BoxBlurPower *blur_power; @@ -167,6 +227,8 @@ public: ~BoxBlurEffect(); PLUGIN_CLASS_MEMBERS(BoxBlurConfig) + void render_gui(void *data); + int is_dragging(); int process_realtime(VFrame *input, VFrame *output); void update_gui(); int is_realtime(); @@ -176,22 +238,32 @@ public: VFrame *input, *output; BoxBlur *box_blur; + int drag; }; void BoxBlurConfig::reset() +{ + horz_radius = 0; + vert_radius = 0; + power = 1; + box_x = box_y = 0.0; + box_w = box_h = 0; +} + +void BoxBlurConfig::preset() { horz_radius = 2; vert_radius = 2; power = 2; - drag = 0; box_x = box_y = 0.0; box_w = box_h = 0; } + BoxBlurConfig::BoxBlurConfig() { - reset(); + preset(); } void BoxBlurConfig::copy_from(BoxBlurConfig &that) @@ -199,7 +271,6 @@ void BoxBlurConfig::copy_from(BoxBlurConfig &that) horz_radius = that.horz_radius; vert_radius = that.vert_radius; power = that.power; - drag = that.drag; box_x = that.box_x; box_y = that.box_y; box_w = that.box_w; box_h = that.box_h; } @@ -208,7 +279,7 @@ int BoxBlurConfig::equivalent(BoxBlurConfig &that) { return horz_radius == that.horz_radius && vert_radius == that.vert_radius && - power == that.power && // drag == that.drag && + power == that.power && EQUIV(box_x, that.box_x) && EQUIV(box_y, that.box_y) && box_w == that.box_w && box_h == that.box_h; } @@ -220,51 +291,150 @@ void BoxBlurConfig::interpolate(BoxBlurConfig &prev, BoxBlurConfig &next, double v = 1. - u; this->horz_radius = u*prev.horz_radius + v*next.horz_radius; this->vert_radius = u*prev.vert_radius + v*next.vert_radius; - this->power = u*prev.power + v*next.power; - this->drag = prev.drag; + this->power = u*prev.power + v*next.power + 1e-6; // avoid truncation jitter this->box_x = u*prev.box_x + v*next.box_x; this->box_y = u*prev.box_y + v*next.box_y; - this->box_w = u*prev.box_w + v*next.box_w; - this->box_h = u*prev.box_h + v*next.box_h; + this->box_w = u*prev.box_w + v*next.box_w + 1e-6; + this->box_h = u*prev.box_h + v*next.box_h + 1e-6; } -BoxBlurRadius::BoxBlurRadius(BoxBlurWindow *gui, int x, int y, int w, int *radius) - : BC_ISlider(x, y, 0, w, w, 0, 100, *radius) +int BoxBlurNum::get_w() { return w; } +int BoxBlurNum::get_h() { return h; } + +BoxBlurNumISlider::BoxBlurNumISlider(BoxBlurNum *num, int x, int y) + : BC_ISlider(x, y, 0, num->slider_w, num->slider_w, + num->imn, num->imx, *num->ivalue) { - this->gui = gui; - this->radius = radius; + this->num = num; } -int BoxBlurRadius::handle_event() + +int BoxBlurNumISlider::handle_event() { - *radius = get_value(); - gui->plugin->send_configure_change(); + int iv = get_value(); + num->update(iv); + num->gui->update_drag(); return 1; } -BoxBlurPower::BoxBlurPower(BoxBlurWindow *gui, int x, int y, int w, int *power) - : BC_ISlider(x, y, 0, w, w, 1, 10, *power) +BoxBlurNumIText::BoxBlurNumIText(BoxBlurNum *num, int x, int y) + : BC_TumbleTextBox(num->gui, *num->ivalue, num->imn, num->imx, + x, y, num->text_w) { - this->gui = gui; - this->power = power; + this->num = num; } -int BoxBlurPower::handle_event() + +int BoxBlurNumIText::handle_event() +{ + int iv = atoi(get_text()); + num->update(iv); + num->gui->update_drag(); + return 1; +} + +BoxBlurNumClear::BoxBlurNumClear(BoxBlurNum *num, int x, int y) + : BC_Button(x, y, num->gui->plugin->get_theme()->get_image_set("reset_button")) +{ + this->num = num; +} + +int BoxBlurNumClear::calculate_w(BoxBlurNum *num) +{ + VFrame **imgs = num->gui->plugin->get_theme()->get_image_set("reset_button"); + return imgs[0]->get_w(); +} + +int BoxBlurNumClear::handle_event() { - *power = get_value(); - gui->plugin->send_configure_change(); + int v = num->imn; + num->update(v); + num->gui->update_drag(); return 1; } +BoxBlurNum::BoxBlurNum(BoxBlurWindow *gui, int x, int y, int w, + const char *name, int *iv, int imn, int imx) +{ + this->gui = gui; + this->x = x; + this->y = y; + this->w = w; + this->h = 0; + this->name = name; + this->ivalue = iv; + this->imn = imn; + this->imx = imx; + int margin = gui->plugin->get_theme()->widget_border; + int clear_w = BoxBlurNumClear::calculate_w(this); + int tumble_w = BC_Tumbler::calculate_w(); + int len = w - 2*margin - clear_w - tumble_w; + this->title_w = xS(60); + this->text_w = xS(60) - tumble_w; + this->slider_w = len - title_w - text_w - 2*margin; + + title = 0; + text = 0; + slider = 0; + clear = 0; +} + +BoxBlurNum::~BoxBlurNum() +{ + delete text; +} + +void BoxBlurNum::create_objects() +{ + int x1 = this->x; + gui->add_subwindow(title = new BC_Title(x1, y, name)); + int margin = gui->plugin->get_theme()->widget_border; + x1 += title_w + margin; + text = new BoxBlurNumIText(this, x1, y); + text->create_objects(); + x1 += text_w + BC_Tumbler::calculate_w() + margin; + gui->add_subwindow(slider = new BoxBlurNumISlider(this, x1, y)); + x1 += slider_w + 2*margin; + gui->add_subwindow(clear = new BoxBlurNumClear(this, x1, y)); + h = bmax(title->get_h(), bmax(text->get_h(), + bmax(slider->get_h(), clear->get_h()))); +} + +void BoxBlurNum::update(int value) +{ + text->update((int64_t)value); + slider->update(value); + *ivalue = value; +} + + +BoxBlurRadius::BoxBlurRadius(BoxBlurWindow *gui, int x, int y, int w, + const char *name, int *radius) + : BoxBlurNum(gui, x, y, w, name, radius, 0, 100) +{ +} + +BoxBlurPower::BoxBlurPower(BoxBlurWindow *gui, int x, int y, int w, + const char *name, int *power) + : BoxBlurNum(gui, x, y, w, name, power, 1, 10) +{ +} + BoxBlurWindow::BoxBlurWindow(BoxBlurEffect *plugin) - : PluginClientWindow(plugin, xS(250), yS(185), xS(250), yS(185), 0) + : PluginClientWindow(plugin, xS(360), yS(260), xS(360), yS(260), 0) { this->plugin = plugin; + blur_horz = 0; + blur_vert = 0; + blur_power = 0; box_x = 0; box_y = 0; box_w = 0; box_h = 0; } BoxBlurWindow::~BoxBlurWindow() { + delete blur_horz; + delete blur_vert; + delete blur_power; delete box_x; delete box_y; delete box_w; @@ -274,48 +444,60 @@ BoxBlurWindow::~BoxBlurWindow() void BoxBlurWindow::create_objects() { int x = xS(10), y = yS(10); - int t1 = x, t2 = t1+xS(24), t3 = get_w()/2, t4 = t3 + xS(24); + int ys10 = yS(10), ys20 = yS(20), ys30 = yS(30), ys40 = yS(40); + int t1 = x, t2 = t1+xS(24), t3 = t2+xS(100), t4 = t3+xS(24); + int ww = get_w() - 2*x, bar_o = xS(30), bar_m = xS(15); int margin = plugin->get_theme()->widget_border; - BC_Title *title; - add_subwindow(title = new BC_Title(x, y, _("Box Blur"), MEDIUMFONT_3D)); - add_subwindow(drag = new BoxBlurDrag(this, plugin, t3, y)); - drag->create_objects(); - if( plugin->config.drag && drag->drag_activate() ) + + BC_TitleBar *tbar; + add_subwindow(tbar = new BC_TitleBar(x, y, ww, bar_o, bar_m, _("Position & Size"))); + y += ys20; + int x1 = ww - BoxBlurDrag::calculate_w(this) - margin; + if( plugin->drag && drag->drag_activate() ) { eprintf("drag enabled, but compositor already grabbed\n"); - int x1 = get_w() - BoxBlurReset::calculate_w(this) - 2*margin; - add_subwindow(reset = new BoxBlurReset(this, x1, y)); - y += bmax(title->get_h(), drag->get_h()) + 2*margin; + plugin->drag = 0; + } + add_subwindow(drag = new BoxBlurDrag(this, plugin, x1, y)); + drag->create_objects(); + BC_Title *title; add_subwindow(title = new BC_Title(t1, y, _("X:"))); box_x = new BoxBlurX(this, t2, y); box_x->create_objects(); add_subwindow(title = new BC_Title(t3, y, _("W:"))); box_w = new BoxBlurW(this, t4, y); box_w->create_objects(); - y += bmax(title->get_h(), box_w->get_h()) + margin; + y += ys30; add_subwindow(title = new BC_Title(t1, y, _("Y:"))); box_y = new BoxBlurY(this, t2, y); box_y->create_objects(); add_subwindow(title = new BC_Title(t3, y, _("H:"))); box_h = new BoxBlurH(this, t4, y); box_h->create_objects(); - y += bmax(title->get_h(), box_h->get_h()) + margin; - - y += 2*margin; - x1 = xS(70); - add_subwindow(title = new BC_Title(x, y, _("Horz:"))); - add_subwindow(blur_horz = new BoxBlurRadius(this, x1, y, xS(160), - &plugin->config.horz_radius)); - y += blur_horz->get_h() + margin; - add_subwindow(title = new BC_Title(x, y, _("Vert:"))); - add_subwindow(blur_vert = new BoxBlurRadius(this, x1, y, xS(160), - &plugin->config.vert_radius)); - y += blur_vert->get_h() + margin; - add_subwindow(title = new BC_Title(x, y, _("Power:"))); - add_subwindow(blur_power = new BoxBlurPower(this, x1, y, xS(160), - &plugin->config.power)); - y += blur_power->get_h() + margin; - + y += ys40; + + add_subwindow(tbar = new BC_TitleBar(x, y, ww, bar_o, bar_m, _("Blur"))); + y += ys20; + blur_horz = new BoxBlurRadius(this, x, y, ww, _("Horz:"), + &plugin->config.horz_radius); + blur_horz->create_objects(); + y += ys30; + blur_vert = new BoxBlurRadius(this, x, y, ww, _("Vert:"), + &plugin->config.vert_radius); + blur_vert->create_objects(); + y += ys30; + blur_power = new BoxBlurPower(this, x, y, ww, _("Power:"), + &plugin->config.power); + blur_power->create_objects(); + y += ys40; + BC_Bar *bar; + add_subwindow(bar = new BC_Bar(x, y, ww)); + y += ys10; + + add_subwindow(reset = new BoxBlurReset(this, x, y)); + x1 = x + ww - BoxBlurPreset::calculate_w(this); + add_subwindow(preset = new BoxBlurPreset(this, x1, y)); + y += bmax(title->get_h(), reset->get_h()) + 2*margin; show_window(1); } @@ -340,11 +522,25 @@ REGISTER_PLUGIN(BoxBlurEffect) NEW_WINDOW_MACRO(BoxBlurEffect, BoxBlurWindow) LOAD_CONFIGURATION_MACRO(BoxBlurEffect, BoxBlurConfig) +void BoxBlurEffect::render_gui(void *data) +{ + BoxBlurEffect *box_blur = (BoxBlurEffect *)data; + box_blur->drag = drag; +} + +int BoxBlurEffect::is_dragging() +{ + drag = 0; + send_render_gui(this); + return drag; +} + BoxBlurEffect::BoxBlurEffect(PluginServer *server) : PluginVClient(server) { box_blur = 0; + drag = 0; } BoxBlurEffect::~BoxBlurEffect() @@ -364,7 +560,6 @@ void BoxBlurEffect::save_data(KeyFrame *keyframe) output.tag.set_property("HORZ_RADIUS", config.horz_radius); output.tag.set_property("VERT_RADIUS", config.vert_radius); output.tag.set_property("POWER", config.power); - output.tag.set_property("DRAG", config.drag); output.tag.set_property("BOX_X", config.box_x); output.tag.set_property("BOX_Y", config.box_y); output.tag.set_property("BOX_W", config.box_w); @@ -387,7 +582,6 @@ void BoxBlurEffect::read_data(KeyFrame *keyframe) config.horz_radius = input.tag.get_property("HORZ_RADIUS", config.horz_radius); config.vert_radius = input.tag.get_property("VERT_RADIUS", config.vert_radius); config.power = input.tag.get_property("POWER", config.power); - config.drag = input.tag.get_property("DRAG", config.drag); config.box_x = input.tag.get_property("BOX_X", config.box_x); config.box_y = input.tag.get_property("BOX_Y", config.box_y); config.box_w = input.tag.get_property("BOX_W", config.box_w); @@ -429,7 +623,7 @@ int BoxBlurEffect::process_realtime(VFrame *input, VFrame *output) -1, x,y, ow, oh); } - if( config.drag ) + if( is_dragging() ) draw_boundry(); return 1; @@ -501,7 +695,7 @@ int BoxBlurH::handle_event() } BoxBlurDrag::BoxBlurDrag(BoxBlurWindow *gui, BoxBlurEffect *plugin, int x, int y) - : DragCheckBox(plugin->server->mwindow, x, y, _("Drag"), &plugin->config.drag, + : DragCheckBox(plugin->server->mwindow, x, y, _("Drag"), &plugin->drag, plugin->config.box_x, plugin->config.box_y, plugin->config.box_w, plugin->config.box_h) { @@ -509,6 +703,13 @@ BoxBlurDrag::BoxBlurDrag(BoxBlurWindow *gui, BoxBlurEffect *plugin, int x, int y this->gui = gui; } +int BoxBlurDrag::calculate_w(BoxBlurWindow *gui) +{ + int w, h; + calculate_extents(gui, &w, &h, _("Drag")); + return w; +} + Track *BoxBlurDrag::get_drag_track() { PluginServer *server = plugin->server; @@ -523,7 +724,7 @@ int64_t BoxBlurDrag::get_drag_position() void BoxBlurDrag::update_gui() { - plugin->config.drag = get_value(); + plugin->drag = get_value(); plugin->config.box_x = drag_x; plugin->config.box_y = drag_y; plugin->config.box_w = drag_w+0.5; @@ -538,6 +739,7 @@ void BoxBlurDrag::update_gui() int BoxBlurDrag::handle_event() { int ret = DragCheckBox::handle_event(); + plugin->drag = get_value(); plugin->send_configure_change(); return ret; } @@ -552,21 +754,44 @@ void BoxBlurWindow::update_drag() } BoxBlurReset::BoxBlurReset(BoxBlurWindow *gui, int x, int y) - : BC_Button(x, y, gui->plugin->get_theme()->get_image_set("reset_button")) + : BC_GenericButton(x, y, _("Reset")) { this->gui = gui; } int BoxBlurReset::calculate_w(BoxBlurWindow *gui) { - VFrame **imgs = gui->plugin->get_theme()->get_image_set("reset_button"); - return imgs[0]->get_w(); + return BC_GenericButton::calculate_w(gui,_("Reset")); } int BoxBlurReset::handle_event() { BoxBlurEffect *plugin = gui->plugin; plugin->config.reset(); + gui->drag->update(0); + gui->drag->drag_deactivate(); + gui->update_gui(); + gui->update_drag(); + return 1; +} + +BoxBlurPreset::BoxBlurPreset(BoxBlurWindow *gui, int x, int y) + : BC_GenericButton(x, y, _("Default")) +{ + this->gui = gui; +} + +int BoxBlurPreset::calculate_w(BoxBlurWindow *gui) +{ + return BC_GenericButton::calculate_w(gui,_("Default")); +} + +int BoxBlurPreset::handle_event() +{ + BoxBlurEffect *plugin = gui->plugin; + plugin->config.preset(); + gui->drag->update(0); + gui->drag->drag_deactivate(); gui->update_gui(); gui->update_drag(); return 1;