]> git.sesse.net Git - casparcg/blobdiff - core/producer/frame/image_transform.cpp
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / core / producer / frame / image_transform.cpp
index a51c6f00e5bfe831a6b8d104066cd9132a7baa83..6c3d6eb90a52372752375417535df73e7cb20860 100644 (file)
@@ -17,6 +17,7 @@
 *    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
 *\r
 */\r
+// TODO: Move layer specific stuff out of frame related classes.\r
 #include "../../stdafx.h"\r
 \r
 #include "image_transform.h"\r
@@ -33,10 +34,8 @@ image_transform::image_transform()
        , brightness_(1.0)\r
        , contrast_(1.0)\r
        , saturation_(1.0)\r
-       , mode_(video_mode::invalid)\r
        , is_key_(false)\r
-       , deinterlace_(false)\r
-       , blend_mode_(image_transform::normal)\r
+       , blend_mode_(image_transform::blend_mode::normal)\r
 {\r
        std::fill(fill_translation_.begin(), fill_translation_.end(), 0.0);\r
        std::fill(fill_scale_.begin(), fill_scale_.end(), 1.0);\r
@@ -149,43 +148,19 @@ std::array<double, 2> image_transform::get_clip_scale() const
        return clip_scale_;\r
 }\r
 \r
-void image_transform::set_mode(video_mode::type mode)\r
-{\r
-       mode_ = mode;\r
-}\r
-\r
-video_mode::type image_transform::get_mode() const\r
-{\r
-       return mode_;\r
-}\r
-\r
-void image_transform::set_deinterlace(bool value)\r
-{\r
-       deinterlace_ = value;\r
-}\r
-\r
-bool image_transform::get_deinterlace() const\r
-{\r
-       return deinterlace_;\r
-}\r
-\r
-void image_transform::set_blend_mode(image_transform::blend_mode value)\r
+void image_transform::set_blend_mode(image_transform::blend_mode::type value)\r
 {\r
        blend_mode_ = value;\r
 }\r
 \r
-image_transform::blend_mode image_transform::get_blend_mode() const\r
+image_transform::blend_mode::type image_transform::get_blend_mode() const\r
 {\r
        return blend_mode_;\r
 }\r
 \r
 image_transform& image_transform::operator*=(const image_transform &other)\r
 {\r
-       opacity_                                *= other.opacity_;\r
-       \r
-       if(other.mode_ != video_mode::invalid)\r
-               mode_ = other.mode_;\r
-\r
+       opacity_                                *= other.opacity_;      \r
        blend_mode_                              = std::max(blend_mode_, other.blend_mode_);\r
        gain_                                   *= other.gain_;\r
        brightness_                             *= other.brightness_;\r
@@ -200,7 +175,6 @@ image_transform& image_transform::operator*=(const image_transform &other)
 \r
        levels_.gamma                   *= other.levels_.gamma;\r
 \r
-       deinterlace_                    |= other.deinterlace_;\r
        is_key_                                 |= other.is_key_;\r
        fill_translation_[0]    += other.fill_translation_[0]*fill_scale_[0];\r
        fill_translation_[1]    += other.fill_translation_[1]*fill_scale_[1];\r
@@ -227,14 +201,10 @@ image_transform tween(double time, const image_transform& source, const image_tr
        {\r
                return tweener(time, source, dest-source, duration);\r
        };\r
-\r
-       CASPAR_ASSERT(source.get_mode() == dest.get_mode() || source.get_mode() == video_mode::invalid || dest.get_mode() == video_mode::invalid);\r
-\r
+       \r
        image_transform result; \r
-       result.set_mode                         (dest.get_mode() != video_mode::invalid ? dest.get_mode() : source.get_mode());\r
        result.set_blend_mode           (std::max(source.get_blend_mode(), dest.get_blend_mode()));\r
        result.set_is_key                       (source.get_is_key() | dest.get_is_key());\r
-       result.set_deinterlace          (source.get_deinterlace() | dest.get_deinterlace());\r
        result.set_gain                         (do_tween(time, source.get_gain(), dest.get_gain(), duration, tweener));\r
        result.set_brightness           (do_tween(time, source.get_brightness(), dest.get_brightness(), duration, tweener));\r
        result.set_contrast                     (do_tween(time, source.get_contrast(), dest.get_contrast(), duration, tweener));\r
@@ -261,68 +231,83 @@ image_transform tween(double time, const image_transform& source, const image_tr
        return result;\r
 }\r
 \r
-image_transform::blend_mode get_blend_mode(const std::wstring& str)\r
+image_transform::blend_mode::type get_blend_mode(const std::wstring& str)\r
 {\r
        if(boost::iequals(str, L"normal"))\r
-               return image_transform::normal;\r
+               return image_transform::blend_mode::normal;\r
        else if(boost::iequals(str, L"lighten"))\r
-               return image_transform::lighten;\r
+               return image_transform::blend_mode::lighten;\r
        else if(boost::iequals(str, L"darken"))\r
-               return image_transform::darken;\r
+               return image_transform::blend_mode::darken;\r
        else if(boost::iequals(str, L"multiply"))\r
-               return image_transform::multiply;\r
+               return image_transform::blend_mode::multiply;\r
        else if(boost::iequals(str, L"average"))\r
-               return image_transform::average;\r
+               return image_transform::blend_mode::average;\r
        else if(boost::iequals(str, L"add"))\r
-               return image_transform::add;\r
+               return image_transform::blend_mode::add;\r
        else if(boost::iequals(str, L"subtract"))\r
-               return image_transform::subtract;\r
+               return image_transform::blend_mode::subtract;\r
        else if(boost::iequals(str, L"difference"))\r
-               return image_transform::difference;\r
+               return image_transform::blend_mode::difference;\r
        else if(boost::iequals(str, L"negation"))\r
-               return image_transform::negation;\r
+               return image_transform::blend_mode::negation;\r
        else if(boost::iequals(str, L"exclusion"))\r
-               return image_transform::exclusion;\r
+               return image_transform::blend_mode::exclusion;\r
        else if(boost::iequals(str, L"screen"))\r
-               return image_transform::screen;\r
+               return image_transform::blend_mode::screen;\r
        else if(boost::iequals(str, L"overlay"))\r
-               return image_transform::overlay;\r
+               return image_transform::blend_mode::overlay;\r
        else if(boost::iequals(str, L"soft_light"))\r
-               return image_transform::soft_light;\r
+               return image_transform::blend_mode::soft_light;\r
        else if(boost::iequals(str, L"hard_light"))\r
-               return image_transform::hard_light;\r
+               return image_transform::blend_mode::hard_light;\r
        else if(boost::iequals(str, L"color_dodge"))\r
-               return image_transform::color_dodge;\r
+               return image_transform::blend_mode::color_dodge;\r
        else if(boost::iequals(str, L"color_burn"))\r
-               return image_transform::color_burn;\r
+               return image_transform::blend_mode::color_burn;\r
        else if(boost::iequals(str, L"linear_dodge"))\r
-               return image_transform::linear_dodge;\r
+               return image_transform::blend_mode::linear_dodge;\r
        else if(boost::iequals(str, L"linear_burn"))\r
-               return image_transform::linear_burn;\r
+               return image_transform::blend_mode::linear_burn;\r
        else if(boost::iequals(str, L"linear_light"))\r
-               return image_transform::linear_light;\r
+               return image_transform::blend_mode::linear_light;\r
        else if(boost::iequals(str, L"vivid_light"))\r
-               return image_transform::vivid_light;\r
+               return image_transform::blend_mode::vivid_light;\r
        else if(boost::iequals(str, L"pin_light"))\r
-               return image_transform::pin_light;\r
+               return image_transform::blend_mode::pin_light;\r
        else if(boost::iequals(str, L"hard_mix"))\r
-               return image_transform::hard_mix;\r
+               return image_transform::blend_mode::hard_mix;\r
        else if(boost::iequals(str, L"reflect"))\r
-               return image_transform::reflect;\r
+               return image_transform::blend_mode::reflect;\r
        else if(boost::iequals(str, L"glow"))\r
-               return image_transform::glow;\r
+               return image_transform::blend_mode::glow;\r
        else if(boost::iequals(str, L"phoenix"))\r
-               return image_transform::phoenix;\r
+               return image_transform::blend_mode::phoenix;\r
        else if(boost::iequals(str, L"contrast"))\r
-               return image_transform::contrast;\r
+               return image_transform::blend_mode::contrast;\r
        else if(boost::iequals(str, L"saturation"))\r
-               return image_transform::saturation;\r
+               return image_transform::blend_mode::saturation;\r
        else if(boost::iequals(str, L"color"))\r
-               return image_transform::color;\r
+               return image_transform::blend_mode::color;\r
        else if(boost::iequals(str, L"luminosity"))\r
-               return image_transform::luminosity;\r
+               return image_transform::blend_mode::luminosity;\r
                \r
-       return image_transform::normal;\r
+       return image_transform::blend_mode::normal;\r
+}\r
+\r
+bool operator<(const image_transform& lhs, const image_transform& rhs)\r
+{\r
+       return memcmp(&lhs, &rhs, sizeof(image_transform)) < 0;\r
+}\r
+\r
+bool operator==(const image_transform& lhs, const image_transform& rhs)\r
+{\r
+       return memcmp(&lhs, &rhs, sizeof(image_transform)) == 0;\r
+}\r
+\r
+bool operator!=(const image_transform& lhs, const image_transform& rhs)\r
+{\r
+       return !(lhs == rhs);\r
 }\r
 \r
 }}
\ No newline at end of file