Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / plugins / gamma / gammawindow.C
diff --git a/cinelerra-5.1/plugins/gamma/gammawindow.C b/cinelerra-5.1/plugins/gamma/gammawindow.C
new file mode 100644 (file)
index 0000000..9fd7496
--- /dev/null
@@ -0,0 +1,317 @@
+
+/*
+ * 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 "gammawindow.h"
+#include "language.h"
+
+
+
+
+
+
+
+
+
+
+GammaWindow::GammaWindow(GammaMain *client)
+ : PluginClientWindow(client,
+       400, 
+       380, 
+       400, 
+       380, 
+       0)
+{ 
+       this->client = client; 
+}
+
+void GammaWindow::create_objects()
+{
+       int x = 10, y = 10;
+       add_subwindow(histogram = new BC_SubWindow(x, 
+               y, 
+               get_w() - x * 2, 
+               get_h() - 180, 
+               WHITE));
+       y += histogram->get_h() + 10;
+
+       BC_Title *title;
+       add_tool(title = new BC_Title(x, y, _("Maximum:")));
+       x += title->get_w() + 10;
+       add_tool(max_slider = new MaxSlider(client, 
+               this, 
+               x, 
+               y, 
+               190));
+       x += max_slider->get_w() + 10;
+       add_tool(max_text = new MaxText(client,
+               this,
+               x,
+               y,
+               100));
+       y += max_text->get_h() + 10;
+       x = 10;
+       add_tool(automatic = new GammaAuto(client, x, y));
+
+       y += automatic->get_h() + 10;
+       add_tool(title = new BC_Title(x, y, _("Gamma:")));
+       x += title->get_w() + 10;
+       add_tool(gamma_slider = new GammaSlider(client, 
+               this, 
+               x, 
+               y, 
+               190));
+       x += gamma_slider->get_w() + 10;
+       add_tool(gamma_text = new GammaText(client,
+               this,
+               x,
+               y,
+               100));
+       y += gamma_text->get_h() + 10;
+       x = 10;
+
+       add_tool(plot = new GammaPlot(client, x, y));
+       y += plot->get_h() + 10;
+
+       add_tool(new GammaColorPicker(client, this, x, y));
+
+       show_window();
+       flush();
+}
+
+void GammaWindow::update()
+{
+       max_slider->update(client->config.max);
+       max_text->update(client->config.max);
+       gamma_slider->update(client->config.gamma);
+       gamma_text->update(client->config.gamma);
+       automatic->update(client->config.automatic);
+       plot->update(client->config.plot);
+       update_histogram();
+}
+
+void GammaWindow::update_histogram()
+{
+       histogram->clear_box(0, 0, histogram->get_w(), histogram->get_h());
+       if(client->engine)
+       {
+               int max = 0;
+               histogram->set_color(MEGREY);
+               for(int i = 0; i < histogram->get_w(); i++)
+               {
+                       int x1 = (int64_t)i * HISTOGRAM_SIZE / histogram->get_w();
+                       int x2 = (int64_t)(i + 1) * HISTOGRAM_SIZE / histogram->get_w();
+                       if(x2 == x1) x2++;
+                       int accum = 0;
+                       for(int x = x1; x < x2; x++)
+                       {
+                               accum += client->engine->accum[x];
+                       }
+                       if(accum > max) max = accum;
+               }
+               for(int i = 0; i < histogram->get_w(); i++)
+               {
+                       int x1 = (int64_t)i * HISTOGRAM_SIZE / histogram->get_w();
+                       int x2 = (int64_t)(i + 1) * HISTOGRAM_SIZE / histogram->get_w();
+                       if(x2 == x1) x2++;
+                       int accum = 0;
+                       for(int x = x1; x < x2; x++)
+                       {
+                               accum += client->engine->accum[x];
+                       }
+
+                       int h = (int)(log(accum) / log(max) * histogram->get_h());
+                       histogram->draw_line(i, 
+                               histogram->get_h(), 
+                               i, 
+                               histogram->get_h() - h);
+               }
+       }
+
+       histogram->set_color(GREEN);
+       int y1 = histogram->get_h();
+       float max = client->config.max * client->config.gamma;
+       float scale = 1.0 / max;
+       float gamma = client->config.gamma - 1.0;
+       for(int i = 1; i < histogram->get_w(); i++)
+       {
+               float in = (float)i / histogram->get_w();
+               float out = in * (scale * pow(in * 2 / max, gamma));
+               int y2 = (int)(histogram->get_h() - out * histogram->get_h());
+               histogram->draw_line(i - 1, y1, i, y2);
+               y1 = y2;
+       }
+       histogram->flash();
+}
+
+
+
+
+MaxSlider::MaxSlider(GammaMain *client, 
+       GammaWindow *gui, 
+       int x, 
+       int y,
+       int w)
+ : BC_FSlider(x, 
+       y, 
+       0, 
+       w, 
+       w,
+       0.0, 
+       1.0, 
+       client->config.max)
+{
+       this->client = client;
+       this->gui = gui;
+       set_precision(0.01);
+}
+
+int MaxSlider::handle_event()
+{
+       client->config.max = get_value();
+       gui->max_text->update(client->config.max);
+       gui->update_histogram();
+       client->send_configure_change();
+       return 1;
+}
+
+MaxText::MaxText(GammaMain *client,
+       GammaWindow *gui,
+       int x,
+       int y,
+       int w)
+ : BC_TextBox(x, y, w, 1, client->config.max)
+{
+       this->client = client;
+       this->gui = gui;
+}
+
+int MaxText::handle_event()
+{
+       client->config.max = atof(get_text());
+       gui->max_slider->update(client->config.max);
+       client->send_configure_change();
+       return 1;
+}
+
+GammaSlider::GammaSlider(GammaMain *client, 
+       GammaWindow *gui, 
+       int x, 
+       int y,
+       int w)
+ : BC_FSlider(x, 
+       y, 
+       0, 
+       w, 
+       w,
+       0.0, 
+       1.0, 
+       client->config.gamma)
+{
+       this->client = client;
+       this->gui = gui;
+       set_precision(0.01);
+}
+
+int GammaSlider::handle_event()
+{
+       client->config.gamma = get_value();
+       gui->gamma_text->update(client->config.gamma);
+       gui->update_histogram();
+       client->send_configure_change();
+       return 1;
+}
+
+GammaText::GammaText(GammaMain *client,
+       GammaWindow *gui,
+       int x,
+       int y,
+       int w)
+ : BC_TextBox(x, y, w, 1, client->config.gamma)
+{
+       this->client = client;
+       this->gui = gui;
+}
+
+int GammaText::handle_event()
+{
+       client->config.gamma = atof(get_text());
+       gui->gamma_slider->update(client->config.gamma);
+       client->send_configure_change();
+       return 1;
+}
+
+GammaAuto::GammaAuto(GammaMain *client, int x, int y)
+ : BC_CheckBox(x, 
+       y, 
+       client->config.automatic, 
+       _("Automatic"))
+{
+       this->plugin = client;
+}
+
+int GammaAuto::handle_event()
+{
+       plugin->config.automatic = get_value();
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+GammaPlot::GammaPlot(GammaMain *plugin, int x, int y)
+ : BC_CheckBox(x, y, plugin->config.plot, _("Plot histogram"))
+{
+       this->plugin = plugin;
+}
+int GammaPlot::handle_event()
+{
+       plugin->config.plot = get_value();
+       plugin->send_configure_change();
+       return 1;
+}
+
+
+GammaColorPicker::GammaColorPicker(GammaMain *plugin, 
+       GammaWindow *gui, 
+       int x, 
+       int y)
+ : BC_GenericButton(x, y, _("Use Color Picker"))
+{
+       this->plugin = plugin;
+       this->gui = gui;
+}
+
+int GammaColorPicker::handle_event()
+{
+// Get colorpicker value
+       float red = plugin->get_red();
+       float green = plugin->get_green();
+       float blue = plugin->get_blue();
+// Get maximum value
+       plugin->config.max = MAX(red, green);
+       plugin->config.max = MAX(plugin->config.max, blue);
+       gui->max_text->update(plugin->config.max);
+       gui->max_slider->update(plugin->config.max);
+       plugin->send_configure_change();
+       return 1;       
+}
+
+