Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / cwindowgui.C
index 567c9338c8f129dbd95995eae96831b6c70e88ef..d9738c2cbe8c93b5989d85fd9487c6178d6604d2 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "automation.h"
 #include "autos.h"
+#include "bccolors.h"
 #include "bcsignals.h"
 #include "canvas.h"
 #include "clip.h"
@@ -57,6 +58,7 @@
 #include "tracks.h"
 #include "transportque.h"
 #include "vtrack.h"
+#include "zoombar.h"
 
 
 static double my_zoom_table[] =
@@ -111,6 +113,8 @@ CWindowGUI::CWindowGUI(MWindow *mwindow, CWindow *cwindow)
        control_out_x = control_out_y = 0;
        translating_zoom = 0;
        highlighted = 0;
+// *** CONTEXT_HELP ***
+       context_help_set_keyword("Compositor Window");
 }
 
 CWindowGUI::~CWindowGUI()
@@ -162,8 +166,6 @@ void CWindowGUI::create_objects()
        canvas = new CWindowCanvas(mwindow, this);
 
        canvas->create_objects(mwindow->edl);
-       canvas->use_cwindow();
-
 
        add_subwindow(timebar = new CTimeBar(mwindow,
                this,
@@ -282,7 +284,7 @@ int CWindowGUI::button_press_event()
        if( current_operation == CWINDOW_NONE &&
            mwindow->edl != 0 && canvas->get_canvas() &&
            mwindow->edl->session->cwindow_click2play &&
-           canvas->get_canvas()->get_cursor_over_window() ) {
+           canvas->get_canvas()->cursor_above() ) {
                switch( get_buttonpress() ) {
                case LEFT_BUTTON:
                        if( !cwindow->playback_engine->is_playing_back ) {
@@ -442,12 +444,13 @@ int CWindowGUI::keypress_event()
                keyboard_zoomout();
                result = 1;
                break;
-       case 'f':
-               canvas->set_fullscreen(canvas->get_fullscreen() ? 0 : 1);
+       case 'f': {
+               int on = canvas->get_fullscreen() ? 0 : 1;
+               canvas->set_fullscreen(on, 1);
                result = 1;
-               break;
+               break; }
        case ESC:
-               canvas->set_fullscreen(0);
+               canvas->set_fullscreen(0, 1);
                result = 1;
                break;
        case 'x':
@@ -591,6 +594,9 @@ int CWindowGUI::keypress_event()
        if( !result )
                result = transport->keypress_event();
 
+       if( !result )
+               result = context_help_check_and_show();
+
        return result;
 }
 
@@ -744,7 +750,7 @@ CWindowEditing::CWindowEditing(MWindow *mwindow, CWindow *cwindow)
                mwindow->theme->cedit_x, mwindow->theme->cedit_y,
                mwindow->edl->session->editing_mode,
                0, // use_editing_mode
-               1, // use_keyframe
+               0, // use_keyframe
                0, // use_splice
                0, // use_overwrite
                1, // use_copy
@@ -758,7 +764,10 @@ CWindowEditing::CWindowEditing(MWindow *mwindow, CWindow *cwindow)
                1, // use_cut
                0, // use_commerical
                0, // use_goto
-               1) // use_clk2play
+               1, // use_clk2play
+               1, // use_scope
+               0, // use_gang_tracks
+               0) // use_timecode
 {
        this->mwindow = mwindow;
        this->cwindow = cwindow;
@@ -823,6 +832,7 @@ 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))
+void panel_btn(set_gang_tracks,(int v), set_gang_tracks(v))
 
 
 CWindowMeters::CWindowMeters(MWindow *mwindow,
@@ -970,6 +980,22 @@ void CWindowTransport::goto_end()
        gui->lock_window("CWindowTransport::goto_end 2");
 }
 
+CWindowCanvasToggleControls::CWindowCanvasToggleControls(CWindowCanvas *canvas)
+ : BC_MenuItem(calculate_text(canvas->get_controls()))
+{
+       this->canvas = canvas;
+}
+int CWindowCanvasToggleControls::handle_event()
+{
+       canvas->toggle_controls();
+       set_text(calculate_text(canvas->get_controls()));
+       return 1;
+}
+
+const char *CWindowCanvasToggleControls::calculate_text(int controls)
+{
+       return !controls ? _("Show controls") : _("Hide controls");
+}
 
 
 CWindowCanvas::CWindowCanvas(MWindow *mwindow, CWindowGUI *gui)
@@ -983,6 +1009,19 @@ CWindowCanvas::CWindowCanvas(MWindow *mwindow, CWindowGUI *gui)
        last_xscroll = 0;
        last_yscroll = 0;
        last_zoom = 0;
+       controls = 0;
+}
+
+void CWindowCanvas::create_objects(EDL *edl)
+{
+       Canvas::create_objects(edl);
+       canvas_menu->add_item(new CanvasPopupAuto(this));
+       canvas_menu->add_item(new CanvasPopupResetCamera(this));
+       canvas_menu->add_item(new CanvasPopupResetProjector(this));
+       canvas_menu->add_item(new CanvasPopupCameraKeyframe(this));
+       canvas_menu->add_item(new CanvasPopupProjectorKeyframe(this));
+       canvas_menu->add_item(controls = new CWindowCanvasToggleControls(this));
+       fullscreen_menu->add_item(new CanvasPopupAuto(this));
 }
 
 void CWindowCanvas::status_event()
@@ -999,19 +1038,19 @@ void CWindowCanvas::update_zoom(int x, int y, float zoom)
        mwindow->edl->session->cwindow_scrollbars = use_scrollbars;
 }
 
-int CWindowCanvas::set_fullscreen(int on)
+int CWindowCanvas::set_fullscreen(int on, int unlock)
 {
        int ret = 0;
        if( on && !get_fullscreen() ) {
                last_xscroll = get_xscroll();
                last_yscroll = get_yscroll();
                last_zoom = get_zoom();
-               Canvas::set_fullscreen(1);
-               zoom_auto();
+               Canvas::set_fullscreen(1, unlock);
+//             zoom_auto();
                ret = 1;
        }
        if( !on && get_fullscreen() ) {
-               Canvas::set_fullscreen(0);
+               Canvas::set_fullscreen(0, unlock);
                gui->zoom_panel->update(get_zoom());
                update_zoom(last_xscroll, last_yscroll, last_zoom);
                gui->update_canvas();
@@ -1062,6 +1101,25 @@ int CWindowCanvas::do_scroll(EDL *edl, float cursor_x, float cursor_y)
        return 1;
 }
 
+int CWindowCanvas::scope_on()
+{
+       EditPanelScopeDialog *scope_dialog = gui->edit_panel->scope_dialog;
+       if( !scope_dialog || !scope_dialog->scope_gui ) return 0;
+       if( scope_dialog->scope_gui->use_refresh ) return 0;
+       if( scope_dialog->scope_gui->use_release ) return 0;
+       return scope_dialog->running();
+}
+
+void CWindowCanvas::draw_scope(VFrame *output, int refresh)
+{
+       if( !output ) return;
+       EditPanelScopeDialog *scope_dialog = gui->edit_panel->scope_dialog;
+       if( !scope_dialog || !scope_dialog->scope_gui ) return;
+       if( scope_dialog->scope_gui->use_refresh && !refresh ) return;
+       if( scope_dialog->scope_gui->use_release && refresh >= 0 ) return;
+       scope_dialog->process(output);
+}
+
 void CWindowCanvas::draw_refresh(int flush)
 {
        BC_WindowBase *window = get_canvas();
@@ -2344,45 +2402,22 @@ int CWindowCanvas::do_eyedrop(int &rerender, int button_press, int draw)
                                gui->eyedrop_visible = 1;
                        }
 
-// Decompression coefficients straight out of jpeglib
-#define V_TO_R    1.40200
-#define V_TO_G    -0.71414
-
-#define U_TO_G    -0.34414
-#define U_TO_B    1.77200
-
-#define GET_COLOR(type, components, max, do_yuv) \
-{ \
+#define GET_COLOR(type, components, max, do_yuv) { \
        type *row = (type*)(refresh_frame->get_rows()[i]) + \
                j * components; \
        float red = (float)*row++ / max; \
        float green = (float)*row++ / max; \
        float blue = (float)*row++ / max; \
        if( do_yuv ) \
-       { \
-               float r = red + V_TO_R * (blue - 0.5); \
-               float g = red + U_TO_G * (green - 0.5) + V_TO_G * (blue - 0.5); \
-               float b = red + U_TO_B * (green - 0.5); \
-               mwindow->edl->local_session->red += r; \
-               mwindow->edl->local_session->green += g; \
-               mwindow->edl->local_session->blue += b; \
-               if( r > mwindow->edl->local_session->red_max ) mwindow->edl->local_session->red_max = r; \
-               if( g > mwindow->edl->local_session->green_max ) mwindow->edl->local_session->green_max = g; \
-               if( b > mwindow->edl->local_session->blue_max ) mwindow->edl->local_session->blue_max = b; \
-       } \
-       else \
-       { \
-               mwindow->edl->local_session->red += red; \
-               mwindow->edl->local_session->green += green; \
-               mwindow->edl->local_session->blue += blue; \
-               if( red > mwindow->edl->local_session->red_max ) mwindow->edl->local_session->red_max = red; \
-               if( green > mwindow->edl->local_session->green_max ) mwindow->edl->local_session->green_max = green; \
-               if( blue > mwindow->edl->local_session->blue_max ) mwindow->edl->local_session->blue_max = blue; \
-       } \
+               YUV::yuv.yuv_to_rgb_f(red, green, blue, red, green-0.5, blue-0.5); \
+       mwindow->edl->local_session->red += red; \
+       mwindow->edl->local_session->green += green; \
+       mwindow->edl->local_session->blue += blue; \
+       if( red > mwindow->edl->local_session->red_max ) mwindow->edl->local_session->red_max = red; \
+       if( green > mwindow->edl->local_session->green_max ) mwindow->edl->local_session->green_max = green; \
+       if( blue > mwindow->edl->local_session->blue_max ) mwindow->edl->local_session->blue_max = blue; \
 }
 
-
-
                        mwindow->edl->local_session->red = 0;
                        mwindow->edl->local_session->green = 0;
                        mwindow->edl->local_session->blue = 0;
@@ -2613,6 +2648,12 @@ void CWindowCanvas::reset_keyframe(int do_camera)
                z_keyframe->set_value(1);
 
                gui->sync_parameters(CHANGE_PARAMS, 1, 1);
+               MWindowGUI *mgui = mwindow->gui;
+               mgui->lock_window("CWindowCanvas::reset_keyframe");
+               gui->mwindow->edl->local_session->reset_view_limits();
+               gui->mwindow->gui->zoombar->update_autozoom();
+               mgui->unlock_window();
+               mwindow->save_backup();
        }
 }
 
@@ -3019,9 +3060,13 @@ int CWindowCanvas::test_bezier(int button_press,
                                redraw = 1;
                        }
 
-                       float x_val = gui->affected_x->get_value();
-                       float y_val = gui->affected_y->get_value();
-                       float z_val = gui->affected_z->get_value();
+                       CWindowToolGUI *tool_gui = !gui->tool_panel ? 0 : gui->tool_panel->tool_gui;
+                       int edge = tool_gui ? tool_gui->edge : 0;
+                       int span = tool_gui ? tool_gui->span : 0;
+
+                       float x_val = gui->affected_x->get_value(edge);
+                       float y_val = gui->affected_y->get_value(edge);
+                       float z_val = gui->affected_z->get_value(edge);
 
                        if( gui->translating_zoom ) {
                                float z = gui->center_z + (cursor_y - gui->y_origin) / yS(128);
@@ -3031,7 +3076,7 @@ int CWindowCanvas::test_bezier(int button_press,
                                        redraw = 1;
                                        redraw_canvas = 1;
                                }
-                               gui->affected_z->set_value(z);
+                               gui->affected_z->bump_value(z, edge, span);
                        }
                        else {
                                float dx = cursor_x - gui->x_origin;
@@ -3042,8 +3087,8 @@ int CWindowCanvas::test_bezier(int button_press,
                                }
                                float x = gui->center_x + dx;
                                float y = gui->center_y + dy;
-                               gui->affected_x->set_value(x);
-                               gui->affected_y->set_value(y);
+                               gui->affected_x->bump_value(x, edge, span);
+                               gui->affected_y->bump_value(y, edge, span);
                                if( !EQUIV(x_val, x) || !EQUIV(y_val, y) ) {
                                        rerender = 1;
                                        redraw = 1;
@@ -3312,6 +3357,9 @@ int CWindowCanvas::button_release_event()
 {
        int result = 0;
        const char *undo_label = 0;
+       BC_WindowBase *window = get_canvas();
+       if( window && !window->get_video_on() )
+               draw_scope(refresh_frame, -1);
 
        switch( gui->current_operation ) {
        case CWINDOW_SCROLL:
@@ -3394,7 +3442,7 @@ void CWindowCanvas::toggle_controls()
        gui->resize_event(gui->get_w(), gui->get_h());
 }
 
-int CWindowCanvas::get_cwindow_controls()
+int CWindowCanvas::get_controls()
 {
        return mwindow->session->cwindow_controls;
 }