/*
* CINELERRA
- * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ * Copyright (C) 2008-2017 Adam Williams <broadcast at earthling dot net>
*
* 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
#include "mwindowgui.h"
#include "mutex.h"
#include "mwindow.h"
+#include "playback3d.h"
+#include "videodevice.h"
#include "vframe.h"
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();
{
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;
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,
}
//printf("Canvas::get_scrollbars 1 %d %d\n", get_xscroll(), get_yscroll());
- if(use_scrollbars)
- {
+ if( use_scrollbars ) {
w_needed = edl->session->output_w;
h_needed = edl->session->output_h;
get_zooms(edl, 0, zoom_x, zoom_y, conformed_w, conformed_h);
//printf("Canvas::get_scrollbars 2 %d %d\n", get_xscroll(), get_yscroll());
-// while(!done)
-// {
- w_visible = (int)(canvas_w / zoom_x);
- h_visible = (int)(canvas_h / zoom_y);
-// done = 1;
-
-// if(w_needed > w_visible)
- if(1)
- {
- if(!need_xscroll)
- {
- need_xscroll = 1;
- canvas_h -= BC_ScrollBar::get_span(SCROLL_HORIZ);
-// done = 0;
- }
- }
- else
- need_xscroll = 0;
+ w_visible = (int)(canvas_w / zoom_x);
+ h_visible = (int)(canvas_h / zoom_y);
+ if( w_needed > w_visible ) {
+ need_xscroll = 1;
+ canvas_h -= BC_ScrollBar::get_span(SCROLL_HORIZ);
+ }
-// if(h_needed > h_visible)
- if(1)
- {
- if(!need_yscroll)
- {
- need_yscroll = 1;
- canvas_w -= BC_ScrollBar::get_span(SCROLL_VERT);
-// done = 0;
- }
- }
- else
- need_yscroll = 0;
-// }
+ if( h_needed > h_visible ) {
+ need_yscroll = 1;
+ canvas_w -= BC_ScrollBar::get_span(SCROLL_VERT);
+ }
//printf("Canvas::get_scrollbars %d %d %d %d %d %d\n", canvas_w, canvas_h, w_needed, h_needed, w_visible, h_visible);
//printf("Canvas::get_scrollbars 3 %d %d\n", get_xscroll(), get_yscroll());
h_visible = (int)(canvas_h / zoom_y);
}
- if(need_xscroll)
- {
- if(!xscroll)
- {
- subwindow->add_subwindow(xscroll =
- new CanvasXScroll(edl, this, canvas_x, canvas_y + canvas_h,
- w_needed, get_xscroll(), w_visible, canvas_w));
+ if( need_xscroll ) {
+ if( !xscroll ) {
+ xscroll = new CanvasXScroll(edl, this, canvas_x, canvas_y + canvas_h,
+ w_needed, get_xscroll(), w_visible, canvas_w);
+ subwindow->add_subwindow(xscroll);
xscroll->show_window(0);
}
else
xscroll->reposition_window(canvas_x, canvas_y + canvas_h, canvas_w);
- if(xscroll->get_length() != w_needed ||
- xscroll->get_handlelength() != w_visible)
+ if( xscroll->get_length() != w_needed ||
+ xscroll->get_handlelength() != w_visible )
xscroll->update_length(w_needed, get_xscroll(), w_visible, 0);
}
- else
- {
- if( xscroll ) { delete xscroll; xscroll = 0; }
+ else if( xscroll ) {
+ delete xscroll; xscroll = 0;
}
//printf("Canvas::get_scrollbars 4 %d %d\n", get_xscroll(), get_yscroll());
- if(need_yscroll)
- {
- if(!yscroll)
- {
- subwindow->add_subwindow(yscroll =
- new CanvasYScroll(edl, this, canvas_x + canvas_w, canvas_y,
- h_needed, get_yscroll(), h_visible, canvas_h));
+ if( need_yscroll ) {
+ if( !yscroll ) {
+ yscroll = new CanvasYScroll(edl, this, canvas_x + canvas_w, canvas_y,
+ h_needed, get_yscroll(), h_visible, canvas_h);
+ subwindow->add_subwindow(yscroll);
yscroll->show_window(0);
}
else
yscroll->reposition_window(canvas_x + canvas_w, canvas_y, canvas_h);
- if(yscroll->get_length() != edl->session->output_h ||
- yscroll->get_handlelength() != h_visible)
+ if( yscroll->get_length() != edl->session->output_h ||
+ yscroll->get_handlelength() != h_visible )
yscroll->update_length(h_needed, get_yscroll(), h_visible, 0);
}
- else
- {
- if( yscroll ) { delete yscroll; yscroll = 0; }
+ else if( yscroll ) {
+ delete yscroll; yscroll = 0;
}
//printf("Canvas::get_scrollbars 5 %d %d\n", get_xscroll(), get_yscroll());
}
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::SCREEN;
+// OpenGL does YUV->RGB in the compositing step
+ if( use_opengl )
+ best_color_model = BC_RGB888;
+ if( refresh_frame &&
+ (refresh_frame->get_w() != device->out_w ||
+ refresh_frame->get_h() != device->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(device->out_w, device->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->transfer_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);
+}
void CanvasPopup::create_objects()
{
+ add_item(new BC_MenuItem("-"));
add_item(new CanvasFullScreenItem(canvas));
add_item(new CanvasPopupSize(canvas, _("Zoom 25%"), 0.25));
add_item(new CanvasPopupSize(canvas, _("Zoom 33%"), 0.33));
CanvasPopupResetCamera::CanvasPopupResetCamera(Canvas *canvas)
- : BC_MenuItem(_("Reset camera"))
+ : BC_MenuItem(_("Reset camera"), "F11", KEY_F11)
{
this->canvas = canvas;
}
CanvasPopupResetProjector::CanvasPopupResetProjector(Canvas *canvas)
- : BC_MenuItem(_("Reset projector"))
+ : BC_MenuItem(_("Reset projector"), "F12", KEY_F12)
{
this->canvas = canvas;
}