dynamic keyframes, textbox rework, andrea ffmpeg.opts, perpetual chkpt undo, lv2...
[goodguy/history.git] / cinelerra-5.1 / plugins / overlay / overlay.C
index a041a10f7d5f080b7f7996d0388dde2ccffef205..8f8cdea5693999439027ac3badb3036f059d7ad2 100644 (file)
@@ -408,8 +408,8 @@ int Overlay::process_buffer(VFrame **frame,
 
        if( --layers > 0 ) {    // need 2 layers to do overlay
                if( !temp )
-                       temp = new VFrame(0, -1, frame[0]->get_w(), frame[0]->get_h(),
-                                       frame[0]->get_color_model(), -1);
+                       temp = new VFrame(frame[0]->get_w(), frame[0]->get_h(),
+                                       frame[0]->get_color_model(), 0);
 
                while( --layers >= 0 ) {
                        current_layer += step;
@@ -593,29 +593,26 @@ static const char * const overlay_shaders[TRANSFER_TYPES] = {
                dst->init_screen();
                src->bind_texture(0);
                dst->bind_texture(1);
-               const char *shader_stack[] = { 0, 0, 0 };
+
+               const char *shader_stack[16];
+               memset(shader_stack,0, sizeof(shader_stack));
                int current_shader = 0;
 
                shader_stack[current_shader++] = get_pixels_frag;
                shader_stack[current_shader++] = overlay_shaders[config.mode];
                shader_stack[current_shader++] = put_pixels_frag;
-
-               unsigned int shader_id = 0;
-               shader_id = VFrame::make_shader(0,
-                       shader_stack[0],
-                       shader_stack[1],
-                       shader_stack[2],
-                       0);
-
-               glUseProgram(shader_id);
-               glUniform1i(glGetUniformLocation(shader_id, "src_tex"), 0);
-               glUniform1i(glGetUniformLocation(shader_id, "dst_tex"), 1);
-               glUniform2f(glGetUniformLocation(shader_id, "dst_tex_dimensions"),
-                               (float)dst->get_texture_w(), (float)dst->get_texture_h());
-               float chroma_offset = BC_CModels::is_yuv(dst->get_color_model()) ? 0.5 : 0.0;
-               glUniform3f(glGetUniformLocation(shader_id, "chroma_offset"),
-                               0.0, chroma_offset, chroma_offset);
-
+               shader_stack[current_shader] = 0;
+               unsigned int shader = VFrame::make_shader(shader_stack);
+               if( shader > 0 ) {
+                       glUseProgram(shader);
+                       glUniform1i(glGetUniformLocation(shader, "src_tex"), 0);
+                       glUniform1i(glGetUniformLocation(shader, "dst_tex"), 1);
+                       glUniform2f(glGetUniformLocation(shader, "dst_tex_dimensions"),
+                                       (float)dst->get_texture_w(), (float)dst->get_texture_h());
+                       float chroma_offset = BC_CModels::is_yuv(dst->get_color_model()) ? 0.5 : 0.0;
+                       glUniform3f(glGetUniformLocation(shader, "chroma_offset"),
+                                       0.0, chroma_offset, chroma_offset);
+               }
                src->draw_texture();
                glUseProgram(0);
 
@@ -635,7 +632,7 @@ static const char * const overlay_shaders[TRANSFER_TYPES] = {
 }
 
 
-const char* Overlay::plugin_title() { return _("Overlay"); }
+const char* Overlay::plugin_title() { return N_("Overlay"); }
 int Overlay::is_realtime() { return 1; }
 int Overlay::is_multichannel() { return 1; }
 int Overlay::is_synthesis() { return 1; }
@@ -660,7 +657,7 @@ void Overlay::save_data(KeyFrame *keyframe)
        FileXML output;
 
 // cause data to be stored directly in text
-       output.set_shared_output(keyframe->get_data(), MESSAGESIZE);
+       output.set_shared_output(keyframe->xbuf);
        output.tag.set_title("OVERLAY");
        output.tag.set_property("MODE", config.mode);
        output.tag.set_property("DIRECTION", config.direction);
@@ -675,7 +672,7 @@ void Overlay::read_data(KeyFrame *keyframe)
 {
        FileXML input;
 
-       input.set_shared_input(keyframe->get_data(), strlen(keyframe->get_data()));
+       input.set_shared_input(keyframe->xbuf);
 
        while(!input.read_tag())
        {