X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fautos.C;h=ced078364c5578980abe367c9324b39109f1adf9;hp=36abbd7dc756041d1d1cb1a356f24bb312508a70;hb=7e5a0760f40ff787cc3d93cb7768a901ebe52809;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd diff --git a/cinelerra-5.1/cinelerra/autos.C b/cinelerra-5.1/cinelerra/autos.C index 36abbd7d..ced07836 100644 --- a/cinelerra-5.1/cinelerra/autos.C +++ b/cinelerra-5.1/cinelerra/autos.C @@ -204,7 +204,7 @@ Auto* Autos::get_prev_auto(int64_t position, while(current && current->position > position) current = PREVIOUS; } - if(!current) + if(!current && first && first->position <= position) { for(current = last; current && current->position > position; @@ -222,7 +222,7 @@ Auto* Autos::get_prev_auto(int64_t position, while(current && current->position < position) current = NEXT; } - if(!current) + if(!current && last && last->position >= position) { for(current = first; current && current->position < position; @@ -282,29 +282,20 @@ Auto* Autos::get_auto_at_position(double position) Auto* Autos::get_auto_for_editing(double position) { - if(position < 0) - { + if(position < 0) { position = edl->local_session->get_selectionstart(1); } Auto *result = 0; - position = edl->align_to_frame(position, 0); - - - - -//printf("Autos::get_auto_for_editing %p %p\n", first, default_auto); - - if(edl->session->auto_keyframes) - { + get_prev_auto(track->to_units(position, 0), PLAY_FORWARD, result); + if( edl->session->auto_keyframes && (!result || result->is_default || + !EQUIV(track->from_units(result->position), position)) ) { +//printf("Autos::get_auto_for_editing %p %p %p\n", default_auto, first, result); + position = edl->align_to_frame(position, 0); result = insert_auto(track->to_units(position, 0)); } - else - result = get_prev_auto(track->to_units(position, 0), - PLAY_FORWARD, - result); +//printf("Autos::get_auto_for_editing %p %p\n", first, default_auto); -//printf("Autos::get_auto_for_editing %p %p %p\n", default_auto, first, result); return result; } @@ -319,7 +310,7 @@ Auto* Autos::get_next_auto(int64_t position, int direction, Auto* ¤t, int while(current && current->position < position) current = NEXT; } - if(!current) + if(!current && last && last->position > position) { for(current = first; current && current->position <= position; @@ -338,7 +329,7 @@ Auto* Autos::get_next_auto(int64_t position, int direction, Auto* ¤t, int while(current && current->position > position) current = PREVIOUS; } - if(!current) + if(!current && first && first->position <= position) { for(current = last; current && current->position > position; @@ -511,15 +502,17 @@ int Autos::copy(int64_t start, //printf("Autos::copy 10 %d %d %p\n", default_only, start, autoof(start)); if(active_only || (!default_only && !active_only)) { - for(Auto* current = autoof(start); - current && current->position <= end; - current = NEXT) - { + Auto *current = autoof(start); +// need the last one if past the end + if( !current && last ) + last->copy(start, end, file, default_only); + + while( current && current->position <= end ) { // Want to copy single keyframes by putting the cursor on them - if(current->position >= start && current->position <= end) - { + if( current->position >= start && current->position <= end ) { current->copy(start, end, file, default_only); } + current = NEXT; } } // Copy default auto again to make it the active auto on the clipboard @@ -712,22 +705,14 @@ Auto* Autos::autoof(int64_t position) Auto* Autos::nearest_before(int64_t position) { Auto *current; - - for(current = last; current && current->position >= position; current = PREVIOUS) - { ; } - - + for(current = last; current && current->position >= position; current = PREVIOUS); return current; // return 0 on failure } Auto* Autos::nearest_after(int64_t position) { Auto *current; - - for(current = first; current && current->position <= position; current = NEXT) - { ; } - - + for(current = first; current && current->position <= position; current = NEXT); return current; // return 0 on failure }