3 * Copyright (C) 2008-2017 Adam Williams <broadcast at earthling dot net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #include "automation.h"
27 #include "condition.h"
29 #include "cplayback.h"
31 #include "cwindowgui.h"
32 #include "cwindowtool.h"
34 #include "edlsession.h"
35 #include "floatauto.h"
36 #include "floatautos.h"
39 #include "localsession.h"
40 #include "mainsession.h"
43 #include "maskautos.h"
46 #include "mwindowgui.h"
49 #include "trackcanvas.h"
50 #include "transportque.h"
53 CWindowTool::CWindowTool(MWindow *mwindow, CWindowGUI *gui)
56 this->mwindow = mwindow;
60 current_tool = CWINDOW_NONE;
62 input_lock = new Condition(0, "CWindowTool::input_lock");
63 output_lock = new Condition(1, "CWindowTool::output_lock");
64 tool_gui_lock = new Mutex("CWindowTool::tool_gui_lock");
67 CWindowTool::~CWindowTool()
78 void CWindowTool::start_tool(int operation)
80 CWindowToolGUI *new_gui = 0;
83 //printf("CWindowTool::start_tool 1\n");
84 if(current_tool != operation)
86 current_tool = operation;
90 new_gui = new CWindowEyedropGUI(mwindow, this);
93 new_gui = new CWindowCropGUI(mwindow, this);
96 new_gui = new CWindowCameraGUI(mwindow, this);
98 case CWINDOW_PROJECTOR:
99 new_gui = new CWindowProjectorGUI(mwindow, this);
102 new_gui = new CWindowMaskGUI(mwindow, this);
105 new_gui = new CWindowRulerGUI(mwindow, this);
113 //printf("CWindowTool::start_tool 1\n");
119 // Wait for previous tool GUI to finish
120 output_lock->lock("CWindowTool::start_tool");
121 this->tool_gui = new_gui;
122 tool_gui->create_objects();
124 if(mwindow->edl->session->tool_window &&
125 mwindow->session->show_cwindow) tool_gui->show_window();
126 tool_gui->lock_window("CWindowTool::start_tool 1");
128 tool_gui->unlock_window();
131 // Signal thread to run next tool GUI
132 input_lock->unlock();
134 //printf("CWindowTool::start_tool 1\n");
139 tool_gui->lock_window("CWindowTool::start_tool");
141 tool_gui->unlock_window();
144 //printf("CWindowTool::start_tool 2\n");
149 void CWindowTool::stop_tool()
153 tool_gui->lock_window("CWindowTool::stop_tool");
154 tool_gui->set_done(0);
155 tool_gui->unlock_window();
159 void CWindowTool::show_tool()
161 if(tool_gui && mwindow->edl->session->tool_window)
163 tool_gui->lock_window("CWindowTool::show_tool");
164 tool_gui->show_window();
165 tool_gui->unlock_window();
169 void CWindowTool::hide_tool()
171 if(tool_gui && mwindow->edl->session->tool_window)
173 tool_gui->lock_window("CWindowTool::show_tool");
174 tool_gui->hide_window();
175 tool_gui->unlock_window();
180 void CWindowTool::run()
184 input_lock->lock("CWindowTool::run");
187 tool_gui->run_window();
188 tool_gui_lock->lock("CWindowTool::run");
191 tool_gui_lock->unlock();
193 output_lock->unlock();
197 void CWindowTool::update_show_window()
201 tool_gui->lock_window("CWindowTool::update_show_window");
203 if(mwindow->edl->session->tool_window)
206 tool_gui->show_window();
209 tool_gui->hide_window();
212 tool_gui->unlock_window();
216 void CWindowTool::raise_window()
220 gui->unlock_window();
221 tool_gui->lock_window("CWindowTool::raise_window");
222 tool_gui->raise_window();
223 tool_gui->unlock_window();
224 gui->lock_window("CWindowTool::raise_window");
228 void CWindowTool::update_values()
230 tool_gui_lock->lock("CWindowTool::update_values");
233 tool_gui->lock_window("CWindowTool::update_values");
236 tool_gui->unlock_window();
238 tool_gui_lock->unlock();
247 CWindowToolGUI::CWindowToolGUI(MWindow *mwindow,
253 mwindow->session->ctool_x,
254 mwindow->session->ctool_y,
263 this->mwindow = mwindow;
264 this->thread = thread;
265 current_operation = 0;
268 CWindowToolGUI::~CWindowToolGUI()
272 int CWindowToolGUI::close_event()
276 mwindow->edl->session->tool_window = 0;
281 thread->gui->lock_window("CWindowToolGUI::close_event");
282 thread->gui->composite_panel->set_operation(mwindow->edl->session->cwindow_operation);
283 thread->gui->flush();
284 thread->gui->unlock_window();
286 lock_window("CWindowToolGUI::close_event");
290 int CWindowToolGUI::keypress_event()
292 if(get_keypress() == 'w' || get_keypress() == 'W')
293 return close_event();
297 int CWindowToolGUI::translation_event()
299 mwindow->session->ctool_x = get_x();
300 mwindow->session->ctool_y = get_y();
309 CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value, int log_increment = 0)
310 : BC_TumbleTextBox(gui, (float)value, (float)-65536, (float)65536, x, y, 100)
313 set_log_floatincrement(log_increment);
316 CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, int value)
317 : BC_TumbleTextBox(gui, (int64_t)value, (int64_t)-65536, (int64_t)65536, x, y, 100)
321 int CWindowCoord::handle_event()
323 gui->event_caller = this;
329 CWindowCropOK::CWindowCropOK(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
330 : BC_GenericButton(x, y, _("Do it"))
332 this->mwindow = mwindow;
335 int CWindowCropOK::handle_event()
337 mwindow->crop_video();
342 int CWindowCropOK::keypress_event()
344 if(get_keypress() == 0xd)
358 CWindowCropGUI::CWindowCropGUI(MWindow *mwindow, CWindowTool *thread)
359 : CWindowToolGUI(mwindow,
361 _(PROGRAM_NAME ": Crop"),
368 CWindowCropGUI::~CWindowCropGUI()
372 void CWindowCropGUI::create_objects()
377 lock_window("CWindowCropGUI::create_objects");
379 int pad = MAX(BC_TextBox::calculate_h(this, MEDIUMFONT, 1, 1),
380 BC_Title::calculate_h(this, "X")) + 5;
381 add_subwindow(title = new BC_Title(x, y, "X1:"));
382 column1 = MAX(column1, title->get_w());
384 add_subwindow(title = new BC_Title(x, y, _("W:")));
385 column1 = MAX(column1, title->get_w());
387 add_subwindow(new CWindowCropOK(mwindow, thread->tool_gui, x, y));
391 x1 = new CWindowCoord(thread->tool_gui, x, y,
392 mwindow->edl->session->crop_x1);
393 x1->create_objects();
395 width = new CWindowCoord(thread->tool_gui, x, y,
396 mwindow->edl->session->crop_x2 - mwindow->edl->session->crop_x1);
397 width->create_objects();
400 x += x1->get_w() + 10;
403 add_subwindow(title = new BC_Title(x, y, "Y1:"));
404 column2 = MAX(column2, title->get_w());
406 add_subwindow(title = new BC_Title(x, y, _("H:")));
407 column2 = MAX(column2, title->get_w());
412 y1 = new CWindowCoord(thread->tool_gui, x, y,
413 mwindow->edl->session->crop_y1);
414 y1->create_objects();
416 height = new CWindowCoord(thread->tool_gui, x, y,
417 mwindow->edl->session->crop_y2 - mwindow->edl->session->crop_y1);
418 height->create_objects();
422 void CWindowCropGUI::handle_event()
425 new_x1 = atol(x1->get_text());
426 new_y1 = atol(y1->get_text());
427 if(new_x1 != mwindow->edl->session->crop_x1)
429 mwindow->edl->session->crop_x2 = new_x1 +
430 mwindow->edl->session->crop_x2 -
431 mwindow->edl->session->crop_x1;
432 mwindow->edl->session->crop_x1 = new_x1;
434 if(new_y1 != mwindow->edl->session->crop_y1)
436 mwindow->edl->session->crop_y2 = new_y1 +
437 mwindow->edl->session->crop_y2 -
438 mwindow->edl->session->crop_y1;
439 mwindow->edl->session->crop_y1 = atol(y1->get_text());
441 mwindow->edl->session->crop_x2 = atol(width->get_text()) +
442 mwindow->edl->session->crop_x1;
443 mwindow->edl->session->crop_y2 = atol(height->get_text()) +
444 mwindow->edl->session->crop_y1;
446 mwindow->cwindow->gui->lock_window("CWindowCropGUI::handle_event");
447 mwindow->cwindow->gui->canvas->draw_refresh();
448 mwindow->cwindow->gui->unlock_window();
451 void CWindowCropGUI::update()
453 x1->update((int64_t)mwindow->edl->session->crop_x1);
454 y1->update((int64_t)mwindow->edl->session->crop_y1);
455 width->update((int64_t)mwindow->edl->session->crop_x2 -
456 mwindow->edl->session->crop_x1);
457 height->update((int64_t)mwindow->edl->session->crop_y2 -
458 mwindow->edl->session->crop_y1);
462 CWindowEyedropGUI::CWindowEyedropGUI(MWindow *mwindow, CWindowTool *thread)
463 : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Color"), 220, 290)
467 CWindowEyedropGUI::~CWindowEyedropGUI()
471 void CWindowEyedropGUI::create_objects()
473 int margin = mwindow->theme->widget_border;
476 int x2 = 70, x3 = x2 + 60;
477 lock_window("CWindowEyedropGUI::create_objects");
478 BC_Title *title0, *title1, *title2, *title3, *title4, *title5, *title6, *title7;
479 add_subwindow(title0 = new BC_Title(x, y,_("X,Y:")));
480 y += title0->get_h() + margin;
481 add_subwindow(title7 = new BC_Title(x, y, _("Radius:")));
482 y += BC_TextBox::calculate_h(this, MEDIUMFONT, 1, 1) + margin;
484 add_subwindow(title1 = new BC_Title(x, y, _("Red:")));
485 y += title1->get_h() + margin;
486 add_subwindow(title2 = new BC_Title(x, y, _("Green:")));
487 y += title2->get_h() + margin;
488 add_subwindow(title3 = new BC_Title(x, y, _("Blue:")));
489 y += title3->get_h() + margin;
491 add_subwindow(title4 = new BC_Title(x, y, "Y:"));
492 y += title4->get_h() + margin;
493 add_subwindow(title5 = new BC_Title(x, y, "U:"));
494 y += title5->get_h() + margin;
495 add_subwindow(title6 = new BC_Title(x, y, "V:"));
497 add_subwindow(current = new BC_Title(x2, title0->get_y(), ""));
499 radius = new CWindowCoord(this, x2, title7->get_y(),
500 mwindow->edl->session->eyedrop_radius);
501 radius->create_objects();
502 radius->set_boundaries((int64_t)0, (int64_t)255);
504 add_subwindow(red = new BC_Title(x2, title1->get_y(), "0"));
505 add_subwindow(green = new BC_Title(x2, title2->get_y(), "0"));
506 add_subwindow(blue = new BC_Title(x2, title3->get_y(), "0"));
507 add_subwindow(rgb_hex = new BC_Title(x3, red->get_y(), "#000000"));
509 add_subwindow(this->y = new BC_Title(x2, title4->get_y(), "0"));
510 add_subwindow(this->u = new BC_Title(x2, title5->get_y(), "0"));
511 add_subwindow(this->v = new BC_Title(x2, title6->get_y(), "0"));
512 add_subwindow(yuv_hex = new BC_Title(x3, this->y->get_y(), "#000000"));
514 y = title6->get_y() + this->v->get_h() + 2*margin;
515 add_subwindow(sample = new BC_SubWindow(x, y, 50, 50));
516 y += sample->get_h() + margin;
517 add_subwindow(use_max = new CWindowEyedropCheckBox(mwindow, this, x, y));
522 void CWindowEyedropGUI::update()
524 char string[BCTEXTLEN];
525 sprintf(string, "%d, %d",
526 thread->gui->eyedrop_x,
527 thread->gui->eyedrop_y);
528 current->update(string);
530 radius->update((int64_t)mwindow->edl->session->eyedrop_radius);
532 LocalSession *local_session = mwindow->edl->local_session;
533 int use_max = local_session->use_max;
534 float r = use_max ? local_session->red_max : local_session->red;
535 float g = use_max ? local_session->green_max : local_session->green;
536 float b = use_max ? local_session->blue_max : local_session->blue;
537 this->red->update(r);
538 this->green->update(g);
539 this->blue->update(b);
541 int rx = 255*r + 0.5; bclamp(rx,0,255);
542 int gx = 255*g + 0.5; bclamp(gx,0,255);
543 int bx = 255*b + 0.5; bclamp(bx,0,255);
544 char rgb_text[BCSTRLEN];
545 sprintf(rgb_text, "#%02x%02x%02x", rx, gx, bx);
546 rgb_hex->update(rgb_text);
549 YUV::rgb_to_yuv_f(r, g, b, y, u, v);
551 this->u->update(u); u += 0.5;
552 this->v->update(v); v += 0.5;
554 int yx = 255*y + 0.5; bclamp(yx,0,255);
555 int ux = 255*u + 0.5; bclamp(ux,0,255);
556 int vx = 255*v + 0.5; bclamp(vx,0,255);
557 char yuv_text[BCSTRLEN];
558 sprintf(yuv_text, "#%02x%02x%02x", yx, ux, vx);
559 yuv_hex->update(yuv_text);
561 int rgb = (rx << 16) | (gx << 8) | (bx << 0);
562 sample->set_color(rgb);
563 sample->draw_box(0, 0, sample->get_w(), sample->get_h());
564 sample->set_color(BLACK);
565 sample->draw_rectangle(0, 0, sample->get_w(), sample->get_h());
569 void CWindowEyedropGUI::handle_event()
571 int new_radius = atoi(radius->get_text());
572 if(new_radius != mwindow->edl->session->eyedrop_radius)
574 CWindowGUI *gui = mwindow->cwindow->gui;
575 if(gui->eyedrop_visible)
577 gui->lock_window("CWindowEyedropGUI::handle_event");
580 gui->canvas->do_eyedrop(rerender, 0, 1);
583 mwindow->edl->session->eyedrop_radius = new_radius;
585 if(gui->eyedrop_visible)
589 gui->canvas->do_eyedrop(rerender, 0, 1);
590 gui->unlock_window();
597 /* Buttons to control Keyframe-Curve-Mode for Projector or Camera */
599 // Configuration for all possible Keyframe Curve Mode toggles
601 FloatAuto::t_mode mode;
607 const _CVD Camera_Crv_Smooth =
611 N_("\"smooth\" Curve on current Camera Keyframes")
613 const _CVD Camera_Crv_Linear =
617 N_("\"linear\" Curve on current Camera Keyframes")
619 const _CVD Projector_Crv_Smooth =
623 N_("\"smooth\" Curve on current Projector Keyframes")
625 const _CVD Projector_Crv_Linear =
629 N_("\"linear\" Curve on current Projector Keyframes")
632 // Implementation Class für Keyframe Curve Mode buttons
634 // This button reflects the state of the "current" keyframe
635 // (the nearest keyframe on the left) for all three automation
636 // lines together. Clicking on this button (re)sets the curve
637 // mode for the three "current" keyframes simultanously, but
638 // never creates a new keyframe.
640 class CWindowCurveToggle : public BC_Toggle
643 CWindowCurveToggle(_CVD mode, MWindow *mwindow, CWindowToolGUI *gui, int x, int y);
644 void check_toggle_state(FloatAuto *x, FloatAuto *y, FloatAuto *z);
653 CWindowCurveToggle::CWindowCurveToggle(_CVD mode, MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
654 : BC_Toggle(x, y, mwindow->theme->get_image_set(mode.icon_id), false),
658 this->mwindow = mwindow;
659 set_tooltip(_(cfg.tooltip));
662 void CWindowCurveToggle::check_toggle_state(FloatAuto *x, FloatAuto *y, FloatAuto *z)
664 // the toggle state is only set to ON if all
665 // three automation lines have the same curve mode.
666 // For mixed states the toggle stays off.
667 set_value( x->curve_mode == this->cfg.mode &&
668 y->curve_mode == this->cfg.mode &&
669 z->curve_mode == this->cfg.mode
670 ,true // redraw to show new state
674 int CWindowCurveToggle::handle_event()
676 FloatAuto *x=0, *y=0, *z=0;
677 Track *track = mwindow->cwindow->calculate_affected_track();
680 { mwindow->cwindow->calculate_affected_autos(&x, &y, &z,
681 track, cfg.use_camera, 0,0,0); // don't create new keyframe
683 if(x) x->change_curve_mode(cfg.mode);
684 if(y) y->change_curve_mode(cfg.mode);
685 if(z) z->change_curve_mode(cfg.mode);
688 gui->update_preview();
695 CWindowEyedropCheckBox::CWindowEyedropCheckBox(MWindow *mwindow,
696 CWindowEyedropGUI *gui, int x, int y)
697 : BC_CheckBox(x, y, mwindow->edl->local_session->use_max, _("Use maximum"))
699 this->mwindow = mwindow;
703 int CWindowEyedropCheckBox::handle_event()
705 mwindow->edl->local_session->use_max = get_value();
712 CWindowCameraGUI::CWindowCameraGUI(MWindow *mwindow, CWindowTool *thread)
713 : CWindowToolGUI(mwindow,
715 _(PROGRAM_NAME ": Camera"),
720 CWindowCameraGUI::~CWindowCameraGUI()
724 void CWindowCameraGUI::create_objects()
726 int x = 10, y = 10, x1;
727 Track *track = mwindow->cwindow->calculate_affected_track();
728 FloatAuto *x_auto = 0;
729 FloatAuto *y_auto = 0;
730 FloatAuto *z_auto = 0;
734 lock_window("CWindowCameraGUI::create_objects");
737 mwindow->cwindow->calculate_affected_autos(&x_auto,
738 &y_auto, &z_auto, track, 1, 0, 0, 0);
741 add_subwindow(title = new BC_Title(x, y, "X:"));
743 this->x = new CWindowCoord(this, x, y,
744 x_auto ? x_auto->get_value() : (float)0);
745 this->x->create_objects();
750 add_subwindow(title = new BC_Title(x, y, "Y:"));
752 this->y = new CWindowCoord(this, x, y,
753 y_auto ? y_auto->get_value() : (float)0);
754 this->y->create_objects();
757 add_subwindow(title = new BC_Title(x, y, "Z:"));
759 this->z = new CWindowCoord(this, x, y,
760 z_auto ? z_auto->get_value() : (float)1);
761 this->z->create_objects();
762 this->z->set_increment(0.01);
766 add_subwindow(button = new CWindowCameraLeft(mwindow, this, x1, y));
767 x1 += button->get_w();
768 add_subwindow(button = new CWindowCameraCenter(mwindow, this, x1, y));
769 x1 += button->get_w();
770 add_subwindow(button = new CWindowCameraRight(mwindow, this, x1, y));
772 y += button->get_h();
774 add_subwindow(button = new CWindowCameraTop(mwindow, this, x1, y));
775 x1 += button->get_w();
776 add_subwindow(button = new CWindowCameraMiddle(mwindow, this, x1, y));
777 x1 += button->get_w();
778 add_subwindow(button = new CWindowCameraBottom(mwindow, this, x1, y));
779 // additional Buttons to control the curve mode of the "current" keyframe
780 x1 += button->get_w() + 15;
781 add_subwindow(this->t_smooth = new CWindowCurveToggle(Camera_Crv_Smooth, mwindow, this, x1, y));
782 x1 += button->get_w();
783 add_subwindow(this->t_linear = new CWindowCurveToggle(Camera_Crv_Linear, mwindow, this, x1, y));
785 // fill in current auto keyframe values, set toggle states.
790 void CWindowCameraGUI::update_preview()
792 mwindow->gui->lock_window("CWindowCameraGUI::update_preview");
793 mwindow->restart_brender();
794 mwindow->gui->draw_overlays(1);
795 mwindow->sync_parameters(CHANGE_PARAMS);
796 mwindow->gui->unlock_window();
797 mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
798 CHANGE_NONE, mwindow->edl, 1);
799 mwindow->cwindow->gui->lock_window("CWindowCameraGUI::update_preview");
800 mwindow->cwindow->gui->canvas->draw_refresh();
801 mwindow->cwindow->gui->unlock_window();
805 void CWindowCameraGUI::handle_event()
807 FloatAuto *x_auto = 0;
808 FloatAuto *y_auto = 0;
809 FloatAuto *z_auto = 0;
810 Track *track = mwindow->cwindow->calculate_affected_track();
813 mwindow->undo->update_undo_before(_("camera"), this);
814 if(event_caller == x)
816 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
817 track->automation->autos[AUTOMATION_CAMERA_X],
821 x_auto->set_value(atof(x->get_text()));
827 if(event_caller == y)
829 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
830 track->automation->autos[AUTOMATION_CAMERA_Y],
834 y_auto->set_value(atof(y->get_text()));
840 if(event_caller == z)
842 z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
843 track->automation->autos[AUTOMATION_CAMERA_Z],
847 float zoom = atof(z->get_text());
848 if(zoom > 100.) zoom = 100.;
850 if(zoom < 0.01) zoom = 0.01;
851 // Doesn't allow user to enter from scratch
852 // if(zoom != atof(z->get_text()))
855 z_auto->set_value(zoom);
856 mwindow->gui->lock_window("CWindowCameraGUI::handle_event");
857 mwindow->gui->draw_overlays(1);
858 mwindow->gui->unlock_window();
864 mwindow->undo->update_undo_after(_("camera"), LOAD_ALL);
868 void CWindowCameraGUI::update()
870 FloatAuto *x_auto = 0;
871 FloatAuto *y_auto = 0;
872 FloatAuto *z_auto = 0;
873 Track *track = mwindow->cwindow->calculate_affected_track();
877 mwindow->cwindow->calculate_affected_autos(&x_auto,
888 x->update(x_auto->get_value());
890 y->update(y_auto->get_value());
892 float value = z_auto->get_value();
894 thread->gui->composite_panel->cpanel_zoom->update(value);
897 if( x_auto && y_auto && z_auto )
899 t_smooth->check_toggle_state(x_auto, y_auto, z_auto);
900 t_linear->check_toggle_state(x_auto, y_auto, z_auto);
907 CWindowCameraLeft::CWindowCameraLeft(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
908 : BC_Button(x, y, mwindow->theme->get_image_set("left_justify"))
911 this->mwindow = mwindow;
912 set_tooltip(_("Left justify"));
914 int CWindowCameraLeft::handle_event()
916 FloatAuto *x_auto = 0;
917 FloatAuto *z_auto = 0;
918 Track *track = mwindow->cwindow->calculate_affected_track();
921 mwindow->cwindow->calculate_affected_autos(&x_auto,
934 track->get_source_dimensions(
935 mwindow->edl->local_session->get_selectionstart(1),
941 mwindow->undo->update_undo_before(_("camera"), 0);
943 (double)track->track_w / z_auto->get_value() / 2 -
945 mwindow->undo->update_undo_after(_("camera"), LOAD_ALL);
947 gui->update_preview();
955 CWindowCameraCenter::CWindowCameraCenter(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
956 : BC_Button(x, y, mwindow->theme->get_image_set("center_justify"))
959 this->mwindow = mwindow;
960 set_tooltip(_("Center horizontal"));
962 int CWindowCameraCenter::handle_event()
964 FloatAuto *x_auto = 0;
965 Track *track = mwindow->cwindow->calculate_affected_track();
967 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
968 track->automation->autos[AUTOMATION_CAMERA_X],
973 mwindow->undo->update_undo_before(_("camera"), 0);
974 x_auto->set_value(0);
976 gui->update_preview();
977 mwindow->undo->update_undo_after(_("camera"), LOAD_ALL);
984 CWindowCameraRight::CWindowCameraRight(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
985 : BC_Button(x, y, mwindow->theme->get_image_set("right_justify"))
988 this->mwindow = mwindow;
989 set_tooltip(_("Right justify"));
991 int CWindowCameraRight::handle_event()
993 FloatAuto *x_auto = 0;
994 FloatAuto *z_auto = 0;
995 Track *track = mwindow->cwindow->calculate_affected_track();
998 mwindow->cwindow->calculate_affected_autos(&x_auto,
1008 if(x_auto && z_auto)
1011 track->get_source_dimensions(
1012 mwindow->edl->local_session->get_selectionstart(1),
1018 mwindow->undo->update_undo_before(_("camera"), 0);
1019 x_auto->set_value( -((double)track->track_w / z_auto->get_value() / 2 -
1022 gui->update_preview();
1023 mwindow->undo->update_undo_after(_("camera"), LOAD_ALL);
1031 CWindowCameraTop::CWindowCameraTop(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
1032 : BC_Button(x, y, mwindow->theme->get_image_set("top_justify"))
1035 this->mwindow = mwindow;
1036 set_tooltip(_("Top justify"));
1038 int CWindowCameraTop::handle_event()
1040 FloatAuto *y_auto = 0;
1041 FloatAuto *z_auto = 0;
1042 Track *track = mwindow->cwindow->calculate_affected_track();
1045 mwindow->cwindow->calculate_affected_autos(0,
1055 if(y_auto && z_auto)
1058 track->get_source_dimensions(
1059 mwindow->edl->local_session->get_selectionstart(1),
1065 mwindow->undo->update_undo_before(_("camera"), 0);
1066 y_auto->set_value((double)track->track_h / z_auto->get_value() / 2 -
1069 gui->update_preview();
1070 mwindow->undo->update_undo_after(_("camera"), LOAD_ALL);
1078 CWindowCameraMiddle::CWindowCameraMiddle(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
1079 : BC_Button(x, y, mwindow->theme->get_image_set("middle_justify"))
1082 this->mwindow = mwindow;
1083 set_tooltip(_("Center vertical"));
1085 int CWindowCameraMiddle::handle_event()
1087 FloatAuto *y_auto = 0;
1088 Track *track = mwindow->cwindow->calculate_affected_track();
1090 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1091 track->automation->autos[AUTOMATION_CAMERA_Y], 1);
1095 mwindow->undo->update_undo_before(_("camera"), 0);
1096 y_auto->set_value(0);
1098 gui->update_preview();
1099 mwindow->undo->update_undo_after(_("camera"), LOAD_ALL);
1106 CWindowCameraBottom::CWindowCameraBottom(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
1107 : BC_Button(x, y, mwindow->theme->get_image_set("bottom_justify"))
1110 this->mwindow = mwindow;
1111 set_tooltip(_("Bottom justify"));
1113 int CWindowCameraBottom::handle_event()
1115 FloatAuto *y_auto = 0;
1116 FloatAuto *z_auto = 0;
1117 Track *track = mwindow->cwindow->calculate_affected_track();
1120 mwindow->cwindow->calculate_affected_autos(0,
1130 if(y_auto && z_auto)
1133 track->get_source_dimensions(
1134 mwindow->edl->local_session->get_selectionstart(1),
1140 mwindow->undo->update_undo_before(_("camera"), 0);
1141 y_auto->set_value(-((double)track->track_h / z_auto->get_value() / 2 -
1144 gui->update_preview();
1145 mwindow->undo->update_undo_after(_("camera"), LOAD_ALL);
1153 CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread)
1154 : CWindowToolGUI(mwindow,
1156 _(PROGRAM_NAME ": Projector"),
1161 CWindowProjectorGUI::~CWindowProjectorGUI()
1164 void CWindowProjectorGUI::create_objects()
1166 int x = 10, y = 10, x1;
1167 Track *track = mwindow->cwindow->calculate_affected_track();
1168 FloatAuto *x_auto = 0;
1169 FloatAuto *y_auto = 0;
1170 FloatAuto *z_auto = 0;
1174 lock_window("CWindowProjectorGUI::create_objects");
1177 mwindow->cwindow->calculate_affected_autos(&x_auto,
1187 add_subwindow(title = new BC_Title(x, y, "X:"));
1188 x += title->get_w();
1189 this->x = new CWindowCoord(this, x, y,
1190 x_auto ? x_auto->get_value() : (float)0);
1191 this->x->create_objects();
1194 add_subwindow(title = new BC_Title(x, y, "Y:"));
1195 x += title->get_w();
1196 this->y = new CWindowCoord(this, x, y,
1197 y_auto ? y_auto->get_value() : (float)0);
1198 this->y->create_objects();
1201 add_subwindow(title = new BC_Title(x, y, "Z:"));
1202 x += title->get_w();
1203 this->z = new CWindowCoord(this, x, y,
1204 z_auto ? z_auto->get_value() : (float)1);
1205 this->z->create_objects();
1206 this->z->set_increment(0.01);
1210 add_subwindow(button = new CWindowProjectorLeft(mwindow, this, x1, y));
1211 x1 += button->get_w();
1212 add_subwindow(button = new CWindowProjectorCenter(mwindow, this, x1, y));
1213 x1 += button->get_w();
1214 add_subwindow(button = new CWindowProjectorRight(mwindow, this, x1, y));
1216 y += button->get_h();
1218 add_subwindow(button = new CWindowProjectorTop(mwindow, this, x1, y));
1219 x1 += button->get_w();
1220 add_subwindow(button = new CWindowProjectorMiddle(mwindow, this, x1, y));
1221 x1 += button->get_w();
1222 add_subwindow(button = new CWindowProjectorBottom(mwindow, this, x1, y));
1224 // additional Buttons to control the curve mode of the "current" keyframe
1225 x1 += button->get_w() + 15;
1226 add_subwindow(this->t_smooth = new CWindowCurveToggle(Projector_Crv_Smooth, mwindow, this, x1, y));
1227 x1 += button->get_w();
1228 add_subwindow(this->t_linear = new CWindowCurveToggle(Projector_Crv_Linear, mwindow, this, x1, y));
1230 // fill in current auto keyframe values, set toggle states.
1235 void CWindowProjectorGUI::update_preview()
1237 mwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
1238 mwindow->restart_brender();
1239 mwindow->sync_parameters(CHANGE_PARAMS);
1240 mwindow->gui->draw_overlays(1);
1241 mwindow->gui->unlock_window();
1242 mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1243 CHANGE_NONE, mwindow->edl, 1);
1244 mwindow->cwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
1245 mwindow->cwindow->gui->canvas->draw_refresh();
1246 mwindow->cwindow->gui->unlock_window();
1249 void CWindowProjectorGUI::handle_event()
1251 FloatAuto *x_auto = 0;
1252 FloatAuto *y_auto = 0;
1253 FloatAuto *z_auto = 0;
1254 Track *track = mwindow->cwindow->calculate_affected_track();
1258 mwindow->undo->update_undo_before(_("projector"), this);
1259 if(event_caller == x)
1261 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1262 track->automation->autos[AUTOMATION_PROJECTOR_X],
1266 x_auto->set_value(atof(x->get_text()));
1272 if(event_caller == y)
1274 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1275 track->automation->autos[AUTOMATION_PROJECTOR_Y],
1279 y_auto->set_value(atof(y->get_text()));
1285 if(event_caller == z)
1287 z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1288 track->automation->autos[AUTOMATION_PROJECTOR_Z],
1292 float zoom = atof(z->get_text());
1293 if(zoom > 100.) zoom = 100.;
1294 else if(zoom < 0.01) zoom = 0.01;
1295 // if (zoom != atof(z->get_text()))
1297 z_auto->set_value(zoom);
1299 mwindow->gui->lock_window("CWindowProjectorGUI::handle_event");
1300 mwindow->gui->draw_overlays(1);
1301 mwindow->gui->unlock_window();
1307 mwindow->undo->update_undo_after(_("projector"), LOAD_ALL);
1311 void CWindowProjectorGUI::update()
1313 FloatAuto *x_auto = 0;
1314 FloatAuto *y_auto = 0;
1315 FloatAuto *z_auto = 0;
1316 Track *track = mwindow->cwindow->calculate_affected_track();
1320 mwindow->cwindow->calculate_affected_autos(&x_auto,
1331 x->update(x_auto->get_value());
1333 y->update(y_auto->get_value());
1335 float value = z_auto->get_value();
1337 thread->gui->composite_panel->cpanel_zoom->update(value);
1340 if( x_auto && y_auto && z_auto )
1342 t_smooth->check_toggle_state(x_auto, y_auto, z_auto);
1343 t_linear->check_toggle_state(x_auto, y_auto, z_auto);
1347 CWindowProjectorLeft::CWindowProjectorLeft(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1348 : BC_Button(x, y, mwindow->theme->get_image_set("left_justify"))
1351 this->mwindow = mwindow;
1352 set_tooltip(_("Left justify"));
1354 int CWindowProjectorLeft::handle_event()
1356 FloatAuto *x_auto = 0;
1357 FloatAuto *z_auto = 0;
1358 Track *track = mwindow->cwindow->calculate_affected_track();
1361 mwindow->cwindow->calculate_affected_autos(&x_auto,
1370 if(x_auto && z_auto)
1372 mwindow->undo->update_undo_before(_("projector"), 0);
1373 x_auto->set_value( (double)track->track_w * z_auto->get_value() / 2 -
1374 (double)mwindow->edl->session->output_w / 2 );
1376 gui->update_preview();
1377 mwindow->undo->update_undo_after(_("projector"), LOAD_ALL);
1384 CWindowProjectorCenter::CWindowProjectorCenter(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1385 : BC_Button(x, y, mwindow->theme->get_image_set("center_justify"))
1388 this->mwindow = mwindow;
1389 set_tooltip(_("Center horizontal"));
1391 int CWindowProjectorCenter::handle_event()
1393 FloatAuto *x_auto = 0;
1394 Track *track = mwindow->cwindow->calculate_affected_track();
1396 x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1397 track->automation->autos[AUTOMATION_PROJECTOR_X],
1402 mwindow->undo->update_undo_before(_("projector"), 0);
1403 x_auto->set_value(0);
1405 gui->update_preview();
1406 mwindow->undo->update_undo_after(_("projector"), LOAD_ALL);
1413 CWindowProjectorRight::CWindowProjectorRight(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1414 : BC_Button(x, y, mwindow->theme->get_image_set("right_justify"))
1417 this->mwindow = mwindow;
1418 set_tooltip(_("Right justify"));
1420 int CWindowProjectorRight::handle_event()
1422 FloatAuto *x_auto = 0;
1423 FloatAuto *z_auto = 0;
1424 Track *track = mwindow->cwindow->calculate_affected_track();
1427 mwindow->cwindow->calculate_affected_autos(&x_auto,
1437 if(x_auto && z_auto)
1439 mwindow->undo->update_undo_before(_("projector"), 0);
1440 x_auto->set_value( -((double)track->track_w * z_auto->get_value() / 2 -
1441 (double)mwindow->edl->session->output_w / 2));
1443 gui->update_preview();
1444 mwindow->undo->update_undo_after(_("projector"), LOAD_ALL);
1451 CWindowProjectorTop::CWindowProjectorTop(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1452 : BC_Button(x, y, mwindow->theme->get_image_set("top_justify"))
1455 this->mwindow = mwindow;
1456 set_tooltip(_("Top justify"));
1458 int CWindowProjectorTop::handle_event()
1460 FloatAuto *y_auto = 0;
1461 FloatAuto *z_auto = 0;
1462 Track *track = mwindow->cwindow->calculate_affected_track();
1465 mwindow->cwindow->calculate_affected_autos(0,
1475 if(y_auto && z_auto)
1477 mwindow->undo->update_undo_before(_("projector"), 0);
1478 y_auto->set_value( (double)track->track_h * z_auto->get_value() / 2 -
1479 (double)mwindow->edl->session->output_h / 2 );
1481 gui->update_preview();
1482 mwindow->undo->update_undo_after(_("projector"), LOAD_ALL);
1489 CWindowProjectorMiddle::CWindowProjectorMiddle(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1490 : BC_Button(x, y, mwindow->theme->get_image_set("middle_justify"))
1493 this->mwindow = mwindow;
1494 set_tooltip(_("Center vertical"));
1496 int CWindowProjectorMiddle::handle_event()
1498 FloatAuto *y_auto = 0;
1499 Track *track = mwindow->cwindow->calculate_affected_track();
1501 y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1502 track->automation->autos[AUTOMATION_PROJECTOR_Y], 1);
1506 mwindow->undo->update_undo_before(_("projector"), 0);
1507 y_auto->set_value(0);
1509 gui->update_preview();
1510 mwindow->undo->update_undo_after(_("projector"), LOAD_ALL);
1517 CWindowProjectorBottom::CWindowProjectorBottom(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1518 : BC_Button(x, y, mwindow->theme->get_image_set("bottom_justify"))
1521 this->mwindow = mwindow;
1522 set_tooltip(_("Bottom justify"));
1524 int CWindowProjectorBottom::handle_event()
1526 FloatAuto *y_auto = 0;
1527 FloatAuto *z_auto = 0;
1528 Track *track = mwindow->cwindow->calculate_affected_track();
1531 mwindow->cwindow->calculate_affected_autos(0,
1541 if(y_auto && z_auto)
1543 mwindow->undo->update_undo_before(_("projector"), 0);
1544 y_auto->set_value( -((double)track->track_h * z_auto->get_value() / 2 -
1545 (double)mwindow->edl->session->output_h / 2));
1547 gui->update_preview();
1548 mwindow->undo->update_undo_after(_("projector"), LOAD_ALL);
1555 CWindowMaskMode::CWindowMaskMode(MWindow *mwindow,
1556 CWindowToolGUI *gui, int x, int y, const char *text)
1557 : BC_PopupMenu(x, y, 220, text, 1)
1559 this->mwindow = mwindow;
1563 void CWindowMaskMode::create_objects()
1565 add_item(new BC_MenuItem(mode_to_text(MASK_MULTIPLY_ALPHA)));
1566 add_item(new BC_MenuItem(mode_to_text(MASK_SUBTRACT_ALPHA)));
1569 char* CWindowMaskMode::mode_to_text(int mode)
1573 case MASK_MULTIPLY_ALPHA:
1574 return _("Multiply alpha");
1577 case MASK_SUBTRACT_ALPHA:
1578 return _("Subtract alpha");
1582 return _("Subtract alpha");
1585 int CWindowMaskMode::text_to_mode(char *text)
1587 if(!strcasecmp(text, _("Multiply alpha")))
1588 return MASK_MULTIPLY_ALPHA;
1590 if(!strcasecmp(text, _("Subtract alpha")))
1591 return MASK_SUBTRACT_ALPHA;
1593 return MASK_SUBTRACT_ALPHA;
1596 int CWindowMaskMode::handle_event()
1603 // Get existing keyframe
1604 ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 0);
1607 mwindow->undo->update_undo_before(_("mask mode"), 0);
1608 #ifdef USE_KEYFRAME_SPANNING
1609 // Create temp keyframe
1610 MaskAuto temp_keyframe(mwindow->edl, autos);
1611 temp_keyframe.copy_data(keyframe);
1613 temp_keyframe.mode = text_to_mode(get_text());
1614 // Commit change to span of keyframes
1615 autos->update_parameter(&temp_keyframe);
1617 ((MaskAuto*)autos->default_auto)->mode =
1618 text_to_mode(get_text());
1620 mwindow->undo->update_undo_after(_("mask mode"), LOAD_AUTOMATION);
1623 //printf("CWindowMaskMode::handle_event 1\n");
1624 gui->update_preview();
1635 CWindowMaskDelete::CWindowMaskDelete(MWindow *mwindow,
1636 CWindowToolGUI *gui,
1639 : BC_GenericButton(x, y, _("Delete"))
1641 this->mwindow = mwindow;
1645 int CWindowMaskDelete::handle_event()
1652 int total_points = 0;
1654 // Get existing keyframe
1655 ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 0);
1659 mwindow->undo->update_undo_before(_("mask delete"), 0);
1661 #ifdef USE_KEYFRAME_SPANNING
1662 // Create temp keyframe
1663 MaskAuto temp_keyframe(mwindow->edl, autos);
1664 temp_keyframe.copy_data(keyframe);
1666 SubMask *submask = temp_keyframe.get_submask(mwindow->edl->session->cwindow_mask);
1667 for(int i = mwindow->cwindow->gui->affected_point;
1668 i < submask->points.total - 1;
1671 *submask->points.values[i] = *submask->points.values[i + 1];
1674 if(submask->points.total)
1676 submask->points.remove_object(
1677 submask->points.values[submask->points.total - 1]);
1679 total_points = submask->points.total;
1681 // Commit change to span of keyframes
1682 ((MaskAutos*)track->automation->autos[AUTOMATION_MASK])->update_parameter(&temp_keyframe);
1684 for(MaskAuto *current = (MaskAuto*)autos->default_auto;
1687 SubMask *submask = current->get_submask(mwindow->edl->session->cwindow_mask);
1689 for(int i = mwindow->cwindow->gui->affected_point;
1690 i < submask->points.total - 1;
1693 *submask->points.values[i] = *submask->points.values[i + 1];
1696 if(submask->points.total)
1698 submask->points.remove_object(
1699 submask->points.values[submask->points.total - 1]);
1701 total_points = submask->points.total;
1703 if(current == (MaskAuto*)autos->default_auto)
1704 current = (MaskAuto*)autos->first;
1706 current = (MaskAuto*)NEXT;
1709 if( mwindow->cwindow->gui->affected_point >= total_points )
1710 mwindow->cwindow->gui->affected_point =
1711 total_points > 0 ? total_points-1 : 0;
1714 gui->update_preview();
1715 mwindow->undo->update_undo_after(_("mask delete"), LOAD_AUTOMATION);
1722 int CWindowMaskDelete::keypress_event()
1724 if(get_keypress() == BACKSPACE ||
1725 get_keypress() == DELETE)
1726 return handle_event();
1731 // CWindowMaskCycleNext::CWindowMaskCycleNext(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1732 // : BC_GenericButton(x, y, _("Cycle next"))
1734 // this->mwindow = mwindow;
1737 // int CWindowMaskCycleNext::handle_event()
1739 // MaskAuto *keyframe;
1740 // MaskAutos *autos;
1742 // MaskPoint *point;
1744 // ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 0);
1748 // // Should apply to all keyframes
1749 // if(keyframe && mask->points.total)
1751 // temp = mask->points.values[0];
1753 // for(int i = 0; i < mask->points.total - 1; i++)
1755 // mask->points.values[i] = mask->points.values[i + 1];
1757 // mask->points.values[mask->points.total - 1] = temp;
1759 // mwindow->cwindow->gui->affected_point--;
1760 // if(mwindow->cwindow->gui->affected_point < 0)
1761 // mwindow->cwindow->gui->affected_point = mask->points.total - 1;
1764 // gui->update_preview();
1770 // CWindowMaskCyclePrev::CWindowMaskCyclePrev(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1771 // : BC_GenericButton(x, y, _("Cycle prev"))
1773 // this->mwindow = mwindow;
1776 // int CWindowMaskCyclePrev::handle_event()
1778 // MaskAuto *keyframe;
1779 // MaskAutos *autos;
1781 // MaskPoint *point;
1783 // ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 0);
1785 // // Should apply to all keyframes
1787 // if(keyframe && mask->points.total)
1789 // temp = mask->points.values[mask->points.total - 1];
1791 // for(int i = mask->points.total - 1; i > 0; i--)
1793 // mask->points.values[i] = mask->points.values[i - 1];
1795 // mask->points.values[0] = temp;
1797 // mwindow->cwindow->gui->affected_point++;
1798 // if(mwindow->cwindow->gui->affected_point >= mask->points.total)
1799 // mwindow->cwindow->gui->affected_point = 0;
1802 // gui->update_preview();
1808 CWindowMaskNumber::CWindowMaskNumber(MWindow *mwindow,
1809 CWindowToolGUI *gui,
1812 : BC_TumbleTextBox(gui,
1813 (int64_t)mwindow->edl->session->cwindow_mask,
1815 (int64_t)SUBMASKS - 1,
1820 this->mwindow = mwindow;
1824 CWindowMaskNumber::~CWindowMaskNumber()
1828 int CWindowMaskNumber::handle_event()
1830 mwindow->edl->session->cwindow_mask = atol(get_text());
1832 gui->update_preview();
1837 CWindowMaskAffectedPoint::CWindowMaskAffectedPoint(MWindow *mwindow,
1838 CWindowToolGUI *gui, int x, int y)
1839 : BC_TumbleTextBox(gui,
1840 (int64_t)mwindow->cwindow->gui->affected_point,
1841 (int64_t)0, INT64_MAX, x, y, 100)
1843 this->mwindow = mwindow;
1847 CWindowMaskAffectedPoint::~CWindowMaskAffectedPoint()
1851 int CWindowMaskAffectedPoint::handle_event()
1853 int total_points = 0;
1854 int affected_point = atol(get_text());
1855 Track *track = mwindow->cwindow->calculate_affected_track();
1857 MaskAutos *autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK];
1858 MaskAuto *keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(autos, 0);
1860 SubMask *mask = keyframe->get_submask(mwindow->edl->session->cwindow_mask);
1861 total_points = mask->points.size();
1864 int active_point = affected_point;
1865 if( affected_point >= total_points )
1866 affected_point = total_points - 1;
1867 else if( affected_point < 0 )
1869 if( active_point != affected_point )
1870 update((int64_t)affected_point);
1871 mwindow->cwindow->gui->affected_point = affected_point;
1873 gui->update_preview();
1881 CWindowMaskFeather::CWindowMaskFeather(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1882 : BC_TumbleTextBox(gui,
1890 this->mwindow = mwindow;
1893 CWindowMaskFeather::~CWindowMaskFeather()
1896 int CWindowMaskFeather::handle_event()
1903 #ifdef USE_KEYFRAME_SPANNING
1909 mwindow->undo->update_undo_before(_("mask feather"), this);
1911 // Get existing keyframe
1912 ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe,
1913 mask, point, create_it);
1917 #ifdef USE_KEYFRAME_SPANNING
1918 // Create temp keyframe
1919 MaskAuto temp_keyframe(mwindow->edl, autos);
1920 temp_keyframe.copy_data(keyframe);
1922 temp_keyframe.feather = atof(get_text());
1923 // Commit change to span of keyframes
1924 autos->update_parameter(&temp_keyframe);
1926 keyframe->feather = atof(get_text());
1929 gui->update_preview();
1932 mwindow->undo->update_undo_after(_("mask feather"), LOAD_AUTOMATION);
1937 CWindowMaskValue::CWindowMaskValue(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1947 this->mwindow = mwindow;
1951 CWindowMaskValue::~CWindowMaskValue()
1955 int CWindowMaskValue::handle_event()
1962 #ifdef USE_KEYFRAME_SPANNING
1968 mwindow->undo->update_undo_before(_("mask value"), this);
1969 ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe,
1970 mask, point, create_it);
1974 #ifdef USE_KEYFRAME_SPANNING
1975 // Create temp keyframe
1976 MaskAuto temp_keyframe(mwindow->edl, autos);
1977 temp_keyframe.copy_data(keyframe);
1979 temp_keyframe.value = get_value();
1980 // Commit change to span of keyframes
1981 autos->update_parameter(&temp_keyframe);
1983 keyframe->value = get_value();
1987 gui->update_preview();
1988 mwindow->undo->update_undo_after(_("mask value"), LOAD_AUTOMATION);
1993 CWindowMaskBeforePlugins::CWindowMaskBeforePlugins(CWindowToolGUI *gui, int x, int y)
1997 _("Apply mask before plugins"))
2002 int CWindowMaskBeforePlugins::handle_event()
2009 ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 1);
2012 keyframe->apply_before_plugins = get_value();
2013 gui->update_preview();
2019 CWindowDisableOpenGLMasking::CWindowDisableOpenGLMasking(CWindowToolGUI *gui, int x, int y)
2020 : BC_CheckBox(x, y, 1, _("Disable OpenGL masking"))
2025 int CWindowDisableOpenGLMasking::handle_event()
2032 ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe, mask, point, 1);
2035 keyframe->disable_opengl_masking = get_value();
2036 gui->update_preview();
2049 CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread)
2050 : CWindowToolGUI(mwindow,
2052 _(PROGRAM_NAME ": Mask"),
2056 this->mwindow = mwindow;
2057 this->thread = thread;
2062 CWindowMaskGUI::~CWindowMaskGUI()
2064 lock_window("CWindowMaskGUI::~CWindowMaskGUI");
2066 delete active_point;
2071 void CWindowMaskGUI::create_objects()
2073 int x = 10, y = 10, margin = mwindow->theme->widget_border;
2074 //MaskAuto *keyframe = 0;
2075 //Track *track = mwindow->cwindow->calculate_affected_track();
2077 // keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(track->automation->autos[AUTOMATION_MASK], 0);
2079 lock_window("CWindowMaskGUI::create_objects");
2081 add_subwindow(title = new BC_Title(x, y, _("Mode:")));
2082 add_subwindow(mode = new CWindowMaskMode(mwindow,
2083 this, x + title->get_w() + margin, y, ""));
2084 mode->create_objects();
2085 y += mode->get_h() + margin;
2086 add_subwindow(title = new BC_Title(x, y, _("Value:")));
2087 add_subwindow(value = new CWindowMaskValue(mwindow, this, x + title->get_w() + margin, y));
2088 y += value->get_h() + margin;
2089 add_subwindow(delete_point = new CWindowMaskDelete(mwindow, this, x, y));
2090 int x1 = x + delete_point->get_w() + 2*margin;
2091 add_subwindow(title = new BC_Title(x1, y, _("Point:")));
2092 x1 += title->get_w() + margin;
2093 active_point = new CWindowMaskAffectedPoint(mwindow, this, x1, y);
2094 active_point->create_objects();
2095 y += delete_point->get_h() + margin;
2096 add_subwindow(title = new BC_Title(x, y, _("Mask number:")));
2097 number = new CWindowMaskNumber(mwindow,
2098 this, x + title->get_w() + margin, y);
2099 number->create_objects();
2100 y += number->get_h() + margin;
2101 add_subwindow(title = new BC_Title(x, y, _("Feather:")));
2102 feather = new CWindowMaskFeather(mwindow,
2103 this, x + title->get_w() + margin, y);
2104 feather->create_objects();
2105 y += feather->get_h() + margin;
2106 add_subwindow(title = new BC_Title(x, y, "X:"));
2107 x += title->get_w() + margin;
2108 this->x = new CWindowCoord(this, x, y, (float)0.0);
2109 this->x->create_objects();
2110 x += this->x->get_w() + margin;
2111 add_subwindow(title = new BC_Title(x, y, "Y:"));
2112 x += title->get_w() + margin;
2113 this->y = new CWindowCoord(this, x, y, (float)0.0);
2114 this->y->create_objects();
2117 y += this->y->get_h() + margin;
2118 add_subwindow(title = new BC_Title(x, y, _("Press Shift to move an end point")));
2119 y += title->get_h() + margin;
2120 add_subwindow(title = new BC_Title(x, y, _("Press Ctrl to move a control point")));
2121 y += title->get_h() + margin;
2122 add_subwindow(title = new BC_Title(x, y, _("Press Alt to translate the mask")));
2125 add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this, 10, y));
2126 y += this->apply_before_plugins->get_h() + margin;
2127 add_subwindow(this->disable_opengl_masking = new CWindowDisableOpenGLMasking(this, 10, y));
2133 void CWindowMaskGUI::get_keyframe(Track* &track,
2135 MaskAuto* &keyframe,
2143 track = mwindow->cwindow->calculate_affected_track();
2146 autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK];
2147 keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(
2153 mask = keyframe->get_submask(mwindow->edl->session->cwindow_mask);
2160 if(mwindow->cwindow->gui->affected_point < mask->points.total &&
2161 mwindow->cwindow->gui->affected_point >= 0)
2163 point = mask->points.values[mwindow->cwindow->gui->affected_point];
2168 void CWindowMaskGUI::update()
2175 //printf("CWindowMaskGUI::update 1\n");
2176 get_keyframe(track, autos, keyframe, mask, point, 0);
2178 double position = mwindow->edl->local_session->get_selectionstart(1);
2179 position = mwindow->edl->align_to_frame(position, 0);
2182 int64_t position_i = track->to_units(position, 0);
2186 x->update(point->x);
2187 y->update(point->y);
2192 feather->update((int64_t)autos->get_feather(position_i, PLAY_FORWARD));
2193 value->update((int64_t)autos->get_value(position_i, PLAY_FORWARD));
2194 apply_before_plugins->update((int64_t)keyframe->apply_before_plugins);
2195 disable_opengl_masking->update((int64_t)keyframe->disable_opengl_masking);
2199 //printf("CWindowMaskGUI::update 1\n");
2200 active_point->update((int64_t)mwindow->cwindow->gui->affected_point);
2201 number->update((int64_t)mwindow->edl->session->cwindow_mask);
2203 //printf("CWindowMaskGUI::update 1\n");
2206 #ifdef USE_KEYFRAME_SPANNING
2208 CWindowMaskMode::mode_to_text(keyframe->mode));
2211 CWindowMaskMode::mode_to_text(((MaskAuto*)autos->default_auto)->mode));
2214 //printf("CWindowMaskGUI::update 2\n");
2217 void CWindowMaskGUI::handle_event()
2224 get_keyframe(track, autos, keyframe, mask, point, 0);
2226 mwindow->undo->update_undo_before(_("mask point"), this);
2230 #ifdef USE_KEYFRAME_SPANNING
2231 // Create temp keyframe
2232 MaskAuto temp_keyframe(mwindow->edl, autos);
2233 temp_keyframe.copy_data(keyframe);
2234 // Get affected point in temp keyframe
2235 mask = temp_keyframe.get_submask(mwindow->edl->session->cwindow_mask);
2236 if(mwindow->cwindow->gui->affected_point < mask->points.total &&
2237 mwindow->cwindow->gui->affected_point >= 0)
2239 point = mask->points.values[mwindow->cwindow->gui->affected_point];
2244 point->x = atof(x->get_text());
2245 point->y = atof(y->get_text());
2246 // Commit to spanned keyframes
2247 autos->update_parameter(&temp_keyframe);
2250 point->x = atof(x->get_text());
2251 point->y = atof(y->get_text());
2256 mwindow->undo->update_undo_after(_("mask point"), LOAD_AUTOMATION);
2259 void CWindowMaskGUI::update_preview()
2261 mwindow->gui->lock_window("CWindowMaskGUI::update_preview");
2262 mwindow->restart_brender();
2263 mwindow->sync_parameters(CHANGE_PARAMS);
2264 mwindow->gui->draw_overlays(1);
2265 mwindow->gui->unlock_window();
2266 mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
2267 CHANGE_NONE, mwindow->edl, 1);
2268 mwindow->cwindow->gui->lock_window("CWindowMaskGUI::update_preview");
2269 mwindow->cwindow->gui->canvas->draw_refresh();
2270 mwindow->cwindow->gui->unlock_window();
2274 CWindowRulerGUI::CWindowRulerGUI(MWindow *mwindow, CWindowTool *thread)
2275 : CWindowToolGUI(mwindow,
2277 _(PROGRAM_NAME ": Ruler"),
2283 CWindowRulerGUI::~CWindowRulerGUI()
2287 void CWindowRulerGUI::create_objects()
2292 lock_window("CWindowRulerGUI::create_objects");
2293 add_subwindow(title = new BC_Title(x, y, _("Current:")));
2294 add_subwindow(current = new BC_Title(x + title->get_w() + 10, y, ""));
2295 y += title->get_h() + 5;
2297 add_subwindow(title = new BC_Title(x, y, _("Point 1:")));
2298 add_subwindow(point1 = new BC_Title(x + title->get_w() + 10, y, ""));
2299 y += title->get_h() + 5;
2301 add_subwindow(title = new BC_Title(x, y, _("Point 2:")));
2302 add_subwindow(point2 = new BC_Title(x + title->get_w() + 10, y, ""));
2303 y += title->get_h() + 5;
2305 add_subwindow(title = new BC_Title(x, y, _("Distance:")));
2306 add_subwindow(distance = new BC_Title(x + title->get_w() + 10, y, ""));
2307 y += title->get_h() + 5;
2308 add_subwindow(title = new BC_Title(x, y, _("Angle:")));
2309 add_subwindow(angle = new BC_Title(x + title->get_w() + 10, y, ""));
2310 y += title->get_h() + 10;
2311 char string[BCTEXTLEN];
2312 sprintf(string, _("Press Ctrl to lock ruler to the\nnearest 45%c angle."), 0xb0);
2313 add_subwindow(title = new BC_Title(x,
2316 y += title->get_h() + 10;
2317 sprintf(string, _("Press Alt to translate the ruler."));
2318 add_subwindow(title = new BC_Title(x,
2325 void CWindowRulerGUI::update()
2327 double distance_value =
2328 sqrt(SQR(mwindow->edl->session->ruler_x2 - mwindow->edl->session->ruler_x1) +
2329 SQR(mwindow->edl->session->ruler_y2 - mwindow->edl->session->ruler_y1));
2330 double angle_value = atan((mwindow->edl->session->ruler_y2 - mwindow->edl->session->ruler_y1) /
2331 (mwindow->edl->session->ruler_x2 - mwindow->edl->session->ruler_x1)) *
2336 if(EQUIV(distance_value, 0.0))
2346 char string[BCTEXTLEN];
2347 sprintf(string, "%d, %d",
2348 mwindow->session->cwindow_output_x,
2349 mwindow->session->cwindow_output_y);
2350 current->update(string);
2351 sprintf(string, "%.0f, %.0f",
2352 mwindow->edl->session->ruler_x1,
2353 mwindow->edl->session->ruler_y1);
2354 point1->update(string);
2355 sprintf(string, "%.0f, %.0f",
2356 mwindow->edl->session->ruler_x2,
2357 mwindow->edl->session->ruler_y2);
2358 point2->update(string);
2360 sprintf(string, _("%0.01f pixels"), distance_value);
2361 distance->update(string);
2362 sprintf(string, "%0.02f %c", angle_value, 0xb0);
2363 angle->update(string);
2366 void CWindowRulerGUI::handle_event()