rework speed timeline picons/waves
[goodguy/history.git] / cinelerra-5.1 / cinelerra / cwindowtool.C
index 6a4a1d7255deaec89758e6729d6e45e94738dbe7..fefe2d4ca28b259e365c4c9489098fbb92c43a5c 100644 (file)
@@ -1,7 +1,6 @@
-
 /*
  * CINELERRA
- * Copyright (C) 2008-2014 Adam Williams <broadcast at earthling dot net>
+ * Copyright (C) 2008-2017 Adam Williams <broadcast at earthling dot net>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  *
  */
 
+#include <stdio.h>
+#include <stdint.h>
+
 #include "automation.h"
-#include "cicolors.h"
+#include "bccolors.h"
 #include "clip.h"
 #include "condition.h"
 #include "cpanel.h"
@@ -287,9 +289,27 @@ int CWindowToolGUI::close_event()
 
 int CWindowToolGUI::keypress_event()
 {
-       if(get_keypress() == 'w' || get_keypress() == 'W')
+       int result = 0;
+
+       switch( get_keypress() ) {
+       case 'w':
+       case 'W':
                return close_event();
-       return 0;
+       case KEY_F1:
+       case KEY_F2:
+       case KEY_F3:
+       case KEY_F4:
+       case KEY_F5:
+       case KEY_F6:
+       case KEY_F7:
+       case KEY_F8:
+       case KEY_F9:
+       case KEY_F10:
+               resend_event(thread->gui);
+               result = 1;
+       }
+
+       return result;
 }
 
 int CWindowToolGUI::translation_event()
@@ -458,11 +478,7 @@ void CWindowCropGUI::update()
 
 
 CWindowEyedropGUI::CWindowEyedropGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow,
-       thread,
-       _(PROGRAM_NAME ": Color"),
-       200,
-       250)
+ : CWindowToolGUI(mwindow, thread, _(PROGRAM_NAME ": Color"), 220, 290)
 {
 }
 
@@ -473,11 +489,13 @@ CWindowEyedropGUI::~CWindowEyedropGUI()
 void CWindowEyedropGUI::create_objects()
 {
        int margin = mwindow->theme->widget_border;
-       int x = margin;
-       int y = margin;
-       int x2 = 70;
+       int x = 10 + margin;
+       int y = 10 + margin;
+       int x2 = 70, x3 = x2 + 60;
        lock_window("CWindowEyedropGUI::create_objects");
-       BC_Title *title1, *title2, *title3, *title4, *title5, *title6, *title7;
+       BC_Title *title0, *title1, *title2, *title3, *title4, *title5, *title6, *title7;
+       add_subwindow(title0 = new BC_Title(x, y,_("X,Y:")));
+       y += title0->get_h() + margin;
        add_subwindow(title7 = new BC_Title(x, y, _("Radius:")));
        y += BC_TextBox::calculate_h(this, MEDIUMFONT, 1, 1) + margin;
 
@@ -494,50 +512,72 @@ void CWindowEyedropGUI::create_objects()
        y += title5->get_h() + margin;
        add_subwindow(title6 = new BC_Title(x, y, "V:"));
 
+       add_subwindow(current = new BC_Title(x2, title0->get_y(), ""));
 
        radius = new CWindowCoord(this, x2, title7->get_y(),
                mwindow->edl->session->eyedrop_radius);
        radius->create_objects();
        radius->set_boundaries((int64_t)0, (int64_t)255);
 
-
        add_subwindow(red = new BC_Title(x2, title1->get_y(), "0"));
        add_subwindow(green = new BC_Title(x2, title2->get_y(), "0"));
        add_subwindow(blue = new BC_Title(x2, title3->get_y(), "0"));
+       add_subwindow(rgb_hex = new BC_Title(x3, red->get_y(), "#000000"));
 
        add_subwindow(this->y = new BC_Title(x2, title4->get_y(), "0"));
        add_subwindow(this->u = new BC_Title(x2, title5->get_y(), "0"));
        add_subwindow(this->v = new BC_Title(x2, title6->get_y(), "0"));
+       add_subwindow(yuv_hex = new BC_Title(x3, this->y->get_y(), "#000000"));
 
-       y = title6->get_y() + this->v->get_h() + margin;
+       y = title6->get_y() + this->v->get_h() + 2*margin;
        add_subwindow(sample = new BC_SubWindow(x, y, 50, 50));
+       y += sample->get_h() + margin;
+       add_subwindow(use_max = new CWindowEyedropCheckBox(mwindow, this, x, y));
        update();
        unlock_window();
 }
 
 void CWindowEyedropGUI::update()
 {
-       radius->update((int64_t)mwindow->edl->session->eyedrop_radius);
+       char string[BCTEXTLEN];
+       sprintf(string, "%d, %d",
+               thread->gui->eyedrop_x,
+               thread->gui->eyedrop_y);
+       current->update(string);
 
-       red->update(mwindow->edl->local_session->red);
-       green->update(mwindow->edl->local_session->green);
-       blue->update(mwindow->edl->local_session->blue);
+       radius->update((int64_t)mwindow->edl->session->eyedrop_radius);
 
+       LocalSession *local_session = mwindow->edl->local_session;
+       int use_max = local_session->use_max;
+       float r = use_max ? local_session->red_max : local_session->red;
+       float g = use_max ? local_session->green_max : local_session->green;
+       float b = use_max ? local_session->blue_max : local_session->blue;
+       this->red->update(r);
+       this->green->update(g);
+       this->blue->update(b);
+
+       int rx = 255*r + 0.5;  bclamp(rx,0,255);
+       int gx = 255*g + 0.5;  bclamp(gx,0,255);
+       int bx = 255*b + 0.5;  bclamp(bx,0,255);
+       char rgb_text[BCSTRLEN];
+       sprintf(rgb_text, "#%02x%02x%02x", rx, gx, bx);
+       rgb_hex->update(rgb_text);
+       
        float y, u, v;
-       YUV::rgb_to_yuv_f(mwindow->edl->local_session->red,
-               mwindow->edl->local_session->green,
-               mwindow->edl->local_session->blue,
-               y,
-               u,
-               v);
+       YUV::yuv.rgb_to_yuv_f(r, g, b, y, u, v);
        this->y->update(y);
-       this->u->update(u);
-       this->v->update(v);
-
-       int red = (int)(CLIP(mwindow->edl->local_session->red, 0, 1) * 0xff);
-       int green = (int)(CLIP(mwindow->edl->local_session->green, 0, 1) * 0xff);
-       int blue = (int)(CLIP(mwindow->edl->local_session->blue, 0, 1) * 0xff);
-       sample->set_color((red << 16) | (green << 8) | blue);
+       this->u->update(u);  u += 0.5;
+       this->v->update(v);  v += 0.5;
+
+       int yx = 255*y + 0.5;  bclamp(yx,0,255);
+       int ux = 255*u + 0.5;  bclamp(ux,0,255);
+       int vx = 255*v + 0.5;  bclamp(vx,0,255);
+       char yuv_text[BCSTRLEN];
+       sprintf(yuv_text, "#%02x%02x%02x", yx, ux, vx);
+       yuv_hex->update(yuv_text);
+
+       int rgb = (rx << 16) | (gx << 8) | (bx << 0);
+       sample->set_color(rgb);
        sample->draw_box(0, 0, sample->get_w(), sample->get_h());
        sample->set_color(BLACK);
        sample->draw_rectangle(0, 0, sample->get_w(), sample->get_h());
@@ -586,28 +626,27 @@ const _CVD Camera_Crv_Smooth =
        {       FloatAuto::SMOOTH,
                true,
                "tan_smooth",
-               _("\"smooth\" Curve on current Camera Keyframes")
+               N_("\"smooth\" Curve on current Camera Keyframes")
        };
 const _CVD Camera_Crv_Linear =
        {       FloatAuto::LINEAR,
                true,
                "tan_linear",
-               _("\"linear\" Curve on current Camera Keyframes")
+               N_("\"linear\" Curve on current Camera Keyframes")
        };
 const _CVD Projector_Crv_Smooth =
        {       FloatAuto::SMOOTH,
                false,
                "tan_smooth",
-               _("\"smooth\" Curve on current Projector Keyframes")
+               N_("\"smooth\" Curve on current Projector Keyframes")
        };
 const _CVD Projector_Crv_Linear =
        {       FloatAuto::LINEAR,
                false,
                "tan_linear",
-               _("\"linear\" Curve on current Projector Keyframes")
+               N_("\"linear\" Curve on current Projector Keyframes")
        };
 
-
 // Implementation Class für Keyframe Curve Mode buttons
 //
 // This button reflects the state of the "current" keyframe
@@ -635,7 +674,7 @@ CWindowCurveToggle::CWindowCurveToggle(_CVD mode, MWindow *mwindow, CWindowToolG
 {
        this->gui = gui;
        this->mwindow = mwindow;
-       set_tooltip(cfg.tooltip);
+       set_tooltip(_(cfg.tooltip));
 }
 
 void CWindowCurveToggle::check_toggle_state(FloatAuto *x, FloatAuto *y, FloatAuto *z)
@@ -671,6 +710,23 @@ int CWindowCurveToggle::handle_event()
 }
 
 
+CWindowEyedropCheckBox::CWindowEyedropCheckBox(MWindow *mwindow, 
+       CWindowEyedropGUI *gui, int x, int y)
+ : BC_CheckBox(x, y, mwindow->edl->local_session->use_max, _("Use maximum"))
+{
+       this->mwindow = mwindow;
+       this->gui = gui;
+}
+
+int CWindowEyedropCheckBox::handle_event()
+{
+       mwindow->edl->local_session->use_max = get_value();
+       
+       gui->update();
+       return 1;
+}
+
+
 CWindowCameraGUI::CWindowCameraGUI(MWindow *mwindow, CWindowTool *thread)
  : CWindowToolGUI(mwindow,
        thread,
@@ -751,16 +807,12 @@ void CWindowCameraGUI::create_objects()
 
 void CWindowCameraGUI::update_preview()
 {
-       mwindow->restart_brender();
-       mwindow->sync_parameters(CHANGE_PARAMS);
-
-       mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
-                       CHANGE_NONE,
-                       mwindow->edl,
-                       1);
        mwindow->gui->lock_window("CWindowCameraGUI::update_preview");
+       mwindow->restart_brender();
        mwindow->gui->draw_overlays(1);
+       mwindow->sync_parameters(CHANGE_PARAMS);
        mwindow->gui->unlock_window();
+       mwindow->cwindow->refresh_frame(CHANGE_NONE);
        mwindow->cwindow->gui->lock_window("CWindowCameraGUI::update_preview");
        mwindow->cwindow->gui->canvas->draw_refresh();
        mwindow->cwindow->gui->unlock_window();
@@ -810,9 +862,9 @@ void CWindowCameraGUI::handle_event()
                        if(z_auto)
                        {
                                float zoom = atof(z->get_text());
-                               if(zoom > 10) zoom = 10;
+                               if(zoom > 100.) zoom = 100.;
                                else
-                               if(zoom < 0) zoom = 0;
+                               if(zoom < 0.01) zoom = 0.01;
        // Doesn't allow user to enter from scratch
        //              if(zoom != atof(z->get_text()))
        //                      z->update(zoom);
@@ -853,8 +905,11 @@ void CWindowCameraGUI::update()
                x->update(x_auto->get_value());
        if(y_auto)
                y->update(y_auto->get_value());
-       if(z_auto)
-               z->update(z_auto->get_value());
+       if(z_auto) {
+               float value = z_auto->get_value();
+               z->update(value);
+               thread->gui->composite_panel->cpanel_zoom->update(value);
+       }
 
        if( x_auto && y_auto && z_auto )
        {
@@ -1196,16 +1251,12 @@ void CWindowProjectorGUI::create_objects()
 
 void CWindowProjectorGUI::update_preview()
 {
+       mwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
        mwindow->restart_brender();
        mwindow->sync_parameters(CHANGE_PARAMS);
-       mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
-                       CHANGE_NONE,
-                       mwindow->edl,
-                       1);
-       // TODO: really need to lock the main window??
-       mwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
        mwindow->gui->draw_overlays(1);
        mwindow->gui->unlock_window();
+       mwindow->cwindow->refresh_frame(CHANGE_NONE);
        mwindow->cwindow->gui->lock_window("CWindowProjectorGUI::update_preview");
        mwindow->cwindow->gui->canvas->draw_refresh();
        mwindow->cwindow->gui->unlock_window();
@@ -1255,9 +1306,8 @@ void CWindowProjectorGUI::handle_event()
                        if(z_auto)
                        {
                                float zoom = atof(z->get_text());
-                               if(zoom > 10000) zoom = 10000;
-                               else
-                               if(zoom < 0) zoom = 0;
+                               if(zoom > 100.) zoom = 100.;
+                               else if(zoom < 0.01) zoom = 0.01;
 //                     if (zoom != atof(z->get_text()))
 //                             z->update(zoom);
                                z_auto->set_value(zoom);
@@ -1297,8 +1347,11 @@ void CWindowProjectorGUI::update()
                x->update(x_auto->get_value());
        if(y_auto)
                y->update(y_auto->get_value());
-       if(z_auto)
-               z->update(z_auto->get_value());
+       if(z_auto) {
+               float value = z_auto->get_value();
+               z->update(value);
+               thread->gui->composite_panel->cpanel_zoom->update(value);
+       }
 
        if( x_auto && y_auto && z_auto )
        {
@@ -1627,6 +1680,9 @@ int CWindowMaskDelete::handle_event()
                temp_keyframe.copy_data(keyframe);
 // Update parameter
                SubMask *submask = temp_keyframe.get_submask(mwindow->edl->session->cwindow_mask);
+               if( shift_down() )
+                       submask->points.remove_all_objects();
+
                for(int i = mwindow->cwindow->gui->affected_point;
                        i < submask->points.total - 1;
                        i++)
@@ -1648,6 +1704,8 @@ int CWindowMaskDelete::handle_event()
                        current; )
                {
                        SubMask *submask = current->get_submask(mwindow->edl->session->cwindow_mask);
+                       if( shift_down() )
+                               submask->points.remove_all_objects();
 
                        for(int i = mwindow->cwindow->gui->affected_point;
                                i < submask->points.total - 1;
@@ -1876,7 +1934,7 @@ int CWindowMaskFeather::handle_event()
                        mask, point, create_it);
 
        if(track)
-       {       
+       {
 #ifdef USE_KEYFRAME_SPANNING
 // Create temp keyframe
                MaskAuto temp_keyframe(mwindow->edl, autos);
@@ -1927,7 +1985,7 @@ int CWindowMaskValue::handle_event()
 #else
        int create_it = 1;
 #endif
-       
+
        mwindow->undo->update_undo_before(_("mask value"), this);
        ((CWindowMaskGUI*)gui)->get_keyframe(track, autos, keyframe,
                mask, point, create_it);
@@ -2010,11 +2068,8 @@ int CWindowDisableOpenGLMasking::handle_event()
 
 
 CWindowMaskGUI::CWindowMaskGUI(MWindow *mwindow, CWindowTool *thread)
- : CWindowToolGUI(mwindow,
-       thread,
-       _(PROGRAM_NAME ": Mask"),
-       330,
-       310)
+ : CWindowToolGUI(mwindow, thread,
+       _(PROGRAM_NAME ": Mask"), 330, 320)
 {
        this->mwindow = mwindow;
        this->thread = thread;
@@ -2082,6 +2137,8 @@ void CWindowMaskGUI::create_objects()
        y += title->get_h() + margin;
        add_subwindow(title = new BC_Title(x, y, _("Press Ctrl to move a control point")));
        y += title->get_h() + margin;
+       add_subwindow(title = new BC_Title(x, y, _("Shift+click Delete to delete the mask")));
+       y += title->get_h() + margin;
        add_subwindow(title = new BC_Title(x, y, _("Press Alt to translate the mask")));
        y += 30;
 
@@ -2221,12 +2278,12 @@ void CWindowMaskGUI::handle_event()
 
 void CWindowMaskGUI::update_preview()
 {
+       mwindow->gui->lock_window("CWindowMaskGUI::update_preview");
        mwindow->restart_brender();
        mwindow->sync_parameters(CHANGE_PARAMS);
-       mwindow->cwindow->playback_engine->que->send_command(CURRENT_FRAME,
-                       CHANGE_NONE,
-                       mwindow->edl,
-                       1);
+       mwindow->gui->draw_overlays(1);
+       mwindow->gui->unlock_window();
+       mwindow->cwindow->refresh_frame(CHANGE_NONE);
        mwindow->cwindow->gui->lock_window("CWindowMaskGUI::update_preview");
        mwindow->cwindow->gui->canvas->draw_refresh();
        mwindow->cwindow->gui->unlock_window();