1 #include "automation.h"
7 #include "cwindowgui.h"
8 #include "cwindowtool.h"
10 #include "edlsession.h"
11 #include "floatauto.h"
12 #include "floatautos.h"
15 #include "localsession.h"
16 #include "mainsession.h"
18 #include "maskautos.h"
21 #include "mwindowgui.h"
24 #include "trackcanvas.h"
25 #include "transportque.h"
28 CWindowTool::CWindowTool(MWindow *mwindow, CWindowGUI *gui)
31 this->mwindow = mwindow;
35 current_tool = CWINDOW_NONE;
37 input_lock = new Condition(0, "CWindowTool::input_lock");
38 output_lock = new Condition(1, "CWindowTool::output_lock");
39 tool_gui_lock = new Mutex("CWindowTool::tool_gui_lock");
42 CWindowTool::~CWindowTool()
53 void CWindowTool::start_tool(int operation)
55 CWindowToolGUI *new_gui = 0;
58 //printf("CWindowTool::start_tool 1\n");
59 if(current_tool != operation)
61 current_tool = operation;
65 new_gui = new CWindowEyedropGUI(mwindow, this);
68 new_gui = new CWindowCropGUI(mwindow, this);
71 new_gui = new CWindowCameraGUI(mwindow, this);
73 case CWINDOW_PROJECTOR:
74 new_gui = new CWindowProjectorGUI(mwindow, this);
77 new_gui = new CWindowMaskGUI(mwindow, this);
85 //printf("CWindowTool::start_tool 1\n");
91 // Wait for previous tool GUI to finish
92 output_lock->lock("CWindowTool::start_tool");
93 this->tool_gui = new_gui;
94 tool_gui->create_objects();
96 if(mwindow->edl->session->tool_window &&
97 mwindow->session->show_cwindow) tool_gui->show_window();
101 // Signal thread to run next tool GUI
102 input_lock->unlock();
104 //printf("CWindowTool::start_tool 1\n");
109 tool_gui->lock_window("CWindowTool::start_tool");
111 tool_gui->unlock_window();
114 //printf("CWindowTool::start_tool 2\n");
119 void CWindowTool::stop_tool()
123 tool_gui->lock_window("CWindowTool::stop_tool");
124 tool_gui->set_done(0);
125 tool_gui->unlock_window();
129 void CWindowTool::show_tool()
131 if(tool_gui && mwindow->edl->session->tool_window)
133 tool_gui->lock_window("CWindowTool::show_tool");
134 tool_gui->show_window();
135 tool_gui->unlock_window();
139 void CWindowTool::hide_tool()
141 if(tool_gui && mwindow->edl->session->tool_window)
143 tool_gui->lock_window("CWindowTool::show_tool");
144 tool_gui->hide_window();
145 tool_gui->unlock_window();
150 void CWindowTool::run()
154 input_lock->lock("CWindowTool::run");
157 tool_gui->run_window();
158 tool_gui_lock->lock("CWindowTool::run");
161 tool_gui_lock->unlock();
163 output_lock->unlock();
167 void CWindowTool::update_show_window()
171 tool_gui->lock_window("CWindowTool::update_show_window");
173 if(mwindow->edl->session->tool_window)
176 tool_gui->show_window();
179 tool_gui->hide_window();
182 tool_gui->unlock_window();
186 void CWindowTool::update_values()
188 tool_gui_lock->lock("CWindowTool::update_values");
191 tool_gui->lock_window("CWindowTool::update_values");
194 tool_gui->unlock_window();
196 tool_gui_lock->unlock();
205 CWindowToolGUI::CWindowToolGUI(MWindow *mwindow,
211 mwindow->session->ctool_x,
212 mwindow->session->ctool_y,
221 this->mwindow = mwindow;
222 this->thread = thread;
223 current_operation = 0;
226 CWindowToolGUI::~CWindowToolGUI()
230 int CWindowToolGUI::close_event()
234 mwindow->edl->session->tool_window = 0;
239 thread->gui->lock_window("CWindowToolGUI::close_event");
240 thread->gui->composite_panel->set_operation(mwindow->edl->session->cwindow_operation);
241 thread->gui->flush();
242 thread->gui->unlock_window();
244 lock_window("CWindowToolGUI::close_event");
248 int CWindowToolGUI::keypress_event()
250 if(get_keypress() == 'w' || get_keypress() == 'W')
251 return close_event();
255 int CWindowToolGUI::translation_event()
257 mwindow->session->ctool_x = get_x();
258 mwindow->session->ctool_y = get_y();
267 CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value)
268 : BC_TumbleTextBox(gui,
279 CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, int value)
280 : BC_TumbleTextBox(gui,
290 int CWindowCoord::handle_event()
292 gui->event_caller = this;
298 CWindowCropOK::CWindowCropOK(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
299 : BC_GenericButton(x, y, _("Do it"))
301 this->mwindow = mwindow;
304 int CWindowCropOK::handle_event()
306 mwindow->crop_video();
311 int CWindowCropOK::keypress_event()
313 if(get_keypress() == 0xd)
327 CWindowCropGUI::CWindowCropGUI(MWindow *mwindow, CWindowTool *thread)
328 : CWindowToolGUI(mwindow,
330 PROGRAM_NAME ": Crop",
337 CWindowCropGUI::~CWindowCropGUI()
341 void CWindowCropGUI::create_objects()
344 BC_TumbleTextBox *textbox;
348 int pad = MAX(BC_TextBox::calculate_h(this, MEDIUMFONT, 1, 1),
349 BC_Title::calculate_h(this, "X")) + 5;
350 add_subwindow(title = new BC_Title(x, y, _("X1:")));
351 column1 = MAX(column1, title->get_w());
353 add_subwindow(title = new BC_Title(x, y, _("W:")));
354 column1 = MAX(column1, title->get_w());
356 add_subwindow(new CWindowCropOK(mwindow, thread->tool_gui, x, y));
360 x1 = new CWindowCoord(thread->tool_gui, x, y, mwindow->edl->session->crop_x1);
361 x1->create_objects();
363 width = new CWindowCoord(thread->tool_gui,
366 mwindow->edl->session->crop_x2 -
367 mwindow->edl->session->crop_x1);
368 width->create_objects();
371 x += x1->get_w() + 10;
374 add_subwindow(title = new BC_Title(x, y, _("Y1:")));
375 column2 = MAX(column2, title->get_w());
377 add_subwindow(title = new BC_Title(x, y, _("H:")));
378 column2 = MAX(column2, title->get_w());
383 y1 = new CWindowCoord(thread->tool_gui, x, y, mwindow->edl->session->crop_y1);
384 y1->create_objects();
386 height = new CWindowCoord(thread->tool_gui,
389 mwindow->edl->session->crop_y2 -
390 mwindow->edl->session->crop_y1);
391 height->create_objects();
394 void CWindowCropGUI::handle_event()
397 new_x1 = atol(x1->get_text());
398 new_y1 = atol(y1->get_text());
399 if(new_x1 != mwindow->edl->session->crop_x1)
401 mwindow->edl->session->crop_x2 = new_x1 +
402 mwindow->edl->session->crop_x2 -
403 mwindow->edl->session->crop_x1;
404 mwindow->edl->session->crop_x1 = new_x1;
406 if(new_y1 != mwindow->edl->session->crop_y1)
408 mwindow->edl->session->crop_y2 = new_y1 +
409 mwindow->edl->session->crop_y2 -
410 mwindow->edl->session->crop_y1;
411 mwindow->edl->session->crop_y1 = atol(y1->get_text());
413 mwindow->edl->session->crop_x2 = atol(width->get_text()) +
414 mwindow->edl->session->crop_x1;
415 mwindow->edl->session->crop_y2 = atol(height->get_text()) +
416 mwindow->edl->session->crop_y1;
418 mwindow->cwindow->gui->lock_window("CWindowCropGUI::handle_event");
419 mwindow->cwindow->gui->canvas->draw_refresh();
420 mwindow->cwindow->gui->unlock_window();
423 void CWindowCropGUI::update()
425 x1->update((int64_t)mwindow->edl->session->crop_x1);
426 y1->update((int64_t)mwindow->edl->session->crop_y1);
427 width->update((int64_t)mwindow->edl->session->crop_x2 -
428 mwindow->edl->session->crop_x1);
429 height->update((int64_t)mwindow->edl->session->crop_y2 -
430 mwindow->edl->session->crop_y1);
438 CWindowEyedropGUI::CWindowEyedropGUI(MWindow *mwindow, CWindowTool *thread)
439 : CWindowToolGUI(mwindow,
441 PROGRAM_NAME ": Color",
447 CWindowEyedropGUI::~CWindowEyedropGUI()
451 void CWindowEyedropGUI::create_objects()
456 BC_Title *title1, *title2, *title3;
457 add_subwindow(title1 = new BC_Title(x, y, "Red:"));
458 y += title1->get_h() + 5;
459 add_subwindow(title2 = new BC_Title(x, y, "Green:"));
460 y += title2->get_h() + 5;
461 add_subwindow(title3 = new BC_Title(x, y, "Blue:"));
464 add_subwindow(red = new BC_Title(x2, title1->get_y(), "0"));
465 add_subwindow(green = new BC_Title(x2, title2->get_y(), "0"));
466 add_subwindow(blue = new BC_Title(x2, title3->get_y(), "0"));
468 y = blue->get_y() + blue->get_h() + 5;
469 add_subwindow(sample = new BC_SubWindow(x, y, 50, 50));
473 void CWindowEyedropGUI::update()
475 red->update(mwindow->edl->local_session->red);
476 green->update(mwindow->edl->local_session->green);
477 blue->update(mwindow->edl->local_session->blue);
479 int red = (int)(CLIP(mwindow->edl->local_session->red, 0, 1) * 0xff);
480 int green = (int)(CLIP(mwindow->edl->local_session->green, 0, 1) * 0xff);
481 int blue = (int)(CLIP(mwindow->edl->local_session->blue, 0, 1) * 0xff);
482 sample->set_color((red << 16) | (green << 8) | blue);
483 sample->draw_box(0, 0, sample->get_w(), sample->get_h());
484 sample->set_color(BLACK);
485 sample->draw_rectangle(0, 0, sample->get_w(), sample->get_h());
497 CWindowCameraGUI::CWindowCameraGUI(MWindow *mwindow, CWindowTool *thread)
498 : CWindowToolGUI(mwindow,
500 PROGRAM_NAME ": Camera",
505 CWindowCameraGUI::~CWindowCameraGUI()
509 void CWindowCameraGUI::create_objects()
511 int x = 10, y = 10, x1;
512 Track *track = mwindow->cwindow->calculate_affected_track();
513 FloatAuto *x_auto = 0;
514 FloatAuto *y_auto = 0;
515 FloatAuto *z_auto = 0;
521 mwindow->cwindow->calculate_affected_autos(&x_auto,
531 add_subwindow(title = new BC_Title(x, y, _("X:")));
533 this->x = new CWindowCoord(this,
536 x_auto ? x_auto->value : (float)0);
537 this->x->create_objects();
540 add_subwindow(title = new BC_Title(x, y, _("Y:")));
542 this->y = new CWindowCoord(this,
545 y_auto ? y_auto->value : (float)0);
546 this->y->create_objects();
549 add_subwindow(title = new BC_Title(x, y, _("Z:")));
551 this->z = new CWindowCoord(this,
554 z_auto ? z_auto->value : (float)1);
555 this->z->create_objects();
559 add_subwindow(button = new CWindowCameraLeft(mwindow, this, x1, y));
560 x1 += button->get_w();
561 add_subwindow(button = new CWindowCameraCenter(mwindow, this, x1, y));
562 x1 += button->get_w();
563 add_subwindow(button = new CWindowCameraRight(mwindow, this, x1, y));
565 y += button->get_h();
567 add_subwindow(button = new CWindowCameraTop(mwindow, this, x1, y));
568 x1 += button->get_w();
569 add_subwindow(button = new CWindowCameraMiddle(mwindow, this, x1, y));
570 x1 += button->get_w();
571 add_subwindow(button = new CWindowCameraBottom(mwindow, this, x1, y));
575 void CWindowCameraGUI::update_preview()
577 mwindow->restart_brender();
578 mwindow->sync_parameters(CHANGE_PARAMS);
580 mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
584 mwindow->cwindow->gui->lock_window("CWindowCameraGUI::update_preview");
585 mwindow->cwindow->gui->canvas->draw_refresh();
586 mwindow->cwindow->gui->unlock_window();
590 void CWindowCameraGUI::handle_event()
592 FloatAuto *x_auto = 0;
593 FloatAuto *y_auto = 0;
594 FloatAuto *z_auto = 0;
595 Track *track = mwindow->cwindow->calculate_affected_track();
598 if(event_caller == x)
600 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
601 track->automation->autos[AUTOMATION_CAMERA_X],
605 x_auto->value = atof(x->get_text());
610 if(event_caller == y)
612 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
613 track->automation->autos[AUTOMATION_CAMERA_Y],
617 y_auto->value = atof(y->get_text());
622 if(event_caller == z)
624 z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
625 track->automation->autos[AUTOMATION_CAMERA_Z],
629 float zoom = atof(z->get_text());
630 if(zoom > 10) zoom = 10;
632 if(zoom < 0) zoom = 0;
633 // Doesn't allow user to enter from scratch
634 // if(zoom != atof(z->get_text()))
637 z_auto->value = zoom;
638 mwindow->gui->lock_window("CWindowCameraGUI::handle_event");
639 mwindow->gui->canvas->draw_overlays();
640 mwindow->gui->canvas->flash();
641 mwindow->gui->unlock_window();
648 void CWindowCameraGUI::update()
650 FloatAuto *x_auto = 0;
651 FloatAuto *y_auto = 0;
652 FloatAuto *z_auto = 0;
653 Track *track = mwindow->cwindow->calculate_affected_track();
657 mwindow->cwindow->calculate_affected_autos(&x_auto,
668 x->update(x_auto->value);
670 y->update(y_auto->value);
672 z->update(z_auto->value);
675 // BezierAuto* CWindowCameraGUI::get_keyframe()
677 // BezierAuto *keyframe = 0;
678 // Track *track = mwindow->cwindow->calculate_affected_track();
680 // keyframe = (BezierAuto*)mwindow->cwindow->calculate_affected_auto(
681 // track->automation->autos[AUTOMATION_CAMERA]);
687 CWindowCameraLeft::CWindowCameraLeft(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
688 : BC_Button(x, y, mwindow->theme->get_image_set("left_justify"))
691 this->mwindow = mwindow;
692 set_tooltip(_("Left justify"));
694 int CWindowCameraLeft::handle_event()
696 FloatAuto *x_auto = 0;
697 FloatAuto *z_auto = 0;
698 Track *track = mwindow->cwindow->calculate_affected_track();
701 mwindow->cwindow->calculate_affected_autos(&x_auto,
714 track->get_source_dimensions(
715 mwindow->edl->local_session->get_selectionstart(1),
722 (double)track->track_w / z_auto->value / 2 -
725 gui->update_preview();
733 CWindowCameraCenter::CWindowCameraCenter(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
734 : BC_Button(x, y, mwindow->theme->get_image_set("center_justify"))
737 this->mwindow = mwindow;
738 set_tooltip(_("Center horizontal"));
740 int CWindowCameraCenter::handle_event()
742 FloatAuto *x_auto = 0;
743 Track *track = mwindow->cwindow->calculate_affected_track();
745 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
746 track->automation->autos[AUTOMATION_CAMERA_X],
753 gui->update_preview();
760 CWindowCameraRight::CWindowCameraRight(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
761 : BC_Button(x, y, mwindow->theme->get_image_set("right_justify"))
764 this->mwindow = mwindow;
765 set_tooltip(_("Right justify"));
767 int CWindowCameraRight::handle_event()
769 FloatAuto *x_auto = 0;
770 FloatAuto *z_auto = 0;
771 Track *track = mwindow->cwindow->calculate_affected_track();
774 mwindow->cwindow->calculate_affected_autos(&x_auto,
787 track->get_source_dimensions(
788 mwindow->edl->local_session->get_selectionstart(1),
794 x_auto->value = -((double)track->track_w / z_auto->value / 2 -
797 gui->update_preview();
805 CWindowCameraTop::CWindowCameraTop(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
806 : BC_Button(x, y, mwindow->theme->get_image_set("top_justify"))
809 this->mwindow = mwindow;
810 set_tooltip(_("Top justify"));
812 int CWindowCameraTop::handle_event()
814 FloatAuto *y_auto = 0;
815 FloatAuto *z_auto = 0;
816 Track *track = mwindow->cwindow->calculate_affected_track();
819 mwindow->cwindow->calculate_affected_autos(0,
832 track->get_source_dimensions(
833 mwindow->edl->local_session->get_selectionstart(1),
839 y_auto->value = (double)track->track_h / z_auto->value / 2 -
842 gui->update_preview();
850 CWindowCameraMiddle::CWindowCameraMiddle(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
851 : BC_Button(x, y, mwindow->theme->get_image_set("middle_justify"))
854 this->mwindow = mwindow;
855 set_tooltip(_("Center vertical"));
857 int CWindowCameraMiddle::handle_event()
859 FloatAuto *y_auto = 0;
860 Track *track = mwindow->cwindow->calculate_affected_track();
862 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
863 track->automation->autos[AUTOMATION_CAMERA_Y], 1);
869 gui->update_preview();
876 CWindowCameraBottom::CWindowCameraBottom(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
877 : BC_Button(x, y, mwindow->theme->get_image_set("bottom_justify"))
880 this->mwindow = mwindow;
881 set_tooltip(_("Bottom justify"));
883 int CWindowCameraBottom::handle_event()
885 FloatAuto *y_auto = 0;
886 FloatAuto *z_auto = 0;
887 Track *track = mwindow->cwindow->calculate_affected_track();
890 mwindow->cwindow->calculate_affected_autos(0,
903 track->get_source_dimensions(
904 mwindow->edl->local_session->get_selectionstart(1),
910 y_auto->value = -((double)track->track_h / z_auto->value / 2 -
913 gui->update_preview();
936 CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread)
937 : CWindowToolGUI(mwindow,
939 PROGRAM_NAME ": Projector",
944 CWindowProjectorGUI::~CWindowProjectorGUI()
947 void CWindowProjectorGUI::create_objects()
949 int x = 10, y = 10, x1;
950 Track *track = mwindow->cwindow->calculate_affected_track();
951 FloatAuto *x_auto = 0;
952 FloatAuto *y_auto = 0;
953 FloatAuto *z_auto = 0;
959 mwindow->cwindow->calculate_affected_autos(&x_auto,
969 add_subwindow(title = new BC_Title(x, y, _("X:")));
971 this->x = new CWindowCoord(this,
974 x_auto ? x_auto->value : (float)0);
975 this->x->create_objects();
978 add_subwindow(title = new BC_Title(x, y, _("Y:")));
980 this->y = new CWindowCoord(this,
983 y_auto ? y_auto->value : (float)0);
984 this->y->create_objects();
987 add_subwindow(title = new BC_Title(x, y, _("Z:")));
989 this->z = new CWindowCoord(this,
992 z_auto ? z_auto->value : (float)1);
993 this->z->create_objects();
997 add_subwindow(button = new CWindowProjectorLeft(mwindow, this, x1, y));
998 x1 += button->get_w();
999 add_subwindow(button = new CWindowProjectorCenter(mwindow, this, x1, y));
1000 x1 += button->get_w();
1001 add_subwindow(button = new CWindowProjectorRight(mwindow, this, x1, y));
1003 y += button->get_h();
1005 add_subwindow(button = new CWindowProjectorTop(mwindow, this, x1, y));
1006 x1 += button->get_w();
1007 add_subwindow(button = new CWindowProjectorMiddle(mwindow, this, x1, y));
1008 x1 += button->get_w();
1009 add_subwindow(button = new CWindowProjectorBottom(mwindow, this, x1, y));
1013 void CWindowProjectorGUI::update_preview()
1015 mwindow->restart_brender();
1016 mwindow->sync_parameters(CHANGE_PARAMS);
1017 mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1021 mwindow->cwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
1022 mwindow->cwindow->gui->canvas->draw_refresh();
1023 mwindow->cwindow->gui->unlock_window();
1026 void CWindowProjectorGUI::handle_event()
1028 FloatAuto *x_auto = 0;
1029 FloatAuto *y_auto = 0;
1030 FloatAuto *z_auto = 0;
1031 Track *track = mwindow->cwindow->calculate_affected_track();
1035 if(event_caller == x)
1037 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1038 track->automation->autos[AUTOMATION_PROJECTOR_X],
1042 x_auto->value = atof(x->get_text());
1047 if(event_caller == y)
1049 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1050 track->automation->autos[AUTOMATION_PROJECTOR_Y],
1054 y_auto->value = atof(y->get_text());
1059 if(event_caller == z)
1061 z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1062 track->automation->autos[AUTOMATION_PROJECTOR_Z],
1066 float zoom = atof(z->get_text());
1067 if(zoom > 10000) zoom = 10000;
1069 if(zoom < 0) zoom = 0;
1070 // if (zoom != atof(z->get_text()))
1072 z_auto->value = zoom;
1074 mwindow->gui->lock_window("CWindowProjectorGUI::handle_event");
1075 mwindow->gui->canvas->draw_overlays();
1076 mwindow->gui->canvas->flash();
1077 mwindow->gui->unlock_window();
1085 void CWindowProjectorGUI::update()
1087 FloatAuto *x_auto = 0;
1088 FloatAuto *y_auto = 0;
1089 FloatAuto *z_auto = 0;
1090 Track *track = mwindow->cwindow->calculate_affected_track();
1094 mwindow->cwindow->calculate_affected_autos(&x_auto,
1105 x->update(x_auto->value);
1107 y->update(y_auto->value);
1109 z->update(z_auto->value);
1112 // BezierAuto* CWindowProjectorGUI::get_keyframe()
1114 // BezierAuto *keyframe = 0;
1115 // Track *track = mwindow->cwindow->calculate_affected_track();
1117 // keyframe = (BezierAuto*)mwindow->cwindow->calculate_affected_auto(
1118 // track->automation->autos[AUTOMATION_PROJECTOR]);
1159 CWindowProjectorLeft::CWindowProjectorLeft(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1160 : BC_Button(x, y, mwindow->theme->get_image_set("left_justify"))
1163 this->mwindow = mwindow;
1164 set_tooltip(_("Left justify"));
1166 int CWindowProjectorLeft::handle_event()
1168 FloatAuto *x_auto = 0;
1169 FloatAuto *z_auto = 0;
1170 Track *track = mwindow->cwindow->calculate_affected_track();
1173 mwindow->cwindow->calculate_affected_autos(&x_auto,
1182 if(x_auto && z_auto)
1184 x_auto->value = (double)track->track_w * z_auto->value / 2 -
1185 (double)mwindow->edl->session->output_w / 2;
1187 gui->update_preview();
1194 CWindowProjectorCenter::CWindowProjectorCenter(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1195 : BC_Button(x, y, mwindow->theme->get_image_set("center_justify"))
1198 this->mwindow = mwindow;
1199 set_tooltip(_("Center horizontal"));
1201 int CWindowProjectorCenter::handle_event()
1203 FloatAuto *x_auto = 0;
1204 Track *track = mwindow->cwindow->calculate_affected_track();
1206 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1207 track->automation->autos[AUTOMATION_PROJECTOR_X],
1214 gui->update_preview();
1221 CWindowProjectorRight::CWindowProjectorRight(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1222 : BC_Button(x, y, mwindow->theme->get_image_set("right_justify"))
1225 this->mwindow = mwindow;
1226 set_tooltip(_("Right justify"));
1228 int CWindowProjectorRight::handle_event()
1230 FloatAuto *x_auto = 0;
1231 FloatAuto *z_auto = 0;
1232 Track *track = mwindow->cwindow->calculate_affected_track();
1235 mwindow->cwindow->calculate_affected_autos(&x_auto,
1245 if(x_auto && z_auto)
1247 x_auto->value = -((double)track->track_w * z_auto->value / 2 -
1248 (double)mwindow->edl->session->output_w / 2);
1250 gui->update_preview();
1257 CWindowProjectorTop::CWindowProjectorTop(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1258 : BC_Button(x, y, mwindow->theme->get_image_set("top_justify"))
1261 this->mwindow = mwindow;
1262 set_tooltip(_("Top justify"));
1264 int CWindowProjectorTop::handle_event()
1266 FloatAuto *y_auto = 0;
1267 FloatAuto *z_auto = 0;
1268 Track *track = mwindow->cwindow->calculate_affected_track();
1271 mwindow->cwindow->calculate_affected_autos(0,
1281 if(y_auto && z_auto)
1283 y_auto->value = (double)track->track_h * z_auto->value / 2 -
1284 (double)mwindow->edl->session->output_h / 2;
1286 gui->update_preview();
1293 CWindowProjectorMiddle::CWindowProjectorMiddle(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1294 : BC_Button(x, y, mwindow->theme->get_image_set("middle_justify"))
1297 this->mwindow = mwindow;
1298 set_tooltip(_("Center vertical"));
1300 int CWindowProjectorMiddle::handle_event()
1302 FloatAuto *y_auto = 0;
1303 Track *track = mwindow->cwindow->calculate_affected_track();
1305 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1306 track->automation->autos[AUTOMATION_PROJECTOR_Y], 1);
1312 gui->update_preview();
1319 CWindowProjectorBottom::CWindowProjectorBottom(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1320 : BC_Button(x, y, mwindow->theme->get_image_set("bottom_justify"))
1323 this->mwindow = mwindow;
1324 set_tooltip(_("Bottom justify"));
1326 int CWindowProjectorBottom::handle_event()
1328 FloatAuto *y_auto = 0;
1329 FloatAuto *z_auto = 0;
1330 Track *track = mwindow->cwindow->calculate_affected_track();
1333 mwindow->cwindow->calculate_affected_autos(0,
1343 if(y_auto && z_auto)
1345 y_auto->value = -((double)track->track_h * z_auto->value / 2 -
1346 (double)mwindow->edl->session->output_h / 2);
1348 gui->update_preview();
1361 CWindowMaskMode::CWindowMaskMode(MWindow *mwindow,
1362 CWindowToolGUI *gui,
1372 this->mwindow = mwindow;
1376 void CWindowMaskMode::create_objects()
1378 add_item(new BC_MenuItem(mode_to_text(MASK_MULTIPLY_ALPHA)));
1379 add_item(new BC_MenuItem(mode_to_text(MASK_SUBTRACT_ALPHA)));
1382 char* CWindowMaskMode::mode_to_text(int mode)
1386 case MASK_MULTIPLY_ALPHA:
1387 return _("Multiply alpha");
1390 case MASK_SUBTRACT_ALPHA:
1391 return _("Subtract alpha");
1395 return _("Subtract alpha");
1398 int CWindowMaskMode::text_to_mode(char *text)
1400 if(!strcasecmp(text, _("Multiply alpha")))
1401 return MASK_MULTIPLY_ALPHA;
1403 if(!strcasecmp(text, _("Subtract alpha")))
1404 return MASK_SUBTRACT_ALPHA;
1406 return MASK_SUBTRACT_ALPHA;
1409 int CWindowMaskMode::handle_event()
1415 ((CWindowMaskGUI*)gui)->get_keyframe(track,
1423 ((MaskAuto*)track->automation->autos[AUTOMATION_MASK]->default_auto)->mode =
1424 text_to_mode(get_text());
1427 //printf("CWindowMaskMode::handle_event 1\n");
1428 gui->update_preview();
1439 CWindowMaskDelete::CWindowMaskDelete(MWindow *mwindow,
1440 CWindowToolGUI *gui,
1443 : BC_GenericButton(x, y, _("Delete"))
1445 this->mwindow = mwindow;
1449 int CWindowMaskDelete::handle_event()
1452 Track *track = mwindow->cwindow->calculate_affected_track();
1459 MaskAutos *mask_autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK];
1460 for(MaskAuto *current = (MaskAuto*)mask_autos->default_auto;
1463 SubMask *submask = current->get_submask(mwindow->edl->session->cwindow_mask);
1467 for(int i = mwindow->cwindow->gui->affected_point;
1468 i < submask->points.total - 1;
1471 *submask->points.values[i] = *submask->points.values[i + 1];
1474 if(submask->points.total)
1476 submask->points.remove_object(
1477 submask->points.values[submask->points.total - 1]);
1481 if(current == (MaskAuto*)mask_autos->default_auto)
1482 current = (MaskAuto*)mask_autos->first;
1484 current = (MaskAuto*)NEXT;
1487 gui->update_preview();
1491 // ((CWindowMaskGUI*)gui)->get_keyframe(track,
1497 // Need to apply to every keyframe
1501 // for(int i = mwindow->cwindow->gui->affected_point;
1502 // i < mask->points.total - 1;
1505 // *mask->points.values[i] = *mask->points.values[i + 1];
1508 // if(mask->points.total)
1510 // mask->points.remove_object(mask->points.values[mask->points.total - 1]);
1514 // gui->update_preview();
1520 int CWindowMaskDelete::keypress_event()
1522 if(get_keypress() == BACKSPACE ||
1523 get_keypress() == DELETE)
1524 return handle_event();
1529 CWindowMaskCycleNext::CWindowMaskCycleNext(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1530 : BC_GenericButton(x, y, _("Cycle next"))
1532 this->mwindow = mwindow;
1535 int CWindowMaskCycleNext::handle_event()
1541 ((CWindowMaskGUI*)gui)->get_keyframe(track,
1549 // Should apply to all keyframes
1550 if(keyframe && mask->points.total)
1552 temp = mask->points.values[0];
1554 for(int i = 0; i < mask->points.total - 1; i++)
1556 mask->points.values[i] = mask->points.values[i + 1];
1558 mask->points.values[mask->points.total - 1] = temp;
1560 mwindow->cwindow->gui->affected_point--;
1561 if(mwindow->cwindow->gui->affected_point < 0)
1562 mwindow->cwindow->gui->affected_point = mask->points.total - 1;
1565 gui->update_preview();
1571 CWindowMaskCyclePrev::CWindowMaskCyclePrev(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1572 : BC_GenericButton(x, y, _("Cycle prev"))
1574 this->mwindow = mwindow;
1577 int CWindowMaskCyclePrev::handle_event()
1583 ((CWindowMaskGUI*)gui)->get_keyframe(track,
1589 // Should apply to all keyframes
1591 if(keyframe && mask->points.total)
1593 temp = mask->points.values[mask->points.total - 1];
1595 for(int i = mask->points.total - 1; i > 0; i--)
1597 mask->points.values[i] = mask->points.values[i - 1];
1599 mask->points.values[0] = temp;
1601 mwindow->cwindow->gui->affected_point++;
1602 if(mwindow->cwindow->gui->affected_point >= mask->points.total)
1603 mwindow->cwindow->gui->affected_point = 0;
1606 gui->update_preview();
1612 CWindowMaskNumber::CWindowMaskNumber(MWindow *mwindow,
1613 CWindowToolGUI *gui,
1616 : BC_TumbleTextBox(gui,
1617 (int64_t)mwindow->edl->session->cwindow_mask,
1619 (int64_t)SUBMASKS - 1,
1624 this->mwindow = mwindow;
1628 CWindowMaskNumber::~CWindowMaskNumber()
1632 int CWindowMaskNumber::handle_event()
1634 mwindow->edl->session->cwindow_mask = atol(get_text());
1636 gui->update_preview();
1644 CWindowMaskFeather::CWindowMaskFeather(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1645 : BC_TumbleTextBox(gui,
1653 this->mwindow = mwindow;
1656 CWindowMaskFeather::~CWindowMaskFeather()
1659 int CWindowMaskFeather::handle_event()
1665 ((CWindowMaskGUI*)gui)->get_keyframe(track,
1671 keyframe->feather = atof(get_text());
1672 gui->update_preview();
1676 CWindowMaskValue::CWindowMaskValue(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1686 this->mwindow = mwindow;
1690 CWindowMaskValue::~CWindowMaskValue()
1694 int CWindowMaskValue::handle_event()
1700 ((CWindowMaskGUI*)gui)->get_keyframe(track,
1706 keyframe->value = get_value();
1707 gui->update_preview();
1713 CWindowMaskBeforePlugins::CWindowMaskBeforePlugins(CWindowToolGUI *gui, int x, int y)
1717 _("Apply mask before plugins"))
1722 int CWindowMaskBeforePlugins::handle_event()
1728 ((CWindowMaskGUI*)gui)->get_keyframe(track,
1734 keyframe->apply_before_plugins = get_value();
1735 gui->update_preview();
1746 CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread)
1747 : CWindowToolGUI(mwindow,
1749 PROGRAM_NAME ": Mask",
1753 this->mwindow = mwindow;
1754 this->thread = thread;
1756 CWindowMaskGUI::~CWindowMaskGUI()
1762 void CWindowMaskGUI::create_objects()
1765 MaskAuto *keyframe = 0;
1766 Track *track = mwindow->cwindow->calculate_affected_track();
1768 keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(track->automation->autos[AUTOMATION_MASK], 0);
1771 add_subwindow(title = new BC_Title(x, y, _("Mode:")));
1772 add_subwindow(mode = new CWindowMaskMode(mwindow,
1777 mode->create_objects();
1779 add_subwindow(new BC_Title(x, y, _("Value:")));
1780 add_subwindow(value = new CWindowMaskValue(mwindow, this, x + 50, y));
1782 add_subwindow(delete_point = new CWindowMaskDelete(mwindow, this, x, y));
1784 add_subwindow(new BC_Title(x, y, _("Mask number:")));
1785 number = new CWindowMaskNumber(mwindow,
1789 number->create_objects();
1791 add_subwindow(new BC_Title(x, y, _("Feather:")));
1792 feather = new CWindowMaskFeather(mwindow,
1796 feather->create_objects();
1798 add_subwindow(title = new BC_Title(x, y, _("X:")));
1799 x += title->get_w();
1800 this->x = new CWindowCoord(this,
1804 this->x->create_objects();
1806 add_subwindow(title = new BC_Title(x, y, _("Y:")));
1807 x += title->get_w();
1808 this->y = new CWindowCoord(this,
1812 this->y->create_objects();
1815 // add_subwindow(title = new BC_Title(x, y, _("Apply mask before plugins:")));
1817 add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this,
1820 // this->apply_before_plugins->create_objects();
1826 void CWindowMaskGUI::get_keyframe(Track* &track,
1827 MaskAuto* &keyframe,
1833 track = mwindow->cwindow->calculate_affected_track();
1835 keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(track->automation->autos[AUTOMATION_MASK], create_it);
1840 mask = keyframe->get_submask(mwindow->edl->session->cwindow_mask);
1847 if(mwindow->cwindow->gui->affected_point < mask->points.total &&
1848 mwindow->cwindow->gui->affected_point >= 0)
1850 point = mask->points.values[mwindow->cwindow->gui->affected_point];
1855 void CWindowMaskGUI::update()
1861 //printf("CWindowMaskGUI::update 1\n");
1868 //printf("CWindowMaskGUI::update 1\n");
1871 x->update(point->x);
1872 y->update(point->y);
1874 //printf("CWindowMaskGUI::update 1\n");
1878 feather->update((int64_t)keyframe->feather);
1879 value->update((int64_t)keyframe->value);
1880 apply_before_plugins->update((int64_t)keyframe->apply_before_plugins);
1882 //printf("CWindowMaskGUI::update 1\n");
1884 number->update((int64_t)mwindow->edl->session->cwindow_mask);
1886 //printf("CWindowMaskGUI::update 1\n");
1890 CWindowMaskMode::mode_to_text(((MaskAuto*)track->automation->autos[AUTOMATION_MASK]->default_auto)->mode));
1892 //printf("CWindowMaskGUI::update 2\n");
1895 void CWindowMaskGUI::handle_event()
1909 point->x = atof(x->get_text());
1910 point->y = atof(y->get_text());
1916 void CWindowMaskGUI::update_preview()
1918 mwindow->restart_brender();
1919 mwindow->sync_parameters(CHANGE_PARAMS);
1920 mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1924 mwindow->cwindow->gui->lock_window("CWindowMaskGUI::update_preview");
1925 mwindow->cwindow->gui->canvas->draw_refresh();
1926 mwindow->cwindow->gui->unlock_window();