4c9affc621c338aef0c6d61ab75af0023d2e5d44
[goodguy/cinelerra.git] / cinelerra-5.1 / plugins / boxblur / boxblur.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 1997-2020 Adam Williams <broadcast at earthling dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #include "guicast.h"
23 #include "boxblur.h"
24 #include "dragcheckbox.h"
25 #include "edl.h"
26 #include "filexml.h"
27 #include "language.h"
28 #include "mainerror.h"
29 #include "plugin.h"
30 #include "pluginserver.h"
31 #include "pluginvclient.h"
32 #include "track.h"
33 #include "tracks.h"
34 #include "theme.h"
35
36 #include <stdint.h>
37 #include <string.h>
38
39 class BoxBlurConfig;
40 class BoxBlurNumISlider;
41 class BoxBlurNumIText;
42 class BoxBlurNumClear;
43 class BoxBlurNum;
44 class BoxBlurRadius;
45 class BoxBlurPower;
46 class BoxBlurDrag;
47 class BoxBlurReset;
48 class BoxBlurX;
49 class BoxBlurY;
50 class BoxBlurW;
51 class BoxBlurH;
52 class BoxBlurWindow;
53 class BoxBlurEffect;
54
55
56 class BoxBlurConfig
57 {
58 public:
59         BoxBlurConfig();
60         void copy_from(BoxBlurConfig &that);
61         int equivalent(BoxBlurConfig &that);
62         void interpolate(BoxBlurConfig &prev, BoxBlurConfig &next,
63                 int64_t prev_frame, int64_t next_frame, int64_t current_frame);
64         void reset();
65         void preset();
66
67         int horz_radius, vert_radius, power;
68         float box_x, box_y;
69         int box_w, box_h;
70         int drag;
71 };
72
73
74 class BoxBlurNumISlider : public BC_ISlider
75 {
76 public:
77         BoxBlurNumISlider(BoxBlurNum *num, int x, int y);
78         int handle_event();
79         BoxBlurNum *num;
80 };
81
82 class BoxBlurNumIText : public BC_TumbleTextBox
83 {
84 public:
85         BoxBlurNumIText(BoxBlurNum *num, int x, int y);
86         int handle_event();
87         BoxBlurNum *num;
88 };
89
90 class BoxBlurNumClear : public BC_Button
91 {
92 public:
93         BoxBlurNumClear(BoxBlurNum *num, int x, int y);
94         static int calculate_w(BoxBlurNum *num);
95         int handle_event();
96
97         BoxBlurNum *num;
98 };
99
100 class BoxBlurNum
101 {
102 public:
103         BoxBlurNum(BoxBlurWindow *gui, int x, int y, int w,
104                 const char *name, int *iv, int imn, int imx);
105         ~BoxBlurNum();
106         void create_objects();
107         void update(int value);
108         int get_w();
109         int get_h();
110
111         BoxBlurWindow *gui;
112         int x, y, w, h;
113         const char *name;
114         int imn, imx, *ivalue;
115         int title_w, text_w, slider_w;
116         BC_Title *title;
117         BoxBlurNumIText *text;
118         BoxBlurNumISlider *slider;
119         BoxBlurNumClear *clear;
120 };
121
122
123 class BoxBlurRadius : public BoxBlurNum
124 {
125 public:
126         BoxBlurRadius(BoxBlurWindow *gui, int x, int y, int w,
127                         const char *name, int *radius);
128 };
129
130 class BoxBlurPower : public BoxBlurNum
131 {
132 public:
133         BoxBlurPower(BoxBlurWindow *gui, int x, int y, int w,
134                         const char *name, int *power);
135 };
136
137 class BoxBlurX : public BC_TumbleTextBox
138 {
139 public:
140         BoxBlurX(BoxBlurWindow *gui, int x, int y);
141         int handle_event();
142         BoxBlurWindow *gui;
143 };
144 class BoxBlurY : public BC_TumbleTextBox
145 {
146 public:
147         BoxBlurY(BoxBlurWindow *gui, int x, int y);
148         int handle_event();
149         BoxBlurWindow *gui;
150 };
151 class BoxBlurW : public BC_TumbleTextBox
152 {
153 public:
154         BoxBlurW(BoxBlurWindow *gui, int x, int y);
155         int handle_event();
156         BoxBlurWindow *gui;
157 };
158 class BoxBlurH : public BC_TumbleTextBox
159 {
160 public:
161         BoxBlurH(BoxBlurWindow *gui, int x, int y);
162         int handle_event();
163         BoxBlurWindow *gui;
164 };
165
166 class BoxBlurDrag : public DragCheckBox
167 {
168 public:
169         BoxBlurDrag(BoxBlurWindow *gui, BoxBlurEffect *plugin, int x, int y);
170         int handle_event();
171         void update_gui();
172         Track *get_drag_track();
173         int64_t get_drag_position();
174         static int calculate_w(BoxBlurWindow *gui);
175
176         BoxBlurWindow *gui;
177         BoxBlurEffect *plugin;
178 };
179
180 class BoxBlurReset : public BC_GenericButton
181 {
182 public:
183         BoxBlurReset(BoxBlurWindow *gui, int x, int y);
184         int handle_event();
185         static int calculate_w(BoxBlurWindow *gui);
186
187         BoxBlurWindow *gui;
188 };
189
190 class BoxBlurPreset : public BC_GenericButton
191 {
192 public:
193         BoxBlurPreset(BoxBlurWindow *gui, int x, int y);
194         int handle_event();
195         static int calculate_w(BoxBlurWindow *gui);
196
197         BoxBlurWindow *gui;
198 };
199
200 class BoxBlurWindow : public PluginClientWindow
201 {
202 public:
203         BoxBlurWindow(BoxBlurEffect *plugin);
204         ~BoxBlurWindow();
205         void create_objects();
206         void update_gui();
207         void update_drag();
208
209         BoxBlurEffect *plugin;
210         BoxBlurReset *reset;
211         BoxBlurPreset *preset;
212         BoxBlurRadius *blur_horz;
213         BoxBlurRadius *blur_vert;
214         BoxBlurPower *blur_power;
215         BoxBlurDrag *drag;
216         BoxBlurX *box_x;
217         BoxBlurY *box_y;
218         BoxBlurW *box_w;
219         BoxBlurH *box_h;
220 };
221
222
223 class BoxBlurEffect : public PluginVClient
224 {
225 public:
226         BoxBlurEffect(PluginServer *server);
227         ~BoxBlurEffect();
228
229         PLUGIN_CLASS_MEMBERS(BoxBlurConfig)
230         int process_realtime(VFrame *input, VFrame *output);
231         void update_gui();
232         int is_realtime();
233         void save_data(KeyFrame *keyframe);
234         void read_data(KeyFrame *keyframe);
235         void draw_boundry();
236
237         VFrame *input, *output;
238         BoxBlur *box_blur;
239 };
240
241
242 void BoxBlurConfig::reset()
243 {
244         horz_radius = 0;
245         vert_radius = 0;
246         power = 1;
247         drag = 0;
248         box_x = box_y = 0.0;
249         box_w = box_h = 0;
250 }
251
252 void BoxBlurConfig::preset()
253 {
254         horz_radius = 2;
255         vert_radius = 2;
256         power = 2;
257         drag = 0;
258         box_x = box_y = 0.0;
259         box_w = box_h = 0;
260 }
261
262
263 BoxBlurConfig::BoxBlurConfig()
264 {
265         preset();
266 }
267
268 void BoxBlurConfig::copy_from(BoxBlurConfig &that)
269 {
270         horz_radius = that.horz_radius;
271         vert_radius = that.vert_radius;
272         power = that.power;
273         drag = that.drag;
274         box_x = that.box_x;  box_y = that.box_y;
275         box_w = that.box_w;  box_h = that.box_h;
276 }
277
278 int BoxBlurConfig::equivalent(BoxBlurConfig &that)
279 {
280         return horz_radius == that.horz_radius &&
281                 vert_radius == that.vert_radius &&
282                 power == that.power && // drag == that.drag &&
283                 EQUIV(box_x, that.box_x) && EQUIV(box_y, that.box_y) &&
284                 box_w == that.box_w && box_h == that.box_h;
285 }
286
287 void BoxBlurConfig::interpolate(BoxBlurConfig &prev, BoxBlurConfig &next,
288         int64_t prev_frame, int64_t next_frame, int64_t current_frame)
289 {
290         double u = (double)(next_frame - current_frame) / (next_frame - prev_frame);
291         double v = 1. - u;
292         this->horz_radius = u*prev.horz_radius + v*next.horz_radius;
293         this->vert_radius = u*prev.vert_radius + v*next.vert_radius;
294         this->power = u*prev.power + v*next.power;
295         this->drag = prev.drag;
296         this->box_x = u*prev.box_x + v*next.box_x;
297         this->box_y = u*prev.box_y + v*next.box_y;
298         this->box_w = u*prev.box_w + v*next.box_w;
299         this->box_h = u*prev.box_h + v*next.box_h;
300 }
301
302
303 int BoxBlurNum::get_w() { return w; }
304 int BoxBlurNum::get_h() { return h; }
305
306 BoxBlurNumISlider::BoxBlurNumISlider(BoxBlurNum *num, int x, int y)
307  : BC_ISlider(x, y, 0, num->slider_w, num->slider_w,
308                 num->imn, num->imx, *num->ivalue)
309 {
310         this->num = num;
311 }
312
313 int BoxBlurNumISlider::handle_event()
314 {
315         int iv = get_value();
316         num->update(iv);
317         return 1;
318 }
319
320 BoxBlurNumIText::BoxBlurNumIText(BoxBlurNum *num, int x, int y)
321  : BC_TumbleTextBox(num->gui, *num->ivalue, num->imn, num->imx,
322                         x, y, num->text_w)
323 {
324         this->num = num;
325 }
326
327 int BoxBlurNumIText::handle_event()
328 {
329         int iv = atoi(get_text());
330         num->update(iv);
331         return 1;
332 }
333
334 BoxBlurNumClear::BoxBlurNumClear(BoxBlurNum *num, int x, int y)
335  : BC_Button(x, y, num->gui->plugin->get_theme()->get_image_set("reset_button"))
336 {
337         this->num = num;
338 }
339
340 int BoxBlurNumClear::calculate_w(BoxBlurNum *num)
341 {
342         VFrame **imgs = num->gui->plugin->get_theme()->get_image_set("reset_button");
343         return imgs[0]->get_w();
344 }
345
346 int BoxBlurNumClear::handle_event()
347 {
348         int v = num->imn;
349         num->update(v);
350         return 1;
351 }
352
353 BoxBlurNum::BoxBlurNum(BoxBlurWindow *gui, int x, int y, int w,
354                  const char *name, int *iv, int imn, int imx)
355 {
356         this->gui = gui;
357         this->x = x;
358         this->y = y;
359         this->w = w;
360         this->h = 0;
361         this->name = name;
362         this->ivalue = iv;
363         this->imn = imn;
364         this->imx = imx;
365         int margin = gui->plugin->get_theme()->widget_border;
366         int clear_w = BoxBlurNumClear::calculate_w(this);
367         int tumble_w = BC_Tumbler::calculate_w();
368         int len = w - 2*margin - clear_w - tumble_w;
369         this->title_w = xS(60);
370         this->text_w = xS(60) - tumble_w;
371         this->slider_w = len - title_w - text_w - 2*margin;
372
373         title = 0;
374         text = 0;
375         slider = 0;
376         clear = 0;
377 }
378
379 BoxBlurNum::~BoxBlurNum()
380 {
381         delete text;
382 }
383
384 void BoxBlurNum::create_objects()
385 {
386         int x1 = this->x;
387         gui->add_subwindow(title = new BC_Title(x1, y, name));
388         int margin = gui->plugin->get_theme()->widget_border;
389         x1 += title_w + margin;
390         text = new BoxBlurNumIText(this, x1, y);
391         text->create_objects();
392         x1 += text_w + BC_Tumbler::calculate_w() + margin;
393         gui->add_subwindow(slider = new BoxBlurNumISlider(this, x1, y));
394         x1 += slider_w + 2*margin;
395         gui->add_subwindow(clear = new BoxBlurNumClear(this, x1, y));
396         h = bmax(title->get_h(), bmax(text->get_h(),
397                 bmax(slider->get_h(), clear->get_h())));
398 }
399
400 void BoxBlurNum::update(int value)
401 {
402         text->update((int64_t)value);
403         slider->update(value);
404         *ivalue = value;
405         gui->update_drag();
406 }
407
408
409 BoxBlurRadius::BoxBlurRadius(BoxBlurWindow *gui, int x, int y, int w,
410                 const char *name, int *radius)
411  : BoxBlurNum(gui, x, y, w, name, radius, 0, 100)
412 {
413 }
414
415 BoxBlurPower::BoxBlurPower(BoxBlurWindow *gui, int x, int y, int w,
416                 const char *name, int *power)
417  : BoxBlurNum(gui, x, y, w, name, power, 1, 10)
418 {
419 }
420
421 BoxBlurWindow::BoxBlurWindow(BoxBlurEffect *plugin)
422  : PluginClientWindow(plugin, xS(360), yS(246), xS(360), yS(246), 0)
423 {
424         this->plugin = plugin;
425         blur_horz = 0;
426         blur_vert = 0;
427         blur_power = 0;
428         box_x = 0;  box_y = 0;
429         box_w = 0;  box_h = 0;
430 }
431
432 BoxBlurWindow::~BoxBlurWindow()
433 {
434         delete blur_horz;
435         delete blur_vert;
436         delete blur_power;
437         delete box_x;
438         delete box_y;
439         delete box_w;
440         delete box_h;
441 }
442
443 void BoxBlurWindow::create_objects()
444 {
445         int x = xS(10), y = yS(10);
446         int t1 = x, t2 = t1+xS(24), t3 = t2+xS(100), t4 = t3+xS(24);
447         int ww = get_w() - 2*x, bar_o = xS(30), bar_m = xS(15);
448         int margin = plugin->get_theme()->widget_border;
449
450         BC_TitleBar *tbar;
451         add_subwindow(tbar = new BC_TitleBar(x, y, ww, bar_o, bar_m, _("Position & Size")));
452         y += tbar->get_h() + margin;
453         int x1 = ww - BoxBlurDrag::calculate_w(this) - margin;
454         add_subwindow(drag = new BoxBlurDrag(this, plugin, x1, y));
455         drag->create_objects();
456         if( plugin->config.drag && drag->drag_activate() )
457                 eprintf("drag enabled, but compositor already grabbed\n");
458
459         BC_Title *title;
460         add_subwindow(title = new BC_Title(t1, y, _("X:")));
461         box_x = new BoxBlurX(this, t2, y);
462         box_x->create_objects();
463         add_subwindow(title = new BC_Title(t3, y, _("W:")));
464         box_w = new BoxBlurW(this, t4, y);
465         box_w->create_objects();
466         y += bmax(title->get_h(), box_w->get_h()) + margin;
467         add_subwindow(title = new BC_Title(t1, y, _("Y:")));
468         box_y = new BoxBlurY(this, t2, y);
469         box_y->create_objects();
470         add_subwindow(title = new BC_Title(t3, y, _("H:")));
471         box_h = new BoxBlurH(this, t4, y);
472         box_h->create_objects();
473         y += bmax(title->get_h(), box_h->get_h()) + 2*margin;
474
475         add_subwindow(tbar = new BC_TitleBar(x, y, ww, bar_o, bar_m, _("Blur")));
476         y += tbar->get_h() + margin;
477         blur_horz = new BoxBlurRadius(this, x, y, ww, _("Horz:"),
478                         &plugin->config.horz_radius);
479         blur_horz->create_objects();
480         y += blur_horz->get_h() + margin;
481         blur_vert = new BoxBlurRadius(this, x, y, ww, _("Vert:"),
482                         &plugin->config.vert_radius);
483         blur_vert->create_objects();
484         y += blur_vert->get_h() + margin;
485         blur_power = new BoxBlurPower(this, x, y, ww, _("Power:"),
486                         &plugin->config.power);
487         blur_power->create_objects();
488         y += blur_power->get_h() + margin + yS(8);
489         BC_Bar *bar;
490         add_subwindow(bar = new BC_Bar(x, y, ww));
491         y += bar->get_h() + 2*margin;
492
493         add_subwindow(reset = new BoxBlurReset(this, x, y));
494         x1 = x + ww - BoxBlurPreset::calculate_w(this);
495         add_subwindow(preset = new BoxBlurPreset(this, x1, y));
496         y += bmax(title->get_h(), reset->get_h()) + 2*margin;
497         show_window(1);
498 }
499
500 void BoxBlurWindow::update_gui()
501 {
502         BoxBlurConfig &config = plugin->config;
503         blur_horz->update(config.horz_radius);
504         blur_vert->update(config.vert_radius);
505         blur_power->update(config.power);
506         box_x->update(config.box_x);
507         box_y->update(config.box_y);
508         box_w->update((int64_t)config.box_w);
509         box_h->update((int64_t)config.box_h);
510         drag->drag_x = config.box_x;
511         drag->drag_y = config.box_y;
512         drag->drag_w = config.box_w;
513         drag->drag_h = config.box_h;
514 }
515
516
517 REGISTER_PLUGIN(BoxBlurEffect)
518 NEW_WINDOW_MACRO(BoxBlurEffect, BoxBlurWindow)
519 LOAD_CONFIGURATION_MACRO(BoxBlurEffect, BoxBlurConfig)
520
521
522 BoxBlurEffect::BoxBlurEffect(PluginServer *server)
523  : PluginVClient(server)
524 {
525         box_blur = 0;
526 }
527
528 BoxBlurEffect::~BoxBlurEffect()
529 {
530         delete box_blur;
531 }
532
533 const char* BoxBlurEffect::plugin_title() { return N_("BoxBlur"); }
534 int BoxBlurEffect::is_realtime() { return 1; }
535
536
537 void BoxBlurEffect::save_data(KeyFrame *keyframe)
538 {
539         FileXML output;
540         output.set_shared_output(keyframe->xbuf);
541         output.tag.set_title("BOXBLUR");
542         output.tag.set_property("HORZ_RADIUS", config.horz_radius);
543         output.tag.set_property("VERT_RADIUS", config.vert_radius);
544         output.tag.set_property("POWER", config.power);
545         output.tag.set_property("DRAG", config.drag);
546         output.tag.set_property("BOX_X", config.box_x);
547         output.tag.set_property("BOX_Y", config.box_y);
548         output.tag.set_property("BOX_W", config.box_w);
549         output.tag.set_property("BOX_H", config.box_h);
550         output.append_tag();
551         output.tag.set_title("/BOXBLUR");
552         output.append_tag();
553         output.append_newline();
554         output.terminate_string();
555 }
556
557 void BoxBlurEffect::read_data(KeyFrame *keyframe)
558 {
559         FileXML input;
560         input.set_shared_input(keyframe->xbuf);
561         int result = 0;
562
563         while( !(result = input.read_tag()) ) {
564                 if( input.tag.title_is("BOXBLUR") ) {
565                         config.horz_radius = input.tag.get_property("HORZ_RADIUS", config.horz_radius);
566                         config.vert_radius = input.tag.get_property("VERT_RADIUS", config.vert_radius);
567                         config.power = input.tag.get_property("POWER", config.power);
568                         config.drag = input.tag.get_property("DRAG", config.drag);
569                         config.box_x = input.tag.get_property("BOX_X", config.box_x);
570                         config.box_y = input.tag.get_property("BOX_Y", config.box_y);
571                         config.box_w = input.tag.get_property("BOX_W", config.box_w);
572                         config.box_h = input.tag.get_property("BOX_H", config.box_h);
573                 }
574         }
575 }
576
577 void BoxBlurEffect::draw_boundry()
578 {
579         if( !gui_open() ) return;
580         int box_x = config.box_x, box_y = config.box_y;
581         int box_w = config.box_w ? config.box_w : input->get_w();
582         int box_h = config.box_h ? config.box_h : input->get_h();
583         DragCheckBox::draw_boundary(output, box_x, box_y, box_w, box_h);
584 }
585
586 int BoxBlurEffect::process_realtime(VFrame *input, VFrame *output)
587 {
588         this->input = input;
589         this->output = output;
590         load_configuration();
591         int out_w = output->get_w(), out_h = output->get_h();
592
593         if( !box_blur ) {
594                 int cpus = (out_w * out_h)/0x80000 + 1;
595                 box_blur = new BoxBlur(cpus);
596         }
597         int x = config.box_x, y = config.box_y;
598         int ow = config.box_w ? config.box_w : out_w;
599         int oh = config.box_h ? config.box_h : out_h;
600         if( config.horz_radius ) {
601                 box_blur->hblur(output, input, config.horz_radius, config.power,
602                         -1, x,y, ow, oh);
603                 input = output;
604         }
605         if( config.vert_radius ) {
606                 box_blur->vblur(output, input, config.vert_radius, config.power,
607                         -1, x,y, ow, oh);
608         }
609
610         if( config.drag )
611                 draw_boundry();
612
613         return 1;
614 }
615
616 void BoxBlurEffect::update_gui()
617 {
618         if( !thread ) return;
619         load_configuration();
620         thread->window->lock_window("BoxBlurEffect::update_gui");
621         BoxBlurWindow *gui = (BoxBlurWindow *)thread->window;
622         gui->update_gui();
623         thread->window->unlock_window();
624 }
625
626
627 BoxBlurX::BoxBlurX(BoxBlurWindow *gui, int x, int y)
628  : BC_TumbleTextBox(gui, gui->plugin->config.box_x,
629                 -32767.f, 32767.f, x, y, xS(64))
630 {
631         this->gui = gui;
632         set_precision(1);
633 }
634 int BoxBlurX::handle_event()
635 {
636         gui->plugin->config.box_x = atof(get_text());
637         gui->update_drag();
638         return 1;
639 }
640
641 BoxBlurY::BoxBlurY(BoxBlurWindow *gui, int x, int y)
642  : BC_TumbleTextBox(gui, gui->plugin->config.box_y,
643                 -32767.f, 32767.f, x, y, xS(64))
644 {
645         this->gui = gui;
646         set_precision(1);
647 }
648 int BoxBlurY::handle_event()
649 {
650         gui->plugin->config.box_y = atof(get_text());
651         gui->update_drag();
652         return 1;
653 }
654
655 BoxBlurW::BoxBlurW(BoxBlurWindow *gui, int x, int y)
656  : BC_TumbleTextBox(gui, gui->plugin->config.box_w,
657                 0, 32767, x, y, xS(64))
658 {
659         this->gui = gui;
660 }
661 int BoxBlurW::handle_event()
662 {
663         gui->plugin->config.box_w = atol(get_text());
664         gui->update_drag();
665         return 1;
666 }
667
668 BoxBlurH::BoxBlurH(BoxBlurWindow *gui, int x, int y)
669  : BC_TumbleTextBox(gui, gui->plugin->config.box_h,
670                 0, 32767, x, y, xS(64))
671 {
672         this->gui = gui;
673 }
674 int BoxBlurH::handle_event()
675 {
676         gui->plugin->config.box_h = atol(get_text());
677         gui->update_drag();
678         return 1;
679 }
680
681 BoxBlurDrag::BoxBlurDrag(BoxBlurWindow *gui, BoxBlurEffect *plugin, int x, int y)
682  : DragCheckBox(plugin->server->mwindow, x, y, _("Drag"), &plugin->config.drag,
683                 plugin->config.box_x, plugin->config.box_y,
684                 plugin->config.box_w, plugin->config.box_h)
685 {
686         this->plugin = plugin;
687         this->gui = gui;
688 }
689
690 int BoxBlurDrag::calculate_w(BoxBlurWindow *gui)
691 {
692         int w, h;
693         calculate_extents(gui, &w, &h, _("Drag"));
694         return w;
695 }
696
697 Track *BoxBlurDrag::get_drag_track()
698 {
699         PluginServer *server = plugin->server;
700         int plugin_id = server->plugin_id;
701         Plugin *plugin = server->edl->tracks->plugin_exists(plugin_id);
702         return !plugin ? 0 : plugin->track;
703 }
704 int64_t BoxBlurDrag::get_drag_position()
705 {
706         return plugin->get_source_position();
707 }
708
709 void BoxBlurDrag::update_gui()
710 {
711         plugin->config.drag = get_value();
712         plugin->config.box_x = drag_x;
713         plugin->config.box_y = drag_y;
714         plugin->config.box_w = drag_w+0.5;
715         plugin->config.box_h = drag_h+0.5;
716         gui->box_x->update((float)plugin->config.box_x);
717         gui->box_y->update((float)plugin->config.box_y);
718         gui->box_w->update((int64_t)plugin->config.box_w);
719         gui->box_h->update((int64_t)plugin->config.box_h);
720         plugin->send_configure_change();
721 }
722
723 int BoxBlurDrag::handle_event()
724 {
725         int ret = DragCheckBox::handle_event();
726         plugin->send_configure_change();
727         return ret;
728 }
729
730 void BoxBlurWindow::update_drag()
731 {
732         drag->drag_x = plugin->config.box_x;
733         drag->drag_y = plugin->config.box_y;
734         drag->drag_w = plugin->config.box_w;
735         drag->drag_h = plugin->config.box_h;
736         plugin->send_configure_change();
737 }
738
739 BoxBlurReset::BoxBlurReset(BoxBlurWindow *gui, int x, int y)
740  : BC_GenericButton(x, y, _("Reset"))
741 {
742         this->gui = gui;
743 }
744
745 int BoxBlurReset::calculate_w(BoxBlurWindow *gui)
746 {
747         return BC_GenericButton::calculate_w(gui,_("Reset"));
748 }
749
750 int BoxBlurReset::handle_event()
751 {
752         BoxBlurEffect *plugin = gui->plugin;
753         plugin->config.reset();
754         gui->drag->update(0);
755         gui->drag->drag_deactivate();
756         gui->update_gui();
757         gui->update_drag();
758         return 1;
759 }
760
761 BoxBlurPreset::BoxBlurPreset(BoxBlurWindow *gui, int x, int y)
762  : BC_GenericButton(x, y, _("Default"))
763 {
764         this->gui = gui;
765 }
766
767 int BoxBlurPreset::calculate_w(BoxBlurWindow *gui)
768 {
769         return BC_GenericButton::calculate_w(gui,_("Default"));
770 }
771
772 int BoxBlurPreset::handle_event()
773 {
774         BoxBlurEffect *plugin = gui->plugin;
775         plugin->config.preset();
776         gui->drag->update(0);
777         gui->drag->drag_deactivate();
778         gui->update_gui();
779         gui->update_drag();
780         return 1;
781 }
782