]> 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>
Sun, 21 Aug 2011 11:46:46 +0000 (11:46 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 21 Aug 2011 11:46:46 +0000 (11:46 +0000)
core/mixer/image/image_mixer.cpp

index 0877430de64c03618018cc3b8ca1824e1b3a8ace..363f47aa3f1dbd33f3a2eafbaaefe1b9cfa36835 100644 (file)
@@ -102,31 +102,30 @@ 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 = std::make_pair(0, 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
+                               if(layer_draw_buffer.first & 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
+                                       layer_draw_buffer.first |= item.transform.get_field_mode();\r
                                }\r
 \r
-                               draw_item(std::move(item), *layer_draw_buffer, local_key_buffer, layer_key_buffer);             \r
+                               draw_item(std::move(item), *layer_draw_buffer.second, local_key_buffer, layer_key_buffer);              \r
                        }\r
                        \r
                        render_item item;\r
                        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.textures                   = list_of(layer_draw_buffer.second);\r
                        item.transform                  = image_transform();\r
                        item.blend_mode                 = layer_blend_mode;\r
 \r
@@ -173,10 +172,7 @@ 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
@@ -187,10 +183,7 @@ private:
                        return item.transform.get_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