From 2864a5f4a5678eec3654e2f1082ac0fec9717af6 Mon Sep 17 00:00:00 2001 From: ronag Date: Wed, 17 Aug 2011 11:10:29 +0000 Subject: [PATCH] 2.0. image_mixer: Fixed problems interlacing with progressive local separate key. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1204 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- core/mixer/image/image_mixer.cpp | 32 ++++++++++++++----- .../transition/transition_producer.cpp | 4 ++- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/core/mixer/image/image_mixer.cpp b/core/mixer/image/image_mixer.cpp index ac24a170c..6967cf6b9 100644 --- a/core/mixer/image/image_mixer.cpp +++ b/core/mixer/image/image_mixer.cpp @@ -150,7 +150,7 @@ public: if(layer.empty()) return; - std::shared_ptr local_key_buffer; + std::pair> local_key_buffer; if(has_overlapping_items(layer, layer.front().transform.get_blend_mode())) { @@ -170,24 +170,40 @@ public: draw_item(std::move(item), draw_buffer, local_key_buffer, layer_key_buffer); } - std::swap(local_key_buffer, layer_key_buffer); + CASPAR_ASSERT(local_key_buffer.first == 0 || local_key_buffer.first == core::video_mode:progressive); + + std::swap(local_key_buffer.second, layer_key_buffer); } - void draw_item(render_item&& item, const safe_ptr& draw_buffer, std::shared_ptr& local_key_buffer, std::shared_ptr& layer_key_buffer) + void draw_item(render_item&& item, + const safe_ptr& draw_buffer, + std::pair>& local_key_buffer, + std::shared_ptr& layer_key_buffer) { if(item.transform.get_is_key()) { - if(!local_key_buffer) - local_key_buffer = create_device_buffer(1); + if(!local_key_buffer.second) + { + local_key_buffer.first = 0; + local_key_buffer.second = create_device_buffer(1); + } item.transform.set_opacity(1.0); item.transform.set_blend_mode(image_transform::blend_mode::normal); - kernel_.draw(channel_.ogl(), std::move(item), make_safe(local_key_buffer), nullptr, nullptr); + + local_key_buffer.first |= item.mode; + kernel_.draw(channel_.ogl(), std::move(item), make_safe(local_key_buffer.second), nullptr, nullptr); } else { - kernel_.draw(channel_.ogl(), std::move(item), draw_buffer, local_key_buffer, layer_key_buffer); - local_key_buffer.reset(); + kernel_.draw(channel_.ogl(), std::move(item), draw_buffer, local_key_buffer.second, layer_key_buffer); + local_key_buffer.first ^= item.mode; + + if(local_key_buffer.first == 0) + { + local_key_buffer.first = 0; + local_key_buffer.second.reset(); + } } } diff --git a/core/producer/transition/transition_producer.cpp b/core/producer/transition/transition_producer.cpp index b2f1dbafb..ca8092644 100644 --- a/core/producer/transition/transition_producer.cpp +++ b/core/producer/transition/transition_producer.cpp @@ -85,7 +85,7 @@ struct transition_producer : public frame_producer source = source_producer_->last_frame(); }); - return last_frame_ = compose(dest, source); + return compose(dest, source); } virtual safe_ptr last_frame() const @@ -159,6 +159,8 @@ struct transition_producer : public frame_producer const auto s_frame = s_frame1->get_image_transform() == s_frame2->get_image_transform() ? s_frame2 : basic_frame::interlace(s_frame1, s_frame2, mode_); const auto d_frame = d_frame1->get_image_transform() == d_frame2->get_image_transform() ? d_frame2 : basic_frame::interlace(d_frame1, d_frame2, mode_); + last_frame_ = basic_frame::combine(s_frame2, d_frame2); + return basic_frame::combine(s_frame, d_frame); } }; -- 2.39.2