X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fresizetrackthread.C;fp=cinelerra-5.1%2Fcinelerra%2Fresizetrackthread.C;h=8ffd680a4a364de6fba4a8c76047e5e279dc1ee5;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/resizetrackthread.C b/cinelerra-5.1/cinelerra/resizetrackthread.C new file mode 100644 index 00000000..8ffd680a --- /dev/null +++ b/cinelerra-5.1/cinelerra/resizetrackthread.C @@ -0,0 +1,378 @@ + +/* + * CINELERRA + * Copyright (C) 2008 Adam Williams + * + * 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; +} + +