+++ /dev/null
-
-/*
- * 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;
-}
-
-