Correctly start lottie animations.

This commit is contained in:
John Preston 2019-07-05 16:43:21 +02:00
parent 4bd0683e91
commit f19ff1f9b2
4 changed files with 26 additions and 17 deletions

View File

@ -47,7 +47,9 @@ public:
explicit FrameRendererObject( explicit FrameRendererObject(
crl::weak_on_queue<FrameRendererObject> weak); crl::weak_on_queue<FrameRendererObject> weak);
void append(std::unique_ptr<SharedState> entry); void append(
std::unique_ptr<SharedState> entry,
const FrameRequest &request);
void frameShown(); void frameShown();
void updateFrameRequest( void updateFrameRequest(
not_null<SharedState*> entry, not_null<SharedState*> entry,
@ -132,10 +134,10 @@ FrameRendererObject::FrameRendererObject(
: _weak(std::move(weak)) { : _weak(std::move(weak)) {
} }
void FrameRendererObject::append(std::unique_ptr<SharedState> state) { void FrameRendererObject::append(
_entries.push_back({ std::move(state) }); std::unique_ptr<SharedState> state,
auto &entry = _entries.back(); const FrameRequest &request) {
entry.request = entry.state->frameForPaint()->request; _entries.push_back({ std::move(state), request });
queueGenerateFrames(); queueGenerateFrames();
} }
@ -537,10 +539,12 @@ std::shared_ptr<FrameRenderer> FrameRenderer::Instance() {
return result; return result;
} }
void FrameRenderer::append(std::unique_ptr<SharedState> entry) { void FrameRenderer::append(
_wrapped.with([entry = std::move(entry)]( std::unique_ptr<SharedState> entry,
const FrameRequest &request) {
_wrapped.with([=, entry = std::move(entry)](
FrameRendererObject &unwrapped) mutable { FrameRendererObject &unwrapped) mutable {
unwrapped.append(std::move(entry)); unwrapped.append(std::move(entry), request);
}); });
} }

View File

@ -131,7 +131,9 @@ public:
static std::shared_ptr<FrameRenderer> CreateIndependent(); static std::shared_ptr<FrameRenderer> CreateIndependent();
static std::shared_ptr<FrameRenderer> Instance(); static std::shared_ptr<FrameRenderer> Instance();
void append(std::unique_ptr<SharedState> entry); void append(
std::unique_ptr<SharedState> entry,
const FrameRequest &request);
void updateFrameRequest( void updateFrameRequest(
not_null<SharedState*> entry, not_null<SharedState*> entry,

View File

@ -71,8 +71,8 @@ void MultiPlayer::startAtRightTime(std::unique_ptr<SharedState> state) {
lastSyncTime, lastSyncTime,
_delay); _delay);
state->start(this, _started, _delay, frameIndex); state->start(this, _started, _delay, frameIndex);
const auto request = state->frameForPaint()->request;
_renderer->append(std::move(state)); _renderer->append(std::move(state), request);
} }
int MultiPlayer::countFrameIndex( int MultiPlayer::countFrameIndex(
@ -323,21 +323,23 @@ void MultiPlayer::checkNextFrameRender() {
void MultiPlayer::updateFrameRequest( void MultiPlayer::updateFrameRequest(
not_null<const Animation*> animation, not_null<const Animation*> animation,
const FrameRequest &request) { const FrameRequest &request) {
const auto state = [&] { const auto state = [&]() -> Lottie::SharedState* {
const auto key = animation; const auto key = animation;
if (const auto i = _active.find(animation); i != end(_active)) { if (const auto i = _active.find(animation); i != end(_active)) {
return i->second.get(); return i->second;
} else if (const auto j = _paused.find(animation); } else if (const auto j = _paused.find(animation);
j != end(_paused)) { j != end(_paused)) {
return j->second.state.get(); return j->second.state;
} else if (const auto k = _pendingToStart.find(animation); } else if (const auto k = _pendingToStart.find(animation);
k != end(_pendingToStart)) { k != end(_pendingToStart)) {
return k->second.state.get(); return nullptr;
} }
Unexpected("Animation in MultiPlayer::updateFrameRequest."); Unexpected("Animation in MultiPlayer::updateFrameRequest.");
}(); }();
if (state) {
_renderer->updateFrameRequest(state, request); _renderer->updateFrameRequest(state, request);
} }
}
void MultiPlayer::markFrameDisplayed(crl::time now) { void MultiPlayer::markFrameDisplayed(crl::time now) {
Expects(!_active.empty()); Expects(!_active.empty());

View File

@ -45,7 +45,8 @@ void SinglePlayer::start(
_state = state.get(); _state = state.get();
auto information = state->information(); auto information = state->information();
state->start(this, crl::now()); state->start(this, crl::now());
_renderer->append(std::move(state)); const auto request = state->frameForPaint()->request;
_renderer->append(std::move(state), request);
_updates.fire({ std::move(information) }); _updates.fire({ std::move(information) });
crl::on_main_update_requests( crl::on_main_update_requests(