X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fkeyframe.C;h=363c72df3ca797ddf3e283507a40f15dec6f0402;hb=166867a58d74619aa11aeb562a994cc364d62231;hp=faad855bec12fe610f6985c996ad930ff105b2fb;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/keyframe.C b/cinelerra-5.1/cinelerra/keyframe.C index faad855b..363c72df 100644 --- a/cinelerra-5.1/cinelerra/keyframe.C +++ b/cinelerra-5.1/cinelerra/keyframe.C @@ -25,6 +25,8 @@ #include "cstrdup.h" #include "filexml.h" #include "keyframe.h" +#include "keyframes.h" +#include "transportque.inc" #include #include @@ -37,6 +39,12 @@ KeyFrame::KeyFrame() xbuf = new XMLBuffer(); } +KeyFrame::KeyFrame(const char *buf, long len) + : Auto() +{ + xbuf = new XMLBuffer(buf, len, 0); +} + KeyFrame::KeyFrame(EDL *edl, KeyFrames *autos) : Auto(edl, (Autos*)autos) { @@ -175,7 +183,7 @@ void KeyFrame::update_parameter(BC_Hash *params, output.append_tag(); // Write anonymous text & duplicate the rest - output.append_text(text ? text : this_text); + output.append_data(text ? text : this_text); output.append_data(extra ? extra : this_extra); output.terminate_string(); // Move output to input @@ -226,6 +234,27 @@ void KeyFrame::get_diff(KeyFrame *src, delete [] src_extra; } +void KeyFrame::span_keyframes(int64_t start, int64_t end) +{ + BC_Hash *params = 0; + char *text = 0, *extra = 0; +// The first one determines the changed parameters since it is the one displayed + KeyFrames *keyframes = (KeyFrames *)autos; + KeyFrame *current = keyframes->get_prev_keyframe(start, PLAY_FORWARD); + current->get_diff(this, ¶ms, &text, &extra); +// Always update the first one + current->update_parameter(params, text, extra); + +// Replace changed parameter in all selected keyframes. + for( current = (KeyFrame*)NEXT; current; current = (KeyFrame*)NEXT ) { + if( current->position >= end ) break; + current->update_parameter(params, text, extra); + } + delete params; + delete [] text, + delete [] extra; +} + int KeyFrame::operator==(Auto &that) { return identical((KeyFrame*)&that);