new/reworked audio plugins ported from hv72 compressor/multi/reverb, glyph workaround...
[goodguy/cinelerra.git] / cinelerra-5.1 / plugins / graphic / graphic.C
index ad2eae77d9dca3fc2d0c18390c559a5b3c513253..b7cf0722f3c6bb1dc2bbeb982a6bc79f1f9e87f6 100644 (file)
 // Canvas parameters
 #define MAJOR_DIVISIONS 7
 #define MINOR_DIVISIONS 5
-#define LINE_W4 12
-#define LINE_W3 10
-#define LINE_W2 5
-#define LINE_W1 2
+#define LINE_W4 xS(12)
+#define LINE_W3 xS(10)
+#define LINE_W2 xS(5)
+#define LINE_W1 xS(2)
 
 
 
@@ -227,7 +227,7 @@ int GraphicCanvas::button_release_event()
        return 0;
 }
 
-#define BOX_SIZE 10
+#define BOX_SIZE xS(10)
 
 int GraphicCanvas::freq_to_y(int freq,
        ArrayList<GraphicPoint*> *points,
@@ -320,29 +320,15 @@ void GraphicCanvas::process(int buttonpress, int motion, int draw)
        if(draw)
        {
                clear_box(0, 0, get_w(), get_h());
-
-
                int niquist = plugin->PluginAClient::project_sample_rate / 2;
-               int total_frames = plugin->get_gui_update_frames();
-               GraphicGUIFrame *frame = (GraphicGUIFrame*)plugin->get_gui_frame();
-
-               if(frame)
-               {
-                       delete plugin->last_frame;
-                       plugin->last_frame = frame;
-               }
-               else
-               {
-                       frame = plugin->last_frame;
-               }
 
-// Draw most recent frame
-               if(frame)
-               {
+// delete frames up to current tracking position
+               double tracking_position = plugin->get_tracking_position();
+               GraphicGUIFrame *frame = (GraphicGUIFrame *)
+                       plugin->get_gui_frame(tracking_position, 1);
+               if( frame ) {
+                       int y1 = 0, y2 = 0;
                        set_color(MEGREY);
-                       int y1 = 0;
-                       int y2 = 0;
-
 
                        for(int i = 0; i < get_w(); i++)
                        {
@@ -366,23 +352,7 @@ void GraphicCanvas::process(int buttonpress, int motion, int draw)
                                        y1 = y2;
                                }
                        }
-//printf( "\n");
-
-                       total_frames--;
-               }
-
-
-
-
-
-
-// Delete remaining frames
-               while(total_frames > 0)
-               {
-                       PluginClientFrame *frame = plugin->get_gui_frame();
-
-                       if(frame) delete frame;
-                       total_frames--;
+                       delete frame;
                }
        }
 
@@ -699,7 +669,7 @@ int GraphicReset::handle_event()
 
 
 GraphicSize::GraphicSize(GraphicGUI *window, GraphicEQ *plugin, int x, int y)
- : BC_PopupMenu(x, y, 100, "4096", 1)
+ : BC_PopupMenu(x, y, xS(120), "4096", 1)
 {
        this->plugin = plugin;
        this->window = window;
@@ -766,8 +736,8 @@ GraphicGUI::GraphicGUI(GraphicEQ *plugin)
  : PluginClientWindow(plugin,
        plugin->w,
        plugin->h,
-       320,
-       200,
+       xS(320),
+       yS(200),
        1)
 {
        this->plugin = plugin;
@@ -802,12 +772,12 @@ void GraphicGUI::create_objects()
 //     int y1 = y;
        add_subwindow(freq_title = new BC_Title(x, y, _("Frequency:")));
        x += freq_title->get_w() + margin;
-       add_subwindow(freq_text = new FreqTextBox(plugin, this, x, y, 100));
+       add_subwindow(freq_text = new FreqTextBox(plugin, this, x, y, xS(100)));
        x += freq_text->get_w() + margin;
 
        add_subwindow(level_title = new BC_Title(x, y, _("Level:")));
        x += level_title->get_w() + margin;
-       add_subwindow(value_text = new ValueTextBox(plugin, this, x, y, 100));
+       add_subwindow(value_text = new ValueTextBox(plugin, this, x, y, xS(100)));
        x += value_text->get_w() + margin;
 
        add_subwindow(reset = new GraphicReset(plugin, this, x, y));
@@ -1031,8 +1001,8 @@ GraphicEQ::GraphicEQ(PluginServer *server)
        fft = 0;
        need_reconfigure = 1;
        active_point = -1;
-       w = 640;
-       h = 480;
+       w = xS(640);
+       h = yS(480);
 }
 
 GraphicEQ::~GraphicEQ()
@@ -1131,18 +1101,15 @@ void GraphicEQ::update_gui()
 {
        if( !thread ) return;
        GraphicGUI *window = (GraphicGUI *)thread->window;
+       window->lock_window("GraphicEQ::update_gui");
 //lock here for points, needed by window cursor_motion callback
 //  deleted in load_configuration by read_data
-       window->lock_window("GraphicEQ::update_gui");
        if( load_configuration() &&
            window->canvas->state != GraphicCanvas::DRAG_POINT ) {
                window->update_canvas();
                window->update_textboxes();
        }
-       else {
-               int total_frames = get_gui_update_frames();
-//printf("ParametricEQ::update_gui %d %d\n", __LINE__, total_frames);
-               if( total_frames )
+       else if( pending_gui_frames() ) {
                        window->update_canvas();
        }
        window->unlock_window();
@@ -1299,15 +1266,14 @@ void GraphicEQ::calculate_envelope(ArrayList<GraphicPoint*> *points,
 }
 
 
-
-
 GraphicGUIFrame::GraphicGUIFrame(int window_size, int sample_rate)
- : PluginClientFrame(window_size / 2, window_size / 2, sample_rate)
+ : PluginClientFrame()
 {
-       data = new double[window_size / 2];
+       this->window_size = window_size;
+       data_size = window_size / 2;
+       data = new double[data_size];
        freq_max = 0;
        time_max = 0;
-       this->window_size = window_size;
 }
 
 GraphicGUIFrame::~GraphicGUIFrame()
@@ -1316,10 +1282,6 @@ GraphicGUIFrame::~GraphicGUIFrame()
 }
 
 
-
-
-
-
 GraphicFFT::GraphicFFT(GraphicEQ *plugin)
  : CrossfadeFFT()
 {