add binfolder path relative filters, fix gbrp color model, vwdw timebar tweaks, title...
[goodguy/history.git] / cinelerra-5.1 / plugins / framefield / framefield.C
index 7f0706587dc6490f32913248ff268b178191559d..b29d3f03818c77772dcd4c97161e98c0a90d1e4d 100644 (file)
@@ -351,12 +351,8 @@ int FrameField::process_buffer(VFrame *frame,
 
                if(!src_frame)
                {
-                       src_frame = new VFrame(0,
-                               -1,
-                               frame->get_w(),
-                               frame->get_h(),
-                               frame->get_color_model(),
-                               -1);
+                       src_frame = new VFrame(frame->get_w(), frame->get_h(),
+                               frame->get_color_model(), 0);
                }
                ptr = src_frame;
        }
@@ -563,7 +559,7 @@ void FrameField::average_rows(int offset, VFrame *frame)
 
 
 
-const char* FrameField::plugin_title() { return _("Frames to fields"); }
+const char* FrameField::plugin_title() { return N_("Frames to fields"); }
 int FrameField::is_realtime() { return 1; }
 
 NEW_WINDOW_MACRO(FrameField, FrameFieldWindow)
@@ -722,7 +718,6 @@ int FrameField::handle_opengl()
                get_output()->enable_opengl();
        }
 
-       unsigned int frag = 0;
        float y_offset = 0.0;
        if(field_number == 0)
        {
@@ -742,49 +737,40 @@ int FrameField::handle_opengl()
                get_output()->get_h(),
                get_output()->get_color_model());
 
+       const char *shader_stack[16];
+       memset(shader_stack,0, sizeof(shader_stack));
+       int current_shader = 0;
 
-       const char *shaders[3] = { 0, 0, 0 };
-       shaders[0] = field_frag;
-
+       shader_stack[current_shader++] = field_frag;
 
 // Aggregate with other effect
 //printf("FrameField::handle_opengl %s\n", get_output()->get_next_effect());
-       if(aggregate_rgb601)
-       {
-               if(rgb601_direction == 1)
-               {
-                       if(BC_CModels::is_yuv(get_output()->get_color_model()))
-                               shaders[1] = yuv_to_601_frag;
-                       else
-                               shaders[1] = rgb_to_601_frag;
-               }
-               else
-               if(rgb601_direction == 2)
-               {
-                       if(BC_CModels::is_yuv(get_output()->get_color_model()))
-                               shaders[1] = _601_to_yuv_frag;
-                       else
-                               shaders[1] = _601_to_rgb_frag;
+       if( aggregate_rgb601 ) {
+               switch( rgb601_direction ) {
+               case 1:
+                       shader_stack[current_shader++] =
+                               BC_CModels::is_yuv(get_output()->get_color_model()) ?
+                                        yuv_to_601_frag : rgb_to_601_frag;
+                       break;
+               case 2:
+                       shader_stack[current_shader++] =
+                               BC_CModels::is_yuv(get_output()->get_color_model()) ?
+                                       _601_to_yuv_frag : _601_to_rgb_frag;
+                       break;
                }
        }
 
-
-
-       frag = VFrame::make_shader(0, shaders[0], shaders[1], shaders[2], 0);
-
-
-       if(frag)
-       {
-               glUseProgram(frag);
-               glUniform1i(glGetUniformLocation(frag, "tex"), 0);
-               glUniform1f(glGetUniformLocation(frag, "double_line_h"),
+       shader_stack[current_shader] = 0;
+       unsigned int shader = VFrame::make_shader(shader_stack);
+       if( shader > 0 ) {
+               glUseProgram(shader);
+               glUniform1i(glGetUniformLocation(shader, "tex"), 0);
+               glUniform1f(glGetUniformLocation(shader, "double_line_h"),
                        2.0 / src_texture->get_texture_h());
-               glUniform1f(glGetUniformLocation(frag, "y_offset"),
+               glUniform1f(glGetUniformLocation(shader, "y_offset"),
                        y_offset / src_texture->get_texture_h());
        }
 
-
-
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        get_output()->draw_texture();