]> git.sesse.net Git - casparcg/commitdiff
Made MIXER CROP work more as one might expect
authorHelge Norberg <helge.norberg@svt.se>
Wed, 22 Oct 2014 15:18:09 +0000 (17:18 +0200)
committerHelge Norberg <helge.norberg@svt.se>
Wed, 22 Oct 2014 15:18:09 +0000 (17:18 +0200)
core/mixer/image/image_kernel.cpp

index c73b02fc8c1bd70fdc9c06ef1287858cd20cc9b4..4b772627789e1fe946cae45fd1b167bf7f40135e 100644 (file)
@@ -178,10 +178,10 @@ struct image_kernel::implementation : boost::noncopyable
                auto crop = params.transform.crop;\r
                auto pers = params.transform.perspective;\r
 \r
-               auto ul = rotate((-anchor[0] + pers.ul[0]) * f_s[0], (-anchor[1] + pers.ul[1]) * f_s[1] / aspect);\r
-               auto ur = rotate((-anchor[0] + pers.ur[0]) * f_s[0], (-anchor[1] + pers.ur[1]) * f_s[1] / aspect);\r
-               auto lr = rotate((-anchor[0] + pers.lr[0]) * f_s[0], (-anchor[1] + pers.lr[1]) * f_s[1] / aspect);\r
-               auto ll = rotate((-anchor[0] + pers.ll[0]) * f_s[0], (-anchor[1] + pers.ll[1]) * f_s[1] / aspect);\r
+               auto ul = rotate((-anchor[0] + pers.ul[0] + crop.ul[0]      ) * f_s[0], (-anchor[1] + pers.ul[1] + crop.ul[1]      ) * f_s[1] / aspect);\r
+               auto ur = rotate((-anchor[0] + pers.ur[0] + crop.lr[0] - 1.0) * f_s[0], (-anchor[1] + pers.ur[1] + crop.ul[1]      ) * f_s[1] / aspect);\r
+               auto lr = rotate((-anchor[0] + pers.lr[0] + crop.lr[0] - 1.0) * f_s[0], (-anchor[1] + pers.lr[1] + crop.lr[1] - 1.0) * f_s[1] / aspect);\r
+               auto ll = rotate((-anchor[0] + pers.ll[0] + crop.ul[0]      ) * f_s[0], (-anchor[1] + pers.ll[1] + crop.lr[1] - 1.0) * f_s[1] / aspect);\r
 \r
                auto upper_left_x =  f_p[0] + ul[0];\r
                auto upper_left_y =  f_p[1] + ul[1];\r
@@ -353,18 +353,18 @@ struct image_kernel::implementation : boost::noncopyable
                double diagonal_intersection_y;\r
 \r
                if (get_line_intersection(\r
-                               pers.ul[0], pers.ul[1],\r
-                               pers.lr[0], pers.lr[1],\r
-                               pers.ur[0], pers.ur[1],\r
-                               pers.ll[0], pers.ll[1],\r
+                               pers.ul[0] + crop.ul[0]      , pers.ul[1] + crop.ul[1]      ,\r
+                               pers.lr[0] + crop.lr[0] - 1.0, pers.lr[1] + crop.lr[1] - 1.0,\r
+                               pers.ur[0] + crop.lr[0] - 1.0, pers.ur[1] + crop.ul[1]      ,\r
+                               pers.ll[0] + crop.ul[0]      , pers.ll[1] + crop.lr[1] - 1.0,\r
                                diagonal_intersection_x,\r
                                diagonal_intersection_y))\r
                {\r
                        // http://www.reedbeta.com/blog/2012/05/26/quadrilateral-interpolation-part-1/\r
-                       auto d0 = hypotenuse(pers.ll[0], pers.ll[1], diagonal_intersection_x, diagonal_intersection_y);\r
-                       auto d1 = hypotenuse(pers.lr[0], pers.lr[1], diagonal_intersection_x, diagonal_intersection_y);\r
-                       auto d2 = hypotenuse(pers.ur[0], pers.ur[1], diagonal_intersection_x, diagonal_intersection_y);\r
-                       auto d3 = hypotenuse(pers.ul[0], pers.ul[1], diagonal_intersection_x, diagonal_intersection_y);\r
+                       auto d0 = hypotenuse(pers.ll[0] + crop.ul[0]      , pers.ll[1] + crop.lr[1] - 1.0, diagonal_intersection_x, diagonal_intersection_y);\r
+                       auto d1 = hypotenuse(pers.lr[0] + crop.lr[0] - 1.0, pers.lr[1] + crop.lr[1] - 1.0, diagonal_intersection_x, diagonal_intersection_y);\r
+                       auto d2 = hypotenuse(pers.ur[0] + crop.lr[0] - 1.0, pers.ur[1] + crop.ul[1]      , diagonal_intersection_x, diagonal_intersection_y);\r
+                       auto d3 = hypotenuse(pers.ul[0] + crop.ul[0]      , pers.ul[1] + crop.ul[1]      , diagonal_intersection_x, diagonal_intersection_y);\r
 \r
                        ulq = calc_q(d3, d1);\r
                        urq = calc_q(d2, d0);\r