if( x1 > x2 ) { int t = x1; x1 = x2; x2 = t; }
if( y1 > y2 ) { int t = y1; y1 = y2; y2 = t; }
}
+ int ow = edl->session->output_w, oh = edl->session->output_h;
int nz = 0;
for( int i=0; i<zwindows.size(); ++i ) {
ZWindow *zwindow = zwindows[i];
++nz;
}
if( !nz ) return;
- int zn = ceil(sqrt(nz));
- int rw = gui->get_root_w(0), rh = gui->get_root_h(0);
- if( x1 < 0 ) x1 = 0;
- if( y1 < 0 ) y1 = 0;
- if( x2 > rw ) x2 = rw;
- if( y2 > rh ) y2 = rh;
- int dx = x2 - x1, dy = y2 - y1;
- int zw = dx / zn;
int lt = BC_DisplayInfo::get_left_border();
int top = BC_DisplayInfo::get_top_border();
int bw = lt + BC_DisplayInfo::get_right_border(); // borders
int bh = top + BC_DisplayInfo::get_bottom_border();
- int zx = 0, zy = 0; // window origins
int mw = xS(10+10), mh = yS(10+10); // canvas margins
- int rsz = 0, n = 0, dz = 0;
- int ow = edl->session->output_w, oh = edl->session->output_h;
+ int dx = x2 - x1, dy = y2 - y1;
+ int64_t sz = dx * dy, best_r = sz;
+ int bx = 1, by = nz;
+ for( int nx=1; nx<=nz; ++nx ) {
+ int ny = ceil((double)nz / nx);
+ int zw = dx / nx;
+ int ww = zw - bw;
+ int hh = (ww - mw) * oh / ow + mh;
+ int zh = hh + bh;
+ int64_t za = zw*nx * zh*ny;
+ int64_t r = sz - za;
+ if( r < 0 ) continue;
+ if( r >= best_r ) continue;
+ best_r = r;
+ bx = nx; by = ny;
+ }
+ for( int ny=1; ny<=nz; ++ny ) {
+ int nx = ceil((double)nz / ny);
+ int zh = dy / ny;
+ int hh = zh - bh;
+ int ww = (hh - mh) * ow / oh + mw;
+ int zw = ww + bw;
+ int64_t za = zw*nx * zh*ny;
+ int64_t r = sz - za;
+ if( r < 0 ) continue;
+ if( r >= best_r ) continue;
+ best_r = r;
+ bx = nx; by = ny;
+ }
+ int zw, zh, ww, hh;
+ if( bx < by ) {
+ zh = dy / by;
+ hh = zh - bh;
+ ww = (hh - mh) * ow / oh + mw;
+ zw = ww + bw;
+ }
+ else {
+ zw = dx / bx;
+ ww = zw - bw;
+ hh = (ww - mw) * oh / ow + mh;
+ zh = hh + bh;
+ }
+
+ int zx = 0, zy = 0; // window origins
+ int n = 0;
for( int i=0; i<zwindows.size(); ++i ) {
ZWindow *zwindow = zwindows[i];
if( zwindow->idx < 0 ) continue;
- int ww = zw - bw, hh = (ww - mw) * oh / ow + mh, zh = hh + bh;
- if( rsz < hh ) rsz = hh;
int xx = zx + x1, yy = zy + y1;
int mx = x2 - zw, my = y2 - zh;
if( xx > mx ) xx = mx;
if( yy > my ) yy = my;
- xx += lt + xS(dz); yy += top + yS(dz);
zwindow->reposition(xx,yy, ww,hh);
if( zwindow->running() ) {
ZWindowGUI *gui = (ZWindowGUI *)zwindow->get_gui();
gui->BC_WindowBase::reposition_window(xx,yy, ww,hh);
gui->unlock_window();
}
- if( ++n >= zn ) {
- n = 0; rsz += bh;
- if( (zy += rsz) > (dy - rsz) ) dz += 10;
- rsz = 0;
- zx = 0;
+ if( ++n >= bx ) {
+ zx = 0; zy += zh;
+ n = 0;
}
else
zx += zw;
gui->mainmenu->show_vwindow->set_checked(1);
}
+
+void MWindow::hide_vwindow(int raise)
+{
+ session->show_vwindow = 0;
+ int total_running = 0;
+
+ for(int j = 0; j < vwindows.size(); j++) {
+ VWindow *vwindow = vwindows[j];
+ if( !vwindow->is_running() ) continue;
+ total_running++;
+ if( !raise && !vwindow->gui->is_hidden() ) continue;
+ vwindow->gui->lock_window("MWindow::show_vwindow");
+ vwindow->gui->hide_window(0);
+ vwindow->gui->unlock_window();
+ }
+ gui->mainmenu->show_vwindow->set_checked(0);
+}
+
+
void MWindow::show_awindow()
{
session->show_awindow = 1;
gui->mainmenu->show_awindow->set_checked(1);
}
+void MWindow::hide_awindow()
+{
+ session->show_awindow = 0;
+
+ awindow->gui->lock_window("MWindow::show_awindow");
+ awindow->gui->hide_window();
+ awindow->gui->unlock_window();
+ gui->mainmenu->show_awindow->set_checked(0);
+}
+
+
char *MWindow::get_cwindow_display()
{
char *x11_host = screens < 2 || session->window_config == 0 ?
gui->mainmenu->show_cwindow->set_checked(1);
}
+
+void MWindow::hide_cwindow()
+{
+ session->show_cwindow = 0;
+
+ cwindow->gui->lock_window("MWindow::show_cwindow");
+ cwindow->gui->hide_window();
+ cwindow->gui->unlock_window();
+ gui->mainmenu->show_cwindow->set_checked(0);
+}
+
+
void MWindow::show_gwindow()
{
session->show_gwindow = 1;
gui->mainmenu->show_gwindow->set_checked(1);
}
+
void MWindow::hide_gwindow()
{
session->show_gwindow = 0;
gwindow->gui->lock_window("MWindow::show_gwindow");
gwindow->gui->hide_window();
gwindow->gui->unlock_window();
+ gui->mainmenu->show_gwindow->set_checked(0);
}
void MWindow::show_lwindow()
gui->mainmenu->show_lwindow->set_checked(1);
}
+void MWindow::hide_lwindow()
+{
+ session->show_lwindow = 0;
+
+ lwindow->gui->lock_window("MWindow::show_lwindow");
+ lwindow->gui->hide_window();
+ lwindow->gui->unlock_window();
+ gui->mainmenu->show_lwindow->set_checked(0);
+}
+
+
void MWindow::restore_windows()
{
gui->unlock_window();
cwindow->gui->unlock_window();
}
else if( session->show_cwindow && cwindow->gui->is_hidden() )
- cwindow->show_window();
+ show_cwindow();
if( !session->show_gwindow && !gwindow->gui->is_hidden() ) {
gwindow->gui->lock_window("MWindow::restore_windows");
int MWindow::create_aspect_ratio(float &w, float &h, int width, int height)
{
w = 1; h = 1;
+ double ar;
+
if(!width || !height) return 1;
if( width == 720 && (height == 480 || height == 576) ) {
w = 4; h = 3; return 0; // for NTSC and PAL
}
- double ar = (double)width / height;
+
+ ar = (double)width / height;
// square-ish pixels
if( EQUIV(ar, 1.0000) ) return 0;
if( EQUIV(ar, 1.3333) ) { w = 4; h = 3; return 0; }
if( EQUIV(ar, 2.1111) ) { w = 19; h = 9; return 0; }
if( EQUIV(ar, 2.2222) ) { w = 20; h = 9; return 0; }
if( EQUIV(ar, 2.3333) ) { w = 21; h = 9; return 0; }
+ if( EQUIV(ar, 2.37037) ) { w = 64; h = 27; return 0; }
+
int ww = width, hh = height;
// numerator, denominator must be under mx
int mx = 255, n = gcd(ww, hh);
session->output_w = width;
session->output_h = height;
session->frame_rate = framerate;
+ session->interlace_mode = asset->interlace_mode;
// not, asset->actual_width/actual_height
asset->width = session->output_w;
asset->height = session->output_h;
asset->frame_rate = session->frame_rate;
+
create_aspect_ratio(session->aspect_w, session->aspect_h,
session->output_w, session->output_h);
+ float ar = asset->aspect_ratio;
+ if (ar) {
+ //printf ("Aspect ratio from asset: %f \n", ar);
+ if( EQUIV(ar, 1.3333) ) { session->aspect_w = 4; session->aspect_h = 3; }
+ if( EQUIV(ar, 1.7777) ) { session->aspect_w = 16; session->aspect_h = 9; }
+ if( EQUIV(ar, 2.1111) ) { session->aspect_w = 19; session->aspect_h = 9; }
+ if( EQUIV(ar, 2.2222) ) { session->aspect_w = 20; session->aspect_h = 9; }
+ if( EQUIV(ar, 2.3333) ) { session->aspect_w = 21; session->aspect_h = 9; }
+ if( EQUIV(ar, 2.370370) ) { session->aspect_w = 64; session->aspect_h = 27; }
+ }
+
+
Track *track = edl->tracks->first;
for( Track *next_track=0; track; track=next_track ) {
next_track = track->next;