]> git.sesse.net Git - casparcg/commitdiff
Added support for psd placeholder layer
authorHelge Norberg <helge.norberg@svt.se>
Fri, 9 Aug 2013 15:56:55 +0000 (17:56 +0200)
committerHelge Norberg <helge.norberg@svt.se>
Fri, 9 Aug 2013 15:56:55 +0000 (17:56 +0200)
core/core.vcxproj
core/core.vcxproj.filters
core/producer/binding.h
core/producer/scene/scene_producer.cpp
core/producer/text/text_producer.cpp
modules/psd/psd_scene_producer.cpp

index 5803438eb233d9a82538cd1cc1ee21c26bec0828..8ea75ed814f766711a917721808e6dfcc7f1ad2e 100644 (file)
     <ClInclude Include="producer\binding.h" />\r
     <ClInclude Include="producer\draw\freehand_producer.h" />\r
     <ClInclude Include="producer\scene\const_producer.h" />\r
+    <ClInclude Include="producer\scene\hotswap_producer.h" />\r
     <ClInclude Include="producer\scene\scene_producer.h" />\r
     <ClInclude Include="producer\text\text_producer.h" />\r
     <ClInclude Include="producer\text\utils\color.h" />\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
     </ClCompile>\r
+    <ClCompile Include="producer\scene\hotswap_producer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
     <ClCompile Include="producer\scene\scene_producer.cpp">\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
       <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|x64'">../../StdAfx.h</PrecompiledHeaderFile>\r
index ff5b36bfc29b6a310b14a7b12e7af72a1fe759b3..a0725384cb0ba4f3e1f1c96870e76e8f2f9e0a53 100644 (file)
     <ClInclude Include="producer\text\utils\string_metrics.h">\r
       <Filter>source\producer\text\utils</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="producer\scene\hotswap_producer.h">\r
+      <Filter>source\producer\scene</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClCompile Include="producer\transition\transition_producer.cpp">\r
     <ClCompile Include="producer\text\utils\texture_atlas.cpp">\r
       <Filter>source\producer\text\utils</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="producer\scene\hotswap_producer.cpp">\r
+      <Filter>source\producer\scene</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
index 68a502d17276632c866299cd2d8bbfc41cbc7c7e..0f1e08665b0042c92d138666fdf6e00343b14295 100644 (file)
@@ -489,7 +489,7 @@ public:
 
        binding<T> otherwise(T false_result)
        {
-               return otherwise(binding<T>(false_result))      
+               return otherwise(binding<T>(false_result));
        }
 };
 
index bd146fc067446afdec67727bcc6ed54353124047..081b3daf85347f5d146006129028f0827e48a287 100644 (file)
@@ -345,13 +345,20 @@ spl::shared_ptr<frame_producer> create_dummy_scene_producer(const spl::shared_pt
        auto& lower_left = scene->create_layer(create_producer(frame_factory, format_desc, create_param(L"scene/lower_left")));
        auto& lower_right = scene->create_layer(create_producer(frame_factory, format_desc, create_param(L"scene/lower_right")));
 
+       /*
        binding<double> panel_x = (scene->frame()
                        .as<double>()
                        .transformed([](double v) { return std::sin(v / 20.0); })
                        * 20.0
                        + 40.0)
                        .transformed([](double v) { return std::floor(v); }); // snap to pixels instead of subpixels
-       binding<double> panel_y = when(car_layer.hidden).then(500.0).otherwise(-panel_x + 300);
+                       */
+       tweener tween(L"easeinoutsine");
+       binding<double> panel_x = when(scene->frame() < 50)
+               .then(scene->frame().as<double>().transformed([tween](double t) { return tween(t, 0.0, 200, 50); }))
+               .otherwise(200.0);
+       //binding<double> panel_y = when(car_layer.hidden).then(500.0).otherwise(-panel_x + 300);
+       binding<double> panel_y(500.0);
        upper_left.position.x = panel_x;
        upper_left.position.y = panel_y;
        upper_right.position.x = upper_left.position.x + upper_left.producer.get()->pixel_constraints().width + panel_width;
index cd41705255ba6cf166c1331d6d1477de556f0bab..a72ba5cb741853fe28d050353aa1f33357c503fe 100644 (file)
@@ -241,4 +241,4 @@ spl::shared_ptr<frame_producer> create_text_producer(const spl::shared_ptr<frame
        return text_producer::create(frame_factory, x, y, params.at(1), text_info, format_desc.width, format_desc.height, true);
 }
 
-}}
\ No newline at end of file
+}}
index 000345e5c29381cb7725074cae27746db9ff5083..66e55f346452faeb8e40d21d04d4665aff77bf0a 100644 (file)
@@ -29,6 +29,7 @@
 #include <core/producer/text/text_producer.h>
 #include <core/producer/scene/scene_producer.h>
 #include <core/producer/scene/const_producer.h>
+#include <core/producer/scene/hotswap_producer.h>
 #include <core/frame/draw_frame.h>
 
 #include <common/env.h>
@@ -37,6 +38,7 @@
 #include <boost/filesystem.hpp>
 #include <boost/foreach.hpp>
 #include <boost/thread/future.hpp>
+#include <boost/algorithm/string.hpp>
 
 namespace caspar { namespace psd {
 
@@ -215,15 +217,27 @@ spl::shared_ptr<core::frame_producer> create_psd_scene_producer(const spl::share
                }
                else if((*it)->image() && (*it)->visible())
                {
-                       core::pixel_format_desc pfd(core::pixel_format::bgra);
-                       pfd.planes.push_back(core::pixel_format_desc::plane((*it)->rect().width(), (*it)->rect().height(), 4));
+                       std::wstring layer_name = (*it)->name();
+                       std::shared_ptr<core::frame_producer> layer_producer;
 
-                       auto frame = frame_factory->create_frame(it->get(), pfd);
-                       memcpy(frame.image_data().data(), (*it)->image()->data(), frame.image_data().size());
+                       if (boost::algorithm::istarts_with(layer_name, L"[producer]"))
+                       {
+                               auto hotswap = std::make_shared<core::hotswap_producer>((*it)->rect().width(), (*it)->rect().height());
+                               hotswap->producer().set(core::create_producer(frame_factory, format_desc, layer_name.substr(10)));
+                               layer_producer = hotswap;
+                       }
+                       else
+                       {
+                               core::pixel_format_desc pfd(core::pixel_format::bgra);
+                               pfd.planes.push_back(core::pixel_format_desc::plane((*it)->rect().width(), (*it)->rect().height(), 4));
 
-                       auto layer_producer = core::create_const_producer(core::draw_frame(std::move(frame)), (*it)->rect().width(), (*it)->rect().height());
+                               auto frame = frame_factory->create_frame(it->get(), pfd);
+                               memcpy(frame.image_data().data(), (*it)->image()->data(), frame.image_data().size());
+
+                               layer_producer = core::create_const_producer(core::draw_frame(std::move(frame)), (*it)->rect().width(), (*it)->rect().height());
+                       }
 
-                       auto& new_layer = root->create_layer(layer_producer, (*it)->rect().left, (*it)->rect().top);
+                       auto& new_layer = root->create_layer(spl::make_shared_ptr(layer_producer), (*it)->rect().left, (*it)->rect().top);
                        new_layer.adjustments.opacity.set((*it)->opacity() / 255.0);
                        new_layer.hidden.set(!(*it)->visible());