From: Hermet Park Date: Thu, 16 Aug 2018 08:12:43 +0000 (+0900) Subject: lottieplayer: Add render option to update buffer forcely. X-Git-Tag: submit/tizen/20180917.042405~103 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=20823b49fe43b31de27b7ae1b09374ed1feb0e67;p=platform%2Fcore%2Fuifw%2Flottie-player.git lottieplayer: Add render option to update buffer forcely. plus code refactoring. Change-Id: Icef131a7df5fa9766ff9cfe7513b1865692719f5 --- diff --git a/inc/lottieplayer.h b/inc/lottieplayer.h index 1e98f07..ee981ae 100644 --- a/inc/lottieplayer.h +++ b/inc/lottieplayer.h @@ -53,8 +53,8 @@ public: // TODO: Consider correct position... void setSize(int width, int height); void size(int &width, int &height) const; - std::future render(float pos, LOTBuffer buffer); - bool renderSync(float pos, LOTBuffer buffer); + std::future render(float pos, LOTBuffer buffer, bool forceRender = false); + bool renderSync(float pos, LOTBuffer buffer, bool forceRender = false); public: LOTPlayerPrivate *d; diff --git a/src/lottie/lottieplayer.cpp b/src/lottie/lottieplayer.cpp index 379232c..39f30b2 100644 --- a/src/lottie/lottieplayer.cpp +++ b/src/lottie/lottieplayer.cpp @@ -7,18 +7,20 @@ #include class LOTPlayerPrivate { + public: LOTPlayerPrivate(); - void update(float pos); + bool update(float pos); bool setFilePath(std::string path); void setSize(const VSize &sz); + void setPos(float pos); VSize size() const; float playTime() const; float pos(); const std::vector &renderList(float pos); - bool render(float pos, const LOTBuffer &buffer); + bool render(float pos, const LOTBuffer &buffer, bool forceRender); -public: +private: std::string mFilePath; std::shared_ptr mModel; std::unique_ptr mCompItem; @@ -30,7 +32,6 @@ public: void LOTPlayerPrivate::setSize(const VSize &sz) { mSize = sz; - if (mCompItem) mCompItem->resize(sz); } VSize LOTPlayerPrivate::size() const @@ -65,33 +66,45 @@ float LOTPlayerPrivate::pos() return mPos; } -void LOTPlayerPrivate::update(float pos) +void LOTPlayerPrivate::setPos(float pos) { if (pos > 1.0) pos = 1.0; if (pos < 0) pos = 0; mPos = pos; +} + +bool LOTPlayerPrivate::update(float pos) +{ + if (!mCompItem) return false; + + mCompItem->resize(mSize); + setPos(pos); int frameNumber; if (mModel->isStatic()) frameNumber = 0; - else frameNumber = mModel->startFrame() + pos * mModel->frameDuration(); + else frameNumber = mModel->startFrame() + pos() * mModel->frameDuration(); - mCompItem->update(frameNumber); + return mCompItem->update(frameNumber); } -bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer) +bool LOTPlayerPrivate::render(float pos, const LOTBuffer &buffer, bool forceRender) { if (!mCompItem) return false; bool renderInProgress = mRenderInProgress.load(); if (renderInProgress) + { vCritical << "Already Rendering Scheduled for this Player"; + } - mRenderInProgress.store(true); - - update(pos); - bool result = mCompItem->render(buffer); + bool result = true; - mRenderInProgress.store(false); + if (update(pos) || forceRender) + { + mRenderInProgress.store(true); + result = mCompItem->render(buffer); + mRenderInProgress.store(false); + } return result; } @@ -109,7 +122,6 @@ bool LOTPlayerPrivate::setFilePath(std::string path) if (loader.load(path)) { mModel = loader.model(); mCompItem = std::make_unique(mModel.get()); - if (!mSize.isEmpty()) setSize(mSize); return true; } return false; @@ -133,6 +145,7 @@ struct RenderTask { LOTPlayerPrivate * playerImpl; float pos; LOTBuffer buffer; + bool forceRender; }; #include @@ -152,7 +165,7 @@ class RenderTaskScheduler { } if (!task && !_q[i].pop(task)) break; - bool result = task->playerImpl->render(task->pos, task->buffer); + bool result = task->playerImpl->render(task->pos, task->buffer, task->forceRender); task->sender.set_value(result); delete task; } @@ -188,12 +201,13 @@ public: } std::future render(LOTPlayerPrivate *impl, float pos, - LOTBuffer &&buffer) + LOTBuffer &&buffer, bool forceRender) { RenderTask *task = new RenderTask(); task->playerImpl = impl; task->pos = pos; task->buffer = std::move(buffer); + task->forceRender = forceRender; return async(task); } }; @@ -245,14 +259,14 @@ const std::vector &LOTPlayer::renderList(float pos) const return d->renderList(pos); } -std::future LOTPlayer::render(float pos, LOTBuffer buffer) +std::future LOTPlayer::render(float pos, LOTBuffer buffer, bool forceRender) { - return render_scheduler.render(d, pos, std::move(buffer)); + return render_scheduler.render(d, pos, std::move(buffer), forceRender); } -bool LOTPlayer::renderSync(float pos, LOTBuffer buffer) +bool LOTPlayer::renderSync(float pos, LOTBuffer buffer, bool forceRender) { - return d->render(pos, buffer); + return d->render(pos, buffer, forceRender); } void initLogging()