Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / resizetrackthread.C
diff --git a/cinelerra-5.1/cinelerra/resizetrackthread.C b/cinelerra-5.1/cinelerra/resizetrackthread.C
new file mode 100644 (file)
index 0000000..8ffd680
--- /dev/null
@@ -0,0 +1,378 @@
+
+/*
+ * CINELERRA
+ * Copyright (C) 2008 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 "asset.h"
+#include "assetedit.h"
+#include "edl.h"
+#include "edlsession.h"
+#include "language.h"
+#include "mainerror.h"
+#include "mainundo.h"
+#include "mwindow.h"
+#include "mwindowgui.h"
+#include "new.h"
+#include "resizetrackthread.h"
+#include "theme.h"
+#include "track.h"
+#include "tracks.h"
+
+
+
+
+
+
+ResizeVTrackThread::ResizeVTrackThread(MWindow *mwindow)
+ : Thread(1, 0, 0)
+{
+       this->mwindow = mwindow;
+       window = 0;
+}
+
+ResizeVTrackThread::~ResizeVTrackThread()
+{
+       if(window)
+       {
+               window->lock_window();
+               window->set_done(1);
+               window->unlock_window();
+       }
+
+       Thread::join();
+}
+
+void ResizeVTrackThread::start_window(int w, int h, int w1, int h1)
+{
+       this->w = w;    this->h = h;
+       this->w1 = w1;  this->h1 = h1;
+       w_scale = h_scale = 1;
+       start();
+}
+
+
+void ResizeVTrackThread::run()
+{
+       ResizeVTrackWindow *window = this->window = 
+               new ResizeVTrackWindow(mwindow, 
+                       this,
+                       mwindow->gui->get_abs_cursor_x(1),
+                       mwindow->gui->get_abs_cursor_y(1));
+       window->create_objects();
+       int result = window->run_window();
+       this->window = 0;
+       delete window;
+
+
+       if(!result)
+       {
+               update();
+       }
+
+       if(((w % 4) || 
+               (h % 4)) && 
+               mwindow->edl->session->playback_config->vconfig->driver == PLAYBACK_X11_GL)
+       {
+               MainError::show_error(
+                       _("This track's dimensions are not multiples of 4 so\n"
+                       "it can't be rendered by OpenGL."));
+       }
+}
+
+
+
+
+ResizeVTrackWindow::ResizeVTrackWindow(MWindow *mwindow, 
+       ResizeVTrackThread *thread,
+       int x,
+       int y)
+ : BC_Window(_(PROGRAM_NAME ": Resize Track"), 
+                               x - 320 / 2,
+                               y - get_resources()->ok_images[0]->get_h() + 100 / 2,
+                               340, 
+                               get_resources()->ok_images[0]->get_h() + 100, 
+                               340, 
+                               get_resources()->ok_images[0]->get_h() + 100, 
+                               0,
+                               0, 
+                               1)
+{
+       this->mwindow = mwindow;
+       this->thread = thread;
+}
+
+ResizeVTrackWindow::~ResizeVTrackWindow()
+{
+}
+
+void ResizeVTrackWindow::create_objects()
+{
+       int x = 10, y = 10;
+
+       lock_window("ResizeVTrackWindow::create_objects");
+       add_subwindow(new BC_Title(x, y, _("Size:")));
+       x += 50;
+       add_subwindow(w = new ResizeVTrackWidth(this, 
+               thread,
+               x,
+               y));
+       x += w->get_w() + 10;
+       add_subwindow(new BC_Title(x, y, _("x")));
+       x += 15;
+       add_subwindow(h = new ResizeVTrackHeight(this, 
+               thread,
+               x,
+               y));
+       x += h->get_w() + 5;
+       FrameSizePulldown *pulldown;
+       add_subwindow(pulldown = new FrameSizePulldown(mwindow->theme, 
+               w, 
+               h, 
+               x, 
+               y));
+       x += pulldown->get_w() + 5;
+       add_subwindow(new ResizeVTrackSwap(this, thread, x, y));
+
+
+       y += 30;
+       x = 10;
+       add_subwindow(new BC_Title(x, y, _("Scale:")));
+       x += 50;
+       add_subwindow(w_scale = new ResizeVTrackScaleW(this, 
+               thread,
+               x,
+               y));
+       x += 100;
+       add_subwindow(new BC_Title(x, y, _("x")));
+       x += 15;
+       add_subwindow(h_scale = new ResizeVTrackScaleH(this, 
+               thread,
+               x,
+               y));
+
+       add_subwindow(new BC_OKButton(this));
+       add_subwindow(new BC_CancelButton(this));
+
+       show_window();
+       flush();
+       unlock_window();
+}
+
+void ResizeVTrackWindow::update(int changed_scale, 
+       int changed_size, 
+       int changed_all)
+{
+//printf("ResizeVTrackWindow::update %d %d %d\n", changed_scale, changed_size, changed_all);
+       if(changed_scale || changed_all)
+       {
+               thread->w = (int)(thread->w1 * thread->w_scale);
+               w->update((int64_t)thread->w);
+               thread->h = (int)(thread->h1 * thread->h_scale);
+               h->update((int64_t)thread->h);
+       }
+       else
+       if(changed_size || changed_all)
+       {
+               thread->w_scale = thread->w1 ? (double)thread->w / thread->w1 : 1.;
+               w_scale->update((float)thread->w_scale);
+               thread->h_scale = thread->h1 ? (double)thread->h / thread->h1 : 1.;
+               h_scale->update((float)thread->h_scale);
+       }
+}
+
+
+
+
+
+
+ResizeVTrackSwap::ResizeVTrackSwap(ResizeVTrackWindow *gui, 
+       ResizeVTrackThread *thread, 
+       int x, 
+       int y)
+ : BC_Button(x, y, thread->mwindow->theme->get_image_set("swap_extents"))
+{
+       this->thread = thread;
+       this->gui = gui;
+       set_tooltip(_("Swap dimensions"));
+}
+
+int ResizeVTrackSwap::handle_event()
+{
+       int w = thread->w;
+       int h = thread->h;
+       thread->w = h;
+       thread->h = w;
+       gui->w->update((int64_t)h);
+       gui->h->update((int64_t)w);
+       gui->update(0, 1, 0);
+       return 1;
+}
+
+
+
+
+
+
+ResizeVTrackWidth::ResizeVTrackWidth(ResizeVTrackWindow *gui, 
+       ResizeVTrackThread *thread,
+       int x,
+       int y)
+ : BC_TextBox(x, y, 90, 1, thread->w)
+{
+       this->gui = gui;
+       this->thread = thread;
+}
+int ResizeVTrackWidth::handle_event()
+{
+       thread->w = atol(get_text());
+       gui->update(0, 1, 0);
+       return 1;
+}
+
+ResizeVTrackHeight::ResizeVTrackHeight(ResizeVTrackWindow *gui, 
+       ResizeVTrackThread *thread,
+       int x,
+       int y)
+ : BC_TextBox(x, y, 90, 1, thread->h)
+{
+       this->gui = gui;
+       this->thread = thread;
+}
+int ResizeVTrackHeight::handle_event()
+{
+       thread->h = atol(get_text());
+       gui->update(0, 1, 0);
+       return 1;
+}
+
+
+ResizeVTrackScaleW::ResizeVTrackScaleW(ResizeVTrackWindow *gui, 
+       ResizeVTrackThread *thread,
+       int x,
+       int y)
+ : BC_TextBox(x, y, 90, 1, (float)thread->w_scale)
+{
+       this->gui = gui;
+       this->thread = thread;
+}
+int ResizeVTrackScaleW::handle_event()
+{
+       thread->w_scale = atof(get_text());
+       gui->update(1, 0, 0);
+       return 1;
+}
+
+ResizeVTrackScaleH::ResizeVTrackScaleH(ResizeVTrackWindow *gui, 
+       ResizeVTrackThread *thread,
+       int x,
+       int y)
+ : BC_TextBox(x, y, 90, 1, (float)thread->h_scale)
+{
+       this->gui = gui;
+       this->thread = thread;
+}
+int ResizeVTrackScaleH::handle_event()
+{
+       thread->h_scale = atof(get_text());
+       gui->update(1, 0, 0);
+       return 1;
+}
+
+
+
+
+
+ResizeTrackThread::ResizeTrackThread(MWindow *mwindow)
+ : ResizeVTrackThread(mwindow)
+{
+}
+
+ResizeTrackThread::~ResizeTrackThread()
+{
+}
+
+
+void ResizeTrackThread::start_window(Track *track)
+{
+       this->track= track;
+       ResizeVTrackThread::start_window(track->track_w,
+               track->track_h,
+               track->track_w,
+               track->track_h);
+}
+
+void ResizeTrackThread::update()
+{
+       mwindow->resize_track(track, w, h);
+}
+
+
+
+
+ResizeAssetThread::ResizeAssetThread(AssetEditWindow *fwindow)
+ : ResizeVTrackThread(fwindow->mwindow)
+{
+       this->fwindow = fwindow;
+}
+
+ResizeAssetThread::~ResizeAssetThread()
+{
+}
+
+void ResizeAssetThread::start_window(Asset *asset)
+{
+       this->asset = asset;
+       ResizeVTrackThread::start_window(asset->get_w(),
+               asset->get_h(),
+               asset->actual_width,
+               asset->actual_height);
+}
+
+void ResizeAssetThread::update()
+{
+       char string[BCTEXTLEN];
+       asset->width = w;
+       asset->height = h;
+       sprintf(string, "%d", asset->width);
+       fwindow->win_width->update(string);
+       sprintf(string, "%d", asset->height);
+       fwindow->win_height->update(string);
+}
+
+ResizeAssetButton::ResizeAssetButton(AssetEditWindow *fwindow, int x, int y)
+ : BC_GenericButton(x, y, _("Resize"))
+{
+       resize_asset_thread = 0;
+        this->fwindow = fwindow;
+        set_underline(0);
+}
+
+ResizeAssetButton::~ResizeAssetButton()
+{
+       delete resize_asset_thread;
+}
+
+int ResizeAssetButton::handle_event()
+{
+       resize_asset_thread = new ResizeAssetThread(fwindow);
+       resize_asset_thread->start_window(fwindow->asset_edit->changed_params);
+        return 1;
+}
+
+