diff options
author | John Reck <jreck@google.com> | 2016-02-11 17:02:33 +0000 |
---|---|---|
committer | John Reck <jreck@google.com> | 2016-02-11 17:02:33 +0000 |
commit | e03ef25a3e44ef5d495e366c30b9b5b69fc58194 (patch) | |
tree | 4db5a1124bf667a84b48d98289233b8cca0098ed /libs/hwui/AnimatorManager.cpp | |
parent | 18bdf443e371e9f293439b4ff92cc79abaa422e5 (diff) |
Revert "VectorDrawable native rendering - Step 5 of MANY"
Bug: 27136799
This reverts commit 18bdf443e371e9f293439b4ff92cc79abaa422e5.
Change-Id: I825b061eec2a591f2d18119ba64494624b9ad4f2
Diffstat (limited to 'libs/hwui/AnimatorManager.cpp')
-rw-r--r-- | libs/hwui/AnimatorManager.cpp | 64 |
1 files changed, 30 insertions, 34 deletions
diff --git a/libs/hwui/AnimatorManager.cpp b/libs/hwui/AnimatorManager.cpp index 2b49b4743d89..cd30b1859384 100644 --- a/libs/hwui/AnimatorManager.cpp +++ b/libs/hwui/AnimatorManager.cpp @@ -27,8 +27,9 @@ namespace uirenderer { using namespace std; -static void detach(sp<BaseRenderNodeAnimator>& animator) { +static void unref(BaseRenderNodeAnimator* animator) { animator->detach(); + animator->decStrong(nullptr); } AnimatorManager::AnimatorManager(RenderNode& parent) @@ -37,12 +38,14 @@ AnimatorManager::AnimatorManager(RenderNode& parent) } AnimatorManager::~AnimatorManager() { - for_each(mNewAnimators.begin(), mNewAnimators.end(), detach); - for_each(mAnimators.begin(), mAnimators.end(), detach); + for_each(mNewAnimators.begin(), mNewAnimators.end(), unref); + for_each(mAnimators.begin(), mAnimators.end(), unref); } void AnimatorManager::addAnimator(const sp<BaseRenderNodeAnimator>& animator) { - mNewAnimators.emplace_back(animator.get()); + animator->incStrong(nullptr); + animator->attach(&mParent); + mNewAnimators.push_back(animator.get()); } void AnimatorManager::setAnimationHandle(AnimationHandle* handle) { @@ -53,31 +56,25 @@ void AnimatorManager::setAnimationHandle(AnimationHandle* handle) { &mParent, mParent.getName()); } +template<typename T> +static void move_all(T& source, T& dest) { + dest.reserve(source.size() + dest.size()); + for (typename T::iterator it = source.begin(); it != source.end(); it++) { + dest.push_back(*it); + } + source.clear(); +} + void AnimatorManager::pushStaging() { if (mNewAnimators.size()) { LOG_ALWAYS_FATAL_IF(!mAnimationHandle, "Trying to start new animators on %p (%s) without an animation handle!", &mParent, mParent.getName()); - // Only add animators that are not already in the on-going animator list. - for (auto& animator : mNewAnimators) { - RenderNode* targetRenderNode = animator->target(); - if (targetRenderNode == &mParent) { - // Animator already in the animator list: skip adding again - continue; - } - - if (targetRenderNode){ - // If the animator is already in another RenderNode's animator list, remove animator from - // that list and add animator to current RenderNode's list. - targetRenderNode->animators().removeActiveAnimator(animator); - } - animator->attach(&mParent); - mAnimators.push_back(std::move(animator)); - } - mNewAnimators.clear(); + // Since this is a straight move, we don't need to inc/dec the ref count + move_all(mNewAnimators, mAnimators); } - for (auto& animator : mAnimators) { - animator->pushStaging(mAnimationHandle->context()); + for (vector<BaseRenderNodeAnimator*>::iterator it = mAnimators.begin(); it != mAnimators.end(); it++) { + (*it)->pushStaging(mAnimationHandle->context()); } } @@ -86,11 +83,11 @@ public: AnimateFunctor(TreeInfo& info, AnimationContext& context) : dirtyMask(0), mInfo(info), mContext(context) {} - bool operator() (sp<BaseRenderNodeAnimator>& animator) { + bool operator() (BaseRenderNodeAnimator* animator) { dirtyMask |= animator->dirtyMask(); bool remove = animator->animate(mContext); if (remove) { - animator->detach(); + animator->decStrong(nullptr); } else { if (animator->isRunning()) { mInfo.out.hasAnimations = true; @@ -132,18 +129,20 @@ void AnimatorManager::animateNoDamage(TreeInfo& info) { uint32_t AnimatorManager::animateCommon(TreeInfo& info) { AnimateFunctor functor(info, mAnimationHandle->context()); - auto newEnd = std::remove_if(mAnimators.begin(), mAnimators.end(), functor); + std::vector< BaseRenderNodeAnimator* >::iterator newEnd; + newEnd = std::remove_if(mAnimators.begin(), mAnimators.end(), functor); mAnimators.erase(newEnd, mAnimators.end()); mAnimationHandle->notifyAnimationsRan(); mParent.mProperties.updateMatrix(); return functor.dirtyMask; } -static void endStagingAnimator(sp<BaseRenderNodeAnimator>& animator) { - animator->cancel(); +static void endStagingAnimator(BaseRenderNodeAnimator* animator) { + animator->end(); if (animator->listener()) { - animator->listener()->onAnimationFinished(animator.get()); + animator->listener()->onAnimationFinished(animator); } + animator->decStrong(nullptr); } void AnimatorManager::endAllStagingAnimators() { @@ -154,16 +153,13 @@ void AnimatorManager::endAllStagingAnimators() { mNewAnimators.clear(); } -void AnimatorManager::removeActiveAnimator(const sp<BaseRenderNodeAnimator>& animator) { - std::remove(mAnimators.begin(), mAnimators.end(), animator); -} - class EndActiveAnimatorsFunctor { public: EndActiveAnimatorsFunctor(AnimationContext& context) : mContext(context) {} - void operator() (sp<BaseRenderNodeAnimator>& animator) { + void operator() (BaseRenderNodeAnimator* animator) { animator->forceEndNow(mContext); + animator->decStrong(nullptr); } private: |