\r
draw_frame draw_frame::interlace(draw_frame frame1, draw_frame frame2, core::field_mode mode)\r
{ \r
- if(frame1 == draw_frame::eof() || frame2 == draw_frame::eof())\r
- return draw_frame::eof();\r
-\r
if(frame1 == draw_frame::empty() && frame2 == draw_frame::empty())\r
return draw_frame::empty();\r
\r
}\r
\r
draw_frame draw_frame::over(draw_frame frame1, draw_frame frame2)\r
-{ \r
- if(frame1 == draw_frame::eof() || frame2 == draw_frame::eof())\r
- return draw_frame::eof();\r
- \r
+{ \r
if(frame1 == draw_frame::empty() && frame2 == draw_frame::empty())\r
return draw_frame::empty();\r
\r
\r
draw_frame draw_frame::mask(draw_frame fill, draw_frame key)\r
{ \r
- if(fill == draw_frame::eof() || key == draw_frame::eof())\r
- return draw_frame::eof();\r
-\r
if(fill == draw_frame::empty() || key == draw_frame::empty())\r
return draw_frame::empty();\r
\r
return frame;\r
}\r
\r
-const draw_frame& draw_frame::eof()\r
-{\r
- return eof_frame;\r
-}\r
-\r
const draw_frame& draw_frame::empty()\r
{\r
return empty_frame;\r
static draw_frame still(draw_frame frame);\r
static draw_frame push(draw_frame frame);\r
\r
- static const draw_frame& eof();\r
static const draw_frame& empty();\r
static const draw_frame& late();\r
\r
\r
if(frame == core::draw_frame::late())\r
return foreground_->last_frame();\r
- \r
- if(frame == core::draw_frame::eof())\r
- { \r
- stop();\r
- return core::draw_frame::empty();\r
- }\r
- \r
+ \r
++frame_number_;\r
\r
if(auto_play_delta_)\r
if(key_ == core::draw_frame::late())\r
key_ = key_producer_->receive();\r
});\r
-\r
- if(fill_ == draw_frame::eof() || key_ == draw_frame::eof())\r
- return draw_frame::eof();\r
-\r
+ \r
if(fill_ == core::draw_frame::late() || key_ == core::draw_frame::late()) // One of the producers is lagging, keep them in sync.\r
return core::draw_frame::late();\r
\r
auto& tween = tweens_[index];\r
auto transform = tween.fetch_and_tick(1);\r
\r
- auto frame = layer.receive(format_desc); \r
- auto frame1 = draw_frame::push(frame);\r
+ auto frame = draw_frame::push(layer.receive(format_desc)); \r
+ auto frame1 = frame;\r
frame1.transform() = transform;\r
\r
if(format_desc.field_mode != core::field_mode::progressive)\r
{ \r
- auto frame2 = draw_frame::push(frame);\r
+ auto frame2 = frame;\r
frame2.transform() = tween.fetch_and_tick(1);\r
frame1 = core::draw_frame::interlace(frame1, frame2, format_desc.field_mode);\r
}\r
delta_ += speed_;\r
\r
if(frames_.empty())\r
- return core::draw_frame::eof();\r
+ return last_frame();\r
\r
if(height_ > format_desc_.height)\r
{\r
if(static_cast<int>(std::abs(delta_)) >= height_ - format_desc_.height)\r
- return core::draw_frame::eof();\r
+ return last_frame();\r
\r
for(int n = 0; n < frames_.size(); ++n)\r
{\r
else\r
{\r
if(static_cast<int>(std::abs(delta_)) >= width_ - format_desc_.width)\r
- return core::draw_frame::eof();\r
+ return last_frame();\r
\r
for(int n = 0; n < frames_.size(); ++n)\r
{\r