]> 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>
Tue, 2 Aug 2011 09:34:45 +0000 (09:34 +0000)
committerRonag <Ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 2 Aug 2011 09:34:45 +0000 (09:34 +0000)
modules/image/producer/image_scroll_producer.cpp

index af78f435cdcf818333f94d3681b9f189e5161e09..2d3d743e0d30783ff064d6687f576cd2ce3ccc96 100644 (file)
@@ -51,18 +51,23 @@ struct image_scroll_producer : public core::frame_producer
 {      \r
        const std::wstring                                                      filename_;\r
        std::vector<safe_ptr<core::basic_frame>>        frames_;\r
-       size_t                                                                          delta_;\r
        core::video_format_desc                                         format_desc_;\r
        size_t                                                                          width_;\r
        size_t                                                                          height_;\r
-       size_t                                                                          speed_;\r
+\r
+       int                                                                                     delta_;\r
+       int                                                                                     speed_;\r
+\r
+       std::array<double, 2>                                           start_offset_;\r
        \r
-       explicit image_scroll_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::wstring& filename, size_t speed) \r
+       explicit image_scroll_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::wstring& filename, int speed) \r
                : filename_(filename)\r
                , delta_(0)\r
                , format_desc_(frame_factory->get_video_format_desc())\r
                , speed_(speed)\r
        {\r
+               start_offset_.assign(0.0);\r
+\r
                auto bitmap = load_image(filename_);\r
                FreeImage_FlipVertical(bitmap.get());\r
 \r
@@ -92,6 +97,13 @@ struct image_scroll_producer : public core::frame_producer
                                frame->commit();\r
                                frames_.push_back(frame);\r
                        }\r
+                       \r
+                       if(speed_ < 0.0)\r
+                       {\r
+                               auto offset = format_desc_.height - (height_ % format_desc_.height);\r
+                               auto offset2 = offset * 0.5/static_cast<double>(format_desc_.height);\r
+                               start_offset_[1] = (std::ceil(static_cast<double>(height_) / static_cast<double>(format_desc_.height)) + 1.0) * 0.5 - offset2;// - 1.5;\r
+                       }\r
                }\r
                else\r
                {\r
@@ -109,10 +121,10 @@ struct image_scroll_producer : public core::frame_producer
                                }\r
                                else\r
                                {\r
-                                       //fast_memclr(frame->image_data().begin(), frame->image_data().size()); \r
-                                       //int width2 = width_ % format_desc_.width;\r
-                                       //for(size_t y = 0; y < height_; ++y)\r
-                                       //      std::copy_n(bytes + i * format_desc_.size*4 + y * width2*4, format_desc_.width*4, frame->image_data().begin() + y *  format_desc_.width*4);\r
+                                       fast_memclr(frame->image_data().begin(), frame->image_data().size());   \r
+                                       int width2 = width_ % format_desc_.width;\r
+                                       for(size_t y = 0; y < height_; ++y)\r
+                                               std::copy_n(bytes + i * format_desc_.width*4 + y * width_*4,width2*4, frame->image_data().begin() + y * format_desc_.width*4);\r
 \r
                                        count = 0;\r
                                }\r
@@ -120,9 +132,19 @@ struct image_scroll_producer : public core::frame_producer
                                frame->commit();\r
                                frames_.push_back(frame);\r
                        }\r
-               }\r
 \r
-               std::reverse(frames_.begin(), frames_.end());\r
+                       std::reverse(frames_.begin(), frames_.end());\r
+\r
+                       if(speed_ > 0.0)\r
+                       {\r
+                               auto offset = format_desc_.width - (width_ % format_desc_.width);\r
+                               start_offset_[0] = offset * 0.5/static_cast<double>(format_desc_.width);\r
+                       }\r
+                       else\r
+                       {\r
+                               start_offset_[0] = (std::ceil(static_cast<double>(width_) / static_cast<double>(format_desc_.width)) + 1.0) * 0.5;// - 1.5;\r
+                       }\r
+               }\r
        }\r
        \r
        // frame_producer\r
@@ -137,12 +159,12 @@ struct image_scroll_producer : public core::frame_producer
                if(height_ > format_desc_.height)\r
                {\r
                        for(size_t n = 0; n < frames_.size(); ++n)\r
-                               frames_[n]->get_image_transform().set_fill_translation(0.0, -0.5*(n+1) + delta_ * 0.5/static_cast<double>(format_desc_.height));\r
+                               frames_[n]->get_image_transform().set_fill_translation(start_offset_[0], start_offset_[1] -0.5*(n+1) + delta_ * 0.5/static_cast<double>(format_desc_.height));\r
                }\r
                else\r
                {\r
                        for(size_t n = 0; n < frames_.size(); ++n)\r
-                               frames_[n]->get_image_transform().set_fill_translation(-0.5*(n+1) + delta_ * 0.5/static_cast<double>(format_desc_.height), 0.0);\r
+                               frames_[n]->get_image_transform().set_fill_translation(start_offset_[0] -0.5*(n+1) + delta_ * 0.5/static_cast<double>(format_desc_.height), start_offset_[1]);\r
                }\r
 \r
                return core::basic_frame(frames_);\r