]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 15 Aug 2011 14:21:53 +0000 (14:21 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 15 Aug 2011 14:21:53 +0000 (14:21 +0000)
core/mixer/image/image_mixer.cpp
core/producer/frame/image_transform.cpp
core/producer/frame/image_transform.h
core/producer/transition/transition_producer.cpp

index 7d1d595e0e60313cbf1fcd25f5276461a0e8147f..c0f82f07d1a4095e40631d774b72f8d5677997c8 100644 (file)
@@ -145,9 +145,45 @@ public:
        void draw(layer&& layer, std::shared_ptr<device_buffer>& layer_key_buffer)\r
        {                                       \r
                std::shared_ptr<device_buffer> local_key_buffer;\r
+                               \r
+               std::shared_ptr<device_buffer> atomic_draw_buffer;              \r
+               std::shared_ptr<device_buffer> atomic_local_key_buffer;\r
 \r
                BOOST_FOREACH(auto& item, layer)\r
+               {\r
+                       //if(item.transform.get_is_atomic()) // layers need to be atomic in-order to support blend-modes properly\r
+                       //{\r
+                       //      if(!atomic_draw_buffer)\r
+                       //      {\r
+                       //              atomic_draw_buffer = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4);       \r
+                       //              channel_.ogl().clear(*atomic_draw_buffer);\r
+                       //      }\r
+\r
+                       //      draw(std::move(item), atomic_draw_buffer, atomic_local_key_buffer, nullptr);\r
+                       //}\r
+                       //else\r
+                       //{\r
+                       //      if(atomic_draw_buffer)\r
+                       //      {\r
+                       //              pixel_format_desc desc;\r
+                       //              desc.pix_fmt = pixel_format::bgra;\r
+                       //              desc.planes.push_back(pixel_format_desc::plane(channel_.get_format_desc().width, channel_.get_format_desc().height, 4));\r
+\r
+                       //              std::vector<safe_ptr<device_buffer>> textures;\r
+                       //              textures.push_back(make_safe(atomic_draw_buffer));\r
+                       //              \r
+                       //              atomic_draw_buffer.reset();\r
+                       //              atomic_local_key_buffer.reset();\r
+                       //              \r
+                       //              render_item atomic_item(desc, std::move(textures), image_transform(), video_mode::progressive, nullptr);\r
+                       //              draw(std::move(atomic_item), draw_buffer_, local_key_buffer, layer_key_buffer);\r
+                       //      }\r
+\r
+                       //      draw(std::move(item), draw_buffer_, local_key_buffer, layer_key_buffer);\r
+                       //}\r
+\r
                        draw(std::move(item), local_key_buffer, layer_key_buffer);\r
+               }\r
                \r
                std::swap(local_key_buffer, layer_key_buffer);\r
        }\r
index 357b1524eafea739ad60862272b9e9869d0554d9..23ba503ab17d960328f8a04d487a5cc5589f9224 100644 (file)
@@ -34,7 +34,7 @@ image_transform::image_transform()
        , contrast_(1.0)\r
        , saturation_(1.0)\r
        , is_key_(false)\r
-       , deinterlace_(false)\r
+       , is_atomic_(false)\r
        , blend_mode_(image_transform::blend_mode::normal)\r
 {\r
        std::fill(fill_translation_.begin(), fill_translation_.end(), 0.0);\r
@@ -148,14 +148,14 @@ std::array<double, 2> image_transform::get_clip_scale() const
        return clip_scale_;\r
 }\r
 \r
-void image_transform::set_deinterlace(bool value)\r
+void image_transform::set_is_atomic(bool value)\r
 {\r
-       deinterlace_ = value;\r
+       is_atomic_ = value;\r
 }\r
 \r
-bool image_transform::get_deinterlace() const\r
+bool image_transform::get_is_atomic() const\r
 {\r
-       return deinterlace_;\r
+       return is_atomic_;\r
 }\r
 \r
 void image_transform::set_blend_mode(image_transform::blend_mode::type value)\r
@@ -185,7 +185,7 @@ image_transform& image_transform::operator*=(const image_transform &other)
 \r
        levels_.gamma                   *= other.levels_.gamma;\r
 \r
-       deinterlace_                    |= other.deinterlace_;\r
+       is_atomic_                              |= other.is_atomic_;\r
        is_key_                                 |= other.is_key_;\r
        fill_translation_[0]    += other.fill_translation_[0]*fill_scale_[0];\r
        fill_translation_[1]    += other.fill_translation_[1]*fill_scale_[1];\r
@@ -216,7 +216,7 @@ image_transform tween(double time, const image_transform& source, const image_tr
        image_transform result; \r
        result.set_blend_mode           (std::max(source.get_blend_mode(), dest.get_blend_mode()));\r
        result.set_is_key                       (source.get_is_key() | dest.get_is_key());\r
-       result.set_deinterlace          (source.get_deinterlace() | dest.get_deinterlace());\r
+       result.set_is_atomic            (source.get_is_atomic() | dest.get_is_atomic());\r
        result.set_gain                         (do_tween(time, source.get_gain(), dest.get_gain(), duration, tweener));\r
        result.set_brightness           (do_tween(time, source.get_brightness(), dest.get_brightness(), duration, tweener));\r
        result.set_contrast                     (do_tween(time, source.get_contrast(), dest.get_contrast(), duration, tweener));\r
index d6870a2a5352b9d3aca4033dcaa1b482f85fdf9f..eb7d83075b07f9f9b79fc5be74e363d8f99ac5c0 100644 (file)
@@ -125,8 +125,8 @@ public:
        void set_is_key(bool value);\r
        bool get_is_key() const;\r
 \r
-       void set_deinterlace(bool value);\r
-       bool get_deinterlace() const;\r
+       void set_is_atomic(bool value);\r
+       bool get_is_atomic() const;\r
 \r
        void set_blend_mode(blend_mode::type value);\r
        blend_mode::type get_blend_mode() const;\r
@@ -145,7 +145,7 @@ private:
        std::array<double, 2> clip_scale_; \r
        video_mode::type mode_;\r
        bool is_key_;\r
-       bool deinterlace_;\r
+       bool is_atomic_;\r
        blend_mode::type blend_mode_;\r
 };\r
 \r
index 9673d51630d53620655954a28806d155daeab5da..42a7ecb4570d0994f69cb81e16dd31757d7dc1b1 100644 (file)
@@ -132,7 +132,10 @@ struct transition_producer : public frame_producer
                if(info_.type == transition::mix)\r
                {\r
                        d_frame1->get_image_transform().set_opacity(delta1);    \r
-                       d_frame2->get_image_transform().set_opacity(delta2);    \r
+                       d_frame2->get_image_transform().set_opacity(delta2);\r
+\r
+                       //s_frame1->get_image_transform().set_opacity(1.0-delta1);      \r
+                       //s_frame2->get_image_transform().set_opacity(1.0-delta2);              \r
                }\r
                else if(info_.type == transition::slide)\r
                {\r
@@ -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_);\r
                const auto d_frame = d_frame1->get_image_transform() == d_frame2->get_image_transform() ? d_frame2 : basic_frame::interlace(d_frame1, d_frame2, mode_);\r
                \r
-               return basic_frame::combine(s_frame, d_frame);\r
+               auto frame = basic_frame::combine(s_frame, d_frame);\r
+\r
+               if(info_.type == transition::mix)\r
+                       frame->get_image_transform().set_is_atomic(true);\r
+\r
+               return frame;\r
        }\r
 };\r
 \r