r663: This commit was generated by cvs2svn to compensate for changes in r662,
[cinelerra_cv.git] / plugins / motion / motionwindow.C
blob41d5c62d40c4e100af1c78e87ab760b49ce0fd18
1 #include "bcdisplayinfo.h"
2 #include "clip.h"
3 #include "language.h"
4 #include "motion.h"
5 #include "motionwindow.h"
12 PLUGIN_THREAD_OBJECT(MotionMain, MotionThread, MotionWindow)
16 MotionWindow::MotionWindow(MotionMain *plugin, int x, int y)
17  : BC_Window(plugin->gui_string, 
18         x,
19         y,
20         600, 
21         600, 
22         600,
23         600,
24         0, 
25         1)
27         this->plugin = plugin; 
30 MotionWindow::~MotionWindow()
34 int MotionWindow::create_objects()
36         int x1 = 10, x = 10, y = 10;
37         int x2 = 310;
38         BC_Title *title;
42         add_subwindow(global = new MotionGlobal(plugin,
43                 this,
44                 x1,
45                 y));
47         add_subwindow(rotate = new MotionRotate(plugin,
48                 this,
49                 x2,
50                 y));
51         y += 50;
53         add_subwindow(title = new BC_Title(x1, 
54                 y, 
55                 _("Translation search radius:\n(Percent of image)")));
56         add_subwindow(global_range = new GlobalRange(plugin, 
57                 x1 + title->get_w() + 10, 
58                 y));
60         add_subwindow(title = new BC_Title(x2, 
61                 y, 
62                 _("Rotation search radius:\n(Degrees)")));
63         add_subwindow(rotation_range = new RotationRange(plugin, 
64                 x2 + title->get_w() + 10, 
65                 y));
67         y += 50;
68         add_subwindow(title = new BC_Title(x1, 
69                 y, 
70                 _("Translation block size:\n(Percent of image)")));
71         add_subwindow(global_block_size = new GlobalBlockSize(plugin, 
72                 x1 + title->get_w() + 10, 
73                 y));
75         add_subwindow(title = new BC_Title(x2, 
76                 y, 
77                 _("Rotation block size:\n(Percent of image)")));
78         add_subwindow(rotation_block_size = new RotationBlockSize(plugin, 
79                 x2 + title->get_w() + 10, 
80                 y));
82         y += 50;
83         add_subwindow(title = new BC_Title(x1, y, _("Translation search steps:")));
84         add_subwindow(global_search_positions = new GlobalSearchPositions(plugin, 
85                 x1 + title->get_w() + 10, 
86                 y, 
87                 80));
88         global_search_positions->create_objects();
90         add_subwindow(title = new BC_Title(x2, y, _("Rotation search steps:")));
91         add_subwindow(rotation_search_positions = new RotationSearchPositions(plugin, 
92                 x2 + title->get_w() + 10, 
93                 y, 
94                 80));
95         rotation_search_positions->create_objects();
97         y += 40;
98         add_subwindow(title = new BC_Title(x, y + 10, _("Block X:")));
99         add_subwindow(block_x = new MotionBlockX(plugin, 
100                 this, 
101                 x + title->get_w() + 10, 
102                 y));
103         add_subwindow(block_x_text = new MotionBlockXText(plugin, 
104                 this, 
105                 x + title->get_w() + 10 + block_x->get_w() + 10, 
106                 y + 10));
108         y += 40;
109         add_subwindow(title = new BC_Title(x, y + 10, _("Block Y:")));
110         add_subwindow(block_y = new MotionBlockY(plugin, 
111                 this, 
112                 x + title->get_w() + 10, 
113                 y));
114         add_subwindow(block_y_text = new MotionBlockYText(plugin, 
115                 this, 
116                 x + title->get_w() + 10 + block_y->get_w() + 10, 
117                 y + 10));
119         y += 50;
120         add_subwindow(title = new BC_Title(x, y + 10, _("Maximum absolute offset:")));
121         add_subwindow(magnitude = new MotionMagnitude(plugin, 
122                 x + title->get_w() + 10, 
123                 y));
125         y += 40;
126         add_subwindow(title = new BC_Title(x, y + 10, _("Settling speed:")));
127         add_subwindow(return_speed = new MotionReturnSpeed(plugin,
128                 x + title->get_w() + 10, 
129                 y));
133         y += 40;
134         add_subwindow(vectors = new MotionDrawVectors(plugin,
135                 this,
136                 x,
137                 y));
140         y += 40;
141         add_subwindow(track_single = new TrackSingleFrame(plugin, 
142                 this,
143                 x, 
144                 y));
145         add_subwindow(title = new BC_Title(x + track_single->get_w() + 20, 
146                 y, 
147                 _("Frame number:")));
148         add_subwindow(track_frame_number = new TrackFrameNumber(plugin, 
149                 this,
150                 x + track_single->get_w() + title->get_w() + 20, 
151                 y));
153         y += 20;
154         add_subwindow(track_previous = new TrackPreviousFrame(plugin, 
155                 this,
156                 x, 
157                 y));
159         y += 20;
160         add_subwindow(previous_same = new PreviousFrameSameBlock(plugin, 
161                 this,
162                 x, 
163                 y));
165         y += 40;
166         int y1 = y;
167         add_subwindow(title = new BC_Title(x, y, _("Master layer:")));
168         add_subwindow(master_layer = new MasterLayer(plugin, 
169                 this,
170                 x + title->get_w() + 10, 
171                 y));
172         master_layer->create_objects();
173         y += 30;
176         add_subwindow(title = new BC_Title(x, y, _("Action:")));
177         add_subwindow(mode1 = new Mode1(plugin, 
178                 this,
179                 x + title->get_w() + 10, 
180                 y));
181         mode1->create_objects();
182         y += 30;
187         add_subwindow(title = new BC_Title(x, y, _("Calculation:")));
188         add_subwindow(mode2 = new Mode2(plugin, 
189                 this, 
190                 x + title->get_w() + 10, 
191                 y));
192         mode2->create_objects();
194         show_window();
195         flush();
196         return 0;
199 void MotionWindow::update_mode()
201         global_range->update(plugin->config.global_range,
202                 MIN_RADIUS,
203                 MAX_RADIUS);
204         rotation_range->update(plugin->config.rotation_range,
205                 MIN_ROTATION,
206                 MAX_ROTATION);
207         vectors->update(plugin->config.draw_vectors);
208         global->update(plugin->config.global);
209         rotate->update(plugin->config.rotate);
213 WINDOW_CLOSE_EVENT(MotionWindow)
224 GlobalRange::GlobalRange(MotionMain *plugin, 
225         int x, 
226         int y)
227  : BC_IPot(x, 
228                 y, 
229                 (int64_t)plugin->config.global_range,
230                 (int64_t)MIN_RADIUS,
231                 (int64_t)MAX_RADIUS)
233         this->plugin = plugin;
237 int GlobalRange::handle_event()
239         plugin->config.global_range = (int)get_value();
240         plugin->send_configure_change();
241         return 1;
247 RotationRange::RotationRange(MotionMain *plugin, 
248         int x, 
249         int y)
250  : BC_IPot(x, 
251                 y, 
252                 (int64_t)plugin->config.rotation_range,
253                 (int64_t)MIN_ROTATION,
254                 (int64_t)MAX_ROTATION)
256         this->plugin = plugin;
260 int RotationRange::handle_event()
262         plugin->config.rotation_range = (int)get_value();
263         plugin->send_configure_change();
264         return 1;
274 GlobalBlockSize::GlobalBlockSize(MotionMain *plugin, 
275         int x, 
276         int y)
277  : BC_IPot(x, 
278                 y, 
279                 (int64_t)plugin->config.global_block_size,
280                 (int64_t)MIN_BLOCK,
281                 (int64_t)MAX_BLOCK)
283         this->plugin = plugin;
287 int GlobalBlockSize::handle_event()
289         plugin->config.global_block_size = (int)get_value();
290         plugin->send_configure_change();
291         return 1;
296 RotationBlockSize::RotationBlockSize(MotionMain *plugin, 
297         int x, 
298         int y)
299  : BC_IPot(x, 
300                 y, 
301                 (int64_t)plugin->config.rotation_block_size,
302                 (int64_t)MIN_BLOCK,
303                 (int64_t)MAX_BLOCK)
305         this->plugin = plugin;
309 int RotationBlockSize::handle_event()
311         plugin->config.rotation_block_size = (int)get_value();
312         plugin->send_configure_change();
313         return 1;
326 GlobalSearchPositions::GlobalSearchPositions(MotionMain *plugin, 
327         int x, 
328         int y,
329         int w)
330  : BC_PopupMenu(x,
331         y,
332         w,
333         "",
334         1)
336         this->plugin = plugin;
338 void GlobalSearchPositions::create_objects()
340         add_item(new BC_MenuItem("64"));
341         add_item(new BC_MenuItem("128"));
342         add_item(new BC_MenuItem("256"));
343         add_item(new BC_MenuItem("512"));
344         add_item(new BC_MenuItem("1024"));
345         add_item(new BC_MenuItem("2048"));
346         add_item(new BC_MenuItem("4096"));
347         add_item(new BC_MenuItem("8192"));
348         add_item(new BC_MenuItem("16384"));
349         add_item(new BC_MenuItem("32768"));
350         add_item(new BC_MenuItem("65536"));
351         add_item(new BC_MenuItem("131072"));
352         char string[BCTEXTLEN];
353         sprintf(string, "%d", plugin->config.global_positions);
354         set_text(string);
357 int GlobalSearchPositions::handle_event()
359         plugin->config.global_positions = atoi(get_text());
360         plugin->send_configure_change();
361         return 1;
370 RotationSearchPositions::RotationSearchPositions(MotionMain *plugin, 
371         int x, 
372         int y,
373         int w)
374  : BC_PopupMenu(x,
375         y,
376         w,
377         "",
378         1)
380         this->plugin = plugin;
382 void RotationSearchPositions::create_objects()
384         add_item(new BC_MenuItem("4"));
385         add_item(new BC_MenuItem("8"));
386         add_item(new BC_MenuItem("16"));
387         add_item(new BC_MenuItem("32"));
388         char string[BCTEXTLEN];
389         sprintf(string, "%d", plugin->config.rotate_positions);
390         set_text(string);
393 int RotationSearchPositions::handle_event()
395         plugin->config.rotate_positions = atoi(get_text());
396         plugin->send_configure_change();
397         return 1;
407 MotionMagnitude::MotionMagnitude(MotionMain *plugin, 
408         int x, 
409         int y)
410  : BC_IPot(x, 
411                 y, 
412                 (int64_t)plugin->config.magnitude,
413                 (int64_t)0,
414                 (int64_t)100)
416         this->plugin = plugin;
419 int MotionMagnitude::handle_event()
421         plugin->config.magnitude = (int)get_value();
422         plugin->send_configure_change();
423         return 1;
427 MotionReturnSpeed::MotionReturnSpeed(MotionMain *plugin, 
428         int x, 
429         int y)
430  : BC_IPot(x, 
431                 y, 
432                 (int64_t)plugin->config.return_speed,
433                 (int64_t)0,
434                 (int64_t)100)
436         this->plugin = plugin;
439 int MotionReturnSpeed::handle_event()
441         plugin->config.return_speed = (int)get_value();
442         plugin->send_configure_change();
443         return 1;
450 MotionGlobal::MotionGlobal(MotionMain *plugin, 
451         MotionWindow *gui,
452         int x, 
453         int y)
454  : BC_CheckBox(x, 
455         y, 
456         plugin->config.global,
457         _("Track translation"))
459         this->plugin = plugin;
460         this->gui = gui;
463 int MotionGlobal::handle_event()
465         plugin->config.global = get_value();
466         plugin->send_configure_change();
467         return 1;
470 MotionRotate::MotionRotate(MotionMain *plugin, 
471         MotionWindow *gui,
472         int x, 
473         int y)
474  : BC_CheckBox(x, 
475         y, 
476         plugin->config.rotate,
477         _("Track rotation"))
479         this->plugin = plugin;
480         this->gui = gui;
483 int MotionRotate::handle_event()
485         plugin->config.rotate = get_value();
486         plugin->send_configure_change();
487         return 1;
494 MotionBlockX::MotionBlockX(MotionMain *plugin, 
495         MotionWindow *gui,
496         int x, 
497         int y)
498  : BC_FPot(x,
499         y,
500         plugin->config.block_x,
501         (float)0, 
502         (float)100)
504         this->plugin = plugin;
505         this->gui = gui;
508 int MotionBlockX::handle_event()
510         plugin->config.block_x = get_value();
511         gui->block_x_text->update((float)plugin->config.block_x);
512         plugin->send_configure_change();
513         return 1;
519 MotionBlockY::MotionBlockY(MotionMain *plugin, 
520         MotionWindow *gui,
521         int x, 
522         int y)
523  : BC_FPot(x,
524         y,
525         (float)plugin->config.block_x,
526         (float)0, 
527         (float)100)
529         this->plugin = plugin;
530         this->gui = gui;
533 int MotionBlockY::handle_event()
535         plugin->config.block_y = get_value();
536         gui->block_y_text->update((float)plugin->config.block_y);
537         plugin->send_configure_change();
538         return 1;
541 MotionBlockXText::MotionBlockXText(MotionMain *plugin, 
542         MotionWindow *gui,
543         int x, 
544         int y)
545  : BC_TextBox(x,
546         y,
547         75,
548         1,
549         (float)plugin->config.block_x)
551         this->plugin = plugin;
552         this->gui = gui;
553         set_precision(4);
556 int MotionBlockXText::handle_event()
558         plugin->config.block_x = atof(get_text());
559         gui->block_x->update(plugin->config.block_x);
560         plugin->send_configure_change();
561         return 1;
567 MotionBlockYText::MotionBlockYText(MotionMain *plugin, 
568         MotionWindow *gui,
569         int x, 
570         int y)
571  : BC_TextBox(x,
572         y,
573         75,
574         1,
575         (float)plugin->config.block_y)
577         this->plugin = plugin;
578         this->gui = gui;
579         set_precision(4);
582 int MotionBlockYText::handle_event()
584         plugin->config.block_y = atof(get_text());
585         gui->block_y->update(plugin->config.block_y);
586         plugin->send_configure_change();
587         return 1;
605 MotionDrawVectors::MotionDrawVectors(MotionMain *plugin, 
606         MotionWindow *gui,
607         int x, 
608         int y)
609  : BC_CheckBox(x,
610         y, 
611         plugin->config.draw_vectors,
612         _("Draw vectors"))
614         this->gui = gui;
615         this->plugin = plugin;
618 int MotionDrawVectors::handle_event()
620         plugin->config.draw_vectors = get_value();
621         plugin->send_configure_change();
622         return 1;
632 TrackSingleFrame::TrackSingleFrame(MotionMain *plugin, 
633         MotionWindow *gui,
634         int x, 
635         int y)
636  : BC_Radial(x, 
637         y, 
638         plugin->config.mode3 == MotionConfig::TRACK_SINGLE, 
639         _("Track single frame"))
641         this->plugin = plugin;
642         this->gui = gui;
645 int TrackSingleFrame::handle_event()
647         plugin->config.mode3 = MotionConfig::TRACK_SINGLE;
648         gui->track_previous->update(0);
649         gui->previous_same->update(0);
650         gui->track_frame_number->enable();
651         plugin->send_configure_change();
652         return 1;
662 TrackFrameNumber::TrackFrameNumber(MotionMain *plugin, 
663         MotionWindow *gui,
664         int x, 
665         int y)
666  : BC_TextBox(x, y, 100, 1, plugin->config.track_frame)
668         this->plugin = plugin;
669         this->gui = gui;
670         if(plugin->config.mode3 != MotionConfig::TRACK_SINGLE) disable();
673 int TrackFrameNumber::handle_event()
675         plugin->config.track_frame = atol(get_text());
676         plugin->send_configure_change();
677         return 1;
686 TrackPreviousFrame::TrackPreviousFrame(MotionMain *plugin, 
687         MotionWindow *gui,
688         int x, 
689         int y)
690  : BC_Radial(x, 
691         y, 
692         plugin->config.mode3 == MotionConfig::TRACK_PREVIOUS, 
693         _("Track previous frame"))
695         this->plugin = plugin;
696         this->gui = gui;
698 int TrackPreviousFrame::handle_event()
700         plugin->config.mode3 = MotionConfig::TRACK_PREVIOUS;
701         gui->track_single->update(0);
702         gui->previous_same->update(0);
703         gui->track_frame_number->disable();
704         plugin->send_configure_change();
705         return 1;
715 PreviousFrameSameBlock::PreviousFrameSameBlock(MotionMain *plugin, 
716         MotionWindow *gui,
717         int x, 
718         int y)
719  : BC_Radial(x, 
720         y, 
721         plugin->config.mode3 == MotionConfig::PREVIOUS_SAME_BLOCK, 
722         _("Previous frame same block"))
724         this->plugin = plugin;
725         this->gui = gui;
727 int PreviousFrameSameBlock::handle_event()
729         plugin->config.mode3 = MotionConfig::PREVIOUS_SAME_BLOCK;
730         gui->track_single->update(0);
731         gui->track_previous->update(0);
732         gui->track_frame_number->disable();
733         plugin->send_configure_change();
734         return 1;
744 MasterLayer::MasterLayer(MotionMain *plugin, MotionWindow *gui, int x, int y)
745  : BC_PopupMenu(x, 
746         y, 
747         calculate_w(gui),
748         to_text(plugin->config.bottom_is_master))
750         this->plugin = plugin;
751         this->gui = gui;
754 int MasterLayer::handle_event()
756         plugin->config.bottom_is_master = from_text(get_text());
757         plugin->send_configure_change();
758         return 1;
761 void MasterLayer::create_objects()
763         add_item(new BC_MenuItem(to_text(0)));
764         add_item(new BC_MenuItem(to_text(1)));
767 int MasterLayer::from_text(char *text)
769         if(!strcmp(text, _("Top"))) return 0;
770         return 1;
773 char* MasterLayer::to_text(int mode)
775         return mode ? _("Bottom") : _("Top");
778 int MasterLayer::calculate_w(MotionWindow *gui)
780         int result = 0;
781         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(0)));
782         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(1)));
783         return result + 50;
793 Mode1::Mode1(MotionMain *plugin, MotionWindow *gui, int x, int y)
794  : BC_PopupMenu(x, 
795         y, 
796         calculate_w(gui),
797         to_text(plugin->config.mode1))
799         this->plugin = plugin;
800         this->gui = gui;
803 int Mode1::handle_event()
805         plugin->config.mode1 = from_text(get_text());
806         plugin->send_configure_change();
807         return 1;
810 void Mode1::create_objects()
812         add_item(new BC_MenuItem(to_text(MotionConfig::TRACK)));
813         add_item(new BC_MenuItem(to_text(MotionConfig::TRACK_PIXEL)));
814         add_item(new BC_MenuItem(to_text(MotionConfig::STABILIZE)));
815         add_item(new BC_MenuItem(to_text(MotionConfig::STABILIZE_PIXEL)));
816         add_item(new BC_MenuItem(to_text(MotionConfig::NOTHING)));
819 int Mode1::from_text(char *text)
821         if(!strcmp(text, _("Track Subpixel"))) return MotionConfig::TRACK;
822         if(!strcmp(text, _("Track Pixel"))) return MotionConfig::TRACK_PIXEL;
823         if(!strcmp(text, _("Stabilize Subpixel"))) return MotionConfig::STABILIZE;
824         if(!strcmp(text, _("Stabilize Pixel"))) return MotionConfig::STABILIZE_PIXEL;
825         if(!strcmp(text, _("Do Nothing"))) return MotionConfig::NOTHING;
828 char* Mode1::to_text(int mode)
830         switch(mode)
831         {
832                 case MotionConfig::TRACK:
833                         return _("Track Subpixel");
834                         break;
835                 case MotionConfig::TRACK_PIXEL:
836                         return _("Track Pixel");
837                         break;
838                 case MotionConfig::STABILIZE:
839                         return _("Stabilize Subpixel");
840                         break;
841                 case MotionConfig::STABILIZE_PIXEL:
842                         return _("Stabilize Pixel");
843                         break;
844                 case MotionConfig::NOTHING:
845                         return _("Do Nothing");
846                         break;
847         }
850 int Mode1::calculate_w(MotionWindow *gui)
852         int result = 0;
853         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::TRACK)));
854         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::TRACK_PIXEL)));
855         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::STABILIZE)));
856         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::STABILIZE_PIXEL)));
857         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::NOTHING)));
858         return result + 50;
865 Mode2::Mode2(MotionMain *plugin, MotionWindow *gui, int x, int y)
866  : BC_PopupMenu(x, 
867         y, 
868         calculate_w(gui),
869         to_text(plugin->config.mode2))
871         this->plugin = plugin;
872         this->gui = gui;
875 int Mode2::handle_event()
877         plugin->config.mode2 = from_text(get_text());
878         plugin->send_configure_change();
879         return 1;
882 void Mode2::create_objects()
884         add_item(new BC_MenuItem(to_text(MotionConfig::NO_CALCULATE)));
885         add_item(new BC_MenuItem(to_text(MotionConfig::RECALCULATE)));
886         add_item(new BC_MenuItem(to_text(MotionConfig::SAVE)));
887         add_item(new BC_MenuItem(to_text(MotionConfig::LOAD)));
890 int Mode2::from_text(char *text)
892         if(!strcmp(text, _("Don't Calculate"))) return MotionConfig::NO_CALCULATE;
893         if(!strcmp(text, _("Recalculate"))) return MotionConfig::RECALCULATE;
894         if(!strcmp(text, _("Save coords to /tmp"))) return MotionConfig::SAVE;
895         if(!strcmp(text, _("Load coords from /tmp"))) return MotionConfig::LOAD;
898 char* Mode2::to_text(int mode)
900         switch(mode)
901         {
902                 case MotionConfig::NO_CALCULATE:
903                         return _("Don't Calculate");
904                         break;
905                 case MotionConfig::RECALCULATE:
906                         return _("Recalculate");
907                         break;
908                 case MotionConfig::SAVE:
909                         return _("Save coords to /tmp");
910                         break;
911                 case MotionConfig::LOAD:
912                         return _("Load coords from /tmp");
913                         break;
914         }
917 int Mode2::calculate_w(MotionWindow *gui)
919         int result = 0;
920         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::NO_CALCULATE)));
921         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::RECALCULATE)));
922         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::SAVE)));
923         result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::LOAD)));
924         return result + 50;