#include <string.h>
class BoxBlurConfig;
+class BoxBlurNumISlider;
+class BoxBlurNumIText;
+class BoxBlurNumClear;
+class BoxBlurNum;
class BoxBlurRadius;
class BoxBlurPower;
class BoxBlurDrag;
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;
};
-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
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);
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:
BoxBlurEffect *plugin;
BoxBlurReset *reset;
+ BoxBlurPreset *preset;
BoxBlurRadius *blur_horz;
BoxBlurRadius *blur_vert;
BoxBlurPower *blur_power;
~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();
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)
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;
}
{
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;
}
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;
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);
}
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()
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);
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);
-1, x,y, ow, oh);
}
- if( config.drag )
+ if( is_dragging() )
draw_boundry();
return 1;
}
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)
{
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;
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;
int BoxBlurDrag::handle_event()
{
int ret = DragCheckBox::handle_event();
+ plugin->drag = get_value();
plugin->send_configure_change();
return ret;
}
}
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;