void draw(layer&& layer, std::shared_ptr<device_buffer>& layer_key_buffer)\r
{ \r
std::shared_ptr<device_buffer> local_key_buffer;\r
+ \r
+ std::shared_ptr<device_buffer> atomic_draw_buffer; \r
+ std::shared_ptr<device_buffer> atomic_local_key_buffer;\r
\r
BOOST_FOREACH(auto& item, layer)\r
+ {\r
+ //if(item.transform.get_is_atomic()) // layers need to be atomic in-order to support blend-modes properly\r
+ //{\r
+ // if(!atomic_draw_buffer)\r
+ // {\r
+ // atomic_draw_buffer = channel_.ogl().create_device_buffer(channel_.get_format_desc().width, channel_.get_format_desc().height, 4); \r
+ // channel_.ogl().clear(*atomic_draw_buffer);\r
+ // }\r
+\r
+ // draw(std::move(item), atomic_draw_buffer, atomic_local_key_buffer, nullptr);\r
+ //}\r
+ //else\r
+ //{\r
+ // if(atomic_draw_buffer)\r
+ // {\r
+ // pixel_format_desc desc;\r
+ // desc.pix_fmt = pixel_format::bgra;\r
+ // desc.planes.push_back(pixel_format_desc::plane(channel_.get_format_desc().width, channel_.get_format_desc().height, 4));\r
+\r
+ // std::vector<safe_ptr<device_buffer>> textures;\r
+ // textures.push_back(make_safe(atomic_draw_buffer));\r
+ // \r
+ // atomic_draw_buffer.reset();\r
+ // atomic_local_key_buffer.reset();\r
+ // \r
+ // render_item atomic_item(desc, std::move(textures), image_transform(), video_mode::progressive, nullptr);\r
+ // draw(std::move(atomic_item), draw_buffer_, local_key_buffer, layer_key_buffer);\r
+ // }\r
+\r
+ // draw(std::move(item), draw_buffer_, local_key_buffer, layer_key_buffer);\r
+ //}\r
+\r
draw(std::move(item), local_key_buffer, layer_key_buffer);\r
+ }\r
\r
std::swap(local_key_buffer, layer_key_buffer);\r
}\r
, contrast_(1.0)\r
, saturation_(1.0)\r
, is_key_(false)\r
- , deinterlace_(false)\r
+ , is_atomic_(false)\r
, blend_mode_(image_transform::blend_mode::normal)\r
{\r
std::fill(fill_translation_.begin(), fill_translation_.end(), 0.0);\r
return clip_scale_;\r
}\r
\r
-void image_transform::set_deinterlace(bool value)\r
+void image_transform::set_is_atomic(bool value)\r
{\r
- deinterlace_ = value;\r
+ is_atomic_ = value;\r
}\r
\r
-bool image_transform::get_deinterlace() const\r
+bool image_transform::get_is_atomic() const\r
{\r
- return deinterlace_;\r
+ return is_atomic_;\r
}\r
\r
void image_transform::set_blend_mode(image_transform::blend_mode::type value)\r
\r
levels_.gamma *= other.levels_.gamma;\r
\r
- deinterlace_ |= other.deinterlace_;\r
+ is_atomic_ |= other.is_atomic_;\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
image_transform result; \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_is_atomic (source.get_is_atomic() | dest.get_is_atomic());\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
void set_is_key(bool value);\r
bool get_is_key() const;\r
\r
- void set_deinterlace(bool value);\r
- bool get_deinterlace() const;\r
+ void set_is_atomic(bool value);\r
+ bool get_is_atomic() const;\r
\r
void set_blend_mode(blend_mode::type value);\r
blend_mode::type get_blend_mode() const;\r
std::array<double, 2> clip_scale_; \r
video_mode::type mode_;\r
bool is_key_;\r
- bool deinterlace_;\r
+ bool is_atomic_;\r
blend_mode::type blend_mode_;\r
};\r
\r
if(info_.type == transition::mix)\r
{\r
d_frame1->get_image_transform().set_opacity(delta1); \r
- d_frame2->get_image_transform().set_opacity(delta2); \r
+ d_frame2->get_image_transform().set_opacity(delta2);\r
+\r
+ //s_frame1->get_image_transform().set_opacity(1.0-delta1); \r
+ //s_frame2->get_image_transform().set_opacity(1.0-delta2); \r
}\r
else if(info_.type == transition::slide)\r
{\r
const auto s_frame = s_frame1->get_image_transform() == s_frame2->get_image_transform() ? s_frame2 : basic_frame::interlace(s_frame1, s_frame2, mode_);\r
const auto d_frame = d_frame1->get_image_transform() == d_frame2->get_image_transform() ? d_frame2 : basic_frame::interlace(d_frame1, d_frame2, mode_);\r
\r
- return basic_frame::combine(s_frame, d_frame);\r
+ auto frame = basic_frame::combine(s_frame, d_frame);\r
+\r
+ if(info_.type == transition::mix)\r
+ frame->get_image_transform().set_is_atomic(true);\r
+\r
+ return frame;\r
}\r
};\r
\r