x265 update 2.7, findobj upgrade, fix svg init, fix for dragchkbox buttonpress, add...
[goodguy/history.git] / cinelerra-5.1 / plugins / histogram / histogram.C
index 4acc0c7bab1cb7ebc2789dc2a648448c8ef05a9d..33c7b21d62dfc0ad433ff6761befa077be34e686 100644 (file)
@@ -36,7 +36,7 @@
 #include "language.h"
 #include "loadbalance.h"
 #include "playback3d.h"
-#include "cicolors.h"
+#include "bccolors.h"
 #include "vframe.h"
 #include "workarounds.h"
 
@@ -96,7 +96,7 @@ HistogramMain::~HistogramMain()
        delete engine;
 }
 
-const char* HistogramMain::plugin_title() { return _("Histogram"); }
+const char* HistogramMain::plugin_title() { return N_("Histogram"); }
 int HistogramMain::is_realtime() { return 1; }
 
 
@@ -625,8 +625,14 @@ int HistogramMain::handle_opengl()
        get_output()->to_texture();
        get_output()->enable_opengl();
 
-       const char *shader_stack[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-       int current_shader = 0;
+        const char *shader_stack[16];
+        memset(shader_stack,0, sizeof(shader_stack));
+        int current_shader = 0;
+
+        int need_color_matrix = BC_CModels::is_yuv(get_output()->get_color_model()) ? 1 : 0;
+        if( need_color_matrix )
+                shader_stack[current_shader++] = bc_gl_colors;
+
        int aggregate_interpolation = 0;
        int aggregate_gamma = 0;
        int aggregate_colorbalance = 0;
@@ -671,64 +677,31 @@ int HistogramMain::handle_opengl()
        if(!strcmp(get_output()->get_prev_effect(0), _("Color Balance")))
                aggregate_colorbalance = 1;
 
-
 // The order of processing is fixed by this sequence
        if(aggregate_interpolation)
-               INTERPOLATE_COMPILE(shader_stack,
-                       current_shader)
+               INTERPOLATE_COMPILE(shader_stack, current_shader);
 
        if(aggregate_gamma)
-               GAMMA_COMPILE(shader_stack,
-                       current_shader,
-                       aggregate_interpolation)
+               GAMMA_COMPILE(shader_stack, current_shader,
+                       aggregate_interpolation);
 
        if(aggregate_colorbalance)
-               COLORBALANCE_COMPILE(shader_stack,
-                       current_shader,
-                       aggregate_interpolation || aggregate_gamma)
+               COLORBALANCE_COMPILE(shader_stack, current_shader,
+                       aggregate_interpolation || aggregate_gamma);
 
+       shader_stack[current_shader++] = 
+               aggregate_interpolation || aggregate_gamma || aggregate_colorbalance ?
+                       histogram_get_pixel1 : histogram_get_pixel2;
 
-       if(aggregate_interpolation || aggregate_gamma || aggregate_colorbalance)
-               shader_stack[current_shader++] = histogram_get_pixel1;
-       else
-               shader_stack[current_shader++] = histogram_get_pixel2;
-
-       unsigned int shader = 0;
-       switch(get_output()->get_color_model())
-       {
-               case BC_YUV888:
-               case BC_YUVA8888:
-                       shader_stack[current_shader++] = head_frag;
-                       shader_stack[current_shader++] = get_yuv_frag;
-                       shader_stack[current_shader++] = apply_histogram_frag;
-                       shader_stack[current_shader++] = put_yuv_frag;
-                       break;
-               default:
-                       shader_stack[current_shader++] = head_frag;
-                       shader_stack[current_shader++] = get_rgb_frag;
-                       shader_stack[current_shader++] = apply_histogram_frag;
-                       shader_stack[current_shader++] = put_rgb_frag;
-                       break;
-       }
+       shader_stack[current_shader++] = head_frag;
+       shader_stack[current_shader++] = BC_CModels::is_yuv(get_output()->get_color_model()) ?
+                       get_yuv_frag : get_rgb_frag;
+       shader_stack[current_shader++] = apply_histogram_frag;
+       shader_stack[current_shader++] = BC_CModels::is_yuv(get_output()->get_color_model()) ?
+                       put_yuv_frag : put_rgb_frag;
 
-       shader = VFrame::make_shader(0,
-               shader_stack[0],
-               shader_stack[1],
-               shader_stack[2],
-               shader_stack[3],
-               shader_stack[4],
-               shader_stack[5],
-               shader_stack[6],
-               shader_stack[7],
-               shader_stack[8],
-               shader_stack[9],
-               shader_stack[10],
-               shader_stack[11],
-               shader_stack[12],
-               shader_stack[13],
-               shader_stack[14],
-               shader_stack[15],
-               0);
+       shader_stack[current_shader] = 0;
+       unsigned int shader = VFrame::make_shader(shader_stack);
 
 // printf("HistogramMain::handle_opengl %d %d %d %d shader=%d\n",
 // aggregate_interpolation,
@@ -763,14 +736,15 @@ int HistogramMain::handle_opengl()
        {
                glUseProgram(shader);
                glUniform1i(glGetUniformLocation(shader, "tex"), 0);
-               if(aggregate_gamma) GAMMA_UNIFORMS(shader)
-               if(aggregate_interpolation) INTERPOLATE_UNIFORMS(shader)
-               if(aggregate_colorbalance) COLORBALANCE_UNIFORMS(shader)
+               if(aggregate_gamma) GAMMA_UNIFORMS(shader);
+               if(aggregate_interpolation) INTERPOLATE_UNIFORMS(shader);
+               if(aggregate_colorbalance) COLORBALANCE_UNIFORMS(shader);
                glUniform4fv(glGetUniformLocation(shader, "low_input"), 1, low_input);
                glUniform4fv(glGetUniformLocation(shader, "high_input"), 1, high_input);
                glUniform4fv(glGetUniformLocation(shader, "gamma"), 1, gamma);
                glUniform4fv(glGetUniformLocation(shader, "low_output"), 1, low_output);
                glUniform4fv(glGetUniformLocation(shader, "output_scale"), 1, output_scale);
+               if( need_color_matrix ) BC_GL_COLORS(shader);
        }
 
        get_output()->init_screen();
@@ -957,7 +931,7 @@ void HistogramUnit::process_package(LoadPackage *package)
                                y = (row[0] << 8) | row[0];
                                u = (row[1] << 8) | row[1];
                                v = (row[2] << 8) | row[2];
-                               plugin->yuv.yuv_to_rgb_16(r, g, b, y, u, v);
+                               YUV::yuv.yuv_to_rgb_16(r, g, b, y, u, v);
                                HISTOGRAM_TAIL(3)
                                break;
                        case BC_RGBA8888:
@@ -979,7 +953,7 @@ void HistogramUnit::process_package(LoadPackage *package)
                                y = (row[0] << 8) | row[0];
                                u = (row[1] << 8) | row[1];
                                v = (row[2] << 8) | row[2];
-                               plugin->yuv.yuv_to_rgb_16(r, g, b, y, u, v);
+                               YUV::yuv.yuv_to_rgb_16(r, g, b, y, u, v);
                                HISTOGRAM_TAIL(4)
                                break;
                        case BC_RGB161616:
@@ -994,7 +968,7 @@ void HistogramUnit::process_package(LoadPackage *package)
                                y = row[0];
                                u = row[1];
                                v = row[2];
-                               plugin->yuv.yuv_to_rgb_16(r, g, b, y, u, v);
+                               YUV::yuv.yuv_to_rgb_16(r, g, b, y, u, v);
                                HISTOGRAM_TAIL(3)
                                break;
                        case BC_RGBA16161616:
@@ -1009,7 +983,7 @@ void HistogramUnit::process_package(LoadPackage *package)
                                y = row[0];
                                u = row[1];
                                v = row[2];
-                               plugin->yuv.yuv_to_rgb_16(r, g, b, y, u, v);
+                               YUV::yuv.yuv_to_rgb_16(r, g, b, y, u, v);
                                HISTOGRAM_TAIL(4)
                                break;
                }
@@ -1060,7 +1034,7 @@ void HistogramUnit::process_package(LoadPackage *package)
                                v = row[2]; \
                        } \
  \
-                       plugin->yuv.yuv_to_rgb_16(r, g, b, y, u, v); \
+                       YUV::yuv.yuv_to_rgb_16(r, g, b, y, u, v); \
  \
 /* Look up in RGB domain */ \
                        r = lookup_r[r]; \
@@ -1068,7 +1042,7 @@ void HistogramUnit::process_package(LoadPackage *package)
                        b = lookup_b[b]; \
  \
 /* Convert to 16 bit YUV */ \
-                       plugin->yuv.rgb_to_yuv_16(r, g, b, y, u, v); \
+                       YUV::yuv.rgb_to_yuv_16(r, g, b, y, u, v); \
  \
                        if(max == 0xff) \
                        { \