igor b reset btns, reframert bug fix
[goodguy/cinelerra.git] / cinelerra-5.1 / plugins / gamma / gammawindow.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #include "bcdisplayinfo.h"
23 #include "gammawindow.h"
24 #include "language.h"
25
26
27
28 GammaWindow::GammaWindow(GammaMain *client)
29  : PluginClientWindow(client,
30         400,
31         380,
32         400,
33         380,
34         0)
35 {
36         this->client = client;
37 }
38
39 void GammaWindow::create_objects()
40 {
41         int x = 10, y = 10, x1 = x;
42         add_subwindow(histogram = new BC_SubWindow(x,
43                 y,
44                 get_w() - x * 2,
45                 get_h() - 180,
46                 WHITE));
47         y += histogram->get_h() + 10;
48
49         BC_Title *title;
50         add_tool(title = new BC_Title(x, y, _("Maximum:")));
51         x += title->get_w() + 10;
52         x1 = x; // save x to align the two sliders
53         add_tool(max_slider = new MaxSlider(client,
54                 this,
55                 x,
56                 y,
57                 190));
58         x += max_slider->get_w() + 10;
59         add_tool(max_text = new MaxText(client,
60                 this,
61                 x,
62                 y,
63                 100));
64         y += max_text->get_h() + 10;
65         x = 10;
66         add_tool(automatic = new GammaAuto(client, x, y));
67         y += automatic->get_h() + 10;
68         add_tool(title = new BC_Title(x, y, _("Gamma:")));
69         x += title->get_w() + 10;
70         x = x1; // recover x of the "MaxSlider" to align the "GammaSlider"
71         add_tool(gamma_slider = new GammaSlider(client,
72                 this,
73                 x,
74                 y,
75                 190));
76         x += gamma_slider->get_w() + 10;
77         add_tool(gamma_text = new GammaText(client,
78                 this,
79                 x,
80                 y,
81                 100));
82         y += gamma_text->get_h() + 10;
83         x = 10;
84
85         add_tool(plot = new GammaPlot(client, x, y));
86         y += plot->get_h() + 10;
87
88         add_tool(new GammaColorPicker(client, this, x, y));
89
90         add_tool(reset = new GammaReset(client, this, get_w()-110, y));
91
92         show_window();
93         flush();
94 }
95
96 void GammaWindow::update()
97 {
98         max_slider->update(client->config.max);
99         max_text->update(client->config.max);
100         gamma_slider->update(client->config.gamma);
101         gamma_text->update(client->config.gamma);
102         automatic->update(client->config.automatic);
103         plot->update(client->config.plot);
104         update_histogram();
105 }
106
107 void GammaWindow::update_histogram()
108 {
109         histogram->clear_box(0, 0, histogram->get_w(), histogram->get_h());
110         if(client->engine)
111         {
112                 int max = 0;
113                 histogram->set_color(MEGREY);
114                 for(int i = 0; i < histogram->get_w(); i++)
115                 {
116                         int x1 = (int64_t)i * HISTOGRAM_SIZE / histogram->get_w();
117                         int x2 = (int64_t)(i + 1) * HISTOGRAM_SIZE / histogram->get_w();
118                         if(x2 == x1) x2++;
119                         int accum = 0;
120                         for(int x = x1; x < x2; x++)
121                         {
122                                 accum += client->engine->accum[x];
123                         }
124                         if(accum > max) max = accum;
125                 }
126                 for(int i = 0; i < histogram->get_w(); i++)
127                 {
128                         int x1 = (int64_t)i * HISTOGRAM_SIZE / histogram->get_w();
129                         int x2 = (int64_t)(i + 1) * HISTOGRAM_SIZE / histogram->get_w();
130                         if(x2 == x1) x2++;
131                         int accum = 0;
132                         for(int x = x1; x < x2; x++)
133                         {
134                                 accum += client->engine->accum[x];
135                         }
136
137                         int h = (int)(log(accum) / log(max) * histogram->get_h());
138                         histogram->draw_line(i,
139                                 histogram->get_h(),
140                                 i,
141                                 histogram->get_h() - h);
142                 }
143         }
144
145         histogram->set_color(GREEN);
146         int y1 = histogram->get_h();
147         float max = client->config.max * client->config.gamma;
148         float scale = 1.0 / max;
149         float gamma = client->config.gamma - 1.0;
150         for(int i = 1; i < histogram->get_w(); i++)
151         {
152                 float in = (float)i / histogram->get_w();
153                 float out = in * (scale * pow(in * 2 / max, gamma));
154                 int y2 = (int)(histogram->get_h() - out * histogram->get_h());
155                 histogram->draw_line(i - 1, y1, i, y2);
156                 y1 = y2;
157         }
158         histogram->flash();
159 }
160
161
162
163
164 MaxSlider::MaxSlider(GammaMain *client,
165         GammaWindow *gui,
166         int x,
167         int y,
168         int w)
169  : BC_FSlider(x,
170         y,
171         0,
172         w,
173         w,
174         0.0,
175         1.0,
176         client->config.max)
177 {
178         this->client = client;
179         this->gui = gui;
180         set_precision(0.01);
181 }
182
183 int MaxSlider::handle_event()
184 {
185         client->config.max = get_value();
186         gui->max_text->update(client->config.max);
187         gui->update_histogram();
188         client->send_configure_change();
189         return 1;
190 }
191
192 MaxText::MaxText(GammaMain *client,
193         GammaWindow *gui,
194         int x,
195         int y,
196         int w)
197  : BC_TextBox(x, y, w, 1, client->config.max)
198 {
199         this->client = client;
200         this->gui = gui;
201 }
202
203 int MaxText::handle_event()
204 {
205         client->config.max = atof(get_text());
206         gui->max_slider->update(client->config.max);
207         client->send_configure_change();
208         return 1;
209 }
210
211 GammaSlider::GammaSlider(GammaMain *client,
212         GammaWindow *gui,
213         int x,
214         int y,
215         int w)
216  : BC_FSlider(x,
217         y,
218         0,
219         w,
220         w,
221         0.0,
222         1.0,
223         client->config.gamma)
224 {
225         this->client = client;
226         this->gui = gui;
227         set_precision(0.01);
228 }
229
230 int GammaSlider::handle_event()
231 {
232         client->config.gamma = get_value();
233         gui->gamma_text->update(client->config.gamma);
234         gui->update_histogram();
235         client->send_configure_change();
236         return 1;
237 }
238
239 GammaText::GammaText(GammaMain *client,
240         GammaWindow *gui,
241         int x,
242         int y,
243         int w)
244  : BC_TextBox(x, y, w, 1, client->config.gamma)
245 {
246         this->client = client;
247         this->gui = gui;
248 }
249
250 int GammaText::handle_event()
251 {
252         client->config.gamma = atof(get_text());
253         gui->gamma_slider->update(client->config.gamma);
254         client->send_configure_change();
255         return 1;
256 }
257
258 GammaAuto::GammaAuto(GammaMain *client, int x, int y)
259  : BC_CheckBox(x,
260         y,
261         client->config.automatic,
262         _("Automatic"))
263 {
264         this->plugin = client;
265 }
266
267 int GammaAuto::handle_event()
268 {
269         plugin->config.automatic = get_value();
270         plugin->send_configure_change();
271         return 1;
272 }
273
274
275 GammaPlot::GammaPlot(GammaMain *plugin, int x, int y)
276  : BC_CheckBox(x, y, plugin->config.plot, _("Plot histogram"))
277 {
278         this->plugin = plugin;
279 }
280 int GammaPlot::handle_event()
281 {
282         plugin->config.plot = get_value();
283         plugin->send_configure_change();
284         return 1;
285 }
286
287
288 GammaColorPicker::GammaColorPicker(GammaMain *plugin,
289         GammaWindow *gui,
290         int x,
291         int y)
292  : BC_GenericButton(x, y, _("Use Color Picker"))
293 {
294         this->plugin = plugin;
295         this->gui = gui;
296 }
297
298 int GammaColorPicker::handle_event()
299 {
300 // Get colorpicker value
301         float red = plugin->get_red();
302         float green = plugin->get_green();
303         float blue = plugin->get_blue();
304 // Get maximum value
305         plugin->config.max = MAX(red, green);
306         plugin->config.max = MAX(plugin->config.max, blue);
307         gui->max_text->update(plugin->config.max);
308         gui->max_slider->update(plugin->config.max);
309         plugin->send_configure_change();
310         return 1;
311 }
312
313
314 GammaReset::GammaReset(GammaMain *plugin, GammaWindow *gui, int x, int y)
315  : BC_GenericButton(x, y, _("Reset"))
316 {
317         this->plugin = plugin;
318         this->gui = gui;
319 }
320
321 int GammaReset::handle_event()
322 {
323         plugin->config.reset();
324         gui->update();
325         plugin->send_configure_change();
326         return 1;
327 }
328