X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fcwindowgui.C;h=935a5f9fc9798ee6611e5348945dba722a9bd27a;hp=5adb0f2cc5c3a9c98dfb804074ba17c537c64294;hb=6d8835a537ca709e122226506548de0d4942aa32;hpb=3f801b05e0de577b00e98019b099ed38d66b9550 diff --git a/cinelerra-5.1/cinelerra/cwindowgui.C b/cinelerra-5.1/cinelerra/cwindowgui.C index 5adb0f2c..935a5f9f 100644 --- a/cinelerra-5.1/cinelerra/cwindowgui.C +++ b/cinelerra-5.1/cinelerra/cwindowgui.C @@ -878,6 +878,7 @@ void panel_btn(fit_selection,(), fit_selection()) void panel_btn(fit_autos,(int all), fit_autos(all)) void panel_btn(set_editing_mode,(int mode), set_editing_mode(mode)) void panel_btn(set_auto_keyframes,(int v), set_auto_keyframes(v)) +void panel_btn(set_span_keyframes,(int v), set_span_keyframes(v)) void panel_btn(set_labels_follow_edits,(int v), set_labels_follow_edits(v)) @@ -1454,7 +1455,7 @@ int CWindowCanvas::do_mask(int &redraw, int &rerender, Auto *prev_auto = 0; mask_autos->get_prev_auto(position, PLAY_FORWARD, (Auto *&)prev_auto, 1); MaskAuto *prev_mask = (MaskAuto *)prev_auto; - ArrayList points; + MaskPoints points; int update_points = 1; // Determine the points based on whether // new keyframes will be generated or drawing is performed. @@ -2002,10 +2003,10 @@ int CWindowCanvas::do_mask(int &redraw, int &rerender, if(button_press && result) { #ifdef USE_KEYFRAME_SPANNING - ArrayList &mask_points = points; + MaskPoints &mask_points = points; #else SubMask *mask = gui->mask_keyframe->get_submask(mwindow->edl->session->cwindow_mask); - ArrayList &mask_points = mask->points; + MaskPoints &mask_points = mask->points; #endif int k = gui->affected_point; if( k >= 0 && k < mask_points.size() ) { @@ -2043,9 +2044,9 @@ int CWindowCanvas::do_mask(int &redraw, int &rerender, gui->current_operation != CWINDOW_NONE ) { // mwindow->undo->update_undo_before(_("mask point"), this); #ifdef USE_KEYFRAME_SPANNING - ArrayList &mask_points = points; + MaskPoints &mask_points = points; #else - ArrayList &mask_points = mask->points; + MaskPoints &mask_points = mask->points; #endif MaskPoint *point = mask_points.get(gui->affected_point); // canvas_to_output(mwindow->edl, 0, cursor_x, cursor_y); @@ -2078,6 +2079,7 @@ int CWindowCanvas::do_mask(int &redraw, int &rerender, case CWINDOW_MASK_TRANSLATE: { if( !mask_gui ) break; + int mode = mask_gui->scale_mode; MaskAuto *keyframe = gui->mask_keyframe; int gang = mask_gui->gang_focus->get_value(); float dx = mask_cursor_x - gui->x_origin; @@ -2089,11 +2091,11 @@ int CWindowCanvas::do_mask(int &redraw, int &rerender, if( !mask_gui->mask_enables[j]->get_value() ) continue; SubMask *sub_mask = keyframe->get_submask(j); if( !sub_mask ) continue; - ArrayList &points = sub_mask->points; + MaskPoints &points = sub_mask->points; for( int i=0; ix += dx; - point->y += dy; + if( mode == 0 || mode == 2) point->x += dx; + if( mode == 1 || mode == 2) point->y += dy; } } gui->x_origin = mask_cursor_x; @@ -2130,6 +2132,9 @@ int CWindowCanvas::do_mask(int &redraw, int &rerender, int button_no = get_buttonpress(); double ds = accel/64., dt = accel*M_PI/360.; double scale = button_no == WHEEL_UP ? 1.+ds : 1.-ds; + int mode = mask_gui->scale_mode; + double xscale = !rotate && (mode == 0 || mode == 2 ) ? scale : 1.; + double yscale = !rotate && (mode == 1 || mode == 2 ) ? scale : 1.; double theta = button_no == WHEEL_UP ? dt : -dt; if( rotate ? theta==0 : scale==1 ) break; float st = sin(theta), ct = cos(theta); @@ -2141,21 +2146,21 @@ int CWindowCanvas::do_mask(int &redraw, int &rerender, if( !mask_gui->mask_enables[j]->get_value() ) continue; SubMask *sub_mask = keyframe->get_submask(j); if( !sub_mask ) continue; - ArrayList &points = sub_mask->points; + MaskPoints &points = sub_mask->points; for( int i=0; ix - gui->x_origin; float py = point->y - gui->y_origin; - float nx = !rotate ? px*scale : px*ct + py*st; - float ny = !rotate ? py*scale : py*ct - px*st; + float nx = !rotate ? px*xscale : px*ct + py*st; + float ny = !rotate ? py*yscale : py*ct - px*st; point->x = nx + gui->x_origin; point->y = ny + gui->y_origin; px = point->control_x1; py = point->control_y1; - point->control_x1 = !rotate ? px*scale : px*ct + py*st; - point->control_y1 = !rotate ? py*scale : py*ct - px*st; + point->control_x1 = !rotate ? px*xscale : px*ct + py*st; + point->control_y1 = !rotate ? py*yscale : py*ct - px*st; px = point->control_x2; py = point->control_y2; - point->control_x2 = !rotate ? px*scale : px*ct + py*st; - point->control_y2 = !rotate ? py*scale : py*ct - px*st; + point->control_x2 = !rotate ? px*xscale : px*ct + py*st; + point->control_y2 = !rotate ? py*yscale : py*ct - px*st; } } rerender = 1; @@ -2234,9 +2239,33 @@ int CWindowCanvas::do_mask(int &redraw, int &rerender, mask_autos->update_parameter(&temp_keyframe); } #endif - - points.remove_all_objects(); //printf("CWindowCanvas::do_mask 20\n"); + + if( draw && draw_boundary && !draw_markers ) { + BC_WindowBase *cvs_win = get_canvas(); + cvs_win->set_inverse(); + cvs_win->set_color(RED+GREEN); + for( int k=0; kedl->session->cwindow_mask ) continue; + points.remove_all_objects(); + if( use_interpolated ) + mask_autos->get_points(&points, k, position, PLAY_FORWARD); + else + prev_mask->get_points(&points, k); + MaskEdge edge; + edge.load(points, 0); + for( int i=0; iedl, 0, ax, ay); + output_to_canvas(mwindow->edl, 0, bx, by); + cvs_win->draw_line(ax,ay, bx,by); + } + } + } + return result; }