X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fhistogram%2Fhistogramwindow.C;h=49e9a91a1314a960079c0dc7c376be1c028cfb66;hb=HEAD;hp=3a2e6cf2ea38877c4c71afedf5b38a613e41c8fc;hpb=0df48ad2d876409c5beeae2e21933a728ea76c33;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/plugins/histogram/histogramwindow.C b/cinelerra-5.1/plugins/histogram/histogramwindow.C index 3a2e6cf2..b36c7b0b 100644 --- a/cinelerra-5.1/plugins/histogram/histogramwindow.C +++ b/cinelerra-5.1/plugins/histogram/histogramwindow.C @@ -22,11 +22,15 @@ #include "bcdisplayinfo.h" #include "bcsignals.h" #include "cursors.h" +#include "edl.h" #include "histogram.h" #include "histogramconfig.h" #include "histogramwindow.h" #include "keys.h" #include "language.h" +#include "localsession.h" +#include "mwindow.h" +#include "pluginserver.h" #include "theme.h" #include @@ -56,63 +60,34 @@ void HistogramWindow::create_objects() int margin = plugin->get_theme()->widget_border; int x = margin, y = margin, x1 = margin; - add_subwindow(mode_v = new HistogramMode(plugin, - x, - y, - HISTOGRAM_VALUE, - _("Value"))); + add_subwindow(mode_v = new HistogramMode(plugin, x, y, + HISTOGRAM_VALUE, _("Value"))); x += mode_v->get_w() + margin; - add_subwindow(mode_r = new HistogramMode(plugin, - x, - y, - HISTOGRAM_RED, - _("Red"))); + add_subwindow(mode_r = new HistogramMode(plugin, x, y, + HISTOGRAM_RED, _("Red"))); x += mode_r->get_w() + margin; - add_subwindow(mode_g = new HistogramMode(plugin, - x, - y, - HISTOGRAM_GREEN, - _("Green"))); + add_subwindow(mode_g = new HistogramMode(plugin, x, y, + HISTOGRAM_GREEN, _("Green"))); x += mode_g->get_w() + margin; - add_subwindow(mode_b = new HistogramMode(plugin, - x, - y, - HISTOGRAM_BLUE, - _("Blue"))); - - + add_subwindow(mode_b = new HistogramMode(plugin, x, y, + HISTOGRAM_BLUE, _("Blue"))); x = get_w() - margin - plugin->get_theme()->get_image_set("histogram_rgb_toggle")[0]->get_w(); - add_subwindow(parade_on = new HistogramParade(plugin, - this, - x, - y, - 1)); + add_subwindow(parade_on = new HistogramParade(plugin, this, + x, y, 1)); x -= parade_on->get_w() + margin; - add_subwindow(parade_off = new HistogramParade(plugin, - this, - x, - y, - 0)); - + add_subwindow(parade_off = new HistogramParade(plugin, this, x, y, 0)); x = x1; y += parade_on->get_h() + margin; - add_subwindow(canvas_title1 = new BC_Title(margin, - y, - "-10%")); - add_subwindow(canvas_title2 = new BC_Title(get_w() - get_text_width(MEDIUMFONT, "110%") - margin, - y, - "110%")); + add_subwindow(canvas_title1 = new BC_Title(margin, y, "-10%")); + x = get_w() - get_text_width(MEDIUMFONT, "110%") - margin; + add_subwindow(canvas_title2 = new BC_Title(x, y, "110%")); y += canvas_title2->get_h() + margin; x = x1; canvas_h = get_h() - y - yS(210); - - add_subwindow(low_input_carrot = new HistogramCarrot(plugin, - this, - x, - y + canvas_h)); + add_subwindow(low_input_carrot = new HistogramCarrot(plugin, this, x, y + canvas_h)); x = low_input_carrot->get_w() / 2 + x; canvas_w = get_w() - x - x; @@ -122,48 +97,27 @@ void HistogramWindow::create_objects() title3_x = x + (int)(canvas_w * (1.0 - HIST_MIN_INPUT) / FLOAT_RANGE); title4_x = x + (int)(canvas_w); - - - - - add_subwindow(canvas = new HistogramCanvas(plugin, - this, - x, - y, - canvas_w, - canvas_h)); + add_subwindow(canvas = new HistogramCanvas(plugin, this, + x, y, canvas_w, canvas_h)); // Canvas border - draw_3d_border(x - 2, - y - 2, - canvas_w + 4, - canvas_h + 4, - get_bg_color(), - BLACK, - MDGREY, - get_bg_color()); + draw_3d_border(x - 2, y - 2, canvas_w + 4, canvas_h + 4, + get_bg_color(), BLACK, MDGREY, get_bg_color()); // Calculate output curve with no value function - plugin->tabulate_curve(plugin->mode, 0); + plugin->tabulate_curve(plugin->preview_lookup, plugin->mode, 0x10000, 0); y += canvas->get_h(); x = margin; - add_subwindow(gamma_carrot = new HistogramCarrot(plugin, - this, - canvas->get_x() + - canvas->get_w() / 2 - - low_input_carrot->get_w() / 2 , - y)); - - add_subwindow(high_input_carrot = new HistogramCarrot(plugin, - this, - canvas->get_x() + - canvas->get_w() - - low_input_carrot->get_w() / 2, - y)); - y += low_input_carrot->get_h() + margin; + add_subwindow(gamma_carrot = new HistogramCarrot(plugin, this, + canvas->get_x() + canvas->get_w() / 2 - + low_input_carrot->get_w() / 2 , y)); + add_subwindow(high_input_carrot = new HistogramCarrot(plugin, this, + canvas->get_x() + canvas->get_w() - + low_input_carrot->get_w() / 2, y)); + y += low_input_carrot->get_h() + margin; // add_subwindow(title = new BC_Title(x, y, _("Input:"))); // x += title->get_w() + margin; @@ -199,10 +153,20 @@ void HistogramWindow::create_objects() low_output_carrot->get_w() / 2, y)); y += high_output_carrot->get_h() + margin; + // add_subwindow(title = new BC_Title(x, y, _("Output:"))); // x += title->get_w() + margin; low_output = new HistogramText(plugin, this, x, y); low_output->create_objects(); + + const char *linear_text = _("Linear"); + int xs = get_w()/2 - xS(50); + x = xs - BC_Title::calculate_w(this, linear_text) - margin; + add_subwindow(log_title1 = new BC_Title(x, y, linear_text)); + add_subwindow(log_slider = new HistogramLogSlider(plugin, this, xs, y)); + xs += log_slider->get_w() + margin; + add_subwindow(log_title2 = new BC_Title(xs, y, _("Log"))); + high_output = new HistogramText(plugin, this, get_w() - low_output->get_w() - margin, y); high_output->create_objects(); @@ -214,24 +178,21 @@ void HistogramWindow::create_objects() y += bar->get_h() + margin; add_subwindow(automatic = new HistogramAuto(plugin, x, y)); - - //int y1 = y; - x = xS(200); - add_subwindow(threshold_title = new BC_Title(x, y, _("Threshold:"))); - x += threshold_title->get_w() + margin; - threshold = new HistogramText(plugin, this, x, y); + int x2 = xS(190); + add_subwindow(threshold_title = new BC_Title(x2, y, _("Threshold:"))); + int x3 = xS(305); + threshold = new HistogramText(plugin, this, x3, y); threshold->create_objects(); + y += automatic->get_h() + margin; - x = get_w() / 2; - add_subwindow(reset = new HistogramReset(plugin, - x, y + threshold->get_h() + margin)); + add_subwindow(plot= new HistogramPlot(plugin, x, y)); + add_subwindow(sum_frames = new HistogramSumFrames(plugin, x2, y)); + y += plot->get_h() + margin; x = x1; - y += automatic->get_h() + margin; - add_subwindow(plot = new HistogramPlot(plugin, x, y)); - - y += plot->get_h() + yS(5); add_subwindow(split = new HistogramSplit(plugin, x, y)); + x = xS(340); + add_subwindow(reset = new HistogramReset(plugin, x, y + yS(5))); update(1, 1, 1, 1); @@ -256,20 +217,13 @@ int HistogramWindow::resize_event(int w, int h) // Canvas follows window size canvas_w = canvas_w + xdiff; canvas_h = canvas_h + ydiff; - canvas->reposition_window(canvas->get_x(), - canvas->get_y(), - canvas_w, - canvas_h); + canvas->reposition_window(canvas->get_x(), canvas->get_y(), + canvas_w, canvas_h); // Canvas border - draw_3d_border(canvas->get_x() - 2, - canvas->get_y() - 2, - canvas_w + 4, - canvas_h + 4, - get_bg_color(), - BLACK, - MDGREY, - get_bg_color()); + draw_3d_border(canvas->get_x() - 2, canvas->get_y() - 2, + canvas_w + 4, canvas_h + 4, + get_bg_color(), BLACK, MDGREY, get_bg_color()); low_input_carrot->reposition_window(low_input_carrot->get_x(), low_input_carrot->get_y() + ydiff); @@ -292,14 +246,9 @@ int HistogramWindow::resize_event(int w, int h) output->update(); // Output border - draw_3d_border(output->get_x() - 2, - output->get_y() - 2, - output->get_w() + 4, - output->get_h() + 4, - get_bg_color(), - BLACK, - MDGREY, - get_bg_color()); + draw_3d_border(output->get_x() - 2, output->get_y() - 2, + output->get_w() + 4, output->get_h() + 4, + get_bg_color(), BLACK, MDGREY, get_bg_color()); low_output_carrot->reposition_window(low_output_carrot->get_x(), low_output_carrot->get_y() + ydiff); @@ -308,6 +257,14 @@ int HistogramWindow::resize_event(int w, int h) low_output->reposition_window(low_output->get_x(), low_output->get_y() + ydiff); + int xs = (w - log_slider->get_w()) / 2; + int margin = plugin->get_theme()->widget_border; + log_title1->reposition_window(xs - log_title1->get_w() - margin, + log_title1->get_y() + ydiff); + log_slider->reposition_window(xs, + log_slider->get_y() + ydiff); + log_title2->reposition_window(xs + log_slider->get_w() + margin, + log_title2->get_y() + ydiff); high_output->reposition_window(high_output->get_x() + xdiff, high_output->get_y() + ydiff); @@ -321,13 +278,15 @@ int HistogramWindow::resize_event(int w, int h) threshold_title->get_y() + ydiff); threshold->reposition_window(threshold->get_x(), threshold->get_y() + ydiff); - reset->reposition_window(reset->get_x(), - reset->get_y() + ydiff); - plot->reposition_window(plot->get_x(), plot->get_y() + ydiff); + sum_frames->reposition_window(sum_frames->get_x(), + sum_frames->get_y() + ydiff); + split->reposition_window(split->get_x(), split->get_y() + ydiff); + reset->reposition_window(reset->get_x(), + reset->get_y() + ydiff); update(1, 1, 1, 1); @@ -371,35 +330,34 @@ int HistogramWindow::keypress_event() } } + if (! result) + result = context_help_check_and_show(); + return result; } -void HistogramWindow::update(int do_canvases, - int do_carrots, - int do_text, - int do_toggles) +void HistogramWindow::update(int do_canvases, int do_carrots, int do_text, int do_toggles) { - if(do_toggles) - { + if(do_toggles) { automatic->update(plugin->config.automatic); mode_v->update(plugin->mode == HISTOGRAM_VALUE ? 1 : 0); mode_r->update(plugin->mode == HISTOGRAM_RED ? 1 : 0); mode_g->update(plugin->mode == HISTOGRAM_GREEN ? 1 : 0); mode_b->update(plugin->mode == HISTOGRAM_BLUE ? 1 : 0); plot->update(plugin->config.plot); + sum_frames->update(plugin->config.sum_frames); split->update(plugin->config.split); parade_on->update(plugin->parade ? 1 : 0); parade_off->update(plugin->parade ? 0 : 1); + log_slider->update(plugin->config.log_slider); output->update(); } - if(do_canvases) - { + if(do_canvases) { update_canvas(); } - if(do_carrots) - { + if(do_carrots) { low_input_carrot->update(); high_input_carrot->update(); gamma_carrot->update(); @@ -407,8 +365,7 @@ void HistogramWindow::update(int do_canvases, high_output_carrot->update(); } - if(do_text) - { + if(do_text) { low_input->update(); gamma->update(); high_input->update(); @@ -416,50 +373,48 @@ void HistogramWindow::update(int do_canvases, high_output->update(); threshold->update(); } - - } void HistogramWindow::draw_canvas_mode(int mode, int color, int y, int h) { - int *accum = plugin->accum[mode]; - int accum_per_canvas_i = HISTOGRAM_SLOTS / canvas_w + 1; - float accum_per_canvas_f = (float)HISTOGRAM_SLOTS / canvas_w; - int normalize = 0; - int max = 0; - - // Draw histogram - for(int i = 0; i < HISTOGRAM_SLOTS; i++) - { - if(accum && accum[i] > normalize) normalize = accum[i]; - } - - - if(normalize) - { - for(int i = 0; i < canvas_w; i++) - { - int accum_start = (int)(accum_per_canvas_f * i); - int accum_end = accum_start + accum_per_canvas_i; - max = 0; - for(int j = accum_start; j < accum_end; j++) - { - max = MAX(accum[j], max); + int64_t max = 0; + int64_t *accum = plugin->accum[mode]; + for( int k0=0,x=0; x 0 ) { + double log_slider = plugin->config.log_slider; + double lin_slider = 1. - log_slider; + double lin_max = (lin_slider * h) / max; + double log_max = (log_slider * h) / log(max); + for( int k0=0,x=0; x 0 ? (double)m : 0; + m = vv > 0 ? vv*lin_max + log(vv)*log_max : 0; canvas->set_color(BLACK); - canvas->draw_line(i, y, i, y + h - max); + int y0 = y1 - m; + canvas->draw_line(x, y, x, y0); canvas->set_color(color); - canvas->draw_line(i, y + h - max, i, y + h); + canvas->draw_line(x, y0, x, y1); + k0 = k1; } } - else - { + else { canvas->set_color(BLACK); canvas->draw_box(0, y, canvas_w, h); } @@ -470,26 +425,16 @@ void HistogramWindow::draw_canvas_mode(int mode, int color, int y, int h) int y1 = 0; // Draw output line - for(int i = 0; i < canvas_w; i++) - { - float input = (float)i / - canvas_w * - FLOAT_RANGE + - HIST_MIN_INPUT; - float output = plugin->calculate_level(input, - mode, - 0); - + for( int x=0; xcalculate_level(input, mode, 0); int y2 = h - (int)(output * h); - if(i > 0) - { - canvas->draw_line(i - 1, y + y1, i, y + y2); - } + if( x > 0 ) + canvas->draw_line(x-1, y+y1, x, y+y2); y1 = y2; } canvas->set_line_width(1); - } @@ -510,28 +455,16 @@ void HistogramWindow::update_canvas() // Draw 0 and 100% lines. canvas->set_color(RED); int x = (int)(canvas_w * -HIST_MIN_INPUT / FLOAT_RANGE); - canvas->draw_line(x, - 0, - x, - canvas_h); + canvas->draw_line(x, 0, x, canvas_h); x = (int)(canvas_w * (1.0 - HIST_MIN_INPUT) / FLOAT_RANGE); - canvas->draw_line(x, - 0, - x, - canvas_h); + canvas->draw_line(x, 0, x, canvas_h); canvas->flash(); } - - -HistogramParade::HistogramParade(HistogramMain *plugin, - HistogramWindow *gui, - int x, - int y, - int value) - : BC_Toggle(x, - y, +HistogramParade::HistogramParade(HistogramMain *plugin, HistogramWindow *gui, + int x, int y, int value) + : BC_Toggle(x, y, value ? plugin->get_theme()->get_image_set("histogram_rgb_toggle") : plugin->get_theme()->get_image_set("histogram_toggle"), 0) @@ -549,30 +482,13 @@ int HistogramParade::handle_event() { update(1); plugin->parade = value; - gui->update(1, - 0, - 0, - 1); + gui->update(1, 0, 0, 1); return 1; } - - - - - - -HistogramCanvas::HistogramCanvas(HistogramMain *plugin, - HistogramWindow *gui, - int x, - int y, - int w, - int h) - : BC_SubWindow(x, - y, - w, - h, - BLACK) +HistogramCanvas::HistogramCanvas(HistogramMain *plugin, HistogramWindow *gui, + int x, int y, int w, int h) + : BC_SubWindow(x, y, w, h, BLACK) { this->plugin = plugin; this->gui = gui; @@ -606,21 +522,7 @@ int HistogramCanvas::button_release_event() } - - - - - - - - - - - - -HistogramReset::HistogramReset(HistogramMain *plugin, - int x, - int y) +HistogramReset::HistogramReset(HistogramMain *plugin, int x, int y) : BC_GenericButton(x, y, _("Reset")) { this->plugin = plugin; @@ -634,19 +536,24 @@ int HistogramReset::handle_event() } +HistogramLogSlider::HistogramLogSlider(HistogramMain *plugin, HistogramWindow *gui, + int x, int y) +: BC_FSlider(x, y, 0, xS(100), xS(100), 0., 1., plugin->config.log_slider) +{ + this->plugin = plugin; + this->gui = gui; +} +int HistogramLogSlider::handle_event() +{ + plugin->config.log_slider = get_value(); + plugin->send_configure_change(); + return 1; +} - - -HistogramCarrot::HistogramCarrot(HistogramMain *plugin, - HistogramWindow *gui, - int x, - int y) - : BC_Toggle(x, - y, - plugin->get_theme()->get_image_set("histogram_carrot"), - 0) +HistogramCarrot::HistogramCarrot(HistogramMain *plugin, HistogramWindow *gui, int x, int y) + : BC_Toggle(x, y, plugin->get_theme()->get_image_set("histogram_carrot"), 0) { this->plugin = plugin; this->gui = gui; @@ -659,30 +566,16 @@ HistogramCarrot::~HistogramCarrot() float* HistogramCarrot::get_value() { - if(this == gui->low_input_carrot) - { + if( this == gui->low_input_carrot ) return &plugin->config.low_input[plugin->mode]; - } - else - if(this == gui->high_input_carrot) - { + if( this == gui->high_input_carrot ) return &plugin->config.high_input[plugin->mode]; - } - else - if(this == gui->gamma_carrot) - { + if( this == gui->gamma_carrot ) return &plugin->config.gamma[plugin->mode]; - } - else - if(this == gui->low_output_carrot) - { + if( this == gui->low_output_carrot ) return &plugin->config.low_output[plugin->mode]; - } - else - if(this == gui->high_output_carrot) - { + if( this == gui->high_output_carrot ) return &plugin->config.high_output[plugin->mode]; - } return 0; } @@ -810,18 +703,8 @@ int HistogramCarrot::cursor_motion_event() - - - - - -HistogramSlider::HistogramSlider(HistogramMain *plugin, - HistogramWindow *gui, - int x, - int y, - int w, - int h, - int is_input) +HistogramSlider::HistogramSlider(HistogramMain *plugin, HistogramWindow *gui, + int x, int y, int w, int h, int is_input) : BC_SubWindow(x, y, w, h) { this->plugin = plugin; @@ -848,44 +731,30 @@ void HistogramSlider::update() clear_box(0, 0, w, h); - switch(mode) - { - case HISTOGRAM_RED: - g = b = 0x00; - break; - case HISTOGRAM_GREEN: - r = b = 0x00; - break; - case HISTOGRAM_BLUE: - r = g = 0x00; - break; + switch(mode) { + case HISTOGRAM_RED: + g = b = 0x00; + break; + case HISTOGRAM_GREEN: + r = b = 0x00; + break; + case HISTOGRAM_BLUE: + r = g = 0x00; + break; } - for(int i = 0; i < w; i++) - { + for( int i = 0; i < w; i++ ) { int color = (int)(i * 0xff / w); set_color(((r * color / 0xff) << 16) | ((g * color / 0xff) << 8) | (b * color / 0xff)); - draw_line(i, 0, i, h); } - - flash(); } - - - - - - - -HistogramAuto::HistogramAuto(HistogramMain *plugin, - int x, - int y) +HistogramAuto::HistogramAuto(HistogramMain *plugin, int x, int y) : BC_CheckBox(x, y, plugin->config.automatic, _("Automatic")) { this->plugin = plugin; @@ -899,11 +768,7 @@ int HistogramAuto::handle_event() } - - -HistogramPlot::HistogramPlot(HistogramMain *plugin, - int x, - int y) +HistogramPlot::HistogramPlot(HistogramMain *plugin, int x, int y) : BC_CheckBox(x, y, plugin->config.plot, _("Plot histogram")) { this->plugin = plugin; @@ -917,11 +782,21 @@ int HistogramPlot::handle_event() } +HistogramSumFrames::HistogramSumFrames(HistogramMain *plugin, int x, int y) + : BC_CheckBox(x, y, plugin->config.sum_frames, _("Sum frames")) +{ + this->plugin = plugin; +} + +int HistogramSumFrames::handle_event() +{ + plugin->config.sum_frames = get_value(); + plugin->send_configure_change(); + return 1; +} -HistogramSplit::HistogramSplit(HistogramMain *plugin, - int x, - int y) +HistogramSplit::HistogramSplit(HistogramMain *plugin, int x, int y) : BC_CheckBox(x, y, plugin->config.split, _("Split output")) { this->plugin = plugin; @@ -935,12 +810,8 @@ int HistogramSplit::handle_event() } - HistogramMode::HistogramMode(HistogramMain *plugin, - int x, - int y, - int value, - char *text) + int x, int y, int value, char *text) : BC_Radial(x, y, plugin->mode == value, text) { this->plugin = plugin; @@ -963,17 +834,9 @@ int HistogramMode::handle_event() } - - - - - - - - HistogramText::HistogramText(HistogramMain *plugin, HistogramWindow *gui, int x, int y, float hist_min, float hist_max) - : BC_TumbleTextBox(gui, 0.0, hist_min, hist_max, x, y, xS(70)) + : BC_TumbleTextBox(gui, 0.0, hist_min, hist_max, x, y, xS(80)) { this->plugin = plugin; this->gui = gui; @@ -983,46 +846,26 @@ HistogramText::HistogramText(HistogramMain *plugin, float* HistogramText::get_value() { - if(this == gui->low_input) - { + if( this == gui->low_input ) return &plugin->config.low_input[plugin->mode]; - } - else - if(this == gui->high_input) - { + if( this == gui->high_input ) return &plugin->config.high_input[plugin->mode]; - } - else - if(this == gui->gamma) - { + if( this == gui->gamma ) return &plugin->config.gamma[plugin->mode]; - } - else - if(this == gui->low_output) - { + if( this == gui->low_output ) return &plugin->config.low_output[plugin->mode]; - } - else - if(this == gui->high_output) - { + if( this == gui->high_output ) return &plugin->config.high_output[plugin->mode]; - } - else - if(this == gui->threshold) - { + if( this == gui->threshold ) return &plugin->config.threshold; - } - return 0; } int HistogramText::handle_event() { float *output = get_value(); - if(output) - { + if( output ) *output = atof(get_text()); - } gui->update(1, 1, 0, 0); plugin->send_configure_change(); @@ -1032,23 +875,7 @@ int HistogramText::handle_event() void HistogramText::update() { float *output = get_value(); - if(output) - { + if( output ) BC_TumbleTextBox::update(*output); - } } - - - - - - - - - - - - - -