modify tile_mixers target geom
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / mwindow.C
index cf16cd9354528066b1f040cbe60055c2d7df0aa1..f245018ad465f1dd1d1b41c2c5a0c59a0a7e9467 100644 (file)
@@ -1469,6 +1469,27 @@ int MWindow::select_zwindow(ZWindow *zwindow)
 
 void MWindow::tile_mixers()
 {
+       int x1 = session->tile_mixers_x;
+       int y1 = session->tile_mixers_y;
+       int x2 = x1 + session->tile_mixers_w;
+       int y2 = y1 + session->tile_mixers_h;
+       tile_mixers(x1, y1, x2, y2);
+}
+
+void MWindow::tile_mixers(int x1, int y1, int x2, int y2)
+{
+       if( x1 == x2 || y1 == y2 ) {
+// use top left quadrent
+               int sw = gui->get_screen_w(1, -1);
+               int sh = gui->get_screen_w(1, -1);
+               x1 = 1;     y1 = 1;
+               x2 = sw/2;  y2 = sh/2;
+       }
+       else {
+               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];
@@ -1476,34 +1497,63 @@ void MWindow::tile_mixers()
                ++nz;
        }
        if( !nz ) return;
-       int zn = ceil(sqrt(nz));
-       int x1 = 1 + gui->get_x(), x2 = cwindow->gui->get_x();
-       int y1 = 1, y2 = gui->get_y();
-       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();
@@ -1511,11 +1561,9 @@ void MWindow::tile_mixers()
                        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;
@@ -1524,7 +1572,8 @@ void MWindow::tile_mixers()
 
 void MWindow::set_gang_tracks(int v)
 {
-       edl->session->gang_tracks = v;
+       edl->local_session->gang_tracks = v;
+       sync_parameters(CHANGE_PARAMS);
        gui->update(1, 1, 0, 0, 1, 0, 0);
        gui->flush();
 }
@@ -2301,6 +2350,7 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
              load_mode == LOADMODE_REPLACE_CONCATENATE ) &&
            (ftype != FILE_IS_XML || edl_mode != LOADMODE_EDL_CLIP) ) {
                select_asset(0, 0);
+               edl->session->proxy_state = PROXY_INACTIVE;
                edl->session->proxy_scale = 1;
                edl->session->proxy_disabled_scale = 1;
                edl->session->proxy_use_scaler = 0;
@@ -2318,8 +2368,8 @@ if(debug) printf("MWindow::load_filenames %d\n", __LINE__);
                goto_start();
        }
 
-       if( ( edl->session->proxy_auto_scale && edl->session->proxy_scale != 1 ) &&
-           ( load_mode != LOADMODE_REPLACE && load_mode != LOADMODE_REPLACE_CONCATENATE ) ) {
+       if( edl->session->proxy_state != PROXY_INACTIVE && edl->session->proxy_auto_scale &&
+           load_mode != LOADMODE_REPLACE && load_mode != LOADMODE_REPLACE_CONCATENATE ) {
                ArrayList<Indexable *> orig_idxbls;
                for( int i=0; i<new_assets.size(); ++i )
                        orig_idxbls.append(new_assets.get(i));
@@ -2424,8 +2474,7 @@ int MWindow::render_proxy(ArrayList<Indexable *> &new_idxbls)
 int MWindow::enable_proxy()
 {
        int ret = 0;
-       if( edl->session->proxy_scale == 1 &&
-           edl->session->proxy_disabled_scale != 1 ) {
+       if( edl->session->proxy_state == PROXY_DISABLED ) {
                int new_scale = edl->session->proxy_disabled_scale;
                int new_use_scaler = edl->session->proxy_use_scaler;
                Asset *asset = new Asset;
@@ -2438,6 +2487,7 @@ int MWindow::enable_proxy()
                        beep(2000., 1.5, gain);
                }
                edl->session->proxy_disabled_scale = 1;
+               edl->session->proxy_state = PROXY_ACTIVE;
                gui->lock_window("MWindow::to_proxy");
                update_project(LOADMODE_REPLACE);
                gui->unlock_window();
@@ -2447,15 +2497,15 @@ int MWindow::enable_proxy()
 
 int MWindow::disable_proxy()
 {
-       if( edl->session->proxy_scale != 1 &&
-           edl->session->proxy_disabled_scale == 1 ) {
-               int old_scale = edl->session->proxy_scale, new_scale = 1;
+       if( edl->session->proxy_state == PROXY_ACTIVE ) {
+               int old_scale = edl->session->proxy_scale, new_scale = 0;
                int new_use_scaler = edl->session->proxy_use_scaler;
                Asset *asset = new Asset;
                asset->format = FILE_FFMPEG;
                asset->load_defaults(defaults, "PROXY_", 1, 1, 0, 0, 0);
                to_proxy(asset, new_scale, new_use_scaler);
                asset->remove_user();
+               edl->session->proxy_state = PROXY_DISABLED;
                edl->session->proxy_disabled_scale = old_scale;
                gui->lock_window("MWindow::to_proxy");
                update_project(LOADMODE_REPLACE);
@@ -2472,7 +2522,7 @@ int MWindow::to_proxy(Asset *asset, int new_scale, int new_use_scaler)
        edl->Garbage::add_user();
        save_backup();
        undo_before(_("proxy"), this);
-       int asset_scale = new_scale == 1 ? 0 :
+       int asset_scale = !new_scale ? 0 :
                        !new_use_scaler ? 1 : new_scale;
        ProxyRender proxy_render(this, asset, asset_scale);
 
@@ -2480,7 +2530,7 @@ int MWindow::to_proxy(Asset *asset, int new_scale, int new_use_scaler)
 // remove all session proxy assets at the at the current proxy_scale
        int proxy_scale = edl->session->proxy_scale;
 
-       if( proxy_scale > 1 ) {
+       if( edl->session->proxy_state == PROXY_ACTIVE ) {
                Asset *orig_asset = edl->assets->first;
                for( ; orig_asset; orig_asset=orig_asset->next ) {
                        char new_path[BCTEXTLEN];
@@ -2519,7 +2569,7 @@ int MWindow::to_proxy(Asset *asset, int new_scale, int new_use_scaler)
                }
 
 // convert from the proxy assets to the original assets
-               edl->set_proxy(1, 0, &proxy_assets, &orig_idxbls);
+               edl->set_proxy(0, 0, &proxy_assets, &orig_idxbls);
 
 // remove the references
                for( int i=0; i<proxy_assets.size(); ++i ) {
@@ -2540,7 +2590,7 @@ int MWindow::to_proxy(Asset *asset, int new_scale, int new_use_scaler)
        confirm_paths.set_array_delete();
 
 // convert to new size if not original size
-       if( new_scale != 1 ) {
+       if( new_scale ) {
                FileSystem fs;
                Asset *orig = edl->assets->first;
                for( ; orig; orig=orig->next ) {
@@ -2568,7 +2618,10 @@ int MWindow::to_proxy(Asset *asset, int new_scale, int new_use_scaler)
                                proxy_render.add_needed(orig_nested, proxy);
                        }
                }
+               edl->session->proxy_state = PROXY_ACTIVE;
        }
+       else
+               edl->session->proxy_state = PROXY_INACTIVE;
 
        int result = 0;
 // test for existing files
@@ -2577,13 +2630,13 @@ int MWindow::to_proxy(Asset *asset, int new_scale, int new_use_scaler)
                confirm_paths.remove_all_objects();
        }
 
-       if( !result )
+       if( !result && new_scale )
                result = proxy_render.create_needed_proxies(new_scale);
 
-       if( !result ) // resize project
+       if( !result ) // resize project
                edl->set_proxy(new_scale, new_use_scaler,
                        &proxy_render.orig_idxbls, &proxy_render.orig_proxies);
-
+       }
        undo_after(_("proxy"), LOAD_ALL);
        edl->Garbage::remove_user();
        restart_brender();
@@ -3049,6 +3102,7 @@ void MWindow::restore_windows()
        else if( session->show_lwindow && lwindow->gui->is_hidden() )
                show_lwindow();
 
+       tile_mixers();
        gui->lock_window("MWindow::restore_windows");
        gui->focus();
 }
@@ -3436,8 +3490,9 @@ int MWindow::get_hash_color(Edit *edit)
                (Indexable*)edit->asset : (Indexable*)edit->nested_edl;
        if( !idxbl ) return 0;
        char path[BCTEXTLEN];
-       if( !edit->asset || edit->track->data_type != TRACK_VIDEO ||
-           edl->session->proxy_scale == 1 ||
+// map proxy colors to unproxy colors
+       if( edl->session->proxy_state != PROXY_ACTIVE ||
+           !edit->asset || edit->track->data_type != TRACK_VIDEO ||
            ProxyRender::from_proxy_path(path, (Asset*)idxbl, edl->session->proxy_scale) )
                strcpy(path, idxbl->path);
        char *cp = strrchr(path, '/');