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

Commit 08a45549 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Initial implmentation of AnimatedImageDrawables on the RenderThread."

parents df64ef9b 2d142138
Loading
Loading
Loading
Loading
+18 −21
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include "ImageDecoder.h"
#include "core_jni_helpers.h"

#include <hwui/AnimatedImageDrawable.h>
#include <hwui/Canvas.h>
#include <SkAndroidCodec.h>
#include <SkAnimatedImage.h>
@@ -27,10 +28,6 @@

using namespace android;

struct AnimatedImageDrawable {
    sk_sp<SkAnimatedImage> mDrawable;
    SkPaint                mPaint;
};

// Note: jpostProcess holds a handle to the ImageDecoder.
static jlong AnimatedImageDrawable_nCreate(JNIEnv* env, jobject /*clazz*/,
@@ -65,20 +62,22 @@ static jlong AnimatedImageDrawable_nCreate(JNIEnv* env, jobject /*clazz*/,
        picture = recorder.finishRecordingAsPicture();
    }

    std::unique_ptr<AnimatedImageDrawable> drawable(new AnimatedImageDrawable);
    drawable->mDrawable = SkAnimatedImage::Make(std::move(imageDecoder->mCodec),
                scaledSize, subset, std::move(picture));
    if (!drawable->mDrawable) {

    sk_sp<SkAnimatedImage> animatedImg = SkAnimatedImage::Make(std::move(imageDecoder->mCodec),
                                                               scaledSize, subset,
                                                               std::move(picture));
    if (!animatedImg) {
        doThrowIOE(env, "Failed to create drawable");
        return 0;
    }
    drawable->mDrawable->start();

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

static void AnimatedImageDrawable_destruct(AnimatedImageDrawable* drawable) {
    delete drawable;
    SkSafeUnref(drawable);
}

static jlong AnimatedImageDrawable_nGetNativeFinalizer(JNIEnv* /*env*/, jobject /*clazz*/) {
@@ -86,45 +85,43 @@ static jlong AnimatedImageDrawable_nGetNativeFinalizer(JNIEnv* /*env*/, jobject
}

static jlong AnimatedImageDrawable_nDraw(JNIEnv* env, jobject /*clazz*/, jlong nativePtr,
                                         jlong canvasPtr, jlong msecs) {
                                         jlong canvasPtr) {
    auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr);
    double timeToNextUpdate = drawable->mDrawable->update(msecs);
    auto* canvas = reinterpret_cast<Canvas*>(canvasPtr);
    canvas->drawAnimatedImage(drawable->mDrawable.get(), 0, 0, &drawable->mPaint);
    return (jlong) timeToNextUpdate;
    return (jlong) canvas->drawAnimatedImage(drawable);
}

static void AnimatedImageDrawable_nSetAlpha(JNIEnv* env, jobject /*clazz*/, jlong nativePtr,
                                            jint alpha) {
    auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr);
    drawable->mPaint.setAlpha(alpha);
    drawable->setStagingAlpha(alpha);
}

static jlong AnimatedImageDrawable_nGetAlpha(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
    auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr);
    return drawable->mPaint.getAlpha();
    return drawable->getStagingAlpha();
}

static void AnimatedImageDrawable_nSetColorFilter(JNIEnv* env, jobject /*clazz*/, jlong nativePtr,
                                                  jlong nativeFilter) {
    auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr);
    auto* filter = reinterpret_cast<SkColorFilter*>(nativeFilter);
    drawable->mPaint.setColorFilter(sk_ref_sp(filter));
    drawable->setStagingColorFilter(sk_ref_sp(filter));
}

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

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

static void AnimatedImageDrawable_nStop(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
    auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr);
    drawable->mDrawable->stop();
    drawable->stop();
}

static long AnimatedImageDrawable_nNativeByteSize(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
@@ -136,7 +133,7 @@ static long AnimatedImageDrawable_nNativeByteSize(JNIEnv* env, jobject /*clazz*/
static const JNINativeMethod gAnimatedImageDrawableMethods[] = {
    { "nCreate",             "(JLandroid/graphics/ImageDecoder;IILandroid/graphics/Rect;)J", (void*) AnimatedImageDrawable_nCreate },
    { "nGetNativeFinalizer", "()J",                                                          (void*) AnimatedImageDrawable_nGetNativeFinalizer },
    { "nDraw",               "(JJJ)J",                                                       (void*) AnimatedImageDrawable_nDraw },
    { "nDraw",               "(JJ)J",                                                        (void*) AnimatedImageDrawable_nDraw },
    { "nSetAlpha",           "(JI)V",                                                        (void*) AnimatedImageDrawable_nSetAlpha },
    { "nGetAlpha",           "(J)I",                                                         (void*) AnimatedImageDrawable_nGetAlpha },
    { "nSetColorFilter",     "(JJ)V",                                                        (void*) AnimatedImageDrawable_nSetColorFilter },
+13 −5
Original line number Diff line number Diff line
@@ -118,10 +118,13 @@ public class AnimatedImageDrawable extends Drawable implements Animatable {

    @Override
    public void draw(@NonNull Canvas canvas) {
        long nextUpdate = nDraw(mNativePtr, canvas.getNativeCanvasWrapper(),
                SystemClock.uptimeMillis());
        long nextUpdate = nDraw(mNativePtr, canvas.getNativeCanvasWrapper());
        // a value <= 0 indicates that the drawable is stopped or that renderThread
        // will manage the animation
        if (nextUpdate > 0) {
            scheduleSelf(mRunnable, nextUpdate);
        }
    }

    @Override
    public void setAlpha(@IntRange(from=0,to=255) int alpha) {
@@ -130,6 +133,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable {
                   + " 255! provided " + alpha);
        }
        nSetAlpha(mNativePtr, alpha);
        invalidateSelf();
    }

    @Override
@@ -141,6 +145,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable {
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        long nativeFilter = colorFilter == null ? 0 : colorFilter.getNativeInstance();
        nSetColorFilter(mNativePtr, nativeFilter);
        invalidateSelf();
    }

    @Override
@@ -161,7 +166,10 @@ public class AnimatedImageDrawable extends Drawable implements Animatable {

    @Override
    public void start() {
        if (isRunning() == false) {
            nStart(mNativePtr);
            invalidateSelf();
        }
    }

    @Override
@@ -173,7 +181,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable {
            @Nullable ImageDecoder decoder, int width, int height, Rect cropRect)
        throws IOException;
    private static native long nGetNativeFinalizer();
    private static native long nDraw(long nativePtr, long canvasNativePtr, long msecs);
    private static native long nDraw(long nativePtr, long canvasNativePtr);
    private static native void nSetAlpha(long nativePtr, int alpha);
    private static native int nGetAlpha(long nativePtr);
    private static native void nSetColorFilter(long nativePtr, long nativeFilter);
+1 −0
Original line number Diff line number Diff line
@@ -137,6 +137,7 @@ cc_defaults {
    whole_static_libs: ["libskia"],

    srcs: [
        "hwui/AnimatedImageDrawable.cpp",
        "hwui/Bitmap.cpp",
        "font/CacheTexture.cpp",
        "font/Font.cpp",
+2 −2
Original line number Diff line number Diff line
@@ -495,9 +495,9 @@ void RecordingCanvas::drawNinePatch(Bitmap& bitmap, const android::Res_png_9patc
                                          refPaint(paint), refBitmap(bitmap), refPatch(&patch)));
}

void RecordingCanvas::drawAnimatedImage(SkAnimatedImage*, float left, float top,
                                        const SkPaint*) {
double RecordingCanvas::drawAnimatedImage(AnimatedImageDrawable*) {
    // Unimplemented
    return 0;
}

// Text
+1 −2
Original line number Diff line number Diff line
@@ -183,8 +183,7 @@ public:
    virtual void drawNinePatch(Bitmap& bitmap, const android::Res_png_9patch& chunk, float dstLeft,
                               float dstTop, float dstRight, float dstBottom,
                               const SkPaint* paint) override;
    virtual void drawAnimatedImage(SkAnimatedImage*, float left, float top,
                                   const SkPaint* paint) override;
    virtual double drawAnimatedImage(AnimatedImageDrawable*) override;

    // Text
    virtual bool drawTextAbsolutePos() const override { return false; }
Loading