Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 057c91a2 authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

Fix start/pause behavior for AnimatedImageDrawable

Bug: 63908092
Test: HwAccelerationTests

Do not start the animation at creation time

When starting, first update the time, so it doesn't think we skipped a
bunch of frames if we're resuming.

Continue storing the SkPicture when stopped, so that we can continue to
show the same frame, without a jump.

Change-Id: I5ac77f2561fc9f42f8f69ebfbee21fe647cfc75a
parent 5511634f
Loading
Loading
Loading
Loading
+3 −4
Original line number Original line Diff line number Diff line
@@ -72,7 +72,6 @@ static jlong AnimatedImageDrawable_nCreate(JNIEnv* env, jobject /*clazz*/,
    }
    }


    sk_sp<AnimatedImageDrawable> drawable(new AnimatedImageDrawable(animatedImg));
    sk_sp<AnimatedImageDrawable> drawable(new AnimatedImageDrawable(animatedImg));
    drawable->start();
    return reinterpret_cast<jlong>(drawable.release());
    return reinterpret_cast<jlong>(drawable.release());
}
}


@@ -114,9 +113,9 @@ static jboolean AnimatedImageDrawable_nIsRunning(JNIEnv* env, jobject /*clazz*/,
    return drawable->isRunning();
    return drawable->isRunning();
}
}


static void AnimatedImageDrawable_nStart(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
static jboolean AnimatedImageDrawable_nStart(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
    auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr);
    auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr);
    drawable->start();
    return drawable->start();
}
}


static void AnimatedImageDrawable_nStop(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
static void AnimatedImageDrawable_nStop(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
@@ -138,7 +137,7 @@ static const JNINativeMethod gAnimatedImageDrawableMethods[] = {
    { "nGetAlpha",           "(J)I",                                                         (void*) AnimatedImageDrawable_nGetAlpha },
    { "nGetAlpha",           "(J)I",                                                         (void*) AnimatedImageDrawable_nGetAlpha },
    { "nSetColorFilter",     "(JJ)V",                                                        (void*) AnimatedImageDrawable_nSetColorFilter },
    { "nSetColorFilter",     "(JJ)V",                                                        (void*) AnimatedImageDrawable_nSetColorFilter },
    { "nIsRunning",          "(J)Z",                                                         (void*) AnimatedImageDrawable_nIsRunning },
    { "nIsRunning",          "(J)Z",                                                         (void*) AnimatedImageDrawable_nIsRunning },
    { "nStart",              "(J)V",                                                         (void*) AnimatedImageDrawable_nStart },
    { "nStart",              "(J)Z",                                                         (void*) AnimatedImageDrawable_nStart },
    { "nStop",               "(J)V",                                                         (void*) AnimatedImageDrawable_nStop },
    { "nStop",               "(J)V",                                                         (void*) AnimatedImageDrawable_nStop },
    { "nNativeByteSize",     "(J)J",                                                         (void*) AnimatedImageDrawable_nNativeByteSize },
    { "nNativeByteSize",     "(J)J",                                                         (void*) AnimatedImageDrawable_nNativeByteSize },
};
};
+2 −3
Original line number Original line Diff line number Diff line
@@ -166,8 +166,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable {


    @Override
    @Override
    public void start() {
    public void start() {
        if (isRunning() == false) {
        if (nStart(mNativePtr)) {
            nStart(mNativePtr);
            invalidateSelf();
            invalidateSelf();
        }
        }
    }
    }
@@ -186,7 +185,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable {
    private static native int nGetAlpha(long nativePtr);
    private static native int nGetAlpha(long nativePtr);
    private static native void nSetColorFilter(long nativePtr, long nativeFilter);
    private static native void nSetColorFilter(long nativePtr, long nativeFilter);
    private static native boolean nIsRunning(long nativePtr);
    private static native boolean nIsRunning(long nativePtr);
    private static native void nStart(long nativePtr);
    private static native boolean nStart(long nativePtr);
    private static native void nStop(long nativePtr);
    private static native void nStop(long nativePtr);
    private static native long nNativeByteSize(long nativePtr);
    private static native long nNativeByteSize(long nativePtr);
}
}
+13 −4
Original line number Original line Diff line number Diff line
@@ -36,18 +36,27 @@ void AnimatedImageDrawable::syncProperties() {
    mColorFilter = mStagingColorFilter;
    mColorFilter = mStagingColorFilter;
}
}


void AnimatedImageDrawable::start() {
bool AnimatedImageDrawable::start() {
    SkAutoExclusive lock(mLock);
    SkAutoExclusive lock(mLock);
    if (mSkAnimatedImage->isRunning()) {
        return false;
    }


    if (!mSnapshot) {
        mSnapshot.reset(mSkAnimatedImage->newPictureSnapshot());
        mSnapshot.reset(mSkAnimatedImage->newPictureSnapshot());
    }


    // While stopped, update() does not decode, but it does advance the time.
    // This prevents us from skipping ahead when we resume.
    const double currentTime = SkTime::GetMSecs();
    mSkAnimatedImage->update(currentTime);
    mSkAnimatedImage->start();
    mSkAnimatedImage->start();
    return mSkAnimatedImage->isRunning();
}
}


void AnimatedImageDrawable::stop() {
void AnimatedImageDrawable::stop() {
    SkAutoExclusive lock(mLock);
    SkAutoExclusive lock(mLock);
    mSkAnimatedImage->stop();
    mSkAnimatedImage->stop();
    mSnapshot.reset(nullptr);
}
}


bool AnimatedImageDrawable::isRunning() {
bool AnimatedImageDrawable::isRunning() {
@@ -120,7 +129,7 @@ void AnimatedImageDrawable::onDraw(SkCanvas* canvas) {
    }
    }


    SkAutoExclusive lock(mLock);
    SkAutoExclusive lock(mLock);
    if (mSkAnimatedImage->isRunning()) {
    if (mSnapshot) {
        canvas->drawPicture(mSnapshot, nullptr, lazyPaint.getMaybeNull());
        canvas->drawPicture(mSnapshot, nullptr, lazyPaint.getMaybeNull());
    } else {
    } else {
        // TODO: we could potentially keep the cached surface around if there is a paint and we know
        // TODO: we could potentially keep the cached surface around if there is a paint and we know
+2 −1
Original line number Original line Diff line number Diff line
@@ -58,7 +58,8 @@ public:


    double drawStaging(SkCanvas* canvas);
    double drawStaging(SkCanvas* canvas);


    void start();
    // Returns true if the animation was started; false otherwise (e.g. it was already running)
    bool start();
    void stop();
    void stop();
    bool isRunning();
    bool isRunning();