From d364a87262c7e53dbf92a44d29bfc5acbba09bbd Mon Sep 17 00:00:00 2001 From: ronag Date: Mon, 15 Aug 2011 14:21:53 +0000 Subject: [PATCH] git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1189 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- core/mixer/image/image_mixer.cpp | 36 +++++++++++++++++++ core/producer/frame/image_transform.cpp | 14 ++++---- core/producer/frame/image_transform.h | 6 ++-- .../transition/transition_producer.cpp | 12 +++++-- 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/core/mixer/image/image_mixer.cpp b/core/mixer/image/image_mixer.cpp index 7d1d595e0..c0f82f07d 100644 --- a/core/mixer/image/image_mixer.cpp +++ b/core/mixer/image/image_mixer.cpp @@ -145,9 +145,45 @@ public: void draw(layer&& layer, std::shared_ptr& layer_key_buffer) { std::shared_ptr local_key_buffer; + + std::shared_ptr atomic_draw_buffer; + std::shared_ptr atomic_local_key_buffer; BOOST_FOREACH(auto& item, layer) + { + //if(item.transform.get_is_atomic()) // layers need to be atomic in-order to support blend-modes properly + //{ + // if(!atomic_draw_buffer) + // { + // atomic_draw_buffer = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4); + // channel_.ogl().clear(*atomic_draw_buffer); + // } + + // draw(std::move(item), atomic_draw_buffer, atomic_local_key_buffer, nullptr); + //} + //else + //{ + // if(atomic_draw_buffer) + // { + // pixel_format_desc desc; + // desc.pix_fmt = pixel_format::bgra; + // desc.planes.push_back(pixel_format_desc::plane(channel_.get_format_desc().width, channel_.get_format_desc().height, 4)); + + // std::vector> textures; + // textures.push_back(make_safe(atomic_draw_buffer)); + // + // atomic_draw_buffer.reset(); + // atomic_local_key_buffer.reset(); + // + // render_item atomic_item(desc, std::move(textures), image_transform(), video_mode::progressive, nullptr); + // draw(std::move(atomic_item), draw_buffer_, local_key_buffer, layer_key_buffer); + // } + + // draw(std::move(item), draw_buffer_, local_key_buffer, layer_key_buffer); + //} + draw(std::move(item), local_key_buffer, layer_key_buffer); + } std::swap(local_key_buffer, layer_key_buffer); } diff --git a/core/producer/frame/image_transform.cpp b/core/producer/frame/image_transform.cpp index 357b1524e..23ba503ab 100644 --- a/core/producer/frame/image_transform.cpp +++ b/core/producer/frame/image_transform.cpp @@ -34,7 +34,7 @@ image_transform::image_transform() , contrast_(1.0) , saturation_(1.0) , is_key_(false) - , deinterlace_(false) + , is_atomic_(false) , blend_mode_(image_transform::blend_mode::normal) { std::fill(fill_translation_.begin(), fill_translation_.end(), 0.0); @@ -148,14 +148,14 @@ std::array image_transform::get_clip_scale() const return clip_scale_; } -void image_transform::set_deinterlace(bool value) +void image_transform::set_is_atomic(bool value) { - deinterlace_ = value; + is_atomic_ = value; } -bool image_transform::get_deinterlace() const +bool image_transform::get_is_atomic() const { - return deinterlace_; + return is_atomic_; } void image_transform::set_blend_mode(image_transform::blend_mode::type value) @@ -185,7 +185,7 @@ image_transform& image_transform::operator*=(const image_transform &other) levels_.gamma *= other.levels_.gamma; - deinterlace_ |= other.deinterlace_; + is_atomic_ |= other.is_atomic_; is_key_ |= other.is_key_; fill_translation_[0] += other.fill_translation_[0]*fill_scale_[0]; fill_translation_[1] += other.fill_translation_[1]*fill_scale_[1]; @@ -216,7 +216,7 @@ image_transform tween(double time, const image_transform& source, const image_tr image_transform result; result.set_blend_mode (std::max(source.get_blend_mode(), dest.get_blend_mode())); result.set_is_key (source.get_is_key() | dest.get_is_key()); - result.set_deinterlace (source.get_deinterlace() | dest.get_deinterlace()); + result.set_is_atomic (source.get_is_atomic() | dest.get_is_atomic()); result.set_gain (do_tween(time, source.get_gain(), dest.get_gain(), duration, tweener)); result.set_brightness (do_tween(time, source.get_brightness(), dest.get_brightness(), duration, tweener)); result.set_contrast (do_tween(time, source.get_contrast(), dest.get_contrast(), duration, tweener)); diff --git a/core/producer/frame/image_transform.h b/core/producer/frame/image_transform.h index d6870a2a5..eb7d83075 100644 --- a/core/producer/frame/image_transform.h +++ b/core/producer/frame/image_transform.h @@ -125,8 +125,8 @@ public: void set_is_key(bool value); bool get_is_key() const; - void set_deinterlace(bool value); - bool get_deinterlace() const; + void set_is_atomic(bool value); + bool get_is_atomic() const; void set_blend_mode(blend_mode::type value); blend_mode::type get_blend_mode() const; @@ -145,7 +145,7 @@ private: std::array clip_scale_; video_mode::type mode_; bool is_key_; - bool deinterlace_; + bool is_atomic_; blend_mode::type blend_mode_; }; diff --git a/core/producer/transition/transition_producer.cpp b/core/producer/transition/transition_producer.cpp index 9673d5163..42a7ecb45 100644 --- a/core/producer/transition/transition_producer.cpp +++ b/core/producer/transition/transition_producer.cpp @@ -132,7 +132,10 @@ struct transition_producer : public frame_producer if(info_.type == transition::mix) { d_frame1->get_image_transform().set_opacity(delta1); - d_frame2->get_image_transform().set_opacity(delta2); + d_frame2->get_image_transform().set_opacity(delta2); + + //s_frame1->get_image_transform().set_opacity(1.0-delta1); + //s_frame2->get_image_transform().set_opacity(1.0-delta2); } else if(info_.type == transition::slide) { @@ -156,7 +159,12 @@ 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_); - return basic_frame::combine(s_frame, d_frame); + auto frame = basic_frame::combine(s_frame, d_frame); + + if(info_.type == transition::mix) + frame->get_image_transform().set_is_atomic(true); + + return frame; } }; -- 2.39.2