Loading core/jni/android/graphics/AnimatedImageDrawable.cpp +18 −21 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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*/, Loading Loading @@ -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*/) { Loading @@ -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) { Loading @@ -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 }, Loading graphics/java/android/graphics/drawable/AnimatedImageDrawable.java +13 −5 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -130,6 +133,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable { + " 255! provided " + alpha); } nSetAlpha(mNativePtr, alpha); invalidateSelf(); } @Override Loading @@ -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 Loading @@ -161,7 +166,10 @@ public class AnimatedImageDrawable extends Drawable implements Animatable { @Override public void start() { if (isRunning() == false) { nStart(mNativePtr); invalidateSelf(); } } @Override Loading @@ -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); Loading libs/hwui/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -137,6 +137,7 @@ cc_defaults { whole_static_libs: ["libskia"], srcs: [ "hwui/AnimatedImageDrawable.cpp", "hwui/Bitmap.cpp", "font/CacheTexture.cpp", "font/Font.cpp", Loading libs/hwui/RecordingCanvas.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading libs/hwui/RecordingCanvas.h +1 −2 Original line number Diff line number Diff line Loading @@ -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 Loading
core/jni/android/graphics/AnimatedImageDrawable.cpp +18 −21 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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*/, Loading Loading @@ -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*/) { Loading @@ -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) { Loading @@ -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 }, Loading
graphics/java/android/graphics/drawable/AnimatedImageDrawable.java +13 −5 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -130,6 +133,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable { + " 255! provided " + alpha); } nSetAlpha(mNativePtr, alpha); invalidateSelf(); } @Override Loading @@ -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 Loading @@ -161,7 +166,10 @@ public class AnimatedImageDrawable extends Drawable implements Animatable { @Override public void start() { if (isRunning() == false) { nStart(mNativePtr); invalidateSelf(); } } @Override Loading @@ -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); Loading
libs/hwui/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -137,6 +137,7 @@ cc_defaults { whole_static_libs: ["libskia"], srcs: [ "hwui/AnimatedImageDrawable.cpp", "hwui/Bitmap.cpp", "font/CacheTexture.cpp", "font/Font.cpp", Loading
libs/hwui/RecordingCanvas.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -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 Loading
libs/hwui/RecordingCanvas.h +1 −2 Original line number Diff line number Diff line Loading @@ -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