olaf neophyte and de.po updates, valgrind tweaks, delete green lady, inkscape dpi=96
[goodguy/history.git] / cinelerra-5.1 / cinelerra / pluginclient.C
index 64c7d53f6649d64ef1e0131d59e688d764c15fc5..7f1fdd04323959926339ba8bc5ad108803b207ea 100644 (file)
@@ -1,22 +1,22 @@
+
 /*
  * CINELERRA
  * Copyright (C) 1997-2011 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
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- * 
+ *
  */
 
 #include "bcdisplayinfo.h"
 #include "bcsignals.h"
 #include "clip.h"
 #include "condition.h"
+#include "edits.h"
+#include "edit.h"
 #include "edl.h"
 #include "edlsession.h"
+#include "file.h"
 #include "filesystem.h"
+#include "filexml.h"
+#include "indexable.h"
 #include "language.h"
 #include "localsession.h"
 #include "mainundo.h"
 #include "mwindow.h"
+#include "plugin.h"
 #include "pluginclient.h"
 #include "pluginserver.h"
 #include "preferences.h"
+#include "track.h"
 #include "transportque.inc"
 
 
@@ -55,10 +62,10 @@ PluginClientThread::PluginClientThread(PluginClient *client)
 
 PluginClientThread::~PluginClientThread()
 {
+       join();
 //printf("PluginClientThread::~PluginClientThread %p %d\n", this, __LINE__);
-       delete window;
+       delete window;  window = 0;
 //printf("PluginClientThread::~PluginClientThread %p %d\n", this, __LINE__);
-       window = 0;
        delete init_complete;
 }
 
@@ -68,10 +75,10 @@ void PluginClientThread::run()
        int result = 0;
        if(client->window_x < 0) client->window_x = info.get_abs_cursor_x();
        if(client->window_y < 0) client->window_y = info.get_abs_cursor_y();
-       window = client->new_window();
+       if(!window)
+               window = (PluginClientWindow*)client->new_window();
 
-       if(window)
-       {
+       if(window) {
                window->lock_window("PluginClientThread::run");
                window->create_objects();
                window->unlock_window();
@@ -85,8 +92,7 @@ void PluginClientThread::run()
 //printf("PluginClientThread::run %p %d\n", this, __LINE__);
                window->hide_window(1);
                window->unlock_window();
-
-
+               window->done_event(result);
 // Can't save defaults in the destructor because it's not called immediately
 // after closing.
                /* if(client->defaults) */ client->save_defaults_xml();
@@ -116,8 +122,8 @@ PluginClient* PluginClientThread::get_client()
 
 
 
-PluginClientFrame::PluginClientFrame(int data_size, 
-       int period_n, 
+PluginClientFrame::PluginClientFrame(int data_size,
+       int period_n,
        int period_d)
 {
        this->data_size = data_size;
@@ -128,51 +134,31 @@ PluginClientFrame::PluginClientFrame(int data_size,
 
 PluginClientFrame::~PluginClientFrame()
 {
-       
+
 }
 
 
 
 
 
-PluginClientWindow::PluginClientWindow(PluginClient *client, 
-       int w,
-       int h,
-       int min_w,
-       int min_h,
-       int allow_resize)
- : BC_Window(client->gui_string, 
-       client->window_x /* - w / 2 */, 
-       client->window_y /* - h / 2 */, 
-       w, 
-       h, 
-       min_w, 
-       min_h,
-       allow_resize, 
-       0,
-       1)
+PluginClientWindow::PluginClientWindow(PluginClient *client,
+       int w, int h, int min_w, int min_h, int allow_resize)
+ : BC_Window(client->gui_string,
+       client->window_x /* - w / 2 */,
+       client->window_y /* - h / 2 */,
+       (int)(w*get_resources()->font_scale+0.5), (int)(h*get_resources()->font_scale+0.5),
+       (int)(min_w*get_resources()->font_scale+0.5), (int)(min_h*get_resources()->font_scale+0.5),
+       allow_resize, 0, 1)
 {
        this->client = client;
 }
 
-PluginClientWindow::PluginClientWindow(const char *title, 
-       int x,
-       int y,
-       int w,
-       int h,
-       int min_w,
-       int min_h,
-       int allow_resize)
- : BC_Window(title, 
-       x, 
-       y, 
-       w, 
-       h, 
-       min_w, 
-       min_h,
-       allow_resize, 
-       0,
-       1)
+PluginClientWindow::PluginClientWindow(const char *title,
+       int x, int y, int w, int h, int min_w, int min_h, int allow_resize)
+ : BC_Window(title, x, y,
+        (int)(w*get_resources()->font_scale+0.5), (int)(h*get_resources()->font_scale+0.5),
+        (int)(min_w*get_resources()->font_scale+0.5), (int)(min_h*get_resources()->font_scale+0.5),
+       allow_resize, 0, 1)
 {
        this->client = 0;
 }
@@ -208,7 +194,7 @@ PluginClient::PluginClient(PluginServer *server)
 {
        reset();
        this->server = server;
-       smp = server->preferences->processors;
+       smp = server->preferences->project_smp;
        defaults = 0;
        update_timer = new Timer;
 // Virtual functions don't work here.
@@ -216,9 +202,8 @@ PluginClient::PluginClient(PluginServer *server)
 
 PluginClient::~PluginClient()
 {
-// Delete the GUI thread.  The GUI must be hidden with hide_gui first.
-       if(thread) 
-       {
+       if( thread ) {
+               hide_gui();
                thread->join();
                delete thread;
        }
@@ -264,12 +249,11 @@ void PluginClient::hide_gui()
                thread->window->set_done(0);
 //printf("PluginClient::hide_gui %d thread->window=%p\n", __LINE__, thread->window);
                thread->window->unlock_window();
-//printf("PluginClient::delete_thread %d\n", __LINE__);
        }
 }
 
 // For realtime plugins initialize buffers
-int PluginClient::plugin_init_realtime(int realtime_priority, 
+int PluginClient::plugin_init_realtime(int realtime_priority,
        int total_in_buffers,
        int buffer_size)
 {
@@ -288,9 +272,9 @@ int PluginClient::plugin_init_realtime(int realtime_priority,
        return 0;
 }
 
-int PluginClient::plugin_start_loop(int64_t start, 
-       int64_t end, 
-       int64_t buffer_size, 
+int PluginClient::plugin_start_loop(int64_t start,
+       int64_t end,
+       int64_t buffer_size,
        int total_buffers)
 {
 //printf("PluginClient::plugin_start_loop %d %ld %ld %ld %d\n",
@@ -357,14 +341,8 @@ int PluginClient::show_gui()
        thread->start();
        thread->init_complete->lock("PluginClient::show_gui");
 // Must wait before sending any hide_gui
-       if(thread->window)
-       {
-               thread->window->init_wait();
-       }
-       else
-       {
-               return 1;
-       }
+       if( !thread->window ) return 1;
+       thread->window->init_wait();
        return 0;
 }
 
@@ -384,7 +362,7 @@ int PluginClient::set_string()
        if(thread)
        {
                thread->window->lock_window("PluginClient::set_string");
-               thread->window->set_title(gui_string);
+               thread->window->put_title(gui_string);
                thread->window->unlock_window();
        }
        return 0;
@@ -413,9 +391,9 @@ void PluginClient::end_process_buffer()
 
 void PluginClient::plugin_update_gui()
 {
-       
+
        update_gui();
-       
+
 // Delete unused GUI frames
        while(frame_buffer.size() > MAX_FRAME_BUFFER)
                frame_buffer.remove_object_number(0);
@@ -431,17 +409,17 @@ int PluginClient::get_gui_update_frames()
        if(frame_buffer.size())
        {
                PluginClientFrame *frame = frame_buffer.get(0);
-               int total_frames = update_timer->get_difference() * 
-                       frame->period_d / 
-                       frame->period_n / 
+               int total_frames = update_timer->get_difference() *
+                       frame->period_d /
+                       frame->period_n /
                        1000;
-               if(total_frames) update_timer->subtract(total_frames * 
-                       frame->period_n * 
-                       1000 / 
+               if(total_frames) update_timer->subtract(total_frames *
+                       frame->period_n *
+                       1000 /
                        frame->period_d);
 
-// printf("PluginClient::get_gui_update_frames %d %ld %d %d %d\n", 
-// __LINE__, 
+// printf("PluginClient::get_gui_update_frames %d %ld %d %d %d\n",
+// __LINE__,
 // update_timer->get_difference(),
 // frame->period_n * 1000 / frame->period_d,
 // total_frames,
@@ -511,12 +489,12 @@ void PluginClient::render_gui(void *data)
        if(thread)
        {
                thread->get_window()->lock_window("PluginClient::render_gui");
-               
+
 // Set all previous frames to draw immediately
                for(int i = 0; i < frame_buffer.size(); i++)
                        frame_buffer.get(i)->force = 1;
 
-               ArrayList<PluginClientFrame*> *src = 
+               ArrayList<PluginClientFrame*> *src =
                        (ArrayList<PluginClientFrame*>*)data;
 
 // Shift GUI data to GUI client
@@ -525,7 +503,7 @@ void PluginClient::render_gui(void *data)
                        this->frame_buffer.append(src->get(0));
                        src->remove_number(0);
                }
-               
+
 // Start the timer for the current buffer
                update_timer->update();
                thread->get_window()->unlock_window();
@@ -549,20 +527,20 @@ int PluginClient::is_video() { return 0; }
 int PluginClient::is_theme() { return 0; }
 int PluginClient::uses_gui() { return 1; }
 int PluginClient::is_transition() { return 0; }
-int PluginClient::load_defaults() 
+int PluginClient::load_defaults()
 {
 //     printf("PluginClient::load_defaults undefined in %s.\n", plugin_title());
-       return 0; 
+       return 0;
 }
 
-int PluginClient::save_defaults() 
-{ 
+int PluginClient::save_defaults()
+{
        save_defaults_xml();
 //     printf("PluginClient::save_defaults undefined in %s.\n", plugin_title());
-       return 0; 
+       return 0;
 }
 
-void PluginClient::load_defaults_xml() 
+void PluginClient::load_defaults_xml()
 {
        char path[BCTEXTLEN];
        server->get_defaults_path(path);
@@ -570,47 +548,44 @@ void PluginClient::load_defaults_xml()
        fs.complete_path(path);
        using_defaults = 1;
 //printf("PluginClient::load_defaults_xml %d %s\n", __LINE__, path);
-       
+
        KeyFrame temp_keyframe;
-       FILE *fd = fopen(path, "r");
-       if(fd)
-       {
-               char *data = temp_keyframe.get_data();
-               int data_size = fread(data, 1, MESSAGESIZE-1, fd);
+       FILE *fp = fopen(path, "r");
+       if( fp ) {
+               struct stat st;  int fd = fileno(fp);
+               int64_t sz = !fstat(fd, &st) ? st.st_size : BCTEXTLEN;
+               char *data = temp_keyframe.get_data(sz+1);
+               int data_size = fread(data, 1, sz, fp);
                if( data_size < 0 ) data_size = 0;
-               if( data_size > 0 )
-               {
+               if( data_size > 0 ) {
+                       data[data_size] = 0;
+                       temp_keyframe.xbuf->oseek(data_size);
 // Get window extents
-                       int state = 0;
-                       for(int i = 0; i < data_size - 8; i++)
-                       {
-                               if(data[i] == '<') break;
-                               if(isdigit(data[i]))
-                               {
-                                       if(state == 0)
-                                       {
-                                               window_x = atoi(data + i);
-                                               state++;
-                                       }
-                                       else
-                                       {
-                                               window_y = atoi(data + i);
-                                               break;
-                                       }
-                                       while(i < data_size && isdigit(data[i])) i++;
+                       int i = 0;
+                       for( int state=0; i<(data_size-8) && state>=0; ++i ) {
+                               if( !data[i] || data[i] == '<' ) break;
+                               if( !isdigit(data[i]) ) continue;
+                               if( !state ) {
+                                       window_x = atoi(data + i);
+                                       state = 1;
+                               }
+                               else {
+                                       window_y = atoi(data + i);
+                                       state = -1;
                                }
+                               while( i<data_size && isdigit(data[i]) ) ++i;
                        }
-                       data[data_size] = 0;
+                       temp_keyframe.xbuf->iseek(i);
                        read_data(&temp_keyframe);
                }
 
-               fclose(fd);
+               fclose(fp);
        }
        using_defaults = 0;
 //printf("PluginClient::load_defaults_xml %d %s\n", __LINE__, path);
 }
 
-void PluginClient::save_defaults_xml() 
+void PluginClient::save_defaults_xml()
 {
        char path[BCTEXTLEN];
        server->get_defaults_path(path);
@@ -619,23 +594,21 @@ void PluginClient::save_defaults_xml()
        using_defaults = 1;
 
        KeyFrame temp_keyframe;
-
        save_data(&temp_keyframe);
-       FILE *fd = fopen(path, "w");
-       if(fd)
-       {
-               fprintf(fd, "%d\n%d\n", window_x, window_y);
-               if(!fwrite(temp_keyframe.get_data(), strlen(temp_keyframe.get_data()), 1, fd))
-               {
+
+       const char *data = temp_keyframe.get_data();
+       int len = strlen(data);
+       FILE *fp = fopen(path, "w");
+
+       if( fp ) {
+               fprintf(fp, "%d\n%d\n", window_x, window_y);
+               if( len > 0 && !fwrite(data, len, 1, fp) ) {
                        fprintf(stderr, "PluginClient::save_defaults_xml %d \"%s\" %d bytes: %s\n",
-                               __LINE__,
-                               path,
-                               (int)strlen(temp_keyframe.get_data()),
-                               strerror(errno));
+                               __LINE__, path, len, strerror(errno));
                }
-
-               fclose(fd);
+               fclose(fp);
        }
+
        using_defaults = 0;
 }
 
@@ -653,10 +626,10 @@ PluginClientThread* PluginClient::get_thread()
        return thread;
 }
 
-BC_WindowBase* PluginClient::new_window() 
-{ 
+BC_WindowBase* PluginClient::new_window()
+{
        printf("PluginClient::new_window undefined in %s.\n", plugin_title());
-       return 0; 
+       return 0;
 }
 int PluginClient::get_parameters() { return 0; }
 int PluginClient::get_samplerate() { return get_project_samplerate(); }
@@ -687,12 +660,6 @@ int PluginClient::get_gui_status()
        return server->get_gui_status();
 }
 
-int PluginClient::start_plugin()
-{
-       printf(_("No processing defined for this plugin.\n"));
-       return 0;
-}
-
 // close event from client side
 void PluginClient::client_side_close()
 {
@@ -717,6 +684,14 @@ double PluginClient::get_project_framerate()
        return server->get_project_framerate();
 }
 
+const char *PluginClient::get_source_path()
+{
+       int64_t source_position = server->plugin->startproject;
+       Edit *edit = server->plugin->track->edits->editof(source_position,PLAY_FORWARD,0);
+       Indexable *indexable = edit ? edit->get_source() : 0;
+       return indexable ? indexable->path : 0;
+}
+
 
 void PluginClient::update_display_title()
 {
@@ -756,39 +731,29 @@ int PluginClient::get_interpolation_type()
 
 float PluginClient::get_red()
 {
-       if(server->mwindow)
-               return server->mwindow->edl->local_session->red;
-       else
-       if(server->edl)
-               return server->edl->local_session->red;
-       else
-               return 0;
+       EDL *edl = server->mwindow ? server->mwindow->edl : server->edl;
+       return !edl ? 0 : edl->local_session->use_max ?
+               edl->local_session->red_max :
+               edl->local_session->red;
 }
 
 float PluginClient::get_green()
 {
-       if(server->mwindow)
-               return server->mwindow->edl->local_session->green;
-       else
-       if(server->edl)
-               return server->edl->local_session->green;
-       else
-               return 0;
+       EDL *edl = server->mwindow ? server->mwindow->edl : server->edl;
+       return !edl ? 0 : edl->local_session->use_max ?
+               edl->local_session->green_max :
+               edl->local_session->green;
 }
 
 float PluginClient::get_blue()
 {
-       if(server->mwindow)
-               return server->mwindow->edl->local_session->blue;
-       else
-       if(server->edl)
-               return server->edl->local_session->blue;
-       else
-               return 0;
+       EDL *edl = server->mwindow ? server->mwindow->edl : server->edl;
+       return !edl ? 0 : edl->local_session->use_max ?
+               edl->local_session->blue_max :
+               edl->local_session->blue;
 }
 
 
-
 int64_t PluginClient::get_source_position()
 {
        return source_position;
@@ -843,7 +808,7 @@ int PluginClient::get_project_smp()
 
 const char* PluginClient::get_defaultdir()
 {
-       return BCASTDIR;
+       return File::get_plugin_path();
 }
 
 
@@ -860,7 +825,6 @@ int PluginClient::send_configure_change()
                server->mwindow->undo->update_undo_before(_("tweek"), this);
 #ifdef USE_KEYFRAME_SPANNING
        KeyFrame keyframe;
-       keyframe.copy_from(server->get_keyframe());
        save_data(&keyframe);
        server->apply_keyframe(&keyframe);
 #else
@@ -900,7 +864,7 @@ void PluginClient::get_projector(float *x, float *y, float *z, int64_t position)
 
 EDLSession* PluginClient::get_edlsession()
 {
-       if(server->edl) 
+       if(server->edl)
                return server->edl->session;
        return 0;
 }