+ if( config.compute_magic ) {
+ float minima_r = 50., minima_g = 50., minima_b = 50.;
+ float maxima_r = 0., maxima_g = 0., maxima_b = 0.;
+
+ for( int i = min_row; i < max_row; i++ ) {
+ float *row = (float*)frame->get_rows()[i];
+ row += 3 * min_col;
+ for( int j = min_col; j < max_col; j++, row += 3 ) {
+ if( row[0] < minima_r ) minima_r = row[0];
+ if( row[0] > maxima_r ) maxima_r = row[0];
+
+ if( row[1] < minima_g ) minima_g = row[1];
+ if( row[1] > maxima_g ) maxima_g = row[1];
+
+ if( row[2] < minima_b ) minima_b = row[2];
+ if( row[2] > maxima_b ) maxima_b = row[2];
+ }
+ }
+
+ // Calculate postprocessing coeficents
+ values.coef2 = minima_r;
+ if( minima_g < values.coef2 ) values.coef2 = minima_g;
+ if( minima_b < values.coef2 ) values.coef2 = minima_b;
+ values.coef1 = maxima_r;
+ if( maxima_g > values.coef1 ) values.coef1 = maxima_g;
+ if( maxima_b > values.coef1 ) values.coef1 = maxima_b;
+ // Try not to overflow RGB601 (235 - 16) / 256 * 0.9
+ float den = values.coef1 - values.coef2;
+ if( fabs(den) < 1e-6 ) den = 1e-6;
+ values.coef1 = 0.770 / den;
+ values.coef2 = 0.065 - values.coef2 * values.coef1;
+ send_render_gui(&values);
+ }
+