X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fhistogram%2Fhistogram.C;h=996edac9f0604549c8e6a444e67e72ead8c84b62;hb=af44bff549c39ac8bb6e42a791e7a211e1013526;hp=fd2cdc86b5f2d35a89eb67a90ea58f11c8858965;hpb=9d832a1fff11b11aaa1108c460690ed05e2bdc05;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/histogram/histogram.C b/cinelerra-5.1/plugins/histogram/histogram.C index fd2cdc86..996edac9 100644 --- a/cinelerra-5.1/plugins/histogram/histogram.C +++ b/cinelerra-5.1/plugins/histogram/histogram.C @@ -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,34 @@ int HistogramMain::handle_opengl() if(!strcmp(get_output()->get_prev_effect(0), _("Color Balance"))) aggregate_colorbalance = 1; + if( BC_CModels::is_yuv(get_output()->get_color_model()) ) + shader_stack[current_shader++] = bc_gl_colors; // 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 +739,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 +934,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 +956,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 +971,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 +986,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 +1037,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 +1045,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) \ { \