4 * Copyright (C) 2008-2017 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 "bcsignals.h"
26 #include "edlsession.h"
29 #include "mainsession.h"
30 #include "mwindowgui.h"
33 #include "playback3d.h"
34 #include "videodevice.h"
39 Canvas::Canvas(MWindow *mwindow, BC_WindowBase *subwindow,
40 int x, int y, int w, int h, int output_w, int output_h,
45 int xs10 = xS(10), ys10 = yS(10);
46 if(w < xs10) w = xs10;
47 if(h < ys10) h = ys10;
48 this->mwindow = mwindow;
49 this->subwindow = subwindow;
54 this->output_w = output_w;
55 this->output_h = output_h;
56 this->use_scrollbars = use_scrollbars;
57 this->canvas_auxwindow = 0;
58 this->scr_w0 = subwindow->get_screen_w(0, 0);
59 this->root_w = subwindow->get_root_w(0);
60 this->root_h = subwindow->get_root_h(0);
61 canvas_lock = new Condition(1, "Canvas::canvas_lock", 1);
66 if(refresh_frame) delete refresh_frame;
68 if(yscroll) delete yscroll;
69 if(xscroll) delete xscroll;
70 delete canvas_subwindow;
71 delete canvas_fullscreen;
84 canvas_fullscreen = 0;
90 BC_WindowBase *Canvas::lock_canvas(const char *loc)
92 canvas_lock->lock(loc);
93 BC_WindowBase *wdw = get_canvas();
94 if( wdw ) wdw->lock_window(loc);
98 void Canvas::unlock_canvas()
100 BC_WindowBase *wdw = get_canvas();
101 if( wdw ) wdw->unlock_window();
102 canvas_lock->unlock();
105 BC_WindowBase* Canvas::get_canvas()
107 if(get_fullscreen() && canvas_fullscreen)
108 return canvas_fullscreen;
109 return canvas_auxwindow ? canvas_auxwindow : canvas_subwindow;
112 void Canvas::use_auxwindow(BC_WindowBase *aux)
114 canvas_auxwindow = aux;
117 void Canvas::use_cwindow()
119 canvas_menu->use_cwindow();
120 fullscreen_menu->use_cwindow();
123 void Canvas::use_rwindow()
125 canvas_menu->use_rwindow();
128 void Canvas::use_vwindow()
130 canvas_menu->use_vwindow();
133 int Canvas::get_fullscreen()
135 return is_fullscreen;
138 void Canvas::set_fullscreen(int value)
140 is_fullscreen = value;
143 // Get dimensions given a zoom
144 void Canvas::calculate_sizes(float aspect_ratio,
151 // Horizontal stretch
152 if((float)output_w / output_h <= aspect_ratio)
154 w = (int)((float)output_h * aspect_ratio * zoom);
155 h = (int)((float)output_h * zoom);
160 h = (int)((float)output_w / aspect_ratio * zoom);
161 w = (int)((float)output_w * zoom);
165 float Canvas::get_x_offset(EDL *edl,
175 // If the projection is smaller than the canvas, this forces it in the center.
176 // if(conformed_w < w_visible)
177 // return -(float)(w_visible - conformed_w) / 2;
179 return (float)get_xscroll();
182 return ((float)-get_canvas()->get_w() / zoom_x +
183 edl->session->output_w) / 2;
188 int canvas_w = get_canvas()->get_w();
189 int canvas_h = get_canvas()->get_h();
193 if((float)out_w / out_h > conformed_w / conformed_h)
195 out_w = (int)(out_h * conformed_w / conformed_h + 0.5);
199 return -(canvas_w - out_w) / 2 / zoom_x;
205 float Canvas::get_y_offset(EDL *edl,
215 // If the projection is smaller than the canvas, this forces it in the center.
216 // if(conformed_h < h_visible)
217 // return -(float)(h_visible - conformed_h) / 2;
219 return (float)get_yscroll();
222 return ((float)-get_canvas()->get_h() / zoom_y +
223 edl->session->output_h) / 2;
228 int canvas_w = get_canvas()->get_w();
229 int canvas_h = get_canvas()->get_h();
233 if((float)out_w / out_h <= conformed_w / conformed_h)
235 out_h = (int)((float)out_w / (conformed_w / conformed_h) + 0.5);
238 //printf("Canvas::get_y_offset 1 %d %d %f\n", out_h, canvas_h, -((float)canvas_h - out_h) / 2);
240 return -((float)canvas_h - out_h) / 2 / zoom_y;
246 // This may not be used anymore
247 void Canvas::check_boundaries(EDL *edl, int &x, int &y, float &zoom)
249 if(x + w_visible > w_needed) x = w_needed - w_visible;
250 if(y + h_visible > h_needed) y = h_needed - h_visible;
256 void Canvas::update_scrollbars(int flush)
260 if(xscroll) xscroll->update_length(w_needed, get_xscroll(), w_visible, flush);
261 if(yscroll) yscroll->update_length(h_needed, get_yscroll(), h_visible, flush);
265 void Canvas::get_zooms(EDL *edl,
272 edl->calculate_conformed_dimensions(single_channel,
278 zoom_x = get_zoom() *
280 edl->session->output_w;
281 zoom_y = get_zoom() *
283 edl->session->output_h;
288 int canvas_w = get_canvas()->get_w();
289 int canvas_h = get_canvas()->get_h();
294 if((float)out_w / out_h > conformed_w / conformed_h)
296 out_w = (int)((float)out_h * conformed_w / conformed_h + 0.5);
300 out_h = (int)((float)out_w / (conformed_w / conformed_h) + 0.5);
303 zoom_x = (float)out_w / edl->session->output_w;
304 zoom_y = (float)out_h / edl->session->output_h;
305 //printf("get zooms 2 %d %d %f %f\n", canvas_w, canvas_h, conformed_w, conformed_h);
309 // Convert a coordinate on the canvas to a coordinate on the output
310 void Canvas::canvas_to_output(EDL *edl, int single_channel, float &x, float &y)
312 float zoom_x, zoom_y, conformed_w, conformed_h;
313 get_zooms(edl, single_channel, zoom_x, zoom_y, conformed_w, conformed_h);
315 //printf("Canvas::canvas_to_output y=%f zoom_y=%f y_offset=%f\n",
316 // y, zoom_y, get_y_offset(edl, single_channel, zoom_y, conformed_w, conformed_h));
318 x = (float)x / zoom_x + get_x_offset(edl, single_channel, zoom_x, conformed_w, conformed_h);
319 y = (float)y / zoom_y + get_y_offset(edl, single_channel, zoom_y, conformed_w, conformed_h);
322 void Canvas::output_to_canvas(EDL *edl, int single_channel, float &x, float &y)
324 float zoom_x, zoom_y, conformed_w, conformed_h;
325 get_zooms(edl, single_channel, zoom_x, zoom_y, conformed_w, conformed_h);
327 //printf("Canvas::output_to_canvas x=%f zoom_x=%f x_offset=%f\n", x, zoom_x, get_x_offset(edl, single_channel, zoom_x, conformed_w));
329 x = (float)zoom_x * (x - get_x_offset(edl, single_channel, zoom_x, conformed_w, conformed_h));
330 y = (float)zoom_y * (y - get_y_offset(edl, single_channel, zoom_y, conformed_w, conformed_h));
335 void Canvas::get_transfers(EDL *edl,
336 float &output_x1, float &output_y1, float &output_x2, float &output_y2,
337 float &canvas_x1, float &canvas_y1, float &canvas_x2, float &canvas_y2,
338 int canvas_w, int canvas_h)
340 //printf("Canvas::get_transfers %d canvas_w=%d canvas_h=%d\n",
341 // __LINE__, canvas_w, canvas_h);
342 // automatic canvas size detection
343 if(canvas_w < 0) canvas_w = get_canvas()->get_w();
344 if(canvas_h < 0) canvas_h = get_canvas()->get_h();
346 // Canvas is zoomed to a portion of the output frame
349 float in_x1, in_y1, in_x2, in_y2;
350 float out_x1, out_y1, out_x2, out_y2;
351 float zoom_x, zoom_y, conformed_w, conformed_h;
353 get_zooms(edl, 0, zoom_x, zoom_y, conformed_w, conformed_h);
363 canvas_to_output(edl, 0, in_x1, in_y1);
364 canvas_to_output(edl, 0, in_x2, in_y2);
366 //printf("Canvas::get_transfers 1 %.0f %.0f %.0f %.0f -> %.0f %.0f %.0f %.0f\n",
367 //in_x1, in_y1, in_x2, in_y2, out_x1, out_y1, out_x2, out_y2);
371 out_x1 += -in_x1 * zoom_x;
377 out_y1 += -in_y1 * zoom_y;
381 int output_w = get_output_w(edl);
382 int output_h = get_output_h(edl);
386 out_x2 -= (in_x2 - output_w) * zoom_x;
392 out_y2 -= (in_y2 - output_h) * zoom_y;
395 // printf("Canvas::get_transfers 2 %.0f %.0f %.0f %.0f -> %.0f %.0f %.0f %.0f\n",
396 // in_x1, in_y1, in_x2, in_y2, out_x1, out_y1, out_x2, out_y2);
408 // if(!scrollbars_exist())
410 // out_x = canvas_w / 2 - out_w / 2;
411 // out_y = canvas_h / 2 - out_h / 2;
416 // The output frame is normalized to the canvas
418 // Default canvas coords fill the entire canvas
421 canvas_x2 = canvas_w;
422 canvas_y2 = canvas_h;
426 // Use EDL aspect ratio to shrink one of the canvas dimensions
427 float out_w = canvas_x2 - canvas_x1;
428 float out_h = canvas_y2 - canvas_y1;
429 if(out_w / out_h > edl->get_aspect_ratio())
431 out_w = (int)(out_h * edl->get_aspect_ratio() + 0.5);
432 canvas_x1 = canvas_w / 2 - out_w / 2;
436 out_h = (int)(out_w / edl->get_aspect_ratio() + 0.5);
437 canvas_y1 = canvas_h / 2 - out_h / 2;
438 // printf("Canvas::get_transfers %d canvas_h=%d out_h=%f canvas_y1=%f\n",
444 canvas_x2 = canvas_x1 + out_w;
445 canvas_y2 = canvas_y1 + out_h;
447 // Get output frame coords from EDL
450 output_x2 = get_output_w(edl);
451 output_y2 = get_output_h(edl);
454 // No EDL to get aspect ratio or output frame coords from
458 output_x2 = this->output_w;
459 output_y2 = this->output_h;
463 // Clamp to minimum value
464 output_x1 = MAX(0, output_x1);
465 output_y1 = MAX(0, output_y1);
466 output_x2 = MAX(output_x1, output_x2);
467 output_y2 = MAX(output_y1, output_y2);
468 canvas_x1 = MAX(0, canvas_x1);
469 canvas_y1 = MAX(0, canvas_y1);
470 canvas_x2 = MAX(canvas_x1, canvas_x2);
471 canvas_y2 = MAX(canvas_y1, canvas_y2);
472 // printf("Canvas::get_transfers %d %f,%f %f,%f -> %f,%f %f,%f\n",
484 int Canvas::scrollbars_exist()
486 return(use_scrollbars && (xscroll || yscroll));
489 int Canvas::get_output_w(EDL *edl)
491 return !edl ? 0 : edl->session->output_w;
494 int Canvas::get_output_h(EDL *edl)
496 return !edl ? 0 : edl->session->output_h;
501 void Canvas::get_scrollbars(EDL *edl,
507 int need_xscroll = 0;
508 int need_yscroll = 0;
510 float zoom_x, zoom_y, conformed_w, conformed_h;
514 w_needed = edl->session->output_w;
515 h_needed = edl->session->output_h;
516 w_visible = w_needed;
517 h_visible = h_needed;
519 //printf("Canvas::get_scrollbars 1 %d %d\n", get_xscroll(), get_yscroll());
521 if( use_scrollbars ) {
522 w_needed = edl->session->output_w;
523 h_needed = edl->session->output_h;
524 get_zooms(edl, 0, zoom_x, zoom_y, conformed_w, conformed_h);
525 //printf("Canvas::get_scrollbars 2 %d %d\n", get_xscroll(), get_yscroll());
527 w_visible = (int)(canvas_w / zoom_x);
528 h_visible = (int)(canvas_h / zoom_y);
529 if( w_needed > w_visible ) {
531 canvas_h -= BC_ScrollBar::get_span(SCROLL_HORIZ);
534 if( h_needed > h_visible ) {
536 canvas_w -= BC_ScrollBar::get_span(SCROLL_VERT);
538 //printf("Canvas::get_scrollbars %d %d %d %d %d %d\n", canvas_w, canvas_h, w_needed, h_needed, w_visible, h_visible);
539 //printf("Canvas::get_scrollbars 3 %d %d\n", get_xscroll(), get_yscroll());
541 w_visible = (int)(canvas_w / zoom_x);
542 h_visible = (int)(canvas_h / zoom_y);
547 xscroll = new CanvasXScroll(edl, this, canvas_x, canvas_y + canvas_h,
548 w_needed, get_xscroll(), w_visible, canvas_w);
549 subwindow->add_subwindow(xscroll);
550 xscroll->show_window(0);
553 xscroll->reposition_window(canvas_x, canvas_y + canvas_h, canvas_w);
555 if( xscroll->get_length() != w_needed ||
556 xscroll->get_handlelength() != w_visible )
557 xscroll->update_length(w_needed, get_xscroll(), w_visible, 0);
560 delete xscroll; xscroll = 0;
562 //printf("Canvas::get_scrollbars 4 %d %d\n", get_xscroll(), get_yscroll());
566 yscroll = new CanvasYScroll(edl, this, canvas_x + canvas_w, canvas_y,
567 h_needed, get_yscroll(), h_visible, canvas_h);
568 subwindow->add_subwindow(yscroll);
569 yscroll->show_window(0);
572 yscroll->reposition_window(canvas_x + canvas_w, canvas_y, canvas_h);
574 if( yscroll->get_length() != edl->session->output_h ||
575 yscroll->get_handlelength() != h_visible )
576 yscroll->update_length(h_needed, get_yscroll(), h_visible, 0);
579 delete yscroll; yscroll = 0;
581 //printf("Canvas::get_scrollbars 5 %d %d\n", get_xscroll(), get_yscroll());
585 void Canvas::update_geometry(EDL *edl, int x, int y, int w, int h)
588 if( this->x != x || this->y != y ||
589 this->w != w || this->h != h ) redraw = 1;
591 int vx = x, vy = y, vw = w, vh = h;
592 get_scrollbars(edl, vx, vy, vw, vh);
593 if( vx != view_x || vy != view_y ||
594 vw != view_w || vh != view_h ) redraw = 1;
596 if( !redraw ) return;
597 reposition_window(edl, x, y, w, h);
600 void Canvas::reposition_window(EDL *edl, int x, int y, int w, int h)
602 this->x = view_x = x; this->y = view_y = y;
603 this->w = view_w = w; this->h = view_h = h;
604 //printf("Canvas::reposition_window 1\n");
605 get_scrollbars(edl, view_x, view_y, view_w, view_h);
606 //printf("Canvas::reposition_window %d %d %d %d\n", view_x, view_y, view_w, view_h);
609 canvas_subwindow->reposition_window(view_x, view_y, view_w, view_h);
611 // Need to clear out the garbage in the back
612 if(canvas_subwindow->get_video_on())
614 canvas_subwindow->set_color(BLACK);
615 canvas_subwindow->draw_box(0, 0,
616 get_canvas()->get_w(), get_canvas()->get_h());
617 canvas_subwindow->flash(0);
623 // must hold window lock
624 int Canvas::refresh(int flush)
626 BC_WindowBase *window = get_canvas();
627 if( !window ) return 0;
628 // relock in lock order to prevent deadlock
629 window->unlock_window();
630 lock_canvas("Canvas::refresh");
632 canvas_lock->unlock();
635 // must not hold locks
636 int Canvas::redraw(int flush)
638 lock_canvas("Canvas::redraw");
644 void Canvas::set_cursor(int cursor)
646 get_canvas()->set_cursor(cursor, 0, 1);
649 int Canvas::get_cursor_x()
651 return get_canvas()->get_cursor_x();
654 int Canvas::get_cursor_y()
656 return get_canvas()->get_cursor_y();
659 int Canvas::get_buttonpress()
661 return get_canvas()->get_buttonpress();
665 void Canvas::create_objects(EDL *edl)
671 get_scrollbars(edl, view_x, view_y, view_w, view_h);
673 subwindow->unlock_window();
675 subwindow->lock_window("Canvas::create_objects");
677 subwindow->add_subwindow(canvas_menu = new CanvasPopup(this));
678 canvas_menu->create_objects();
680 subwindow->add_subwindow(fullscreen_menu = new CanvasFullScreenPopup(this));
681 fullscreen_menu->create_objects();
685 int Canvas::button_press_event()
689 if(get_canvas()->get_buttonpress() == 3)
692 fullscreen_menu->activate_menu();
694 canvas_menu->activate_menu();
701 void Canvas::start_single()
707 void Canvas::stop_single()
713 void Canvas::start_video()
717 get_canvas()->start_video();
722 void Canvas::stop_video()
726 get_canvas()->stop_video();
732 void Canvas::start_fullscreen()
738 void Canvas::stop_fullscreen()
744 void Canvas::create_canvas()
746 canvas_lock->lock("Canvas::create_canvas");
748 BC_WindowBase *wdw = 0;
749 if( !get_fullscreen() ) {
751 if( canvas_fullscreen ) {
752 canvas_fullscreen->lock_window("Canvas::create_canvas 1");
753 video_on = canvas_fullscreen->get_video_on();
754 if( video_on ) canvas_fullscreen->stop_video();
755 canvas_fullscreen->hide_window();
756 canvas_fullscreen->unlock_window();
758 if( !canvas_auxwindow && !canvas_subwindow ) {
759 subwindow->add_subwindow(canvas_subwindow = new CanvasOutput(this,
760 view_x, view_y, view_w, view_h));
763 wdw->lock_window("Canvas::create_canvas 2");
767 wdw = canvas_auxwindow ? canvas_auxwindow : canvas_subwindow;
768 wdw->lock_window("Canvas::create_canvas 3");
769 video_on = wdw->get_video_on();
770 if( video_on ) wdw->stop_video();
772 wdw->get_fullscreen_geometry(x, y, w, h);
773 wdw->unlock_window();
774 if( canvas_fullscreen ) {
775 if( x != canvas_fullscreen->get_x() ||
776 y != canvas_fullscreen->get_y() ||
777 w != canvas_fullscreen->get_w() ||
778 h != canvas_fullscreen->get_h() ) {
779 delete canvas_fullscreen;
780 canvas_fullscreen = 0;
783 if( !canvas_fullscreen )
784 canvas_fullscreen = new CanvasFullScreen(this, w, h);
785 wdw = canvas_fullscreen;
786 wdw->lock_window("Canvas::create_canvas 4");
789 wdw->reposition_window(x, y);
797 wdw->unlock_window();
798 canvas_lock->unlock();
803 int Canvas::cursor_leave_event_base(BC_WindowBase *caller)
806 if(cursor_inside) result = cursor_leave_event();
811 int Canvas::cursor_enter_event_base(BC_WindowBase *caller)
814 if(caller->is_event_win() && caller->cursor_inside())
817 result = cursor_enter_event();
822 int Canvas::button_press_event_base(BC_WindowBase *caller)
824 if(caller->is_event_win() && caller->cursor_inside())
826 return button_press_event();
831 int Canvas::keypress_event(BC_WindowBase *caller)
833 int key = caller->get_keypress();
836 caller->unlock_window();
841 caller->lock_window("Canvas::keypress_event 1");
844 caller->unlock_window();
847 caller->lock_window("Canvas::keypress_event 2");
855 void Canvas::update_refresh(VideoDevice *device, VFrame *output_frame)
857 int best_color_model = output_frame->get_color_model();
859 device->out_config->driver == PLAYBACK_X11_GL &&
860 output_frame->get_opengl_state() != VFrame::RAM;
862 // OpenGL does YUV->RGB in the compositing step
864 best_color_model = BC_RGB888;
865 else if( BC_CModels::has_alpha(best_color_model) ) {
867 BC_CModels::is_float(best_color_model ) ?
869 BC_CModels::is_yuv(best_color_model ) ?
870 ( BC_CModels::calculate_pixelsize(best_color_model) > 8 ?
871 BC_YUV161616 : BC_YUV888 ) :
872 ( BC_CModels::calculate_pixelsize(best_color_model) > 8 ?
873 BC_RGB161616 : BC_RGB888 ) ;
875 int out_w = output_frame->get_w();
876 int out_h = output_frame->get_h();
878 (refresh_frame->get_w() != out_w ||
879 refresh_frame->get_h() != out_h ||
880 refresh_frame->get_color_model() != best_color_model ) ) {
881 // x11 direct render uses BC_BGR8888, use tranfer_from to remap
882 delete refresh_frame; refresh_frame = 0;
885 if( !refresh_frame ) {
887 new VFrame(out_w, out_h, best_color_model);
892 mwindow->playback_3d->copy_from(this, refresh_frame, output_frame, 0);
893 lock_canvas("Canvas::update_refresh");
896 refresh_frame->transfer_from(output_frame, -1);
899 void Canvas::clear(int flash)
901 BC_WindowBase *window = get_canvas();
902 if( !window ) return;
903 window->set_bg_color(get_clear_color());
904 window->clear_box(0,0, window->get_w(), window->get_h());
905 if( flash ) window->flash();
908 void Canvas::clear_borders(EDL *edl)
910 BC_WindowBase *window = get_canvas();
911 if( !window ) return;
913 int window_w = window->get_w();
914 int window_h = window->get_h();
915 float output_x1,output_y1, output_x2,output_y2;
916 float canvas_x1,canvas_y1, canvas_x2,canvas_y2;
918 output_x1, output_y1, output_x2, output_y2,
919 canvas_x1, canvas_y1, canvas_x2, canvas_y2);
920 int color = get_clear_color();
921 window->set_color(color);
923 if( canvas_y1 > 0 ) {
924 window->draw_box(0, 0, window_w, canvas_y1);
925 window->flash(0, 0, window_w, canvas_y1);
928 if( canvas_y2 < window_h ) {
929 window->draw_box(0, canvas_y2, window_w, window_h-canvas_y2);
930 window->flash(0, canvas_y2, window_w, window_h-canvas_y2);
933 if( canvas_x1 > 0 ) {
934 window->draw_box(0, canvas_y1, canvas_x1, canvas_y2-canvas_y1);
935 window->flash(0, canvas_y1, canvas_x1, canvas_y2-canvas_y1);
938 if( canvas_x2 < window_w ) {
939 window->draw_box(canvas_x2, canvas_y1,
940 window_w-canvas_x2, canvas_y2-canvas_y1);
941 window->flash(canvas_x2, canvas_y1,
942 window_w-canvas_x2, canvas_y2-canvas_y1);
946 int Canvas::get_clear_color()
948 BC_WindowBase *cwdw = get_canvas();
949 if( !cwdw ) return 0;
950 return cwdw->get_bg_color();
953 CanvasOutput::CanvasOutput(Canvas *canvas,
954 int x, int y, int w, int h)
955 : BC_SubWindow(x, y, w, h, canvas->get_clear_color())
957 this->canvas = canvas;
960 CanvasOutput::~CanvasOutput()
964 int CanvasOutput::cursor_leave_event()
966 return canvas->cursor_leave_event_base(canvas->get_canvas());
969 int CanvasOutput::cursor_enter_event()
971 return canvas->cursor_enter_event_base(canvas->get_canvas());
974 int CanvasOutput::button_press_event()
976 return canvas->button_press_event_base(canvas->get_canvas());
979 int CanvasOutput::button_release_event()
981 return canvas->button_release_event();
984 int CanvasOutput::cursor_motion_event()
986 return canvas->cursor_motion_event();
989 int CanvasOutput::keypress_event()
991 return canvas->keypress_event(canvas->get_canvas());
996 CanvasFullScreen::CanvasFullScreen(Canvas *canvas, int w, int h)
997 : BC_FullScreen(canvas->subwindow, w, h, canvas->get_clear_color(), 0, 0, 0)
999 this->canvas = canvas;
1002 CanvasFullScreen::~CanvasFullScreen()
1007 CanvasXScroll::CanvasXScroll(EDL *edl, Canvas *canvas, int x, int y,
1008 int length, int position, int handle_length, int pixels)
1009 : BC_ScrollBar(x, y, SCROLL_HORIZ, pixels, length, position, handle_length)
1011 this->canvas = canvas;
1014 CanvasXScroll::~CanvasXScroll()
1018 int CanvasXScroll::handle_event()
1020 canvas->update_zoom(get_value(), canvas->get_yscroll(), canvas->get_zoom());
1021 return canvas->refresh(1);
1025 CanvasYScroll::CanvasYScroll(EDL *edl, Canvas *canvas, int x, int y,
1026 int length, int position, int handle_length, int pixels)
1027 : BC_ScrollBar(x, y, SCROLL_VERT, pixels, length, position, handle_length)
1029 this->canvas = canvas;
1032 CanvasYScroll::~CanvasYScroll()
1036 int CanvasYScroll::handle_event()
1038 canvas->update_zoom(canvas->get_xscroll(), get_value(), canvas->get_zoom());
1039 return canvas->refresh(1);
1043 CanvasFullScreenPopup::CanvasFullScreenPopup(Canvas *canvas)
1044 : BC_PopupMenu(0, 0, 0, "", 0)
1046 this->canvas = canvas;
1050 void CanvasFullScreenPopup::create_objects()
1052 add_item(new CanvasSubWindowItem(canvas));
1055 void CanvasFullScreenPopup::use_cwindow()
1057 add_item(new CanvasPopupAuto(canvas));
1060 CanvasSubWindowItem::CanvasSubWindowItem(Canvas *canvas)
1061 : BC_MenuItem(_("Windowed"), "f", 'f')
1063 this->canvas = canvas;
1066 int CanvasSubWindowItem::handle_event()
1068 // It isn't a problem to delete the canvas from in here because the event
1069 // dispatcher is the canvas subwindow.
1070 canvas->subwindow->unlock_window();
1071 canvas->stop_fullscreen();
1072 canvas->subwindow->lock_window("CanvasSubWindowItem::handle_event");
1077 CanvasPopup::CanvasPopup(Canvas *canvas)
1078 : BC_PopupMenu(0, 0, 0, "", 0)
1080 this->canvas = canvas;
1083 CanvasPopup::~CanvasPopup()
1087 CanvasZoomSize::CanvasZoomSize(Canvas *canvas)
1088 : BC_MenuItem(_("Zoom..."))
1090 this->canvas = canvas;
1093 CanvasSizeSubMenu::CanvasSizeSubMenu(CanvasZoomSize *zoom_size)
1095 this->zoom_size = zoom_size;
1098 void CanvasPopup::create_objects()
1100 add_item(new BC_MenuItem("-"));
1101 add_item(new CanvasFullScreenItem(canvas));
1103 CanvasZoomSize *zoom_size = new CanvasZoomSize(canvas);
1104 add_item(zoom_size);
1105 CanvasSizeSubMenu *submenu = new CanvasSizeSubMenu(zoom_size);
1106 zoom_size->add_submenu(submenu);
1108 submenu->add_submenuitem(new CanvasPopupSize(canvas, _("Zoom 25%"), 0.25));
1109 submenu->add_submenuitem(new CanvasPopupSize(canvas, _("Zoom 33%"), 0.33));
1110 submenu->add_submenuitem(new CanvasPopupSize(canvas, _("Zoom 50%"), 0.5));
1111 submenu->add_submenuitem(new CanvasPopupSize(canvas, _("Zoom 75%"), 0.75));
1112 submenu->add_submenuitem(new CanvasPopupSize(canvas, _("Zoom 100%"), 1.0));
1113 submenu->add_submenuitem(new CanvasPopupSize(canvas, _("Zoom 150%"), 1.5));
1114 submenu->add_submenuitem(new CanvasPopupSize(canvas, _("Zoom 200%"), 2.0));
1115 submenu->add_submenuitem(new CanvasPopupSize(canvas, _("Zoom 300%"), 3.0));
1116 submenu->add_submenuitem(new CanvasPopupSize(canvas, _("Zoom 400%"), 4.0));
1119 void CanvasPopup::use_cwindow()
1121 add_item(new CanvasPopupAuto(canvas));
1122 add_item(new CanvasPopupResetCamera(canvas));
1123 add_item(new CanvasPopupResetProjector(canvas));
1124 add_item(new CanvasPopupCameraKeyframe(canvas));
1125 add_item(new CanvasPopupProjectorKeyframe(canvas));
1126 add_item(toggle_controls = new CanvasToggleControls(canvas));
1129 void CanvasPopup::use_rwindow()
1131 add_item(new CanvasPopupResetTranslation(canvas));
1134 void CanvasPopup::use_vwindow()
1136 add_item(new CanvasPopupRemoveSource(canvas));
1140 CanvasPopupAuto::CanvasPopupAuto(Canvas *canvas)
1141 : BC_MenuItem(_("Zoom Auto"))
1143 this->canvas = canvas;
1146 int CanvasPopupAuto::handle_event()
1148 canvas->zoom_auto();
1153 CanvasPopupSize::CanvasPopupSize(Canvas *canvas, char *text, float percentage)
1156 this->canvas = canvas;
1157 this->percentage = percentage;
1159 CanvasPopupSize::~CanvasPopupSize()
1162 int CanvasPopupSize::handle_event()
1164 canvas->zoom_resize_window(percentage);
1169 CanvasPopupResetCamera::CanvasPopupResetCamera(Canvas *canvas)
1170 : BC_MenuItem(_("Reset camera"), _("F11"), KEY_F11)
1172 this->canvas = canvas;
1174 int CanvasPopupResetCamera::handle_event()
1176 canvas->reset_camera();
1180 CanvasPopupResetProjector::CanvasPopupResetProjector(Canvas *canvas)
1181 : BC_MenuItem(_("Reset projector"), _("F12"), KEY_F12)
1183 this->canvas = canvas;
1185 int CanvasPopupResetProjector::handle_event()
1187 canvas->reset_projector();
1192 CanvasPopupCameraKeyframe::CanvasPopupCameraKeyframe(Canvas *canvas)
1193 : BC_MenuItem(_("Camera keyframe"), _("Shift-F11"), KEY_F11)
1195 this->canvas = canvas;
1198 int CanvasPopupCameraKeyframe::handle_event()
1200 canvas->camera_keyframe();
1204 CanvasPopupProjectorKeyframe::CanvasPopupProjectorKeyframe(Canvas *canvas)
1205 : BC_MenuItem(_("Projector keyframe"), _("Shift-F12"), KEY_F12)
1207 this->canvas = canvas;
1210 int CanvasPopupProjectorKeyframe::handle_event()
1212 canvas->projector_keyframe();
1218 CanvasPopupResetTranslation::CanvasPopupResetTranslation(Canvas *canvas)
1219 : BC_MenuItem(_("Reset translation"))
1221 this->canvas = canvas;
1223 int CanvasPopupResetTranslation::handle_event()
1225 canvas->reset_translation();
1231 CanvasToggleControls::CanvasToggleControls(Canvas *canvas)
1232 : BC_MenuItem(calculate_text(canvas->get_cwindow_controls()))
1234 this->canvas = canvas;
1236 int CanvasToggleControls::handle_event()
1238 canvas->toggle_controls();
1239 set_text(calculate_text(canvas->get_cwindow_controls()));
1243 char* CanvasToggleControls::calculate_text(int cwindow_controls)
1245 if(!cwindow_controls)
1246 return _("Show controls");
1248 return _("Hide controls");
1257 CanvasFullScreenItem::CanvasFullScreenItem(Canvas *canvas)
1258 : BC_MenuItem(_("Fullscreen"), "f", 'f')
1260 this->canvas = canvas;
1262 int CanvasFullScreenItem::handle_event()
1264 canvas->subwindow->unlock_window();
1265 canvas->start_fullscreen();
1266 canvas->subwindow->lock_window("CanvasFullScreenItem::handle_event");
1278 CanvasPopupRemoveSource::CanvasPopupRemoveSource(Canvas *canvas)
1279 : BC_MenuItem(_("Close source"))
1281 this->canvas = canvas;
1283 int CanvasPopupRemoveSource::handle_event()
1285 canvas->close_source();