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"
20 #include "mwindowgui.h"
23 #include "trackcanvas.h"
24 #include "transportque.h"
27 CWindowTool::CWindowTool(MWindow *mwindow, CWindowGUI *gui)
30 this->mwindow = mwindow;
34 current_tool = CWINDOW_NONE;
36 input_lock = new Condition(0, "CWindowTool::input_lock");
37 output_lock = new Condition(1, "CWindowTool::output_lock");
38 tool_gui_lock = new Mutex("CWindowTool::tool_gui_lock");
41 CWindowTool::~CWindowTool()
52 void CWindowTool::start_tool(int operation)
54 CWindowToolGUI *new_gui = 0;
57 //printf("CWindowTool::start_tool 1\n");
58 if(current_tool != operation)
60 current_tool = operation;
64 new_gui = new CWindowEyedropGUI(mwindow, this);
67 new_gui = new CWindowCropGUI(mwindow, this);
70 new_gui = new CWindowCameraGUI(mwindow, this);
72 case CWINDOW_PROJECTOR:
73 new_gui = new CWindowProjectorGUI(mwindow, this);
76 new_gui = new CWindowMaskGUI(mwindow, this);
84 //printf("CWindowTool::start_tool 1\n");
90 // Wait for previous tool GUI to finish
91 output_lock->lock("CWindowTool::start_tool");
92 this->tool_gui = new_gui;
93 tool_gui->create_objects();
95 if(mwindow->edl->session->tool_window &&
96 mwindow->session->show_cwindow) tool_gui->show_window();
100 // Signal thread to run next tool GUI
101 input_lock->unlock();
103 //printf("CWindowTool::start_tool 1\n");
108 tool_gui->lock_window("CWindowTool::start_tool");
110 tool_gui->unlock_window();
113 //printf("CWindowTool::start_tool 2\n");
118 void CWindowTool::stop_tool()
122 tool_gui->lock_window("CWindowTool::stop_tool");
123 tool_gui->set_done(0);
124 tool_gui->unlock_window();
128 void CWindowTool::show_tool()
130 if(tool_gui && mwindow->edl->session->tool_window)
132 tool_gui->lock_window("CWindowTool::show_tool");
133 tool_gui->show_window();
134 tool_gui->unlock_window();
138 void CWindowTool::hide_tool()
140 if(tool_gui && mwindow->edl->session->tool_window)
142 tool_gui->lock_window("CWindowTool::show_tool");
143 tool_gui->hide_window();
144 tool_gui->unlock_window();
149 void CWindowTool::run()
153 input_lock->lock("CWindowTool::run");
156 tool_gui->run_window();
157 tool_gui_lock->lock("CWindowTool::run");
160 tool_gui_lock->unlock();
162 output_lock->unlock();
166 void CWindowTool::update_show_window()
170 tool_gui->lock_window("CWindowTool::update_show_window");
172 if(mwindow->edl->session->tool_window)
175 tool_gui->show_window();
178 tool_gui->hide_window();
181 tool_gui->unlock_window();
185 void CWindowTool::update_values()
187 tool_gui_lock->lock("CWindowTool::update_values");
190 tool_gui->lock_window("CWindowTool::update_values");
193 tool_gui->unlock_window();
195 tool_gui_lock->unlock();
204 CWindowToolGUI::CWindowToolGUI(MWindow *mwindow,
210 mwindow->session->ctool_x,
211 mwindow->session->ctool_y,
220 this->mwindow = mwindow;
221 this->thread = thread;
222 current_operation = 0;
225 CWindowToolGUI::~CWindowToolGUI()
229 int CWindowToolGUI::close_event()
233 mwindow->edl->session->tool_window = 0;
238 thread->gui->lock_window("CWindowToolGUI::close_event");
239 thread->gui->composite_panel->set_operation(mwindow->edl->session->cwindow_operation);
240 thread->gui->flush();
241 thread->gui->unlock_window();
243 lock_window("CWindowToolGUI::close_event");
247 int CWindowToolGUI::keypress_event()
249 if(get_keypress() == 'w' || get_keypress() == 'W')
250 return close_event();
254 int CWindowToolGUI::translation_event()
256 mwindow->session->ctool_x = get_x();
257 mwindow->session->ctool_y = get_y();
266 CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value)
267 : BC_TumbleTextBox(gui,
278 CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, int value)
279 : BC_TumbleTextBox(gui,
289 int CWindowCoord::handle_event()
291 gui->event_caller = this;
297 CWindowCropOK::CWindowCropOK(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
298 : BC_GenericButton(x, y, _("Do it"))
300 this->mwindow = mwindow;
303 int CWindowCropOK::handle_event()
305 mwindow->crop_video();
310 int CWindowCropOK::keypress_event()
312 if(get_keypress() == 0xd)
326 CWindowCropGUI::CWindowCropGUI(MWindow *mwindow, CWindowTool *thread)
327 : CWindowToolGUI(mwindow,
329 PROGRAM_NAME ": Crop",
336 CWindowCropGUI::~CWindowCropGUI()
340 void CWindowCropGUI::create_objects()
343 BC_TumbleTextBox *textbox;
347 int pad = MAX(BC_TextBox::calculate_h(this, MEDIUMFONT, 1, 1),
348 BC_Title::calculate_h(this, "X")) + 5;
349 add_subwindow(title = new BC_Title(x, y, _("X1:")));
350 column1 = MAX(column1, title->get_w());
352 add_subwindow(title = new BC_Title(x, y, _("W:")));
353 column1 = MAX(column1, title->get_w());
355 add_subwindow(new CWindowCropOK(mwindow, thread->tool_gui, x, y));
359 x1 = new CWindowCoord(thread->tool_gui, x, y, mwindow->edl->session->crop_x1);
360 x1->create_objects();
362 width = new CWindowCoord(thread->tool_gui,
365 mwindow->edl->session->crop_x2 -
366 mwindow->edl->session->crop_x1);
367 width->create_objects();
370 x += x1->get_w() + 10;
373 add_subwindow(title = new BC_Title(x, y, _("Y1:")));
374 column2 = MAX(column2, title->get_w());
376 add_subwindow(title = new BC_Title(x, y, _("H:")));
377 column2 = MAX(column2, title->get_w());
382 y1 = new CWindowCoord(thread->tool_gui, x, y, mwindow->edl->session->crop_y1);
383 y1->create_objects();
385 height = new CWindowCoord(thread->tool_gui,
388 mwindow->edl->session->crop_y2 -
389 mwindow->edl->session->crop_y1);
390 height->create_objects();
393 void CWindowCropGUI::handle_event()
396 new_x1 = atol(x1->get_text());
397 new_y1 = atol(y1->get_text());
398 if(new_x1 != mwindow->edl->session->crop_x1)
400 mwindow->edl->session->crop_x2 = new_x1 +
401 mwindow->edl->session->crop_x2 -
402 mwindow->edl->session->crop_x1;
403 mwindow->edl->session->crop_x1 = new_x1;
405 if(new_y1 != mwindow->edl->session->crop_y1)
407 mwindow->edl->session->crop_y2 = new_y1 +
408 mwindow->edl->session->crop_y2 -
409 mwindow->edl->session->crop_y1;
410 mwindow->edl->session->crop_y1 = atol(y1->get_text());
412 mwindow->edl->session->crop_x2 = atol(width->get_text()) +
413 mwindow->edl->session->crop_x1;
414 mwindow->edl->session->crop_y2 = atol(height->get_text()) +
415 mwindow->edl->session->crop_y1;
417 mwindow->cwindow->gui->lock_window("CWindowCropGUI::handle_event");
418 mwindow->cwindow->gui->canvas->draw_refresh();
419 mwindow->cwindow->gui->unlock_window();
422 void CWindowCropGUI::update()
424 x1->update((int64_t)mwindow->edl->session->crop_x1);
425 y1->update((int64_t)mwindow->edl->session->crop_y1);
426 width->update((int64_t)mwindow->edl->session->crop_x2 -
427 mwindow->edl->session->crop_x1);
428 height->update((int64_t)mwindow->edl->session->crop_y2 -
429 mwindow->edl->session->crop_y1);
437 CWindowEyedropGUI::CWindowEyedropGUI(MWindow *mwindow, CWindowTool *thread)
438 : CWindowToolGUI(mwindow,
440 PROGRAM_NAME ": Color",
446 CWindowEyedropGUI::~CWindowEyedropGUI()
450 void CWindowEyedropGUI::create_objects()
455 BC_Title *title1, *title2, *title3;
456 add_subwindow(title1 = new BC_Title(x, y, "Red:"));
457 y += title1->get_h() + 5;
458 add_subwindow(title2 = new BC_Title(x, y, "Green:"));
459 y += title2->get_h() + 5;
460 add_subwindow(title3 = new BC_Title(x, y, "Blue:"));
463 add_subwindow(red = new BC_Title(x2, title1->get_y(), "0"));
464 add_subwindow(green = new BC_Title(x2, title2->get_y(), "0"));
465 add_subwindow(blue = new BC_Title(x2, title3->get_y(), "0"));
467 y = blue->get_y() + blue->get_h() + 5;
468 add_subwindow(sample = new BC_SubWindow(x, y, 50, 50));
472 void CWindowEyedropGUI::update()
474 red->update(mwindow->edl->local_session->red);
475 green->update(mwindow->edl->local_session->green);
476 blue->update(mwindow->edl->local_session->blue);
478 int red = (int)(CLIP(mwindow->edl->local_session->red, 0, 1) * 0xff);
479 int green = (int)(CLIP(mwindow->edl->local_session->green, 0, 1) * 0xff);
480 int blue = (int)(CLIP(mwindow->edl->local_session->blue, 0, 1) * 0xff);
481 sample->set_color((red << 16) | (green << 8) | blue);
482 sample->draw_box(0, 0, sample->get_w(), sample->get_h());
483 sample->set_color(BLACK);
484 sample->draw_rectangle(0, 0, sample->get_w(), sample->get_h());
496 CWindowCameraGUI::CWindowCameraGUI(MWindow *mwindow, CWindowTool *thread)
497 : CWindowToolGUI(mwindow,
499 PROGRAM_NAME ": Camera",
504 CWindowCameraGUI::~CWindowCameraGUI()
508 void CWindowCameraGUI::create_objects()
510 int x = 10, y = 10, x1;
511 Track *track = mwindow->cwindow->calculate_affected_track();
512 FloatAuto *x_auto = 0;
513 FloatAuto *y_auto = 0;
514 FloatAuto *z_auto = 0;
520 mwindow->cwindow->calculate_affected_autos(&x_auto,
530 add_subwindow(title = new BC_Title(x, y, _("X:")));
532 this->x = new CWindowCoord(this,
535 x_auto ? x_auto->value : (float)0);
536 this->x->create_objects();
539 add_subwindow(title = new BC_Title(x, y, _("Y:")));
541 this->y = new CWindowCoord(this,
544 y_auto ? y_auto->value : (float)0);
545 this->y->create_objects();
548 add_subwindow(title = new BC_Title(x, y, _("Z:")));
550 this->z = new CWindowCoord(this,
553 z_auto ? z_auto->value : (float)1);
554 this->z->create_objects();
558 add_subwindow(button = new CWindowCameraLeft(mwindow, this, x1, y));
559 x1 += button->get_w();
560 add_subwindow(button = new CWindowCameraCenter(mwindow, this, x1, y));
561 x1 += button->get_w();
562 add_subwindow(button = new CWindowCameraRight(mwindow, this, x1, y));
564 y += button->get_h();
566 add_subwindow(button = new CWindowCameraTop(mwindow, this, x1, y));
567 x1 += button->get_w();
568 add_subwindow(button = new CWindowCameraMiddle(mwindow, this, x1, y));
569 x1 += button->get_w();
570 add_subwindow(button = new CWindowCameraBottom(mwindow, this, x1, y));
574 void CWindowCameraGUI::update_preview()
576 mwindow->restart_brender();
577 mwindow->sync_parameters(CHANGE_PARAMS);
579 mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
583 mwindow->cwindow->gui->lock_window("CWindowCameraGUI::update_preview");
584 mwindow->cwindow->gui->canvas->draw_refresh();
585 mwindow->cwindow->gui->unlock_window();
589 void CWindowCameraGUI::handle_event()
591 FloatAuto *x_auto = 0;
592 FloatAuto *y_auto = 0;
593 FloatAuto *z_auto = 0;
594 Track *track = mwindow->cwindow->calculate_affected_track();
597 if(event_caller == x)
599 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
600 track->automation->autos[AUTOMATION_CAMERA_X],
604 x_auto->value = atof(x->get_text());
609 if(event_caller == y)
611 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
612 track->automation->autos[AUTOMATION_CAMERA_Y],
616 y_auto->value = atof(y->get_text());
621 if(event_caller == z)
623 z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
624 track->automation->autos[AUTOMATION_CAMERA_Z],
628 float zoom = atof(z->get_text());
629 if(zoom > 10) zoom = 10;
631 if(zoom < 0) zoom = 0;
632 // Doesn't allow user to enter from scratch
633 // if(zoom != atof(z->get_text()))
636 z_auto->value = zoom;
637 mwindow->gui->lock_window("CWindowCameraGUI::handle_event");
638 mwindow->gui->canvas->draw_overlays();
639 mwindow->gui->canvas->flash();
640 mwindow->gui->unlock_window();
647 void CWindowCameraGUI::update()
649 FloatAuto *x_auto = 0;
650 FloatAuto *y_auto = 0;
651 FloatAuto *z_auto = 0;
652 Track *track = mwindow->cwindow->calculate_affected_track();
656 mwindow->cwindow->calculate_affected_autos(&x_auto,
667 x->update(x_auto->value);
669 y->update(y_auto->value);
671 z->update(z_auto->value);
674 // BezierAuto* CWindowCameraGUI::get_keyframe()
676 // BezierAuto *keyframe = 0;
677 // Track *track = mwindow->cwindow->calculate_affected_track();
679 // keyframe = (BezierAuto*)mwindow->cwindow->calculate_affected_auto(
680 // track->automation->autos[AUTOMATION_CAMERA]);
686 CWindowCameraLeft::CWindowCameraLeft(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
687 : BC_Button(x, y, mwindow->theme->get_image_set("left_justify"))
690 this->mwindow = mwindow;
691 set_tooltip(_("Left justify"));
693 int CWindowCameraLeft::handle_event()
695 FloatAuto *x_auto = 0;
696 FloatAuto *z_auto = 0;
697 Track *track = mwindow->cwindow->calculate_affected_track();
700 mwindow->cwindow->calculate_affected_autos(&x_auto,
713 track->get_source_dimensions(
714 mwindow->edl->local_session->get_selectionstart(1),
721 (double)track->track_w / z_auto->value / 2 -
724 gui->update_preview();
732 CWindowCameraCenter::CWindowCameraCenter(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
733 : BC_Button(x, y, mwindow->theme->get_image_set("center_justify"))
736 this->mwindow = mwindow;
737 set_tooltip(_("Center horizontal"));
739 int CWindowCameraCenter::handle_event()
741 FloatAuto *x_auto = 0;
742 Track *track = mwindow->cwindow->calculate_affected_track();
744 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
745 track->automation->autos[AUTOMATION_CAMERA_X],
752 gui->update_preview();
759 CWindowCameraRight::CWindowCameraRight(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
760 : BC_Button(x, y, mwindow->theme->get_image_set("right_justify"))
763 this->mwindow = mwindow;
764 set_tooltip(_("Right justify"));
766 int CWindowCameraRight::handle_event()
768 FloatAuto *x_auto = 0;
769 FloatAuto *z_auto = 0;
770 Track *track = mwindow->cwindow->calculate_affected_track();
773 mwindow->cwindow->calculate_affected_autos(&x_auto,
786 track->get_source_dimensions(
787 mwindow->edl->local_session->get_selectionstart(1),
793 x_auto->value = -((double)track->track_w / z_auto->value / 2 -
796 gui->update_preview();
804 CWindowCameraTop::CWindowCameraTop(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
805 : BC_Button(x, y, mwindow->theme->get_image_set("top_justify"))
808 this->mwindow = mwindow;
809 set_tooltip(_("Top justify"));
811 int CWindowCameraTop::handle_event()
813 FloatAuto *y_auto = 0;
814 FloatAuto *z_auto = 0;
815 Track *track = mwindow->cwindow->calculate_affected_track();
818 mwindow->cwindow->calculate_affected_autos(0,
831 track->get_source_dimensions(
832 mwindow->edl->local_session->get_selectionstart(1),
838 y_auto->value = (double)track->track_h / z_auto->value / 2 -
841 gui->update_preview();
849 CWindowCameraMiddle::CWindowCameraMiddle(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
850 : BC_Button(x, y, mwindow->theme->get_image_set("middle_justify"))
853 this->mwindow = mwindow;
854 set_tooltip(_("Center vertical"));
856 int CWindowCameraMiddle::handle_event()
858 FloatAuto *y_auto = 0;
859 Track *track = mwindow->cwindow->calculate_affected_track();
861 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
862 track->automation->autos[AUTOMATION_CAMERA_Y], 1);
868 gui->update_preview();
875 CWindowCameraBottom::CWindowCameraBottom(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
876 : BC_Button(x, y, mwindow->theme->get_image_set("bottom_justify"))
879 this->mwindow = mwindow;
880 set_tooltip(_("Bottom justify"));
882 int CWindowCameraBottom::handle_event()
884 FloatAuto *y_auto = 0;
885 FloatAuto *z_auto = 0;
886 Track *track = mwindow->cwindow->calculate_affected_track();
889 mwindow->cwindow->calculate_affected_autos(0,
902 track->get_source_dimensions(
903 mwindow->edl->local_session->get_selectionstart(1),
909 y_auto->value = -((double)track->track_h / z_auto->value / 2 -
912 gui->update_preview();
935 CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread)
936 : CWindowToolGUI(mwindow,
938 PROGRAM_NAME ": Projector",
943 CWindowProjectorGUI::~CWindowProjectorGUI()
946 void CWindowProjectorGUI::create_objects()
948 int x = 10, y = 10, x1;
949 Track *track = mwindow->cwindow->calculate_affected_track();
950 FloatAuto *x_auto = 0;
951 FloatAuto *y_auto = 0;
952 FloatAuto *z_auto = 0;
958 mwindow->cwindow->calculate_affected_autos(&x_auto,
968 add_subwindow(title = new BC_Title(x, y, _("X:")));
970 this->x = new CWindowCoord(this,
973 x_auto ? x_auto->value : (float)0);
974 this->x->create_objects();
977 add_subwindow(title = new BC_Title(x, y, _("Y:")));
979 this->y = new CWindowCoord(this,
982 y_auto ? y_auto->value : (float)0);
983 this->y->create_objects();
986 add_subwindow(title = new BC_Title(x, y, _("Z:")));
988 this->z = new CWindowCoord(this,
991 z_auto ? z_auto->value : (float)1);
992 this->z->create_objects();
996 add_subwindow(button = new CWindowProjectorLeft(mwindow, this, x1, y));
997 x1 += button->get_w();
998 add_subwindow(button = new CWindowProjectorCenter(mwindow, this, x1, y));
999 x1 += button->get_w();
1000 add_subwindow(button = new CWindowProjectorRight(mwindow, this, x1, y));
1002 y += button->get_h();
1004 add_subwindow(button = new CWindowProjectorTop(mwindow, this, x1, y));
1005 x1 += button->get_w();
1006 add_subwindow(button = new CWindowProjectorMiddle(mwindow, this, x1, y));
1007 x1 += button->get_w();
1008 add_subwindow(button = new CWindowProjectorBottom(mwindow, this, x1, y));
1012 void CWindowProjectorGUI::update_preview()
1014 mwindow->restart_brender();
1015 mwindow->sync_parameters(CHANGE_PARAMS);
1016 mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1020 mwindow->cwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
1021 mwindow->cwindow->gui->canvas->draw_refresh();
1022 mwindow->cwindow->gui->unlock_window();
1025 void CWindowProjectorGUI::handle_event()
1027 FloatAuto *x_auto = 0;
1028 FloatAuto *y_auto = 0;
1029 FloatAuto *z_auto = 0;
1030 Track *track = mwindow->cwindow->calculate_affected_track();
1034 if(event_caller == x)
1036 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1037 track->automation->autos[AUTOMATION_PROJECTOR_X],
1041 x_auto->value = atof(x->get_text());
1046 if(event_caller == y)
1048 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1049 track->automation->autos[AUTOMATION_PROJECTOR_Y],
1053 y_auto->value = atof(y->get_text());
1058 if(event_caller == z)
1060 z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1061 track->automation->autos[AUTOMATION_PROJECTOR_Z],
1065 float zoom = atof(z->get_text());
1066 if(zoom > 10000) zoom = 10000;
1068 if(zoom < 0) zoom = 0;
1069 // if (zoom != atof(z->get_text()))
1071 z_auto->value = zoom;
1073 mwindow->gui->lock_window("CWindowProjectorGUI::handle_event");
1074 mwindow->gui->canvas->draw_overlays();
1075 mwindow->gui->canvas->flash();
1076 mwindow->gui->unlock_window();
1084 void CWindowProjectorGUI::update()
1086 FloatAuto *x_auto = 0;
1087 FloatAuto *y_auto = 0;
1088 FloatAuto *z_auto = 0;
1089 Track *track = mwindow->cwindow->calculate_affected_track();
1093 mwindow->cwindow->calculate_affected_autos(&x_auto,
1104 x->update(x_auto->value);
1106 y->update(y_auto->value);
1108 z->update(z_auto->value);
1111 // BezierAuto* CWindowProjectorGUI::get_keyframe()
1113 // BezierAuto *keyframe = 0;
1114 // Track *track = mwindow->cwindow->calculate_affected_track();
1116 // keyframe = (BezierAuto*)mwindow->cwindow->calculate_affected_auto(
1117 // track->automation->autos[AUTOMATION_PROJECTOR]);
1158 CWindowProjectorLeft::CWindowProjectorLeft(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1159 : BC_Button(x, y, mwindow->theme->get_image_set("left_justify"))
1162 this->mwindow = mwindow;
1163 set_tooltip(_("Left justify"));
1165 int CWindowProjectorLeft::handle_event()
1167 FloatAuto *x_auto = 0;
1168 FloatAuto *z_auto = 0;
1169 Track *track = mwindow->cwindow->calculate_affected_track();
1172 mwindow->cwindow->calculate_affected_autos(&x_auto,
1181 if(x_auto && z_auto)
1183 x_auto->value = (double)track->track_w * z_auto->value / 2 -
1184 (double)mwindow->edl->session->output_w / 2;
1186 gui->update_preview();
1193 CWindowProjectorCenter::CWindowProjectorCenter(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1194 : BC_Button(x, y, mwindow->theme->get_image_set("center_justify"))
1197 this->mwindow = mwindow;
1198 set_tooltip(_("Center horizontal"));
1200 int CWindowProjectorCenter::handle_event()
1202 FloatAuto *x_auto = 0;
1203 Track *track = mwindow->cwindow->calculate_affected_track();
1205 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1206 track->automation->autos[AUTOMATION_PROJECTOR_X],
1213 gui->update_preview();
1220 CWindowProjectorRight::CWindowProjectorRight(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1221 : BC_Button(x, y, mwindow->theme->get_image_set("right_justify"))
1224 this->mwindow = mwindow;
1225 set_tooltip(_("Right justify"));
1227 int CWindowProjectorRight::handle_event()
1229 FloatAuto *x_auto = 0;
1230 FloatAuto *z_auto = 0;
1231 Track *track = mwindow->cwindow->calculate_affected_track();
1234 mwindow->cwindow->calculate_affected_autos(&x_auto,
1244 if(x_auto && z_auto)
1246 x_auto->value = -((double)track->track_w * z_auto->value / 2 -
1247 (double)mwindow->edl->session->output_w / 2);
1249 gui->update_preview();
1256 CWindowProjectorTop::CWindowProjectorTop(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1257 : BC_Button(x, y, mwindow->theme->get_image_set("top_justify"))
1260 this->mwindow = mwindow;
1261 set_tooltip(_("Top justify"));
1263 int CWindowProjectorTop::handle_event()
1265 FloatAuto *y_auto = 0;
1266 FloatAuto *z_auto = 0;
1267 Track *track = mwindow->cwindow->calculate_affected_track();
1270 mwindow->cwindow->calculate_affected_autos(0,
1280 if(y_auto && z_auto)
1282 y_auto->value = (double)track->track_h * z_auto->value / 2 -
1283 (double)mwindow->edl->session->output_h / 2;
1285 gui->update_preview();
1292 CWindowProjectorMiddle::CWindowProjectorMiddle(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1293 : BC_Button(x, y, mwindow->theme->get_image_set("middle_justify"))
1296 this->mwindow = mwindow;
1297 set_tooltip(_("Center vertical"));
1299 int CWindowProjectorMiddle::handle_event()
1301 FloatAuto *y_auto = 0;
1302 Track *track = mwindow->cwindow->calculate_affected_track();
1304 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1305 track->automation->autos[AUTOMATION_PROJECTOR_Y], 1);
1311 gui->update_preview();
1318 CWindowProjectorBottom::CWindowProjectorBottom(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1319 : BC_Button(x, y, mwindow->theme->get_image_set("bottom_justify"))
1322 this->mwindow = mwindow;
1323 set_tooltip(_("Bottom justify"));
1325 int CWindowProjectorBottom::handle_event()
1327 FloatAuto *y_auto = 0;
1328 FloatAuto *z_auto = 0;
1329 Track *track = mwindow->cwindow->calculate_affected_track();
1332 mwindow->cwindow->calculate_affected_autos(0,
1342 if(y_auto && z_auto)
1344 y_auto->value = -((double)track->track_h * z_auto->value / 2 -
1345 (double)mwindow->edl->session->output_h / 2);
1347 gui->update_preview();
1360 CWindowMaskMode::CWindowMaskMode(MWindow *mwindow,
1361 CWindowToolGUI *gui,
1371 this->mwindow = mwindow;
1375 void CWindowMaskMode::create_objects()
1377 add_item(new BC_MenuItem(mode_to_text(MASK_MULTIPLY_ALPHA)));
1378 add_item(new BC_MenuItem(mode_to_text(MASK_SUBTRACT_ALPHA)));
1381 char* CWindowMaskMode::mode_to_text(int mode)
1385 case MASK_MULTIPLY_ALPHA:
1386 return _("Multiply alpha");
1389 case MASK_SUBTRACT_ALPHA:
1390 return _("Subtract alpha");
1394 return _("Subtract alpha");
1397 int CWindowMaskMode::text_to_mode(char *text)
1399 if(!strcasecmp(text, _("Multiply alpha")))
1400 return MASK_MULTIPLY_ALPHA;
1402 if(!strcasecmp(text, _("Subtract alpha")))
1403 return MASK_SUBTRACT_ALPHA;
1405 return MASK_SUBTRACT_ALPHA;
1408 int CWindowMaskMode::handle_event()
1414 ((CWindowMaskGUI*)gui)->get_keyframe(track,
1422 ((MaskAuto*)track->automation->autos[AUTOMATION_MASK]->default_auto)->mode =
1423 text_to_mode(get_text());
1426 //printf("CWindowMaskMode::handle_event 1\n");
1427 gui->update_preview();
1438 CWindowMaskDelete::CWindowMaskDelete(MWindow *mwindow,
1439 CWindowToolGUI *gui,
1442 : BC_GenericButton(x, y, _("Delete"))
1444 this->mwindow = mwindow;
1448 int CWindowMaskDelete::handle_event()
1451 Track *track = mwindow->cwindow->calculate_affected_track();
1458 MaskAutos *mask_autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK];
1459 for(MaskAuto *current = (MaskAuto*)mask_autos->default_auto;
1462 SubMask *submask = current->get_submask(mwindow->edl->session->cwindow_mask);
1466 for(int i = mwindow->cwindow->gui->affected_point;
1467 i < submask->points.total - 1;
1470 *submask->points.values[i] = *submask->points.values[i + 1];
1473 if(submask->points.total)
1475 submask->points.remove_object(
1476 submask->points.values[submask->points.total - 1]);
1480 if(current == (MaskAuto*)mask_autos->default_auto)
1481 current = (MaskAuto*)mask_autos->first;
1483 current = (MaskAuto*)NEXT;
1486 gui->update_preview();
1490 // ((CWindowMaskGUI*)gui)->get_keyframe(track,
1496 // Need to apply to every keyframe
1500 // for(int i = mwindow->cwindow->gui->affected_point;
1501 // i < mask->points.total - 1;
1504 // *mask->points.values[i] = *mask->points.values[i + 1];
1507 // if(mask->points.total)
1509 // mask->points.remove_object(mask->points.values[mask->points.total - 1]);
1513 // gui->update_preview();
1519 int CWindowMaskDelete::keypress_event()
1521 if(get_keypress() == BACKSPACE ||
1522 get_keypress() == DELETE)
1523 return handle_event();
1528 CWindowMaskCycleNext::CWindowMaskCycleNext(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1529 : BC_GenericButton(x, y, _("Cycle next"))
1531 this->mwindow = mwindow;
1534 int CWindowMaskCycleNext::handle_event()
1540 ((CWindowMaskGUI*)gui)->get_keyframe(track,
1548 // Should apply to all keyframes
1549 if(keyframe && mask->points.total)
1551 temp = mask->points.values[0];
1553 for(int i = 0; i < mask->points.total - 1; i++)
1555 mask->points.values[i] = mask->points.values[i + 1];
1557 mask->points.values[mask->points.total - 1] = temp;
1559 mwindow->cwindow->gui->affected_point--;
1560 if(mwindow->cwindow->gui->affected_point < 0)
1561 mwindow->cwindow->gui->affected_point = mask->points.total - 1;
1564 gui->update_preview();
1570 CWindowMaskCyclePrev::CWindowMaskCyclePrev(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1571 : BC_GenericButton(x, y, _("Cycle prev"))
1573 this->mwindow = mwindow;
1576 int CWindowMaskCyclePrev::handle_event()
1582 ((CWindowMaskGUI*)gui)->get_keyframe(track,
1588 // Should apply to all keyframes
1590 if(keyframe && mask->points.total)
1592 temp = mask->points.values[mask->points.total - 1];
1594 for(int i = mask->points.total - 1; i > 0; i--)
1596 mask->points.values[i] = mask->points.values[i - 1];
1598 mask->points.values[0] = temp;
1600 mwindow->cwindow->gui->affected_point++;
1601 if(mwindow->cwindow->gui->affected_point >= mask->points.total)
1602 mwindow->cwindow->gui->affected_point = 0;
1605 gui->update_preview();
1611 CWindowMaskNumber::CWindowMaskNumber(MWindow *mwindow,
1612 CWindowToolGUI *gui,
1615 : BC_TumbleTextBox(gui,
1616 (int64_t)mwindow->edl->session->cwindow_mask,
1618 (int64_t)SUBMASKS - 1,
1623 this->mwindow = mwindow;
1627 CWindowMaskNumber::~CWindowMaskNumber()
1631 int CWindowMaskNumber::handle_event()
1633 mwindow->edl->session->cwindow_mask = atol(get_text());
1635 gui->update_preview();
1643 CWindowMaskFeather::CWindowMaskFeather(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1644 : BC_TumbleTextBox(gui,
1652 this->mwindow = mwindow;
1655 CWindowMaskFeather::~CWindowMaskFeather()
1658 int CWindowMaskFeather::handle_event()
1664 ((CWindowMaskGUI*)gui)->get_keyframe(track,
1670 keyframe->feather = atof(get_text());
1671 gui->update_preview();
1675 CWindowMaskValue::CWindowMaskValue(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1685 this->mwindow = mwindow;
1689 CWindowMaskValue::~CWindowMaskValue()
1693 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();