]> git.sesse.net Git - casparcg/blobdiff - core/mixer/image/image_mixer.cpp
2.0. image_mixer: "replace" blend mode was not necessary.
[casparcg] / core / mixer / image / image_mixer.cpp
index 0877430de64c03618018cc3b8ca1824e1b3a8ace..d70dc4fedc15a4f0a7c31b687a5d9b3259b43193 100644 (file)
@@ -33,7 +33,7 @@
 #include <common/exception/exceptions.h>\r
 #include <common/gl/gl_check.h>\r
 \r
-#include <core/producer/frame/image_transform.h>\r
+#include <core/producer/frame/frame_transform.h>\r
 #include <core/producer/frame/pixel_format.h>\r
 #include <core/video_format.h>\r
 \r
@@ -102,24 +102,16 @@ private:
                if(layer.empty())\r
                        return;\r
 \r
-               std::pair<int, std::shared_ptr<device_buffer>> local_key_buffer;\r
+               std::pair<int, std::shared_ptr<device_buffer>> local_key_buffer; // int is fields flag\r
                                \r
                if(layer.front().blend_mode != blend_mode::normal && has_overlapping_items(layer))\r
                {\r
-                       auto layer_draw_buffer = create_device_buffer(4);       \r
+                       auto layer_draw_buffer = create_device_buffer(4); // int is fields flag\r
                        auto layer_blend_mode = layer.front().blend_mode;\r
 \r
-                       int fields = 0;\r
                        BOOST_FOREACH(auto& item, layer)\r
                        {\r
-                               if(fields & item.transform.get_field_mode())\r
-                                       item.blend_mode = blend_mode::normal; // Disable blending and just merge, it will be used when merging back into render stack.\r
-                               else\r
-                               {\r
-                                       item.blend_mode = blend_mode::replace; // Target field is empty, no blending, just copy\r
-                                       fields |= item.transform.get_field_mode();\r
-                               }\r
-\r
+                               item.blend_mode = blend_mode::normal; // Disable blending and just merge.\r
                                draw_item(std::move(item), *layer_draw_buffer, local_key_buffer, layer_key_buffer);             \r
                        }\r
                        \r
@@ -127,7 +119,7 @@ private:
                        item.pix_desc.pix_fmt   = pixel_format::bgra;\r
                        item.pix_desc.planes    = list_of(pixel_format_desc::plane(channel_.get_format_desc().width, channel_.get_format_desc().height, 4));\r
                        item.textures                   = list_of(layer_draw_buffer);\r
-                       item.transform                  = image_transform();\r
+                       item.transform                  = frame_transform();\r
                        item.blend_mode                 = layer_blend_mode;\r
 \r
                        kernel_.draw(channel_.ogl(), std::move(item), *draw_buffer, nullptr, nullptr);\r
@@ -148,7 +140,7 @@ private:
                                   std::pair<int, std::shared_ptr<device_buffer>>&      local_key_buffer, \r
                                   std::shared_ptr<device_buffer>&                                      layer_key_buffer)\r
        {                                                                                       \r
-               if(item.transform.get_is_key())\r
+               if(item.transform.is_key)\r
                {\r
                        if(!local_key_buffer.second)\r
                        {\r
@@ -156,13 +148,13 @@ private:
                                local_key_buffer.second = create_device_buffer(1);\r
                        }\r
                        \r
-                       local_key_buffer.first |= item.transform.get_field_mode(); // Add field to flag.\r
+                       local_key_buffer.first |= item.transform.field_mode; // Add field to flag.\r
                        kernel_.draw(channel_.ogl(), std::move(item), *local_key_buffer.second, nullptr, nullptr);\r
                }\r
                else\r
                {\r
                        kernel_.draw(channel_.ogl(), std::move(item), draw_buffer, local_key_buffer.second, layer_key_buffer);\r
-                       local_key_buffer.first ^= item.transform.get_field_mode(); // Remove field from flag.\r
+                       local_key_buffer.first ^= item.transform.field_mode; // Remove field from flag.\r
                        \r
                        if(local_key_buffer.first == 0) // If all fields from key has been used, reset it\r
                        {\r
@@ -173,24 +165,18 @@ private:
        }\r
 \r
        bool has_overlapping_items(const layer& layer)\r
-       {\r
-               if(layer.size() < 2)\r
-                       return false;   \r
-               \r
+       {               \r
                auto upper_count = boost::range::count_if(layer, [&](const render_item& item)\r
                {\r
-                       return item.transform.get_field_mode() | field_mode::upper;\r
+                       return item.transform.field_mode | field_mode::upper;\r
                });\r
 \r
                auto lower_count = boost::range::count_if(layer, [&](const render_item& item)\r
                {\r
-                       return item.transform.get_field_mode() | field_mode::lower;\r
+                       return item.transform.field_mode | field_mode::lower;\r
                });\r
 \r
-               if(upper_count < 2 && lower_count < 2)\r
-                       return false;\r
-\r
-               return true;\r
+               return upper_count > 1 || lower_count > 1;\r
        }                       \r
                \r
        safe_ptr<device_buffer> create_device_buffer(size_t stride)\r
@@ -206,7 +192,7 @@ struct image_mixer::implementation : boost::noncopyable
 {      \r
        ogl_device&                                                             ogl_;\r
        image_renderer                                                  renderer_;\r
-       std::vector<image_transform>                    transform_stack_;\r
+       std::vector<frame_transform>                    transform_stack_;\r
        blend_mode::type                                                active_blend_mode_;\r
        std::deque<std::deque<render_item>>             layers_; // layer/stream/items\r
 public:\r
@@ -226,12 +212,12 @@ public:
                \r
        void begin(core::basic_frame& frame)\r
        {\r
-               transform_stack_.push_back(transform_stack_.back()*frame.get_image_transform());\r
+               transform_stack_.push_back(transform_stack_.back()*frame.get_frame_transform());\r
        }\r
                \r
        void visit(core::write_frame& frame)\r
        {       \r
-               if(transform_stack_.back().get_field_mode() == field_mode::empty)\r
+               if(transform_stack_.back().field_mode == field_mode::empty)\r
                        return;\r
                \r
                core::render_item item;\r