]> git.sesse.net Git - casparcg/blob - core/producer/frame/image_transform.cpp
2.0.0.2: Fixed debug compilation.
[casparcg] / core / producer / frame / image_transform.cpp
1 #include "../../stdafx.h"\r
2 \r
3 #include "image_transform.h"\r
4 \r
5 #include <common/utility/assert.h>\r
6 \r
7 namespace caspar { namespace core {\r
8                 \r
9 image_transform::image_transform() \r
10         : opacity_(1.0)\r
11         , gain_(1.0)\r
12         , mode_(video_mode::invalid)\r
13 {\r
14         std::fill(fill_translation_.begin(), fill_translation_.end(), 0.0);\r
15         std::fill(fill_scale_.begin(), fill_scale_.end(), 1.0);\r
16         std::fill(key_translation_.begin(), key_translation_.end(), 0.0);\r
17         std::fill(key_scale_.begin(), key_scale_.end(), 1.0);\r
18 }\r
19 \r
20 void image_transform::set_opacity(double value)\r
21 {\r
22         opacity_ = std::max(value, 0.0);\r
23 }\r
24 \r
25 double image_transform::get_opacity() const\r
26 {\r
27         return opacity_;\r
28 }\r
29 \r
30 void image_transform::set_gain(double value)\r
31 {\r
32         gain_ = std::max(0.0, value);\r
33 }\r
34 \r
35 double image_transform::get_gain() const\r
36 {\r
37         return gain_;\r
38 }\r
39 \r
40 void image_transform::set_fill_translation(double x, double y)\r
41 {\r
42         fill_translation_[0] = x;\r
43         fill_translation_[1] = y;\r
44 }\r
45 \r
46 void image_transform::set_fill_scale(double x, double y)\r
47 {\r
48         fill_scale_[0] = x;\r
49         fill_scale_[1] = y;     \r
50 }\r
51 \r
52 std::array<double, 2> image_transform::get_fill_translation() const\r
53 {\r
54         return fill_translation_;\r
55 }\r
56 \r
57 std::array<double, 2> image_transform::get_fill_scale() const\r
58 {\r
59         return fill_scale_;\r
60 }\r
61 \r
62 void image_transform::set_key_translation(double x, double y)\r
63 {\r
64         key_translation_[0] = x;\r
65         key_translation_[1] = y;\r
66 }\r
67 \r
68 void image_transform::set_key_scale(double x, double y)\r
69 {\r
70         key_scale_[0] = x;\r
71         key_scale_[1] = y;      \r
72 }\r
73 \r
74 std::array<double, 2> image_transform::get_key_translation() const\r
75 {\r
76         return key_translation_;\r
77 }\r
78 \r
79 std::array<double, 2> image_transform::get_key_scale() const\r
80 {\r
81         return key_scale_;\r
82 }\r
83 \r
84 void image_transform::set_mode(video_mode::type mode)\r
85 {\r
86         mode_ = mode;\r
87 }\r
88 \r
89 video_mode::type image_transform::get_mode() const\r
90 {\r
91         return mode_;\r
92 }\r
93 \r
94 image_transform& image_transform::operator*=(const image_transform &other)\r
95 {\r
96         opacity_ *= other.opacity_;\r
97         if(other.mode_ != video_mode::invalid)\r
98                 mode_ = other.mode_;\r
99         gain_ *= other.gain_;\r
100         fill_translation_[0] += other.fill_translation_[0]*fill_scale_[0];\r
101         fill_translation_[1] += other.fill_translation_[1]*fill_scale_[1];\r
102         fill_scale_[0] *= other.fill_scale_[0];\r
103         fill_scale_[1] *= other.fill_scale_[1];\r
104         key_translation_[0] += other.key_translation_[0]*key_scale_[0];\r
105         key_translation_[1] += other.key_translation_[1]*key_scale_[1];\r
106         key_scale_[0] *= other.key_scale_[0];\r
107         key_scale_[1] *= other.key_scale_[1];\r
108         return *this;\r
109 }\r
110 \r
111 const image_transform image_transform::operator*(const image_transform &other) const\r
112 {\r
113         return image_transform(*this) *= other;\r
114 }\r
115 \r
116 image_transform tween(double time, const image_transform& source, const image_transform& dest, double duration, const tweener_t& tweener)\r
117 {       \r
118         auto do_tween = [](double time, double source, double dest, double duration, const tweener_t& tweener)\r
119         {\r
120                 return tweener(time, source, dest-source, duration);\r
121         };\r
122 \r
123         CASPAR_ASSERT(source.get_mode() == dest.get_mode() || source.get_mode() == video_mode::invalid || dest.get_mode() == video_mode::invalid);\r
124 \r
125         image_transform result; \r
126         result.set_mode(dest.get_mode() != video_mode::invalid ? dest.get_mode() : source.get_mode());\r
127         result.set_gain(do_tween(time, source.get_gain(), dest.get_gain(), duration, tweener));\r
128         result.set_opacity(do_tween(time, source.get_opacity(), dest.get_opacity(), duration, tweener));\r
129         result.set_fill_translation(do_tween(time, source.get_fill_translation()[0], dest.get_fill_translation()[0], duration, tweener), do_tween(time, source.get_fill_translation()[1], dest.get_fill_translation()[1], duration, tweener));\r
130         result.set_fill_scale(do_tween(time, source.get_fill_scale()[0], dest.get_fill_scale()[0], duration, tweener), do_tween(time, source.get_fill_scale()[1], dest.get_fill_scale()[1], duration, tweener));\r
131         result.set_key_translation(do_tween(time, source.get_key_translation()[0], dest.get_key_translation()[0], duration, tweener), do_tween(time, source.get_key_translation()[1], dest.get_key_translation()[1], duration, tweener));\r
132         result.set_key_scale(do_tween(time, source.get_key_scale()[0], dest.get_key_scale()[0], duration, tweener), do_tween(time, source.get_key_scale()[1], dest.get_key_scale()[1], duration, tweener));\r
133         \r
134         return result;\r
135 }\r
136 \r
137 }}