r863: Merge 2.1:
[cinelerra_cv/ct.git] / plugins / linearize / linearizewindow.C
blobf04ca03c1987f6f1b92cd16c01a2ad972511cbf5
1 #include "bcdisplayinfo.h"
2 #include "linearizewindow.h"
3 #include "language.h"
9 PLUGIN_THREAD_OBJECT(LinearizeMain, LinearizeThread, LinearizeWindow)
16 LinearizeWindow::LinearizeWindow(LinearizeMain *client, int x, int y)
17  : BC_Window(client->gui_string, x,
18         y,
19         400, 
20         350, 
21         400, 
22         350, 
23         0, 
24         0)
25
26         this->client = client; 
29 int LinearizeWindow::create_objects()
31         int x = 10, y = 10;
32         add_subwindow(histogram = new BC_SubWindow(x, 
33                 y, 
34                 get_w() - x * 2, 
35                 get_h() - 150, 
36                 WHITE));
37         y += histogram->get_h() + 10;
39         BC_Title *title;
40         add_tool(title = new BC_Title(x, y, _("Maximum:")));
41         x += title->get_w() + 10;
42         add_tool(max_slider = new MaxSlider(client, 
43                 this, 
44                 x, 
45                 y, 
46                 190));
47         x += max_slider->get_w() + 10;
48         add_tool(max_text = new MaxText(client,
49                 this,
50                 x,
51                 y,
52                 100));
53         y += max_text->get_h() + 10;
54         x = 10;
55         add_tool(automatic = new LinearizeAuto(client, x, y));
57         y += automatic->get_h() + 10;
58         add_tool(title = new BC_Title(x, y, _("Gamma:")));
59         x += title->get_w() + 10;
60         add_tool(gamma_slider = new GammaSlider(client, 
61                 this, 
62                 x, 
63                 y, 
64                 190));
65         x += gamma_slider->get_w() + 10;
66         add_tool(gamma_text = new GammaText(client,
67                 this,
68                 x,
69                 y,
70                 100));
71         y += gamma_text->get_h() + 10;
72         x = 10;
75         add_tool(new LinearizeColorPicker(client, this, x, y));
77         show_window();
78         flush();
79         return 0;
82 void LinearizeWindow::update()
84         max_slider->update(client->config.max);
85         max_text->update(client->config.max);
86         gamma_slider->update(client->config.gamma);
87         gamma_text->update(client->config.gamma);
88         automatic->update(client->config.automatic);
89         update_histogram();
92 void LinearizeWindow::update_histogram()
94         histogram->clear_box(0, 0, histogram->get_w(), histogram->get_h());
95         if(client->engine)
96         {
97                 int max = 0;
98                 histogram->set_color(MEGREY);
99                 for(int i = 0; i < histogram->get_w(); i++)
100                 {
101                         int x1 = (int64_t)i * HISTOGRAM_SIZE / histogram->get_w();
102                         int x2 = (int64_t)(i + 1) * HISTOGRAM_SIZE / histogram->get_w();
103                         if(x2 == x1) x2++;
104                         int accum = 0;
105                         for(int x = x1; x < x2; x++)
106                         {
107                                 accum += client->engine->accum[x];
108                         }
109                         if(accum > max) max = accum;
110                 }
111                 for(int i = 0; i < histogram->get_w(); i++)
112                 {
113                         int x1 = (int64_t)i * HISTOGRAM_SIZE / histogram->get_w();
114                         int x2 = (int64_t)(i + 1) * HISTOGRAM_SIZE / histogram->get_w();
115                         if(x2 == x1) x2++;
116                         int accum = 0;
117                         for(int x = x1; x < x2; x++)
118                         {
119                                 accum += client->engine->accum[x];
120                         }
122                         int h = (int)(log(accum) / log(max) * histogram->get_h());
123                         histogram->draw_line(i, 
124                                 histogram->get_h(), 
125                                 i, 
126                                 histogram->get_h() - h);
127                 }
128         }
130         histogram->set_color(GREEN);
131         int y1 = histogram->get_h();
132         float scale = 1.0 / client->config.max;
133         float gamma = client->config.gamma - 1.0;
134         float max = client->config.max;
135         for(int i = 1; i < histogram->get_w(); i++)
136         {
137                 float in = (float)i / histogram->get_w();
138                 float out = in * (scale * pow(in * 2 / max, gamma));
139                 int y2 = (int)(histogram->get_h() - out * histogram->get_h());
140                 histogram->draw_line(i - 1, y1, i, y2);
141                 y1 = y2;
142         }
143         histogram->flash();
146 WINDOW_CLOSE_EVENT(LinearizeWindow)
148 MaxSlider::MaxSlider(LinearizeMain *client, 
149         LinearizeWindow *gui, 
150         int x, 
151         int y,
152         int w)
153  : BC_FSlider(x, 
154         y, 
155         0, 
156         w, 
157         w,
158         0.0, 
159         1.0, 
160         client->config.max)
162         this->client = client;
163         this->gui = gui;
164         set_precision(0.01);
167 int MaxSlider::handle_event()
169         client->config.max = get_value();
170         gui->max_text->update(client->config.max);
171         gui->update_histogram();
172         client->send_configure_change();
173         return 1;
176 MaxText::MaxText(LinearizeMain *client,
177         LinearizeWindow *gui,
178         int x,
179         int y,
180         int w)
181  : BC_TextBox(x, y, w, 1, client->config.max)
183         this->client = client;
184         this->gui = gui;
187 int MaxText::handle_event()
189         client->config.max = atof(get_text());
190         gui->max_slider->update(client->config.max);
191         client->send_configure_change();
192         return 1;
195 GammaSlider::GammaSlider(LinearizeMain *client, 
196         LinearizeWindow *gui, 
197         int x, 
198         int y,
199         int w)
200  : BC_FSlider(x, 
201         y, 
202         0, 
203         w, 
204         w,
205         0.0, 
206         1.0, 
207         client->config.gamma)
209         this->client = client;
210         this->gui = gui;
211         set_precision(0.01);
214 int GammaSlider::handle_event()
216         client->config.gamma = get_value();
217         gui->gamma_text->update(client->config.gamma);
218         gui->update_histogram();
219         client->send_configure_change();
220         return 1;
223 GammaText::GammaText(LinearizeMain *client,
224         LinearizeWindow *gui,
225         int x,
226         int y,
227         int w)
228  : BC_TextBox(x, y, w, 1, client->config.gamma)
230         this->client = client;
231         this->gui = gui;
234 int GammaText::handle_event()
236         client->config.gamma = atof(get_text());
237         gui->gamma_slider->update(client->config.gamma);
238         client->send_configure_change();
239         return 1;
242 LinearizeAuto::LinearizeAuto(LinearizeMain *client, int x, int y)
243  : BC_CheckBox(x, 
244         y, 
245         client->config.automatic, 
246         _("Automatic"))
248         this->plugin = client;
251 int LinearizeAuto::handle_event()
253         plugin->config.automatic = get_value();
254         plugin->send_configure_change();
255         return 1;
258 LinearizeColorPicker::LinearizeColorPicker(LinearizeMain *plugin, 
259         LinearizeWindow *gui, 
260         int x, 
261         int y)
262  : BC_GenericButton(x, y, _("Use Color Picker"))
264         this->plugin = plugin;
265         this->gui = gui;
268 int LinearizeColorPicker::handle_event()
270 // Get colorpicker value
271         float red = plugin->get_red();
272         float green = plugin->get_green();
273         float blue = plugin->get_blue();
274 // Get maximum value
275         plugin->config.max = MAX(red, green);
276         plugin->config.max = MAX(plugin->config.max, blue);
277         gui->max_text->update(plugin->config.max);
278         gui->max_slider->update(plugin->config.max);
279         plugin->send_configure_change();
280         return 1;