]> git.sesse.net Git - casparcg/commitdiff
2.0. image_mixer: Fixed wierd bug where "layer" was leaked.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 25 Aug 2011 14:38:09 +0000 (14:38 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 25 Aug 2011 14:38:09 +0000 (14:38 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1286 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/image/image_mixer.cpp

index 35e95f0a34e1e75ad42b7a44709fab40b92e84e1..5d4507a8701e6bbe683149c594f9425fb7cd346a 100644 (file)
@@ -55,15 +55,7 @@ struct item
        frame_transform                                                 transform;\r
 };\r
 \r
-struct layer\r
-{\r
-       std::vector<item>                                               items;\r
-       blend_mode::type                                                blend_mode;\r
-\r
-       layer(blend_mode::type blend_mode) : blend_mode(blend_mode)\r
-       {\r
-       }\r
-};\r
+typedef std::pair<blend_mode::type, std::vector<item>> layer;\r
 \r
 class image_renderer\r
 {\r
@@ -97,15 +89,15 @@ private:
 \r
                        BOOST_FOREACH(auto& layer, upper)\r
                        {\r
-                               boost::remove_erase_if(layer.items, [](const item& item){return !(item.transform.field_mode & field_mode::upper);});\r
-                               BOOST_FOREACH(auto& item, layer.items)\r
+                               boost::remove_erase_if(layer.second, [](const item& item){return !(item.transform.field_mode & field_mode::upper);});\r
+                               BOOST_FOREACH(auto& item, layer.second)\r
                                        item.transform.field_mode = field_mode::upper;\r
                        }\r
 \r
                        BOOST_FOREACH(auto& layer, lower)\r
                        {\r
-                               boost::remove_erase_if(layer.items, [](const item& item){return !(item.transform.field_mode & field_mode::lower);});\r
-                               BOOST_FOREACH(auto& item, layer.items)\r
+                               boost::remove_erase_if(layer.second, [](const item& item){return !(item.transform.field_mode & field_mode::lower);});\r
+                               BOOST_FOREACH(auto& item, layer.second)\r
                                        item.transform.field_mode = field_mode::lower;\r
                        }\r
 \r
@@ -141,25 +133,25 @@ private:
                                        safe_ptr<device_buffer>&                draw_buffer,\r
                                        std::shared_ptr<device_buffer>& layer_key_buffer)\r
        {                               \r
-               if(layer.items.empty())\r
+               if(layer.second.empty())\r
                        return;\r
 \r
                std::shared_ptr<device_buffer> local_key_buffer;\r
                std::shared_ptr<device_buffer> local_mix_buffer;\r
                                \r
-               if(layer.blend_mode != blend_mode::normal && layer.items.size() > 1)\r
+               if(layer.first != blend_mode::normal && layer.second.size() > 1)\r
                {\r
                        auto layer_draw_buffer = create_device_buffer(4);\r
 \r
-                       BOOST_FOREACH(auto& item, layer.items)\r
+                       BOOST_FOREACH(auto& item, layer.second)\r
                                draw_item(std::move(item), layer_draw_buffer, layer_key_buffer, local_key_buffer, local_mix_buffer);    \r
                \r
                        draw_device_buffer(layer_draw_buffer, std::move(local_mix_buffer), blend_mode::normal);                                                 \r
-                       draw_device_buffer(draw_buffer, std::move(layer_draw_buffer), layer.blend_mode);\r
+                       draw_device_buffer(draw_buffer, std::move(layer_draw_buffer), layer.first);\r
                }\r
                else // fast path\r
                {\r
-                       BOOST_FOREACH(auto& item, layer.items)          \r
+                       BOOST_FOREACH(auto& item, layer.second)         \r
                                draw_item(std::move(item), draw_buffer, layer_key_buffer, local_key_buffer, local_mix_buffer);          \r
                                        \r
                        draw_device_buffer(draw_buffer, std::move(local_mix_buffer), blend_mode::normal);\r
@@ -253,7 +245,7 @@ public:
 \r
        void begin_layer(blend_mode::type blend_mode)\r
        {\r
-               layers_.push_back(layer(blend_mode));\r
+               layers_.push_back(std::make_pair(blend_mode, std::vector<item>()));\r
        }\r
                \r
        void begin(core::basic_frame& frame)\r
@@ -271,7 +263,7 @@ public:
                item.textures   = frame.get_textures();\r
                item.transform  = transform_stack_.back();\r
 \r
-               layers_.back().items.push_back(item);\r
+               layers_.back().second.push_back(item);\r
        }\r
 \r
        void end()\r