delete zoom_panel;
delete active;
delete inactive;
+ delete focus_frame;
delete orig_mask_keyframe;
}
active = new BC_Pixmap(this, mwindow->theme->get_image("cwindow_active"));
inactive = new BC_Pixmap(this, mwindow->theme->get_image("cwindow_inactive"));
+ focus_frame = new VFramePng(mwindow->theme->get_image_data("cwindow_focus.png"));
mwindow->theme->get_cwindow_sizes(this, mwindow->session->cwindow_controls);
mwindow->theme->draw_cwindow_bg(this);
BC_WindowBase *window = get_canvas();
if( window && !window->get_video_on() ) {
clear(0);
- if( mwindow->uses_opengl() ) {
-// this code is to idle rendering before drawing overlays on refresh frame
-// if this is not done, occationally opengl finishs late, and overwrites
-// the x11 refresh frame and the overlay is not visible. Rarely happens.
- unlock_canvas();
- mwindow->playback_3d->finish_output(this);
- lock_canvas("CWindowCanvas::draw_refresh");
- }
if( refresh_frame && refresh_frame->get_w()>0 && refresh_frame->get_h()>0 ) {
float in_x1, in_y1, in_x2, in_y2;
float out_x1, out_y1, out_x2, out_y2;
if( draw_boundary ) {
char mask_label[BCSTRLEN];
int k = mwindow->edl->session->cwindow_mask;
- if( !prev_mask || prev_mask->is_default ||
- k < 0 || k >= prev_mask->masks.size() )
+ if( !prev_mask || k < 0 || k >= prev_mask->masks.size() )
sprintf(mask_label, "%d", k);
else
sprintf(mask_label, "%s", prev_mask->masks[k]->name);
output_to_canvas(mwindow->edl, 0, fx, fy);
float r = bmax(cvs_win->get_w(), cvs_win->get_h());
float d = 0.005*r;
+#if 1
+ int fw = 2*d+3, fh = fw;
+ VFrame focus(fw,fh, BC_RGBA8888);
+ focus.transfer_from(gui->focus_frame);
+ fx -= fw/2.f; fy -= fh/2.f;
+ BC_Pixmap focus_pixmap(cvs_win, &focus, PIXMAP_ALPHA);
+ cvs_win->draw_pixmap(&focus_pixmap,fx,fy);
+#else
cvs_win->set_line_width((int)(0.0025*r) + 1);
cvs_win->set_color(BLUE);
cvs_win->draw_line(fx-d,fy-d, fx+d, fy+d);
cvs_win->draw_line(fx-d,fy+d, fx+d, fy-d);
cvs_win->set_line_width(0);
cvs_win->set_color(WHITE);
+#endif
+ }
+ if( draw && mask_gui && mask_gui->center_mark && points.size() ) {
+ float cx = 0, cy = 0;
+ int n = points.size();
+ for( int i=0; i<n; ++i ) {
+ MaskPoint *point = points.get(i);
+ cx += point->x; cy += point->y;
+ }
+ cx /= n; cy /= n;
+ output_to_canvas(mwindow->edl, 0, cx, cy);
+ float r = bmax(cvs_win->get_w(), cvs_win->get_h());
+ float d = 0.003*r;
+ cvs_win->set_line_width((int)(0.002*r) + 1);
+ cvs_win->set_color(ORANGE);
+ cvs_win->draw_line(cx-d,cy, cx+d, cy);
+ cvs_win->draw_line(cx,cy-d, cx, cy+d);
+ cvs_win->set_line_width(0);
+ cvs_win->set_color(WHITE);
}
//printf("CWindowCanvas::do_mask 1\n");
}
SubMask *mask = gui->mask_keyframe->get_submask(mwindow->edl->session->cwindow_mask);
ArrayList<MaskPoint*> &mask_points = mask->points;
#endif
- MaskPoint *point = mask_points.values[gui->affected_point];
- gui->center_x = point->x;
- gui->center_y = point->y;
- gui->control_in_x = point->control_x1;
- gui->control_in_y = point->control_y1;
- gui->control_out_x = point->control_x2;
- gui->control_out_y = point->control_y2;
+ int k = gui->affected_point;
+ if( k >= 0 && k < mask_points.size() ) {
+ MaskPoint *point = mask_points.values[k];
+ gui->center_x = point->x;
+ gui->center_y = point->y;
+ gui->control_in_x = point->control_x1;
+ gui->control_in_y = point->control_y1;
+ gui->control_out_x = point->control_x2;
+ gui->control_out_y = point->control_y2;
+ }
+ else {
+ gui->center_x = gui->center_y = 0;
+ gui->control_in_x = gui->control_in_y = 0;
+ gui->control_out_x = gui->control_out_y = 0;
+ }
gui->tool_panel->raise_window();
}
point->control_x2 = !rotate ? px*scale : px*ct + py*st;
point->control_y2 = !rotate ? py*scale : py*ct - px*st;
}
+ rerender = 1;
+ redraw = 1;
break; }
}