rework proxy scaler, fix crop-gui coord, video_data tweak for proxy_format
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / mwindowedit.C
index 9e5b5012003c9150a41eac4d87c27b2a340d8089..2d09eeb0434a94d283b4c8496645e4c257b71ffb 100644 (file)
@@ -203,7 +203,7 @@ void MWindow::asset_to_all()
                                }
                        }
 
-
+#ifdef GLx4
                        if( ((edl->session->output_w % 4) ||
                                (edl->session->output_h % 4)) &&
                                edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL ) {
@@ -211,7 +211,7 @@ void MWindow::asset_to_all()
                                        _("This project's dimensions are not multiples of 4 so\n"
                                        "it can't be rendered by OpenGL."));
                        }
-
+#endif
 // Get aspect ratio
                        if( defaults->get("AUTOASPECT", 0) ) {
                                create_aspect_ratio(
@@ -250,7 +250,7 @@ void MWindow::asset_to_size()
                h = indexable->get_h();
                edl->session->output_w = w;
                edl->session->output_h = h;
-
+#ifdef GLx4
                if( ((edl->session->output_w % 4) ||
                        (edl->session->output_h % 4)) &&
                        edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL ) {
@@ -258,7 +258,7 @@ void MWindow::asset_to_size()
                                _("This project's dimensions are not multiples of 4 so\n"
                                "it can't be rendered by OpenGL."));
                }
-
+#endif
 // Get aspect ratio
                if( defaults->get("AUTOASPECT", 0) ) {
                        create_aspect_ratio(edl->session->aspect_w,
@@ -403,10 +403,43 @@ void MWindow::clear_labels()
 
 int MWindow::clear_labels(double start, double end)
 {
+       if( start == end ) {
+               start = 0;
+               end = edl->tracks->total_length();
+       }
        edl->labels->clear(start, end, 0);
        return 0;
 }
 
+void MWindow::clear_hard_edges()
+{
+       undo_before();
+       clear_hard_edges(edl->local_session->get_selectionstart(),
+               edl->local_session->get_selectionend());
+       edl->optimize();
+       save_backup();
+       undo_after(_("clear hard edges"), LOAD_EDITS);
+       restart_brender();
+       gui->update(1, NORMAL_DRAW, 0, 0, 1, 0, 0);
+       cwindow->refresh_frame(CHANGE_EDL);
+}
+
+int MWindow::clear_hard_edges(double start, double end)
+{
+       if( start == end ) {
+               start = 0;
+               end = edl->tracks->total_length();
+       }
+       edl->clear_hard_edges(start, end);
+       return 0;
+}
+
+void MWindow::clear_select()
+{
+       edl->tracks->clear_selected_edits();
+       gui->draw_overlays(1);
+}
+
 void MWindow::concatenate_tracks()
 {
        undo_before();
@@ -478,12 +511,10 @@ int MWindow::copy_default_keyframe()
        return 0;
 }
 
-
 // Uses cropping coordinates in edl session to crop and translate video.
 // We modify the projector since camera automation depends on the track size.
-void MWindow::crop_video()
+void MWindow::crop_video(int mode)
 {
-
        undo_before();
 // Clamp EDL crop region
        if( edl->session->crop_x1 > edl->session->crop_x2 ) {
@@ -496,22 +527,54 @@ void MWindow::crop_video()
                edl->session->crop_y2 ^= edl->session->crop_y1;
                edl->session->crop_y1 ^= edl->session->crop_y2;
        }
-
-       float old_projector_x = (float)edl->session->output_w / 2;
-       float old_projector_y = (float)edl->session->output_h / 2;
-       float new_projector_x = (float)(edl->session->crop_x1 + edl->session->crop_x2) / 2;
-       float new_projector_y = (float)(edl->session->crop_y1 + edl->session->crop_y2) / 2;
-       float projector_offset_x = -(new_projector_x - old_projector_x);
-       float projector_offset_y = -(new_projector_y - old_projector_y);
-
-       edl->tracks->translate_projector(projector_offset_x, projector_offset_y);
-
-       edl->session->output_w = edl->session->crop_x2 - edl->session->crop_x1;
-       edl->session->output_h = edl->session->crop_y2 - edl->session->crop_y1;
-       edl->session->crop_x1 = 0;
-       edl->session->crop_y1 = 0;
-       edl->session->crop_x2 = edl->session->output_w;
-       edl->session->crop_y2 = edl->session->output_h;
+       switch( mode ) {
+       case CROP_REFORMAT: {
+               float ctr_x = edl->session->output_w / 2.;
+               float ctr_y = edl->session->output_h / 2.;
+               float new_x = (edl->session->crop_x1 + edl->session->crop_x2) / 2.;
+               float new_y = (edl->session->crop_y1 + edl->session->crop_y2) / 2.;
+               float dx = -(new_x - ctr_x), dy = -(new_y - ctr_y);
+               edl->tracks->translate_projector(dx, dy, 1);
+
+               edl->session->output_w = edl->session->crop_x2 - edl->session->crop_x1;
+               edl->session->output_h = edl->session->crop_y2 - edl->session->crop_y1;
+               edl->session->crop_x1 = edl->session->crop_y1 = 0;
+               edl->session->crop_x2 = edl->session->output_w;
+               edl->session->crop_y2 = edl->session->output_h;
+               break; }
+       case CROP_RESIZE: {
+               float old_w = edl->session->output_w;
+               float old_h = edl->session->output_h;
+               float new_w = edl->session->crop_x2 - edl->session->crop_x1;
+               float new_h = edl->session->crop_y2 - edl->session->crop_y1;
+               if( !new_w ) new_w = 1;
+               if( !new_h ) new_h = 1;
+               float xzoom = old_w / new_w, yzoom = old_h / new_h;
+               float new_z = bmin(xzoom, yzoom);
+               float new_x = (edl->session->crop_x1 + edl->session->crop_x2) / 2.;
+               float new_y = (edl->session->crop_y1 + edl->session->crop_y2) / 2.;
+               edl->tracks->crop_resize(new_x, new_y, new_z);
+
+               edl->session->crop_x1 = 0;
+               edl->session->crop_y1 = 0;
+               edl->session->crop_x2 = edl->session->output_w;
+               edl->session->crop_y2 = edl->session->output_h;
+               break; }
+       case CROP_SHRINK: {
+               float old_w = edl->session->output_w;
+               float old_h = edl->session->output_h;
+               float new_w = edl->session->crop_x2 - edl->session->crop_x1;
+               float new_h = edl->session->crop_y2 - edl->session->crop_y1;
+               if( !new_w ) new_w = 1;
+               if( !new_h ) new_h = 1;
+               float xzoom = old_w / new_w, yzoom = old_h / new_h;
+               float new_z = bmin(xzoom, yzoom);
+
+               float new_x = (edl->session->crop_x1 + edl->session->crop_x2) / 2.;
+               float new_y = (edl->session->crop_y1 + edl->session->crop_y2) / 2.;
+               edl->tracks->crop_shrink(new_x, new_y, new_z);
+               break; }
+       }
 
 // Recalculate aspect ratio
        if( defaults->get("AUTOASPECT", 0) ) {
@@ -1486,6 +1549,9 @@ int MWindow::paste_edls(ArrayList<EDL*> *new_edls, int load_mode,
                                default:
                                        continue;
                                }
+// re-label only if not already labeled
+                               if( new_edl->local_session->asset2edl )
+                                       strcpy(current->title, edl->tracks->last->title);
                                destination_tracks.append(edl->tracks->last);
                        }
 
@@ -2391,10 +2457,9 @@ void MWindow::rescale_proxy(EDL *clip, int orig_scale, int new_scale)
        edl->rescale_proxy(orig_scale, new_scale);
 }
 
-void MWindow::add_proxy(int use_scaler,
-       ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets)
+void MWindow::add_proxy(ArrayList<Indexable*> *orig_assets, ArrayList<Indexable*> *proxy_assets)
 {
-       edl->add_proxy(use_scaler, orig_assets, proxy_assets);
+       edl->add_proxy(orig_assets, proxy_assets);
 }
 
 void MWindow::cut_commercials()