// Scale to input range
if(!EQUIV(config.high_input[mode], config.low_input[mode]))
{
- output = (input - config.low_input[mode]) /
+ output = input < config.low_input[mode] ? 0 :
+ (input - config.low_input[mode]) /
(config.high_input[mode] - config.low_input[mode]);
}
else
void HistogramMain::calculate_histogram(VFrame *data, int do_value)
{
-
- if(!engine) engine = new HistogramEngine(this,
- get_project_smp() + 1,
- get_project_smp() + 1);
-
+ if( !engine )
+ {
+ int cpus = data->get_w() * data->get_h() / 0x80000 + 2;
+ int smps = get_project_smp();
+ if( cpus > smps ) cpus = smps;
+ engine = new HistogramEngine(this, cpus, cpus);
+ }
if(!accum[0])
{
for(int i = 0; i < HISTOGRAM_MODES; i++)
// Apply histogram in hardware
if(use_opengl) return run_opengl();
- if(!engine) engine = new HistogramEngine(this,
- get_project_smp() + 1,
- get_project_smp() + 1);
this->input = frame;
this->output = frame;
-// Always plot to set the curves if automatic
- if(config.plot || config.automatic) send_render_gui(frame);
+ if( !engine )
+ {
+ int cpus = input->get_w() * input->get_h() / 0x80000 + 2;
+ int smps = get_project_smp();
+ if( cpus > smps ) cpus = smps;
+ engine = new HistogramEngine(this, cpus, cpus);
+ }
+// if to plot histogram
+ if(config.plot) send_render_gui(frame);
// Generate tables here. The same table is used by many packages to render
// each horizontal stripe. Need to cover the entire output range in each