X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fcanvas.C;h=2a478d41a93c5ab04b3902001ee04d3870caf794;hb=702161ddaf384a773831f1643fca0a54133625b2;hp=b2bd838ddb01d94c81b535e1e8a6c517cc87766a;hpb=2ba7e9962ea989863e152373e96a09b00a0b4eb8;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/canvas.C b/cinelerra-5.1/cinelerra/canvas.C index b2bd838d..2a478d41 100644 --- a/cinelerra-5.1/cinelerra/canvas.C +++ b/cinelerra-5.1/cinelerra/canvas.C @@ -1,7 +1,7 @@ /* * CINELERRA - * Copyright (C) 2008 Adam Williams + * Copyright (C) 2008-2017 Adam Williams * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,6 +30,8 @@ #include "mwindowgui.h" #include "mutex.h" #include "mwindow.h" +#include "playback3d.h" +#include "videodevice.h" #include "vframe.h" @@ -330,8 +332,8 @@ void Canvas::get_transfers(EDL *edl, float &canvas_x1, float &canvas_y1, float &canvas_x2, float &canvas_y2, int canvas_w, int canvas_h) { -// printf("Canvas::get_transfers %d %d\n", canvas_w, -// canvas_h); +//printf("Canvas::get_transfers %d canvas_w=%d canvas_h=%d\n", +// __LINE__, canvas_w, canvas_h); // automatic canvas size detection if(canvas_w < 0) canvas_w = get_canvas()->get_w(); if(canvas_h < 0) canvas_h = get_canvas()->get_h(); @@ -428,6 +430,11 @@ void Canvas::get_transfers(EDL *edl, { out_h = (int)(out_w / edl->get_aspect_ratio() + 0.5); canvas_y1 = canvas_h / 2 - out_h / 2; +// printf("Canvas::get_transfers %d canvas_h=%d out_h=%f canvas_y1=%f\n", +// __LINE__, +// canvas_h, +// out_h, +// canvas_y1); } canvas_x2 = canvas_x1 + out_w; canvas_y2 = canvas_y1 + out_h; @@ -457,7 +464,8 @@ void Canvas::get_transfers(EDL *edl, canvas_y1 = MAX(0, canvas_y1); canvas_x2 = MAX(canvas_x1, canvas_x2); canvas_y2 = MAX(canvas_y1, canvas_y2); -// printf("Canvas::get_transfers 2 %f,%f %f,%f -> %f,%f %f,%f\n", +// printf("Canvas::get_transfers %d %f,%f %f,%f -> %f,%f %f,%f\n", +// __LINE__, // output_x1, // output_y1, // output_x2, @@ -731,23 +739,8 @@ void Canvas::create_canvas() wdw->stop_video(); } - int x = subwindow->get_screen_x(0, -1); - int y = subwindow->get_screen_y(0, -1); - int w = root_w; - int h = root_h; - if( mwindow->screens == 1 && root_w > scr_w0 ) { - // Xinerama - if( subwindow->get_x() >= scr_w0 ) { - // assumes right side is the big one - w = root_w - scr_w0; - h = root_h; - } - else { - // use same aspect ratio to compute left height - w = scr_w0; - h = (w*root_h) / (root_w-scr_w0); - } - } + int x, y, w, h; + wdw->get_fullscreen_geometry(x, y, w, h); if( canvas_fullscreen ) { @@ -780,6 +773,10 @@ void Canvas::create_canvas() if(video_on) get_canvas()->start_video(); + get_canvas()->lock_window("Canvas::create_canvas 2"); + get_canvas()->focus(); + get_canvas()->unlock_window(); + unlock_canvas(); } @@ -815,7 +812,6 @@ int Canvas::button_press_event_base(BC_WindowBase *caller) int Canvas::keypress_event(BC_WindowBase *caller) { - int caller_is_canvas = (caller == get_canvas()); int key = caller->get_keypress(); switch( key ) { case 'f': @@ -824,13 +820,13 @@ int Canvas::keypress_event(BC_WindowBase *caller) stop_fullscreen(); else start_fullscreen(); - if(!caller_is_canvas) caller->lock_window("Canvas::keypress_event 1"); + caller->lock_window("Canvas::keypress_event 1"); break; case ESC: caller->unlock_window(); if(get_fullscreen()) stop_fullscreen(); - if(!caller_is_canvas) caller->lock_window("Canvas::keypress_event 2"); + caller->lock_window("Canvas::keypress_event 2"); break; default: return 0; @@ -838,19 +834,55 @@ int Canvas::keypress_event(BC_WindowBase *caller) return 1; } +void Canvas::update_refresh(VideoDevice *device, VFrame *output_frame) +{ + int best_color_model = output_frame->get_color_model(); + int use_opengl = + device->out_config->driver == PLAYBACK_X11_GL && + output_frame->get_opengl_state() != VFrame::RAM; +// OpenGL does YUV->RGB in the compositing step + if( use_opengl ) + best_color_model = BC_RGB888; + int out_w = output_frame->get_w(); + int out_h = output_frame->get_h(); + if( refresh_frame && + (refresh_frame->get_w() != out_w || + refresh_frame->get_h() != out_h || + refresh_frame->get_color_model() != best_color_model ) ) { +// x11 direct render uses BC_BGR8888, use tranfer_from to remap + delete refresh_frame; refresh_frame = 0; + } + if( !refresh_frame ) { + refresh_frame = + new VFrame(out_w, out_h, best_color_model); + } + if( use_opengl ) { + get_canvas()->unlock_window(); + unlock_canvas(); + mwindow->playback_3d->copy_from(this, refresh_frame, output_frame, 0); + lock_canvas(" Canvas::output_refresh"); + get_canvas()->lock_window(" Canvas::output_refresh"); + } + else + refresh_frame->copy_from(output_frame); +} - - - - - - +void Canvas::clear(int flush) +{ + if( refresh_frame ) + refresh_frame->clear_frame(); + BC_WindowBase *wdw = get_canvas(); + if( !wdw ) return; + wdw->set_bg_color(BLACK); + wdw->clear_box(0,0, wdw->get_w(), wdw->get_h()); + wdw->flash(flush); +} @@ -870,17 +902,17 @@ CanvasOutput::~CanvasOutput() int CanvasOutput::cursor_leave_event() { - return canvas->cursor_leave_event_base(this); + return canvas->cursor_leave_event_base(canvas->get_canvas()); } int CanvasOutput::cursor_enter_event() { - return canvas->cursor_enter_event_base(this); + return canvas->cursor_enter_event_base(canvas->get_canvas()); } int CanvasOutput::button_press_event() { - return canvas->button_press_event_base(this); + return canvas->button_press_event_base(canvas->get_canvas()); } int CanvasOutput::button_release_event() @@ -895,31 +927,13 @@ int CanvasOutput::cursor_motion_event() int CanvasOutput::keypress_event() { - return canvas->keypress_event(this); + return canvas->keypress_event(canvas->get_canvas()); } - - - - - - - - - - -CanvasFullScreen::CanvasFullScreen(Canvas *canvas, - int w, - int h) - : BC_FullScreen(canvas->subwindow, - w, - h, - BLACK, - 0, - 0, - 0) +CanvasFullScreen::CanvasFullScreen(Canvas *canvas, int w, int h) + : BC_FullScreen(canvas->subwindow, w, h, BLACK, 0, 0, 0) { this->canvas = canvas; } @@ -929,32 +943,9 @@ CanvasFullScreen::~CanvasFullScreen() } - - - - - - - - - - - -CanvasXScroll::CanvasXScroll(EDL *edl, - Canvas *canvas, - int x, - int y, - int length, - int position, - int handle_length, - int pixels) - : BC_ScrollBar(x, - y, - SCROLL_HORIZ, - pixels, - length, - position, - handle_length) +CanvasXScroll::CanvasXScroll(EDL *edl, Canvas *canvas, int x, int y, + int length, int position, int handle_length, int pixels) + : BC_ScrollBar(x, y, SCROLL_HORIZ, pixels, length, position, handle_length) { this->canvas = canvas; } @@ -972,25 +963,9 @@ int CanvasXScroll::handle_event() } - - - - -CanvasYScroll::CanvasYScroll(EDL *edl, - Canvas *canvas, - int x, - int y, - int length, - int position, - int handle_length, - int pixels) - : BC_ScrollBar(x, - y, - SCROLL_VERT, - pixels, - length, - position, - handle_length) +CanvasYScroll::CanvasYScroll(EDL *edl, Canvas *canvas, int x, int y, + int length, int position, int handle_length, int pixels) + : BC_ScrollBar(x, y, SCROLL_VERT, pixels, length, position, handle_length) { this->canvas = canvas; } @@ -1008,10 +983,6 @@ int CanvasYScroll::handle_event() } - - - - CanvasFullScreenPopup::CanvasFullScreenPopup(Canvas *canvas) : BC_PopupMenu(0, 0, 0, "", 0) { @@ -1046,12 +1017,6 @@ int CanvasSubWindowItem::handle_event() } - - - - - - CanvasPopup::CanvasPopup(Canvas *canvas) : BC_PopupMenu(0, 0, 0, "", 0) { @@ -1127,7 +1092,7 @@ int CanvasPopupSize::handle_event() CanvasPopupResetCamera::CanvasPopupResetCamera(Canvas *canvas) - : BC_MenuItem(_("Reset camera")) + : BC_MenuItem(_("Reset camera"), "F11", KEY_F11) { this->canvas = canvas; } @@ -1140,7 +1105,7 @@ int CanvasPopupResetCamera::handle_event() CanvasPopupResetProjector::CanvasPopupResetProjector(Canvas *canvas) - : BC_MenuItem(_("Reset projector")) + : BC_MenuItem(_("Reset projector"), "F12", KEY_F12) { this->canvas = canvas; }