bd/dvd create reworks, Makefile updates
[goodguy/history.git] / cinelerra-5.1 / plugins / scaleratio / scaleratiowin.C
diff --git a/cinelerra-5.1/plugins/scaleratio/scaleratiowin.C b/cinelerra-5.1/plugins/scaleratio/scaleratiowin.C
new file mode 100644 (file)
index 0000000..68aa066
--- /dev/null
@@ -0,0 +1,320 @@
+
+/*
+ * 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 "bcdisplayinfo.h"
+#include "clip.h"
+#include "language.h"
+#include "rescale.h"
+#include "scaleratio.h"
+#include "scaleratiowin.h"
+#include "mwindow.h"
+
+
+ScaleRatioWin::ScaleRatioWin(ScaleRatioMain *client)
+ : PluginClientWindow(client, 400, 300, 400, 300, 0)
+{ 
+       this->client = client; 
+}
+
+ScaleRatioWin::~ScaleRatioWin()
+{
+}
+
+void ScaleRatioWin::create_objects()
+{
+       int x = 10, y = 10;
+       int x0 = x, x1 = x0 + 50;
+       int y0 = y;
+       client->load_configuration();
+
+       add_tool(new BC_Title(x0, y0, _("In R:")));
+       add_tool(in_r = new ScaleRatioRatio(this, client, x1, y0, &client->config.in_r));
+       in_r->create_objects();
+       y0 += in_r->get_th() + 10;
+
+       add_tool(new BC_Title(x0, y0, _("In W:")));
+       in_w = new ScaleRatioCoord(this, client, x1, y0, 0, &client->config.in_w);
+       in_w->create_objects();
+       y0 += in_w->get_h() + 8;
+
+       add_tool(new BC_Title(x0, y0, _("In H:")));
+       in_h = new ScaleRatioCoord(this, client, x1, y0, 0, &client->config.in_h);
+       in_h->create_objects();
+
+       x0 = get_w()/2;  y0 = y;
+       x1 = x0 + 50;
+
+       add_tool(new BC_Title(x0, y0, _("Out R:")));
+       add_tool(out_r = new ScaleRatioRatio(this, client, x1, y0, &client->config.out_r));
+       out_r->create_objects();
+       y0 += out_r->get_th() + 10;
+
+       add_tool(new BC_Title(x0, y0, _("Out W:")));
+       out_w = new ScaleRatioCoord(this, client, x1, y0, 0, &client->config.out_w);
+       out_w->create_objects();
+       y0 += out_w->get_h() + 8;
+
+       add_tool(new BC_Title(x0, y0, _("Out H:")));
+       out_h = new ScaleRatioCoord(this, client, x1, y0, 0, &client->config.out_h);
+       out_h->create_objects();
+       y0 += out_h->get_h() + 8;
+
+       y = y0 + 5;
+       add_tool(apply_button = new ScaleRatioApply(this, x, y));
+       int x2 = x + apply_button->get_w() + 50;
+       add_tool(type_popup = new ScaleRatioType(this, x2, y, &client->config.type));
+       type_popup->create_objects();
+       y += apply_button->get_h() + 30;
+
+       x0 = x;  y0 = y;
+       x1 = x0 + 50;
+
+       add_tool(new BC_Title(x0, y0, _("Src X:")));
+       src_x = new ScaleRatioCoord(this, client, x1, y0, 1, &client->config.src_x);
+       src_x->create_objects();
+       y0 += 30;
+
+       add_tool(new BC_Title(x0, y0, _("Src Y:")));
+       src_y = new ScaleRatioCoord(this, client, x1, y0, 1, &client->config.src_y);
+       src_y->create_objects();
+       y0 += 30;
+
+
+       add_tool(new BC_Title(x0, y0, _("Src W:")));
+       src_w = new ScaleRatioCoord(this, client, x1, y0, 0, &client->config.src_w);
+       src_w->create_objects();
+       y0 += 30;
+
+       add_tool(new BC_Title(x0, y0, _("Src H:")));
+       src_h = new ScaleRatioCoord(this, client, x1, y0, 0, &client->config.src_h);
+       src_h->create_objects();
+       y0 += 30;
+
+       x0 = get_w()/2;
+       x1 = x0 + 50;
+       y0 = y;
+       add_tool(new BC_Title(x0, y0, _("Dst X:")));
+       dst_x = new ScaleRatioCoord(this, client, x1, y0, 1, &client->config.dst_x);
+       dst_x->create_objects();
+       y0 += 30;
+
+       add_tool(new BC_Title(x0, y0, _("Dst Y:")));
+       dst_y = new ScaleRatioCoord(this, client, x1, y0, 1, &client->config.dst_y);
+       dst_y->create_objects();
+       y0 += 30;
+
+       add_tool(new BC_Title(x0, y0, _("Dst W:")));
+       dst_w = new ScaleRatioCoord(this, client, x1, y0, 0, &client->config.dst_w);
+       dst_w->create_objects();
+       y0 += 30;
+
+       add_tool(new BC_Title(x0, y0, _("Dst H:")));
+       dst_h = new ScaleRatioCoord(this, client, x1, y0, 0, &client->config.dst_h);
+       dst_h->create_objects();
+       y0 += 30;
+
+       show_window();
+       flush();
+}
+
+
+
+ScaleRatioCoord::ScaleRatioCoord(ScaleRatioWin *win, 
+       ScaleRatioMain *client, int x, int y, int s, float *value)
+ : BC_TumbleTextBox(win, (int)*value, (int)-10000*s, (int)10000, x, y, 100)
+{
+       this->client = client;
+       this->win = win;
+       this->value = value;
+}
+
+ScaleRatioCoord::~ScaleRatioCoord()
+{
+}
+
+int ScaleRatioCoord::handle_event()
+{
+       *value = atof(get_text());
+       client->send_configure_change();
+       return 1;
+}
+
+
+ScaleRatioTumbler::ScaleRatioTumbler(ScaleRatioRatio *ratio, int value, int x, int y)
+ : BC_TumbleTextBox(ratio->win, value, 0, 10000, x, y, 45)
+{
+       this->ratio = ratio;
+}
+
+ScaleRatioTumbler::~ScaleRatioTumbler()
+{
+}
+
+int ScaleRatioTumbler::handle_event()
+{
+       ratio->update_ratio();
+       return 1;
+}
+
+ScaleRatioRatio::ScaleRatioRatio(ScaleRatioWin *win, 
+       ScaleRatioMain *client, int x, int y, float *value)
+ : BC_TextBox(x, y, 100, 1, *value)
+{
+       this->client = client;
+       this->win = win;
+       this->value = value;
+       this->ah = 0;
+       this->aw = 0;
+}
+
+ScaleRatioRatio::~ScaleRatioRatio()
+{
+       delete ah;
+       delete aw;
+}
+
+int ScaleRatioRatio::handle_event()
+{
+       *value = atof(get_text());
+       float fah = 0, faw = 0;
+       MWindow::create_aspect_ratio(faw, fah, *value*1000000, 1000000);
+       ah->update((int64_t)fah);
+       aw->update((int64_t)faw);
+       win->update_config();
+       win->update_gui();
+       return 1;
+}
+
+void ScaleRatioRatio::create_objects()
+{
+       int tx = BC_TextBox::get_x();
+       int ty = BC_TextBox::get_y();
+       int x = tx;
+       int y = ty + BC_TextBox::get_h() + 5;
+       float faw = 0, fah = 0;
+       MWindow::create_aspect_ratio(faw, fah, *value*1000000, 1000000);
+       aw = new ScaleRatioTumbler(this, faw, x, y);
+       aw->create_objects();
+       x += aw->get_w() + 5;
+       ah = new ScaleRatioTumbler(this, fah, x, y);
+       ah->create_objects();
+       x += ah->get_w();
+       y += ah->get_h();
+       tw = x - tx;
+       int w = BC_TextBox::get_w();
+       if( tw < w ) tw = w;
+       th = y - ty;
+}
+
+void ScaleRatioRatio::update_ratio()
+{
+       float fah = atof(ah->get_text());
+       float faw = atof(aw->get_text());
+       *value = fah > 0 ? faw / fah : 1.f;
+       win->update_config();
+       win->update_gui();
+}
+
+ScaleRatioTypeItem::ScaleRatioTypeItem(ScaleRatioType *popup, int type, const char *text)
+ : BC_MenuItem(text)
+{
+       this->popup = popup;
+       this->type = type;
+}
+
+ScaleRatioTypeItem::~ScaleRatioTypeItem()
+{
+}
+
+int ScaleRatioTypeItem::handle_event()
+{
+       popup->win->client->config.type = type;
+       popup->set_value(type);
+       return popup->handle_event();
+}
+
+
+ScaleRatioType::ScaleRatioType(ScaleRatioWin *win, int x, int y, int *value)
+ : BC_PopupMenu(x, y, 180, "", 1)
+{
+       this->win = win;
+       this->value = value;
+}
+
+ScaleRatioType::~ScaleRatioType()
+{
+}
+
+void ScaleRatioType::create_objects()
+{
+       for( int i=1; i<Rescale::n_scale_types; ++i )
+               add_item(new ScaleRatioTypeItem(this, i, Rescale::scale_types[i]));
+       set_value(*value);
+}
+
+void ScaleRatioType::update(int v)
+{
+       set_value(*value = v);
+}
+
+int ScaleRatioType::handle_event()
+{
+       win->update_config();
+       win->update_gui();
+       return 1;
+}
+
+int ScaleRatioApply::handle_event()
+{
+       win->update_config();
+       win->update_gui();
+       win->client->send_configure_change();
+       return 1;
+}
+
+void ScaleRatioWin::update_config()
+{
+       ScaleRatioConfig *conf = &client->config;
+       Rescale in(conf->in_w, conf->in_h, conf->in_r);
+       Rescale out(conf->out_w, conf->out_h, conf->out_r);
+       in.rescale(out,conf->type, conf->src_w,conf->src_h, conf->dst_w,conf->dst_h);
+}
+
+void ScaleRatioWin::update_gui()
+{
+       ScaleRatioConfig *conf = &client->config;
+       type_popup->update(conf->type);
+       in_r->update(conf->in_r);
+       out_r->update(conf->out_r);
+       in_w->update(conf->in_w);
+       in_h->update(conf->in_h);
+       src_x->update(conf->src_x);
+       src_y->update(conf->src_y);
+       src_w->update(conf->src_w);
+       src_h->update(conf->src_h);
+       out_w->update(conf->out_w);
+       out_h->update(conf->out_h);
+       dst_x->update(conf->dst_x);
+       dst_y->update(conf->dst_y);
+       dst_w->update(conf->dst_w);
+       dst_h->update(conf->dst_h);
+}
+