diff --git a/effects/transformeffect.cpp b/effects/transformeffect.cpp index db6b51fd0..3fa164bf5 100644 --- a/effects/transformeffect.cpp +++ b/effects/transformeffect.cpp @@ -18,6 +18,7 @@ #define BLEND_MODE_NORMAL 0 #define BLEND_MODE_SCREEN 1 #define BLEND_MODE_MULTIPLY 2 +#define BLEND_MODE_OVERLAY 3 TransformEffect::TransformEffect(Clip* c) : Effect(c) { setup_effect(EFFECT_TYPE_VIDEO, VIDEO_TRANSFORM_EFFECT); @@ -64,6 +65,7 @@ TransformEffect::TransformEffect(Clip* c) : Effect(c) { ui_layout->addWidget(new QLabel("Blend Mode:"), 6, 0); blend_mode_box = new QComboBox(); blend_mode_box->addItem("Normal", BLEND_MODE_NORMAL); + blend_mode_box->addItem("Overlay", BLEND_MODE_OVERLAY); blend_mode_box->addItem("Screen", BLEND_MODE_SCREEN); blend_mode_box->addItem("Multiply", BLEND_MODE_MULTIPLY); ui_layout->addWidget(blend_mode_box, 6, 1); @@ -189,6 +191,9 @@ void TransformEffect::process_gl(int* anchor_x, int* anchor_y) { case BLEND_MODE_NORMAL: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; + case BLEND_MODE_OVERLAY: + glBlendFunc(GL_DST_COLOR, GL_SRC_ALPHA); + break; case BLEND_MODE_SCREEN: glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); break; diff --git a/olive.pro.user b/olive.pro.user index 330905635..fa03ad249 100644 --- a/olive.pro.user +++ b/olive.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 290602658..0886835b0 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -445,33 +445,28 @@ void Timeline::on_snappingButton_toggled(bool checked) snapping = checked; } -void Timeline::split_clip_and_relink(Clip* pre_clip, long frame, bool relink) { - Clip* post = sequence->split_clip(pre_clip, frame); +void Timeline::split_clip_and_relink(Clip* clip, long frame, bool relink) { + QVector pre_clips; + QVector post_clips; + + pre_clips.append(clip); + post_clips.append(sequence->split_clip(clip, frame)); // if alt is not down, split clips links too if (relink) { - QVector splits; - splits.append(post); - // find linked clips of old clip - for (int i=0;ilinked.size();i++) { - Clip* link = sequence->get_clip(pre_clip->linked.at(i)); + for (int i=0;ilinked.size();i++) { + Clip* link = sequence->get_clip(clip->linked.at(i)); if (!panel_timeline->is_clip_selected(link)) { Clip* s = sequence->split_clip(link, frame); - if (s != NULL) splits.append(s); - } - } - - // re-link all new clips - for (int i=0;ilinked.append(cc->id); + if (s != NULL) { + pre_clips.append(link); + post_clips.append(s); } } } + + relink_clips_using_ids(pre_clips, post_clips); } } @@ -513,16 +508,7 @@ void Timeline::delete_areas_and_relink(QVector& areas) { } } } - for (int i=0;ilinked.size();k++) { - if (c->linked.at(k) == pre_clips.at(j)->id) { - post_clips.at(i)->linked.append(post_clips.at(j)->id); - } - } - } - } + relink_clips_using_ids(pre_clips, post_clips); } void Timeline::copy(bool del) { @@ -656,17 +642,7 @@ bool Timeline::split_selection() { } // relink after splitting - for (int i=0;ilinked.size();k++) { - if (pre->linked.at(k) == pre_splits.at(j)->id) { - post_splits.at(i)->linked.append(post_splits.at(j)->id); - } - } - } - } + relink_clips_using_ids(pre_splits, post_splits); return split; } @@ -676,17 +652,25 @@ void Timeline::split_at_playhead() { if (selections.size() > 0) { // see if whole clips are selected + QVector pre_clips; + QVector post_clips; for (int j=0;jclip_count();j++) { Clip* clip = sequence->get_clip(j); if (clip != NULL && is_clip_selected(clip)) { - // should this relink? - sequence->split_clip(clip, playhead); - split_selected = true; + Clip* s = sequence->split_clip(clip, playhead); + if (s != NULL) { + pre_clips.append(clip); + post_clips.append(s); + split_selected = true; + } } } - // split a selection if not - if (!split_selected) { + if (split_selected) { + // relink clips if we split + relink_clips_using_ids(pre_clips, post_clips); + } else { + // split a selection if not split_selected = split_selection(); } } diff --git a/project/sequence.cpp b/project/sequence.cpp index 16024228d..4def2bf67 100644 --- a/project/sequence.cpp +++ b/project/sequence.cpp @@ -32,11 +32,12 @@ void Sequence::delete_clip(int i) { // remove any potential link references to clip for (int j=0;jlinked.size();k++) { - if (c->linked[k] == clips[i]->id) { -// c->linked[k] = NULL; - c->linked.removeAt(k); - break; + if (c != NULL) { + for (int k=0;klinked.size();k++) { + if (c->linked[k] == clips[i]->id) { + c->linked.removeAt(k); + break; + } } } }