Renderer renderer = actor.GetRendererAt(0u);
DALI_TEST_CHECK(renderer);
- Property::Map map = actor.GetProperty<Property::Map>(DummyControl::Property::TEST_VISUAL);
- Property::Value* value = map.Find(DevelImageVisual::Property::PLAY_RANGE);
+ Property::Map map = actor.GetProperty<Property::Map>(DummyControl::Property::TEST_VISUAL);
+ Property::Value* value = map.Find(DevelImageVisual::Property::PLAY_RANGE);
+ int totalFrameNumber = map.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER)->Get<int>();
int resultStartFrame, resultEndFrame;
Property::Array* result = value->GetArray();
result->GetElementAt(0).Get(resultStartFrame);
result->GetElementAt(1).Get(resultEndFrame);
- DALI_TEST_EQUALS(startFrame, resultStartFrame, TEST_LOCATION); // Should not be changed
- DALI_TEST_EQUALS(endFrame, resultEndFrame, TEST_LOCATION);
+ DALI_TEST_EQUALS(resultStartFrame, 1, TEST_LOCATION);
+ DALI_TEST_EQUALS(resultEndFrame, totalFrameNumber - 1, TEST_LOCATION); // Should be clamped
DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, Property::Map());
application.SendNotification();
- // Trigger count is 2 - load, resource ready
- DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+ // Trigger count is 1 - load
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
+ // Trigger count is 1 - resource ready
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
textureTrace.Enable(true);
{
mAnimationFinishedTrigger.reset();
}
+ if(mLoadCompletedTrigger)
+ {
+ mLoadCompletedTrigger.reset();
+ }
mVectorRenderer.Finalize();
mVectorAnimationThread.AddTask(this);
}
+bool VectorAnimationTask::IsLoadRequested() const
+{
+ return mLoadRequest;
+}
+
void VectorAnimationTask::SetAnimationData(const AnimationData& data)
{
ConditionalWait::ScopedLock lock(mConditionalWait);
}
// Make sure the range specified is between 0 and the total frame number
- if(startFrame < mTotalFrame && endFrame < mTotalFrame)
+ startFrame = std::min(startFrame, mTotalFrame - 1);
+ endFrame = std::min(endFrame, mTotalFrame - 1);
+
+ // If the range is not in order swap values
+ if(startFrame > endFrame)
{
- // If the range is not in order swap values
- if(startFrame > endFrame)
+ uint32_t temp = startFrame;
+ startFrame = endFrame;
+ endFrame = temp;
+ }
+
+ if(startFrame != mStartFrame || endFrame != mEndFrame)
+ {
+ mStartFrame = startFrame;
+ mEndFrame = endFrame;
+
+ // If the current frame is out of the range, change the current frame also.
+ if(mStartFrame > mCurrentFrame)
{
- uint32_t temp = startFrame;
- startFrame = endFrame;
- endFrame = temp;
+ mCurrentFrame = mStartFrame;
}
-
- if(startFrame != mStartFrame || endFrame != mEndFrame)
+ else if(mEndFrame < mCurrentFrame)
{
- mStartFrame = startFrame;
- mEndFrame = endFrame;
-
- // If the current frame is out of the range, change the current frame also.
- if(mStartFrame > mCurrentFrame)
- {
- mCurrentFrame = mStartFrame;
- }
- else if(mEndFrame < mCurrentFrame)
- {
- mCurrentFrame = mEndFrame;
- }
-
- DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::SetPlayRange: [%d, %d] [%s] [%p]\n", mStartFrame, mEndFrame, mUrl.c_str(), this);
+ mCurrentFrame = mEndFrame;
}
- }
- else
- {
- DALI_LOG_ERROR("VectorAnimationTask::SetPlayRange: Invalid range (%d, %d) [%s] [%p]\n", startFrame, endFrame, mUrl.c_str(), this);
- return;
+
+ DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::SetPlayRange: [%d, %d] [%s] [%p]\n", mStartFrame, mEndFrame, mUrl.c_str(), this);
}
}
void SetRenderer(Renderer renderer);
/**
- * @brief Request to load the animation file.
+ * @brief Requests to load the animation file.
*
* @param[in] url The url of the vector animation file
*/
void RequestLoad(const std::string& url);
/**
+ * @brief Queries whether loading is requested.
+ * @return True if loading is requested.
+ */
+ bool IsLoadRequested() const;
+
+ /**
* @brief Sets data to specify animation playback.
* @param[in] data The animation data
*/
{
ConditionalWait::ScopedLock lock(mConditionalWait);
- if(mAnimationTasks.end() == std::find(mAnimationTasks.begin(), mAnimationTasks.end(), task))
+ // Find if the task is already in the list except loading task
+ auto iter = std::find_if(mAnimationTasks.begin(), mAnimationTasks.end(), [task](VectorAnimationTaskPtr& element) { return (element == task && !element->IsLoadRequested()); });
+ if(iter == mAnimationTasks.end())
{
auto currentTime = task->CalculateNextFrameTime(true); // Rasterize as soon as possible