4
* Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
#include "automation.h"
24
#include "condition.h"
26
#include "cplayback.h"
28
#include "cwindowgui.h"
29
#include "cwindowtool.h"
31
#include "edlsession.h"
32
#include "floatauto.h"
33
#include "floatautos.h"
36
#include "localsession.h"
37
#include "mainsession.h"
39
#include "maskautos.h"
42
#include "mwindowgui.h"
45
#include "trackcanvas.h"
46
#include "transportque.h"
49
CWindowTool::CWindowTool(MWindow *mwindow, CWindowGUI *gui)
52
this->mwindow = mwindow;
56
current_tool = CWINDOW_NONE;
58
input_lock = new Condition(0, "CWindowTool::input_lock");
59
output_lock = new Condition(1, "CWindowTool::output_lock");
60
tool_gui_lock = new Mutex("CWindowTool::tool_gui_lock");
63
CWindowTool::~CWindowTool()
74
void CWindowTool::start_tool(int operation)
76
CWindowToolGUI *new_gui = 0;
79
//printf("CWindowTool::start_tool 1\n");
80
if(current_tool != operation)
82
current_tool = operation;
86
new_gui = new CWindowEyedropGUI(mwindow, this);
89
new_gui = new CWindowCropGUI(mwindow, this);
92
new_gui = new CWindowCameraGUI(mwindow, this);
94
case CWINDOW_PROJECTOR:
95
new_gui = new CWindowProjectorGUI(mwindow, this);
98
new_gui = new CWindowMaskGUI(mwindow, this);
106
//printf("CWindowTool::start_tool 1\n");
112
// Wait for previous tool GUI to finish
113
output_lock->lock("CWindowTool::start_tool");
114
this->tool_gui = new_gui;
115
tool_gui->create_objects();
117
if(mwindow->edl->session->tool_window &&
118
mwindow->session->show_cwindow) tool_gui->show_window();
122
// Signal thread to run next tool GUI
123
input_lock->unlock();
125
//printf("CWindowTool::start_tool 1\n");
130
tool_gui->lock_window("CWindowTool::start_tool");
132
tool_gui->unlock_window();
135
//printf("CWindowTool::start_tool 2\n");
140
void CWindowTool::stop_tool()
144
tool_gui->lock_window("CWindowTool::stop_tool");
145
tool_gui->set_done(0);
146
tool_gui->unlock_window();
150
void CWindowTool::show_tool()
152
if(tool_gui && mwindow->edl->session->tool_window)
154
tool_gui->lock_window("CWindowTool::show_tool");
155
tool_gui->show_window();
156
tool_gui->unlock_window();
160
void CWindowTool::hide_tool()
162
if(tool_gui && mwindow->edl->session->tool_window)
164
tool_gui->lock_window("CWindowTool::show_tool");
165
tool_gui->hide_window();
166
tool_gui->unlock_window();
171
void CWindowTool::run()
175
input_lock->lock("CWindowTool::run");
178
tool_gui->run_window();
179
tool_gui_lock->lock("CWindowTool::run");
182
tool_gui_lock->unlock();
184
output_lock->unlock();
188
void CWindowTool::update_show_window()
192
tool_gui->lock_window("CWindowTool::update_show_window");
194
if(mwindow->edl->session->tool_window)
197
tool_gui->show_window();
200
tool_gui->hide_window();
203
tool_gui->unlock_window();
207
void CWindowTool::update_values()
209
tool_gui_lock->lock("CWindowTool::update_values");
212
tool_gui->lock_window("CWindowTool::update_values");
215
tool_gui->unlock_window();
217
tool_gui_lock->unlock();
226
CWindowToolGUI::CWindowToolGUI(MWindow *mwindow,
232
mwindow->session->ctool_x,
233
mwindow->session->ctool_y,
242
this->mwindow = mwindow;
243
this->thread = thread;
244
current_operation = 0;
247
CWindowToolGUI::~CWindowToolGUI()
251
int CWindowToolGUI::close_event()
255
mwindow->edl->session->tool_window = 0;
260
thread->gui->lock_window("CWindowToolGUI::close_event");
261
thread->gui->composite_panel->set_operation(mwindow->edl->session->cwindow_operation);
262
thread->gui->flush();
263
thread->gui->unlock_window();
265
lock_window("CWindowToolGUI::close_event");
269
int CWindowToolGUI::keypress_event()
271
if(get_keypress() == 'w' || get_keypress() == 'W')
272
return close_event();
276
int CWindowToolGUI::translation_event()
278
mwindow->session->ctool_x = get_x();
279
mwindow->session->ctool_y = get_y();
288
CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, float value, int log_increment = 0)
289
: BC_TumbleTextBox(gui,
298
set_log_floatincrement(log_increment);
301
CWindowCoord::CWindowCoord(CWindowToolGUI *gui, int x, int y, int value)
302
: BC_TumbleTextBox(gui,
312
int CWindowCoord::handle_event()
314
gui->event_caller = this;
320
CWindowCropOK::CWindowCropOK(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
321
: BC_GenericButton(x, y, _("Do it"))
323
this->mwindow = mwindow;
326
int CWindowCropOK::handle_event()
328
mwindow->crop_video();
333
int CWindowCropOK::keypress_event()
335
if(get_keypress() == 0xd)
349
CWindowCropGUI::CWindowCropGUI(MWindow *mwindow, CWindowTool *thread)
350
: CWindowToolGUI(mwindow,
352
PROGRAM_NAME ": Crop",
359
CWindowCropGUI::~CWindowCropGUI()
363
void CWindowCropGUI::create_objects()
366
BC_TumbleTextBox *textbox;
370
int pad = MAX(BC_TextBox::calculate_h(this, MEDIUMFONT, 1, 1),
371
BC_Title::calculate_h(this, "X")) + 5;
372
add_subwindow(title = new BC_Title(x, y, _("X1:")));
373
column1 = MAX(column1, title->get_w());
375
add_subwindow(title = new BC_Title(x, y, _("W:")));
376
column1 = MAX(column1, title->get_w());
378
add_subwindow(new CWindowCropOK(mwindow, thread->tool_gui, x, y));
382
x1 = new CWindowCoord(thread->tool_gui, x, y, mwindow->edl->session->crop_x1);
383
x1->create_objects();
385
width = new CWindowCoord(thread->tool_gui,
388
mwindow->edl->session->crop_x2 -
389
mwindow->edl->session->crop_x1);
390
width->create_objects();
393
x += x1->get_w() + 10;
396
add_subwindow(title = new BC_Title(x, y, _("Y1:")));
397
column2 = MAX(column2, title->get_w());
399
add_subwindow(title = new BC_Title(x, y, _("H:")));
400
column2 = MAX(column2, title->get_w());
405
y1 = new CWindowCoord(thread->tool_gui, x, y, mwindow->edl->session->crop_y1);
406
y1->create_objects();
408
height = new CWindowCoord(thread->tool_gui,
411
mwindow->edl->session->crop_y2 -
412
mwindow->edl->session->crop_y1);
413
height->create_objects();
416
void CWindowCropGUI::handle_event()
419
new_x1 = atol(x1->get_text());
420
new_y1 = atol(y1->get_text());
421
if(new_x1 != mwindow->edl->session->crop_x1)
423
mwindow->edl->session->crop_x2 = new_x1 +
424
mwindow->edl->session->crop_x2 -
425
mwindow->edl->session->crop_x1;
426
mwindow->edl->session->crop_x1 = new_x1;
428
if(new_y1 != mwindow->edl->session->crop_y1)
430
mwindow->edl->session->crop_y2 = new_y1 +
431
mwindow->edl->session->crop_y2 -
432
mwindow->edl->session->crop_y1;
433
mwindow->edl->session->crop_y1 = atol(y1->get_text());
435
mwindow->edl->session->crop_x2 = atol(width->get_text()) +
436
mwindow->edl->session->crop_x1;
437
mwindow->edl->session->crop_y2 = atol(height->get_text()) +
438
mwindow->edl->session->crop_y1;
440
mwindow->cwindow->gui->lock_window("CWindowCropGUI::handle_event");
441
mwindow->cwindow->gui->canvas->draw_refresh();
442
mwindow->cwindow->gui->unlock_window();
445
void CWindowCropGUI::update()
447
x1->update((int64_t)mwindow->edl->session->crop_x1);
448
y1->update((int64_t)mwindow->edl->session->crop_y1);
449
width->update((int64_t)mwindow->edl->session->crop_x2 -
450
mwindow->edl->session->crop_x1);
451
height->update((int64_t)mwindow->edl->session->crop_y2 -
452
mwindow->edl->session->crop_y1);
460
CWindowEyedropGUI::CWindowEyedropGUI(MWindow *mwindow, CWindowTool *thread)
461
: CWindowToolGUI(mwindow,
463
PROGRAM_NAME ": Color",
469
CWindowEyedropGUI::~CWindowEyedropGUI()
473
void CWindowEyedropGUI::create_objects()
478
BC_Title *title1, *title2, *title3;
479
add_subwindow(title1 = new BC_Title(x, y, "Red:"));
480
y += title1->get_h() + 5;
481
add_subwindow(title2 = new BC_Title(x, y, "Green:"));
482
y += title2->get_h() + 5;
483
add_subwindow(title3 = new BC_Title(x, y, "Blue:"));
486
add_subwindow(red = new BC_Title(x2, title1->get_y(), "0"));
487
add_subwindow(green = new BC_Title(x2, title2->get_y(), "0"));
488
add_subwindow(blue = new BC_Title(x2, title3->get_y(), "0"));
490
y = blue->get_y() + blue->get_h() + 5;
491
add_subwindow(sample = new BC_SubWindow(x, y, 50, 50));
495
void CWindowEyedropGUI::update()
497
red->update(mwindow->edl->local_session->red);
498
green->update(mwindow->edl->local_session->green);
499
blue->update(mwindow->edl->local_session->blue);
501
int red = (int)(CLIP(mwindow->edl->local_session->red, 0, 1) * 0xff);
502
int green = (int)(CLIP(mwindow->edl->local_session->green, 0, 1) * 0xff);
503
int blue = (int)(CLIP(mwindow->edl->local_session->blue, 0, 1) * 0xff);
504
sample->set_color((red << 16) | (green << 8) | blue);
505
sample->draw_box(0, 0, sample->get_w(), sample->get_h());
506
sample->set_color(BLACK);
507
sample->draw_rectangle(0, 0, sample->get_w(), sample->get_h());
519
CWindowCameraGUI::CWindowCameraGUI(MWindow *mwindow, CWindowTool *thread)
520
: CWindowToolGUI(mwindow,
522
PROGRAM_NAME ": Camera",
527
CWindowCameraGUI::~CWindowCameraGUI()
531
void CWindowCameraGUI::create_objects()
533
int x = 10, y = 10, x1;
534
Track *track = mwindow->cwindow->calculate_affected_track();
535
FloatAuto *x_auto = 0;
536
FloatAuto *y_auto = 0;
537
FloatAuto *z_auto = 0;
543
mwindow->cwindow->calculate_affected_autos(&x_auto,
553
add_subwindow(title = new BC_Title(x, y, _("X:")));
555
this->x = new CWindowCoord(this,
558
x_auto ? x_auto->value : (float)0);
559
this->x->create_objects();
562
add_subwindow(title = new BC_Title(x, y, _("Y:")));
564
this->y = new CWindowCoord(this,
567
y_auto ? y_auto->value : (float)0);
568
this->y->create_objects();
571
add_subwindow(title = new BC_Title(x, y, _("Z:")));
573
this->z = new CWindowCoord(this,
576
z_auto ? z_auto->value : (float)1,
578
this->z->create_objects();
579
this->z->set_boundaries((float).0001, (float)256.0);
583
add_subwindow(button = new CWindowCameraLeft(mwindow, this, x1, y));
584
x1 += button->get_w();
585
add_subwindow(button = new CWindowCameraCenter(mwindow, this, x1, y));
586
x1 += button->get_w();
587
add_subwindow(button = new CWindowCameraRight(mwindow, this, x1, y));
589
y += button->get_h();
591
add_subwindow(button = new CWindowCameraTop(mwindow, this, x1, y));
592
x1 += button->get_w();
593
add_subwindow(button = new CWindowCameraMiddle(mwindow, this, x1, y));
594
x1 += button->get_w();
595
add_subwindow(button = new CWindowCameraBottom(mwindow, this, x1, y));
599
void CWindowCameraGUI::update_preview()
601
mwindow->restart_brender();
602
mwindow->sync_parameters(CHANGE_PARAMS);
604
mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
608
mwindow->cwindow->gui->lock_window("CWindowCameraGUI::update_preview");
609
mwindow->cwindow->gui->canvas->draw_refresh();
610
mwindow->cwindow->gui->unlock_window();
614
void CWindowCameraGUI::handle_event()
616
FloatAuto *x_auto = 0;
617
FloatAuto *y_auto = 0;
618
FloatAuto *z_auto = 0;
619
Track *track = mwindow->cwindow->calculate_affected_track();
622
if(event_caller == x)
624
x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
625
track->automation->autos[AUTOMATION_CAMERA_X],
629
x_auto->value = atof(x->get_text());
634
if(event_caller == y)
636
y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
637
track->automation->autos[AUTOMATION_CAMERA_Y],
641
y_auto->value = atof(y->get_text());
646
if(event_caller == z)
648
z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
649
track->automation->autos[AUTOMATION_CAMERA_Z],
653
float zoom = atof(z->get_text());
654
if(zoom > 10) zoom = 10;
656
if(zoom < 0) zoom = 0;
657
// Doesn't allow user to enter from scratch
658
// if(zoom != atof(z->get_text()))
661
z_auto->value = zoom;
662
mwindow->gui->lock_window("CWindowCameraGUI::handle_event");
663
mwindow->gui->canvas->draw_overlays();
664
mwindow->gui->canvas->flash();
665
mwindow->gui->unlock_window();
672
void CWindowCameraGUI::update()
674
FloatAuto *x_auto = 0;
675
FloatAuto *y_auto = 0;
676
FloatAuto *z_auto = 0;
677
Track *track = mwindow->cwindow->calculate_affected_track();
681
mwindow->cwindow->calculate_affected_autos(&x_auto,
692
x->update(x_auto->value);
694
y->update(y_auto->value);
696
z->update(z_auto->value);
699
// BezierAuto* CWindowCameraGUI::get_keyframe()
701
// BezierAuto *keyframe = 0;
702
// Track *track = mwindow->cwindow->calculate_affected_track();
704
// keyframe = (BezierAuto*)mwindow->cwindow->calculate_affected_auto(
705
// track->automation->autos[AUTOMATION_CAMERA]);
711
CWindowCameraLeft::CWindowCameraLeft(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
712
: BC_Button(x, y, mwindow->theme->get_image_set("left_justify"))
715
this->mwindow = mwindow;
716
set_tooltip(_("Left justify"));
718
int CWindowCameraLeft::handle_event()
720
FloatAuto *x_auto = 0;
721
FloatAuto *z_auto = 0;
722
Track *track = mwindow->cwindow->calculate_affected_track();
725
mwindow->cwindow->calculate_affected_autos(&x_auto,
738
track->get_source_dimensions(
739
mwindow->edl->local_session->get_selectionstart(1),
746
(double)track->track_w / z_auto->value / 2 -
749
gui->update_preview();
757
CWindowCameraCenter::CWindowCameraCenter(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
758
: BC_Button(x, y, mwindow->theme->get_image_set("center_justify"))
761
this->mwindow = mwindow;
762
set_tooltip(_("Center horizontal"));
764
int CWindowCameraCenter::handle_event()
766
FloatAuto *x_auto = 0;
767
Track *track = mwindow->cwindow->calculate_affected_track();
769
x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
770
track->automation->autos[AUTOMATION_CAMERA_X],
777
gui->update_preview();
784
CWindowCameraRight::CWindowCameraRight(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
785
: BC_Button(x, y, mwindow->theme->get_image_set("right_justify"))
788
this->mwindow = mwindow;
789
set_tooltip(_("Right justify"));
791
int CWindowCameraRight::handle_event()
793
FloatAuto *x_auto = 0;
794
FloatAuto *z_auto = 0;
795
Track *track = mwindow->cwindow->calculate_affected_track();
798
mwindow->cwindow->calculate_affected_autos(&x_auto,
811
track->get_source_dimensions(
812
mwindow->edl->local_session->get_selectionstart(1),
818
x_auto->value = -((double)track->track_w / z_auto->value / 2 -
821
gui->update_preview();
829
CWindowCameraTop::CWindowCameraTop(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
830
: BC_Button(x, y, mwindow->theme->get_image_set("top_justify"))
833
this->mwindow = mwindow;
834
set_tooltip(_("Top justify"));
836
int CWindowCameraTop::handle_event()
838
FloatAuto *y_auto = 0;
839
FloatAuto *z_auto = 0;
840
Track *track = mwindow->cwindow->calculate_affected_track();
843
mwindow->cwindow->calculate_affected_autos(0,
856
track->get_source_dimensions(
857
mwindow->edl->local_session->get_selectionstart(1),
863
y_auto->value = (double)track->track_h / z_auto->value / 2 -
866
gui->update_preview();
874
CWindowCameraMiddle::CWindowCameraMiddle(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
875
: BC_Button(x, y, mwindow->theme->get_image_set("middle_justify"))
878
this->mwindow = mwindow;
879
set_tooltip(_("Center vertical"));
881
int CWindowCameraMiddle::handle_event()
883
FloatAuto *y_auto = 0;
884
Track *track = mwindow->cwindow->calculate_affected_track();
886
y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
887
track->automation->autos[AUTOMATION_CAMERA_Y], 1);
893
gui->update_preview();
900
CWindowCameraBottom::CWindowCameraBottom(MWindow *mwindow, CWindowCameraGUI *gui, int x, int y)
901
: BC_Button(x, y, mwindow->theme->get_image_set("bottom_justify"))
904
this->mwindow = mwindow;
905
set_tooltip(_("Bottom justify"));
907
int CWindowCameraBottom::handle_event()
909
FloatAuto *y_auto = 0;
910
FloatAuto *z_auto = 0;
911
Track *track = mwindow->cwindow->calculate_affected_track();
914
mwindow->cwindow->calculate_affected_autos(0,
927
track->get_source_dimensions(
928
mwindow->edl->local_session->get_selectionstart(1),
934
y_auto->value = -((double)track->track_h / z_auto->value / 2 -
937
gui->update_preview();
960
CWindowProjectorGUI::CWindowProjectorGUI(MWindow *mwindow, CWindowTool *thread)
961
: CWindowToolGUI(mwindow,
963
PROGRAM_NAME ": Projector",
968
CWindowProjectorGUI::~CWindowProjectorGUI()
971
void CWindowProjectorGUI::create_objects()
973
int x = 10, y = 10, x1;
974
Track *track = mwindow->cwindow->calculate_affected_track();
975
FloatAuto *x_auto = 0;
976
FloatAuto *y_auto = 0;
977
FloatAuto *z_auto = 0;
983
mwindow->cwindow->calculate_affected_autos(&x_auto,
993
add_subwindow(title = new BC_Title(x, y, _("X:")));
995
this->x = new CWindowCoord(this,
998
x_auto ? x_auto->value : (float)0);
999
this->x->create_objects();
1002
add_subwindow(title = new BC_Title(x, y, _("Y:")));
1003
x += title->get_w();
1004
this->y = new CWindowCoord(this,
1007
y_auto ? y_auto->value : (float)0);
1008
this->y->create_objects();
1011
add_subwindow(title = new BC_Title(x, y, _("Z:")));
1012
x += title->get_w();
1013
this->z = new CWindowCoord(this,
1016
z_auto ? z_auto->value : (float)1,
1018
this->z->create_objects();
1019
this->z->set_boundaries((float).0001, (float)256.0);
1023
add_subwindow(button = new CWindowProjectorLeft(mwindow, this, x1, y));
1024
x1 += button->get_w();
1025
add_subwindow(button = new CWindowProjectorCenter(mwindow, this, x1, y));
1026
x1 += button->get_w();
1027
add_subwindow(button = new CWindowProjectorRight(mwindow, this, x1, y));
1029
y += button->get_h();
1031
add_subwindow(button = new CWindowProjectorTop(mwindow, this, x1, y));
1032
x1 += button->get_w();
1033
add_subwindow(button = new CWindowProjectorMiddle(mwindow, this, x1, y));
1034
x1 += button->get_w();
1035
add_subwindow(button = new CWindowProjectorBottom(mwindow, this, x1, y));
1039
void CWindowProjectorGUI::update_preview()
1041
mwindow->restart_brender();
1042
mwindow->sync_parameters(CHANGE_PARAMS);
1043
mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1047
mwindow->cwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
1048
mwindow->cwindow->gui->canvas->draw_refresh();
1049
mwindow->cwindow->gui->unlock_window();
1052
void CWindowProjectorGUI::handle_event()
1054
FloatAuto *x_auto = 0;
1055
FloatAuto *y_auto = 0;
1056
FloatAuto *z_auto = 0;
1057
Track *track = mwindow->cwindow->calculate_affected_track();
1061
if(event_caller == x)
1063
x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1064
track->automation->autos[AUTOMATION_PROJECTOR_X],
1068
x_auto->value = atof(x->get_text());
1073
if(event_caller == y)
1075
y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1076
track->automation->autos[AUTOMATION_PROJECTOR_Y],
1080
y_auto->value = atof(y->get_text());
1085
if(event_caller == z)
1087
z_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1088
track->automation->autos[AUTOMATION_PROJECTOR_Z],
1092
float zoom = atof(z->get_text());
1093
if(zoom > 10000) zoom = 10000;
1095
if(zoom < 0) zoom = 0;
1096
// if (zoom != atof(z->get_text()))
1098
z_auto->value = zoom;
1100
mwindow->gui->lock_window("CWindowProjectorGUI::handle_event");
1101
mwindow->gui->canvas->draw_overlays();
1102
mwindow->gui->canvas->flash();
1103
mwindow->gui->unlock_window();
1111
void CWindowProjectorGUI::update()
1113
FloatAuto *x_auto = 0;
1114
FloatAuto *y_auto = 0;
1115
FloatAuto *z_auto = 0;
1116
Track *track = mwindow->cwindow->calculate_affected_track();
1120
mwindow->cwindow->calculate_affected_autos(&x_auto,
1131
x->update(x_auto->value);
1133
y->update(y_auto->value);
1135
z->update(z_auto->value);
1138
// BezierAuto* CWindowProjectorGUI::get_keyframe()
1140
// BezierAuto *keyframe = 0;
1141
// Track *track = mwindow->cwindow->calculate_affected_track();
1143
// keyframe = (BezierAuto*)mwindow->cwindow->calculate_affected_auto(
1144
// track->automation->autos[AUTOMATION_PROJECTOR]);
1185
CWindowProjectorLeft::CWindowProjectorLeft(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1186
: BC_Button(x, y, mwindow->theme->get_image_set("left_justify"))
1189
this->mwindow = mwindow;
1190
set_tooltip(_("Left justify"));
1192
int CWindowProjectorLeft::handle_event()
1194
FloatAuto *x_auto = 0;
1195
FloatAuto *z_auto = 0;
1196
Track *track = mwindow->cwindow->calculate_affected_track();
1199
mwindow->cwindow->calculate_affected_autos(&x_auto,
1208
if(x_auto && z_auto)
1210
x_auto->value = (double)track->track_w * z_auto->value / 2 -
1211
(double)mwindow->edl->session->output_w / 2;
1213
gui->update_preview();
1220
CWindowProjectorCenter::CWindowProjectorCenter(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1221
: BC_Button(x, y, mwindow->theme->get_image_set("center_justify"))
1224
this->mwindow = mwindow;
1225
set_tooltip(_("Center horizontal"));
1227
int CWindowProjectorCenter::handle_event()
1229
FloatAuto *x_auto = 0;
1230
Track *track = mwindow->cwindow->calculate_affected_track();
1232
x_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1233
track->automation->autos[AUTOMATION_PROJECTOR_X],
1240
gui->update_preview();
1247
CWindowProjectorRight::CWindowProjectorRight(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1248
: BC_Button(x, y, mwindow->theme->get_image_set("right_justify"))
1251
this->mwindow = mwindow;
1252
set_tooltip(_("Right justify"));
1254
int CWindowProjectorRight::handle_event()
1256
FloatAuto *x_auto = 0;
1257
FloatAuto *z_auto = 0;
1258
Track *track = mwindow->cwindow->calculate_affected_track();
1261
mwindow->cwindow->calculate_affected_autos(&x_auto,
1271
if(x_auto && z_auto)
1273
x_auto->value = -((double)track->track_w * z_auto->value / 2 -
1274
(double)mwindow->edl->session->output_w / 2);
1276
gui->update_preview();
1283
CWindowProjectorTop::CWindowProjectorTop(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1284
: BC_Button(x, y, mwindow->theme->get_image_set("top_justify"))
1287
this->mwindow = mwindow;
1288
set_tooltip(_("Top justify"));
1290
int CWindowProjectorTop::handle_event()
1292
FloatAuto *y_auto = 0;
1293
FloatAuto *z_auto = 0;
1294
Track *track = mwindow->cwindow->calculate_affected_track();
1297
mwindow->cwindow->calculate_affected_autos(0,
1307
if(y_auto && z_auto)
1309
y_auto->value = (double)track->track_h * z_auto->value / 2 -
1310
(double)mwindow->edl->session->output_h / 2;
1312
gui->update_preview();
1319
CWindowProjectorMiddle::CWindowProjectorMiddle(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1320
: BC_Button(x, y, mwindow->theme->get_image_set("middle_justify"))
1323
this->mwindow = mwindow;
1324
set_tooltip(_("Center vertical"));
1326
int CWindowProjectorMiddle::handle_event()
1328
FloatAuto *y_auto = 0;
1329
Track *track = mwindow->cwindow->calculate_affected_track();
1331
y_auto = (FloatAuto*)mwindow->cwindow->calculate_affected_auto(
1332
track->automation->autos[AUTOMATION_PROJECTOR_Y], 1);
1338
gui->update_preview();
1345
CWindowProjectorBottom::CWindowProjectorBottom(MWindow *mwindow, CWindowProjectorGUI *gui, int x, int y)
1346
: BC_Button(x, y, mwindow->theme->get_image_set("bottom_justify"))
1349
this->mwindow = mwindow;
1350
set_tooltip(_("Bottom justify"));
1352
int CWindowProjectorBottom::handle_event()
1354
FloatAuto *y_auto = 0;
1355
FloatAuto *z_auto = 0;
1356
Track *track = mwindow->cwindow->calculate_affected_track();
1359
mwindow->cwindow->calculate_affected_autos(0,
1369
if(y_auto && z_auto)
1371
y_auto->value = -((double)track->track_h * z_auto->value / 2 -
1372
(double)mwindow->edl->session->output_h / 2);
1374
gui->update_preview();
1387
CWindowMaskMode::CWindowMaskMode(MWindow *mwindow,
1388
CWindowToolGUI *gui,
1398
this->mwindow = mwindow;
1402
void CWindowMaskMode::create_objects()
1404
add_item(new BC_MenuItem(mode_to_text(MASK_MULTIPLY_ALPHA)));
1405
add_item(new BC_MenuItem(mode_to_text(MASK_SUBTRACT_ALPHA)));
1408
char* CWindowMaskMode::mode_to_text(int mode)
1412
case MASK_MULTIPLY_ALPHA:
1413
return _("Multiply alpha");
1416
case MASK_SUBTRACT_ALPHA:
1417
return _("Subtract alpha");
1421
return _("Subtract alpha");
1424
int CWindowMaskMode::text_to_mode(char *text)
1426
if(!strcasecmp(text, _("Multiply alpha")))
1427
return MASK_MULTIPLY_ALPHA;
1429
if(!strcasecmp(text, _("Subtract alpha")))
1430
return MASK_SUBTRACT_ALPHA;
1432
return MASK_SUBTRACT_ALPHA;
1435
int CWindowMaskMode::handle_event()
1441
((CWindowMaskGUI*)gui)->get_keyframe(track,
1449
((MaskAuto*)track->automation->autos[AUTOMATION_MASK]->default_auto)->mode =
1450
text_to_mode(get_text());
1453
//printf("CWindowMaskMode::handle_event 1\n");
1454
gui->update_preview();
1465
CWindowMaskDelete::CWindowMaskDelete(MWindow *mwindow,
1466
CWindowToolGUI *gui,
1469
: BC_GenericButton(x, y, _("Delete"))
1471
this->mwindow = mwindow;
1475
int CWindowMaskDelete::handle_event()
1478
Track *track = mwindow->cwindow->calculate_affected_track();
1485
MaskAutos *mask_autos = (MaskAutos*)track->automation->autos[AUTOMATION_MASK];
1486
for(MaskAuto *current = (MaskAuto*)mask_autos->default_auto;
1489
SubMask *submask = current->get_submask(mwindow->edl->session->cwindow_mask);
1493
for(int i = mwindow->cwindow->gui->affected_point;
1494
i < submask->points.total - 1;
1497
*submask->points.values[i] = *submask->points.values[i + 1];
1500
if(submask->points.total)
1502
submask->points.remove_object(
1503
submask->points.values[submask->points.total - 1]);
1507
if(current == (MaskAuto*)mask_autos->default_auto)
1508
current = (MaskAuto*)mask_autos->first;
1510
current = (MaskAuto*)NEXT;
1513
gui->update_preview();
1517
// ((CWindowMaskGUI*)gui)->get_keyframe(track,
1523
// Need to apply to every keyframe
1527
// for(int i = mwindow->cwindow->gui->affected_point;
1528
// i < mask->points.total - 1;
1531
// *mask->points.values[i] = *mask->points.values[i + 1];
1534
// if(mask->points.total)
1536
// mask->points.remove_object(mask->points.values[mask->points.total - 1]);
1540
// gui->update_preview();
1546
int CWindowMaskDelete::keypress_event()
1548
if(get_keypress() == BACKSPACE ||
1549
get_keypress() == DELETE)
1550
return handle_event();
1555
CWindowMaskCycleNext::CWindowMaskCycleNext(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1556
: BC_GenericButton(x, y, _("Cycle next"))
1558
this->mwindow = mwindow;
1561
int CWindowMaskCycleNext::handle_event()
1567
((CWindowMaskGUI*)gui)->get_keyframe(track,
1575
// Should apply to all keyframes
1576
if(keyframe && mask->points.total)
1578
temp = mask->points.values[0];
1580
for(int i = 0; i < mask->points.total - 1; i++)
1582
mask->points.values[i] = mask->points.values[i + 1];
1584
mask->points.values[mask->points.total - 1] = temp;
1586
mwindow->cwindow->gui->affected_point--;
1587
if(mwindow->cwindow->gui->affected_point < 0)
1588
mwindow->cwindow->gui->affected_point = mask->points.total - 1;
1591
gui->update_preview();
1597
CWindowMaskCyclePrev::CWindowMaskCyclePrev(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1598
: BC_GenericButton(x, y, _("Cycle prev"))
1600
this->mwindow = mwindow;
1603
int CWindowMaskCyclePrev::handle_event()
1609
((CWindowMaskGUI*)gui)->get_keyframe(track,
1615
// Should apply to all keyframes
1617
if(keyframe && mask->points.total)
1619
temp = mask->points.values[mask->points.total - 1];
1621
for(int i = mask->points.total - 1; i > 0; i--)
1623
mask->points.values[i] = mask->points.values[i - 1];
1625
mask->points.values[0] = temp;
1627
mwindow->cwindow->gui->affected_point++;
1628
if(mwindow->cwindow->gui->affected_point >= mask->points.total)
1629
mwindow->cwindow->gui->affected_point = 0;
1632
gui->update_preview();
1638
CWindowMaskNumber::CWindowMaskNumber(MWindow *mwindow,
1639
CWindowToolGUI *gui,
1642
: BC_TumbleTextBox(gui,
1643
(int64_t)mwindow->edl->session->cwindow_mask,
1645
(int64_t)SUBMASKS - 1,
1650
this->mwindow = mwindow;
1654
CWindowMaskNumber::~CWindowMaskNumber()
1658
int CWindowMaskNumber::handle_event()
1660
mwindow->edl->session->cwindow_mask = atol(get_text());
1662
gui->update_preview();
1670
CWindowMaskFeather::CWindowMaskFeather(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1671
: BC_TumbleTextBox(gui,
1679
this->mwindow = mwindow;
1682
CWindowMaskFeather::~CWindowMaskFeather()
1685
int CWindowMaskFeather::handle_event()
1691
((CWindowMaskGUI*)gui)->get_keyframe(track,
1697
keyframe->feather = atof(get_text());
1698
gui->update_preview();
1702
CWindowMaskValue::CWindowMaskValue(MWindow *mwindow, CWindowToolGUI *gui, int x, int y)
1712
this->mwindow = mwindow;
1716
CWindowMaskValue::~CWindowMaskValue()
1720
int CWindowMaskValue::handle_event()
1726
((CWindowMaskGUI*)gui)->get_keyframe(track,
1732
keyframe->value = get_value();
1733
gui->update_preview();
1739
CWindowMaskBeforePlugins::CWindowMaskBeforePlugins(CWindowToolGUI *gui, int x, int y)
1743
_("Apply mask before plugins"))
1748
int CWindowMaskBeforePlugins::handle_event()
1754
((CWindowMaskGUI*)gui)->get_keyframe(track,
1761
keyframe->apply_before_plugins = get_value();
1762
gui->update_preview();
1774
CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread)
1775
: CWindowToolGUI(mwindow,
1777
PROGRAM_NAME ": Mask",
1781
this->mwindow = mwindow;
1782
this->thread = thread;
1784
CWindowMaskGUI::~CWindowMaskGUI()
1790
void CWindowMaskGUI::create_objects()
1793
MaskAuto *keyframe = 0;
1794
Track *track = mwindow->cwindow->calculate_affected_track();
1796
keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(track->automation->autos[AUTOMATION_MASK], 0);
1799
add_subwindow(title = new BC_Title(x, y, _("Mode:")));
1800
add_subwindow(mode = new CWindowMaskMode(mwindow,
1805
mode->create_objects();
1807
add_subwindow(new BC_Title(x, y, _("Value:")));
1808
add_subwindow(value = new CWindowMaskValue(mwindow, this, x + 50, y));
1810
add_subwindow(delete_point = new CWindowMaskDelete(mwindow, this, x, y));
1812
add_subwindow(new BC_Title(x, y, _("Mask number:")));
1813
number = new CWindowMaskNumber(mwindow,
1817
number->create_objects();
1819
add_subwindow(new BC_Title(x, y, _("Feather:")));
1820
feather = new CWindowMaskFeather(mwindow,
1824
feather->create_objects();
1826
add_subwindow(title = new BC_Title(x, y, _("X:")));
1827
x += title->get_w();
1828
this->x = new CWindowCoord(this,
1832
this->x->create_objects();
1834
add_subwindow(title = new BC_Title(x, y, _("Y:")));
1835
x += title->get_w();
1836
this->y = new CWindowCoord(this,
1840
this->y->create_objects();
1843
// add_subwindow(title = new BC_Title(x, y, _("Apply mask before plugins:")));
1845
add_subwindow(this->apply_before_plugins = new CWindowMaskBeforePlugins(this,
1848
// this->apply_before_plugins->create_objects();
1854
void CWindowMaskGUI::get_keyframe(Track* &track,
1855
MaskAuto* &keyframe,
1861
track = mwindow->cwindow->calculate_affected_track();
1863
keyframe = (MaskAuto*)mwindow->cwindow->calculate_affected_auto(track->automation->autos[AUTOMATION_MASK], create_it);
1868
mask = keyframe->get_submask(mwindow->edl->session->cwindow_mask);
1875
if(mwindow->cwindow->gui->affected_point < mask->points.total &&
1876
mwindow->cwindow->gui->affected_point >= 0)
1878
point = mask->points.values[mwindow->cwindow->gui->affected_point];
1883
void CWindowMaskGUI::update()
1889
//printf("CWindowMaskGUI::update 1\n");
1896
//printf("CWindowMaskGUI::update 1\n");
1899
x->update(point->x);
1900
y->update(point->y);
1902
//printf("CWindowMaskGUI::update 1\n");
1906
feather->update((int64_t)keyframe->feather);
1907
value->update((int64_t)keyframe->value);
1908
apply_before_plugins->update((int64_t)keyframe->apply_before_plugins);
1910
//printf("CWindowMaskGUI::update 1\n");
1912
number->update((int64_t)mwindow->edl->session->cwindow_mask);
1914
//printf("CWindowMaskGUI::update 1\n");
1918
CWindowMaskMode::mode_to_text(((MaskAuto*)track->automation->autos[AUTOMATION_MASK]->default_auto)->mode));
1920
//printf("CWindowMaskGUI::update 2\n");
1923
void CWindowMaskGUI::handle_event()
1937
point->x = atof(x->get_text());
1938
point->y = atof(y->get_text());
1944
void CWindowMaskGUI::update_preview()
1946
mwindow->restart_brender();
1947
mwindow->sync_parameters(CHANGE_PARAMS);
1948
mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
1952
mwindow->cwindow->gui->lock_window("CWindowMaskGUI::update_preview");
1953
mwindow->cwindow->gui->canvas->draw_refresh();
1954
mwindow->cwindow->gui->unlock_window();