add BC_SCALE env var for hi def monitors, cleanup theme data
[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         xS(400),
31         yS(380),
32         xS(400),
33         yS(380),
34         0)
35 {
36         this->client = client;
37 }
38
39 void GammaWindow::create_objects()
40 {
41         int xs10 = xS(10), xs100 = xS(100), xs110 = xS(110), xs190 = xS(190);
42         int ys10 = yS(10), ys180 = yS(180);
43         int x = xs10, y = ys10, x1 = x;
44         add_subwindow(histogram = new BC_SubWindow(x,
45                 y,
46                 get_w() - x * 2,
47                 get_h() - ys180,
48                 WHITE));
49         y += histogram->get_h() + ys10;
50
51         BC_Title *title;
52         add_tool(title = new BC_Title(x, y, _("Maximum:")));
53         x += title->get_w() + xs10;
54         x1 = x; // save x to align the two sliders
55         add_tool(max_slider = new MaxSlider(client,
56                 this,
57                 x,
58                 y,
59                 xs190));
60         x += max_slider->get_w() + xs10;
61         add_tool(max_text = new MaxText(client,
62                 this,
63                 x,
64                 y,
65                 xs100));
66         y += max_text->get_h() + ys10;
67         x = xs10;
68         add_tool(automatic = new GammaAuto(client, x, y));
69         y += automatic->get_h() + ys10;
70         add_tool(title = new BC_Title(x, y, _("Gamma:")));
71         x += title->get_w() + xs10;
72         x = x1; // recover x of the "MaxSlider" to align the "GammaSlider"
73         add_tool(gamma_slider = new GammaSlider(client,
74                 this,
75                 x,
76                 y,
77                 xs190));
78         x += gamma_slider->get_w() + xs10;
79         add_tool(gamma_text = new GammaText(client,
80                 this,
81                 x,
82                 y,
83                 xs100));
84         y += gamma_text->get_h() + ys10;
85         x = xs10;
86
87         add_tool(plot = new GammaPlot(client, x, y));
88         y += plot->get_h() + ys10;
89
90         add_tool(new GammaColorPicker(client, this, x, y));
91
92         add_tool(reset = new GammaReset(client, this, get_w()-xs110, y));
93
94         show_window();
95         flush();
96 }
97
98 void GammaWindow::update()
99 {
100         max_slider->update(client->config.max);
101         max_text->update(client->config.max);
102         gamma_slider->update(client->config.gamma);
103         gamma_text->update(client->config.gamma);
104         automatic->update(client->config.automatic);
105         plot->update(client->config.plot);
106         update_histogram();
107 }
108
109 void GammaWindow::update_histogram()
110 {
111         histogram->clear_box(0, 0, histogram->get_w(), histogram->get_h());
112         if(client->engine)
113         {
114                 int max = 0;
115                 histogram->set_color(MEGREY);
116                 for(int i = 0; i < histogram->get_w(); i++)
117                 {
118                         int x1 = (int64_t)i * HISTOGRAM_SIZE / histogram->get_w();
119                         int x2 = (int64_t)(i + 1) * HISTOGRAM_SIZE / histogram->get_w();
120                         if(x2 == x1) x2++;
121                         int accum = 0;
122                         for(int x = x1; x < x2; x++)
123                         {
124                                 accum += client->engine->accum[x];
125                         }
126                         if(accum > max) max = accum;
127                 }
128                 for(int i = 0; i < histogram->get_w(); i++)
129                 {
130                         int x1 = (int64_t)i * HISTOGRAM_SIZE / histogram->get_w();
131                         int x2 = (int64_t)(i + 1) * HISTOGRAM_SIZE / histogram->get_w();
132                         if(x2 == x1) x2++;
133                         int accum = 0;
134                         for(int x = x1; x < x2; x++)
135                         {
136                                 accum += client->engine->accum[x];
137                         }
138
139                         int h = (int)(log(accum) / log(max) * histogram->get_h());
140                         histogram->draw_line(i,
141                                 histogram->get_h(),
142                                 i,
143                                 histogram->get_h() - h);
144                 }
145         }
146
147         histogram->set_color(GREEN);
148         int y1 = histogram->get_h();
149         float max = client->config.max * client->config.gamma;
150         float scale = 1.0 / max;
151         float gamma = client->config.gamma - 1.0;
152         for(int i = 1; i < histogram->get_w(); i++)
153         {
154                 float in = (float)i / histogram->get_w();
155                 float out = in * (scale * pow(in * 2 / max, gamma));
156                 int y2 = (int)(histogram->get_h() - out * histogram->get_h());
157                 histogram->draw_line(i - 1, y1, i, y2);
158                 y1 = y2;
159         }
160         histogram->flash();
161 }
162
163
164
165
166 MaxSlider::MaxSlider(GammaMain *client,
167         GammaWindow *gui,
168         int x,
169         int y,
170         int w)
171  : BC_FSlider(x,
172         y,
173         0,
174         w,
175         w,
176         0.0,
177         1.0,
178         client->config.max)
179 {
180         this->client = client;
181         this->gui = gui;
182         set_precision(0.01);
183 }
184
185 int MaxSlider::handle_event()
186 {
187         client->config.max = get_value();
188         gui->max_text->update(client->config.max);
189         gui->update_histogram();
190         client->send_configure_change();
191         return 1;
192 }
193
194 MaxText::MaxText(GammaMain *client,
195         GammaWindow *gui,
196         int x,
197         int y,
198         int w)
199  : BC_TextBox(x, y, w, 1, client->config.max)
200 {
201         this->client = client;
202         this->gui = gui;
203 }
204
205 int MaxText::handle_event()
206 {
207         client->config.max = atof(get_text());
208         gui->max_slider->update(client->config.max);
209         client->send_configure_change();
210         return 1;
211 }
212
213 GammaSlider::GammaSlider(GammaMain *client,
214         GammaWindow *gui,
215         int x,
216         int y,
217         int w)
218  : BC_FSlider(x,
219         y,
220         0,
221         w,
222         w,
223         0.0,
224         1.0,
225         client->config.gamma)
226 {
227         this->client = client;
228         this->gui = gui;
229         set_precision(0.01);
230 }
231
232 int GammaSlider::handle_event()
233 {
234         client->config.gamma = get_value();
235         gui->gamma_text->update(client->config.gamma);
236         gui->update_histogram();
237         client->send_configure_change();
238         return 1;
239 }
240
241 GammaText::GammaText(GammaMain *client,
242         GammaWindow *gui,
243         int x,
244         int y,
245         int w)
246  : BC_TextBox(x, y, w, 1, client->config.gamma)
247 {
248         this->client = client;
249         this->gui = gui;
250 }
251
252 int GammaText::handle_event()
253 {
254         client->config.gamma = atof(get_text());
255         gui->gamma_slider->update(client->config.gamma);
256         client->send_configure_change();
257         return 1;
258 }
259
260 GammaAuto::GammaAuto(GammaMain *client, int x, int y)
261  : BC_CheckBox(x,
262         y,
263         client->config.automatic,
264         _("Automatic"))
265 {
266         this->plugin = client;
267 }
268
269 int GammaAuto::handle_event()
270 {
271         plugin->config.automatic = get_value();
272         plugin->send_configure_change();
273         return 1;
274 }
275
276
277 GammaPlot::GammaPlot(GammaMain *plugin, int x, int y)
278  : BC_CheckBox(x, y, plugin->config.plot, _("Plot histogram"))
279 {
280         this->plugin = plugin;
281 }
282 int GammaPlot::handle_event()
283 {
284         plugin->config.plot = get_value();
285         plugin->send_configure_change();
286         return 1;
287 }
288
289
290 GammaColorPicker::GammaColorPicker(GammaMain *plugin,
291         GammaWindow *gui,
292         int x,
293         int y)
294  : BC_GenericButton(x, y, _("Use Color Picker"))
295 {
296         this->plugin = plugin;
297         this->gui = gui;
298 }
299
300 int GammaColorPicker::handle_event()
301 {
302 // Get colorpicker value
303         float red = plugin->get_red();
304         float green = plugin->get_green();
305         float blue = plugin->get_blue();
306 // Get maximum value
307         plugin->config.max = MAX(red, green);
308         plugin->config.max = MAX(plugin->config.max, blue);
309         gui->max_text->update(plugin->config.max);
310         gui->max_slider->update(plugin->config.max);
311         plugin->send_configure_change();
312         return 1;
313 }
314
315
316 GammaReset::GammaReset(GammaMain *plugin, GammaWindow *gui, int x, int y)
317  : BC_GenericButton(x, y, _("Reset"))
318 {
319         this->plugin = plugin;
320         this->gui = gui;
321 }
322
323 int GammaReset::handle_event()
324 {
325         plugin->config.reset();
326         gui->update();
327         plugin->send_configure_change();
328         return 1;
329 }
330