X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fgradient%2Fgradient.C;h=1c4a956651181ce79875d307c707c25bdf457bd6;hp=a7d7828e4ae34601a87f1b9c8909daeaa0e986fc;hb=723142d62d61cde588e961426440f839ca9dcda9;hpb=21c2e6b36d6a96c2f662a89459d607b5a387f4eb diff --git a/cinelerra-5.1/plugins/gradient/gradient.C b/cinelerra-5.1/plugins/gradient/gradient.C index a7d7828e..1c4a9566 100644 --- a/cinelerra-5.1/plugins/gradient/gradient.C +++ b/cinelerra-5.1/plugins/gradient/gradient.C @@ -23,6 +23,7 @@ #include #include +#include "bccolors.h" #include "bcdisplayinfo.h" #include "clip.h" #include "bchash.h" @@ -45,6 +46,12 @@ REGISTER_PLUGIN(GradientMain) GradientConfig::GradientConfig() +{ + reset(); +} + +void GradientConfig::reset() + { angle = 0; in_radius = 0; @@ -211,6 +218,8 @@ void GradientWindow::create_objects() BC_Title *title2; add_subwindow(title2 = new BC_Title(x, y, _("Outer radius:"))); + add_subwindow(reset = new GradientReset(plugin, this, x, y+100)); + y = y1; x += MAX(title1->get_w(), title2->get_w()) + margin; @@ -225,7 +234,6 @@ void GradientWindow::create_objects() add_subwindow(in_color = new GradientInColorButton(plugin, this, x, y)); y += COLOR_H + margin; - add_subwindow(out_color = new GradientOutColorButton(plugin, this, x, y)); x += MAX(in_color->get_w(), out_color->get_w()) + margin; y = y1; @@ -253,6 +261,7 @@ void GradientWindow::create_objects() COLOR_H + 4, 1); + show_window(); } @@ -296,6 +305,7 @@ void GradientWindow::update_shape() y)); } } + show_window(); } @@ -317,6 +327,12 @@ void GradientWindow::update_out_color() flash(out_color_x, out_color_y, COLOR_W, COLOR_H); } +void GradientWindow::done_event(int result) +{ + in_color_thread->close_window(); + out_color_thread->close_window(); +} + @@ -530,11 +546,24 @@ int GradientOutColorButton::handle_event() return 1; } +GradientReset::GradientReset(GradientMain *plugin, GradientWindow *window, int x, int y) + : BC_GenericButton(x, y, _("Reset")) +{ + this->plugin = plugin; + this->window = window; +} +int GradientReset::handle_event() +{ + plugin->config.reset(); + window->update_gui(); + plugin->send_configure_change(); + return 1; +} GradientInColorThread::GradientInColorThread(GradientMain *plugin, GradientWindow *window) - : ColorThread(1, _("Inner color")) + : ColorPicker(1, _("Inner color")) { this->plugin = plugin; this->window = window; @@ -569,7 +598,7 @@ int GradientInColorThread::handle_new_color(int output, int alpha) GradientOutColorThread::GradientOutColorThread(GradientMain *plugin, GradientWindow *window) - : ColorThread(1, _("Outer color")) + : ColorPicker(1, _("Outer color")) { this->plugin = plugin; this->window = window; @@ -628,7 +657,7 @@ GradientMain::~GradientMain() if(overlayer) delete overlayer; } -const char* GradientMain::plugin_title() { return _("Gradient"); } +const char* GradientMain::plugin_title() { return N_("Gradient"); } int GradientMain::is_realtime() { return 1; } @@ -682,12 +711,9 @@ int GradientMain::process_buffer(VFrame *frame, gradient = 0; } - if(!gradient) gradient = new VFrame(0, - -1, - input->get_w(), - input->get_h(), - gradient_cmodel, - -1); + if(!gradient) + gradient = new VFrame(input->get_w(), input->get_h(), + gradient_cmodel, 0); if(!engine) engine = new GradientServer(this, get_project_smp() + 1, @@ -720,32 +746,32 @@ int GradientMain::process_buffer(VFrame *frame, void GradientMain::update_gui() { - if(thread) - { - if(load_configuration()) - { - ((GradientWindow*)thread->window)->lock_window("GradientMain::update_gui"); - ((GradientWindow*)thread->window)->rate->set_text(GradientRate::to_text(config.rate)); - ((GradientWindow*)thread->window)->in_radius->update(config.in_radius); - ((GradientWindow*)thread->window)->out_radius->update(config.out_radius); - ((GradientWindow*)thread->window)->shape->set_text(GradientShape::to_text(config.shape)); - if(((GradientWindow*)thread->window)->angle) - ((GradientWindow*)thread->window)->angle->update(config.angle); - if(((GradientWindow*)thread->window)->center_x) - ((GradientWindow*)thread->window)->center_x->update(config.center_x); - if(((GradientWindow*)thread->window)->center_y) - ((GradientWindow*)thread->window)->center_y->update(config.center_y); - ((GradientWindow*)thread->window)->update_in_color(); - ((GradientWindow*)thread->window)->update_out_color(); - ((GradientWindow*)thread->window)->update_shape(); - ((GradientWindow*)thread->window)->unlock_window(); - ((GradientWindow*)thread->window)->in_color_thread->update_gui(config.get_in_color(), config.in_a); - ((GradientWindow*)thread->window)->out_color_thread->update_gui(config.get_out_color(), config.out_a); - } - } + if( !thread ) return; + if( !load_configuration() ) return; + ((GradientWindow*)thread->window)->lock_window("GradientMain::update_gui"); + GradientWindow *window = (GradientWindow *)thread->window; + window->update_gui(); + window->unlock_window(); } - +void GradientWindow::update_gui() +{ + GradientConfig &config = plugin->config; + rate->set_text(GradientRate::to_text(config.rate)); + in_radius->update(config.in_radius); + out_radius->update(config.out_radius); + shape->set_text(GradientShape::to_text(config.shape)); + if( angle ) angle->update(config.angle); + if( center_x ) center_x->update(config.center_x); + if( center_y ) center_y->update(config.center_y); + update_in_color(); + update_out_color(); + update_shape(); + unlock_window(); + in_color_thread->update_gui(config.get_in_color(), config.in_a); + out_color_thread->update_gui(config.get_out_color(), config.out_a); + lock_window("GradientWindow::update_gui"); +} void GradientMain::save_data(KeyFrame *keyframe) @@ -869,132 +895,125 @@ int GradientMain::handle_opengl() "}\n"; - const char *shader_stack[5] = { 0, 0, 0, 0, 0 }; - shader_stack[0] = head_frag; + const char *shader_stack[16]; + memset(shader_stack,0, sizeof(shader_stack)); + int current_shader = 0; - switch(config.shape) - { - case GradientConfig::LINEAR: - shader_stack[1] = linear_shape; - break; + shader_stack[current_shader++] = head_frag; - default: - shader_stack[1] = radial_shape; - break; + const char *shape_frag = 0; + switch( config.shape ) { + case GradientConfig::LINEAR: + shape_frag = linear_shape; + break; + default: + shape_frag = radial_shape; + break; } - - switch(config.rate) - { - case GradientConfig::LINEAR: - shader_stack[2] = linear_rate; - break; - case GradientConfig::LOG: - shader_stack[2] = log_rate; - break; - case GradientConfig::SQUARE: - shader_stack[2] = square_rate; - break; + if( shape_frag ) + shader_stack[current_shader++] = shape_frag; + + const char *rate_frag = 0; + switch(config.rate) { + case GradientConfig::LINEAR: + rate_frag = linear_rate; + break; + case GradientConfig::LOG: + rate_frag = log_rate; + break; + case GradientConfig::SQUARE: + rate_frag = square_rate; + break; } + if( rate_frag ) + shader_stack[current_shader++] = rate_frag; + + shader_stack[current_shader++] = tail_frag; - shader_stack[3] = tail_frag; // Force frame to create texture without copying to it if full alpha. - if(config.in_a >= 0xff && - config.out_a >= 0xff) + if( config.in_a >= 0xff && config.out_a >= 0xff ) get_output()->set_opengl_state(VFrame::TEXTURE); get_output()->to_texture(); get_output()->enable_opengl(); get_output()->init_screen(); get_output()->bind_texture(0); - unsigned int frag = VFrame::make_shader(0, - shader_stack[0], - shader_stack[1], - shader_stack[2], - shader_stack[3], - 0); - - if(frag) - { - glUseProgram(frag); + shader_stack[current_shader] = 0; + unsigned int shader = VFrame::make_shader(shader_stack); + if( shader > 0 ) { + glUseProgram(shader); float w = get_output()->get_w(); float h = get_output()->get_h(); float texture_w = get_output()->get_texture_w(); float texture_h = get_output()->get_texture_h(); - glUniform1i(glGetUniformLocation(frag, "tex"), 0); - glUniform1f(glGetUniformLocation(frag, "half_w"), w / 2 / texture_w); - glUniform1f(glGetUniformLocation(frag, "half_h"), h / 2 / texture_h); + glUniform1i(glGetUniformLocation(shader, "tex"), 0); + glUniform1f(glGetUniformLocation(shader, "half_w"), w / 2 / texture_w); + glUniform1f(glGetUniformLocation(shader, "half_h"), h / 2 / texture_h); if(config.shape == GradientConfig::LINEAR) { - glUniform1f(glGetUniformLocation(frag, "center_x"), + glUniform1f(glGetUniformLocation(shader, "center_x"), w / 2 / texture_w); - glUniform1f(glGetUniformLocation(frag, "center_y"), + glUniform1f(glGetUniformLocation(shader, "center_y"), h / 2 / texture_h); } else { - glUniform1f(glGetUniformLocation(frag, "center_x"), + glUniform1f(glGetUniformLocation(shader, "center_x"), (float)config.center_x * w / 100 / texture_w); - glUniform1f(glGetUniformLocation(frag, "center_y"), + glUniform1f(glGetUniformLocation(shader, "center_y"), (float)config.center_y * h / 100 / texture_h); } float gradient_size = hypotf(w / texture_w, h / texture_h); - glUniform1f(glGetUniformLocation(frag, "half_gradient_size"), + glUniform1f(glGetUniformLocation(shader, "half_gradient_size"), gradient_size / 2); - glUniform1f(glGetUniformLocation(frag, "sin_angle"), + glUniform1f(glGetUniformLocation(shader, "sin_angle"), sin(config.angle * (M_PI / 180))); - glUniform1f(glGetUniformLocation(frag, "cos_angle"), + glUniform1f(glGetUniformLocation(shader, "cos_angle"), cos(config.angle * (M_PI / 180))); float in_radius = (float)config.in_radius / 100 * gradient_size; - glUniform1f(glGetUniformLocation(frag, "in_radius"), in_radius); + glUniform1f(glGetUniformLocation(shader, "in_radius"), in_radius); float out_radius = (float)config.out_radius / 100 * gradient_size; - glUniform1f(glGetUniformLocation(frag, "out_radius"), out_radius); - glUniform1f(glGetUniformLocation(frag, "radius_diff"), + glUniform1f(glGetUniformLocation(shader, "out_radius"), out_radius); + glUniform1f(glGetUniformLocation(shader, "radius_diff"), out_radius - in_radius); - switch(get_output()->get_color_model()) - { - case BC_YUV888: - case BC_YUVA8888: - { - float in1, in2, in3, in4; - float out1, out2, out3, out4; - YUV::rgb_to_yuv_f((float)config.in_r / 0xff, - (float)config.in_g / 0xff, - (float)config.in_b / 0xff, - in1, - in2, - in3); + switch(get_output()->get_color_model()) { + case BC_YUV888: + case BC_YUVA8888: { + float in1, in2, in3, in4; + float out1, out2, out3, out4; + YUV::yuv.rgb_to_yuv_f( + (float)config.in_r / 0xff, + (float)config.in_g / 0xff, + (float)config.in_b / 0xff, + in1, in2, in3); in4 = (float)config.in_a / 0xff; - YUV::rgb_to_yuv_f((float)config.out_r / 0xff, - (float)config.out_g / 0xff, - (float)config.out_b / 0xff, - out1, - out2, - out3); - in2 += 0.5; - in3 += 0.5; - out2 += 0.5; - out3 += 0.5; - out4 = (float)config.out_a / 0xff; - glUniform4f(glGetUniformLocation(frag, "out_color"), - out1, out2, out3, out4); - glUniform4f(glGetUniformLocation(frag, "in_color"), - in1, in2, in3, in4); - break; - } + YUV::yuv.rgb_to_yuv_f( + (float)config.out_r / 0xff, + (float)config.out_g / 0xff, + (float)config.out_b / 0xff, + out1, out2, out3); + in2 += 0.5; in3 += 0.5; + out2 += 0.5; out3 += 0.5; + out4 = (float)config.out_a / 0xff; + glUniform4f(glGetUniformLocation(shader, "out_color"), + out1, out2, out3, out4); + glUniform4f(glGetUniformLocation(shader, "in_color"), + in1, in2, in3, in4); + break; } - default: - glUniform4f(glGetUniformLocation(frag, "out_color"), - (float)config.out_r / 0xff, - (float)config.out_g / 0xff, - (float)config.out_b / 0xff, - (float)config.out_a / 0xff); - glUniform4f(glGetUniformLocation(frag, "in_color"), - (float)config.in_r / 0xff, - (float)config.in_g / 0xff, - (float)config.in_b / 0xff, - (float)config.in_a / 0xff); - break; + default: + glUniform4f(glGetUniformLocation(shader, "out_color"), + (float)config.out_r / 0xff, + (float)config.out_g / 0xff, + (float)config.out_b / 0xff, + (float)config.out_a / 0xff); + glUniform4f(glGetUniformLocation(shader, "in_color"), + (float)config.in_r / 0xff, + (float)config.in_g / 0xff, + (float)config.in_b / 0xff, + (float)config.in_a / 0xff); + break; } } @@ -1007,23 +1026,11 @@ int GradientMain::handle_opengl() } - - - - - - - - - GradientPackage::GradientPackage() : LoadPackage() { } - - - GradientUnit::GradientUnit(GradientServer *server, GradientMain *plugin) : LoadClient(server) { @@ -1032,8 +1039,6 @@ GradientUnit::GradientUnit(GradientServer *server, GradientMain *plugin) } - - static float calculate_opacity(float mag, float in_radius, float out_radius, int rate) { @@ -1302,14 +1307,14 @@ void GradientUnit::process_package(LoadPackage *package) { int in1, in2, in3, in4; int out1, out2, out3, out4; - yuv.rgb_to_yuv_8(plugin->config.in_r, + YUV::yuv.rgb_to_yuv_8(plugin->config.in_r, plugin->config.in_g, plugin->config.in_b, in1, in2, in3); in4 = plugin->config.in_a; - yuv.rgb_to_yuv_8(plugin->config.out_r, + YUV::yuv.rgb_to_yuv_8(plugin->config.out_r, plugin->config.out_g, plugin->config.out_b, out1, @@ -1324,14 +1329,14 @@ void GradientUnit::process_package(LoadPackage *package) { int in1, in2, in3, in4; int out1, out2, out3, out4; - yuv.rgb_to_yuv_8(plugin->config.in_r, + YUV::yuv.rgb_to_yuv_8(plugin->config.in_r, plugin->config.in_g, plugin->config.in_b, in1, in2, in3); in4 = plugin->config.in_a; - yuv.rgb_to_yuv_8(plugin->config.out_r, + YUV::yuv.rgb_to_yuv_8(plugin->config.out_r, plugin->config.out_g, plugin->config.out_b, out1,