diff options
author | 2024-01-30 13:14:55 +0000 | |
---|---|---|
committer | 2024-02-08 11:40:48 +0000 | |
commit | f919b6dbf35c8a1309b529f93f1337b28095eced (patch) | |
tree | 41e80561522d60fc3b14d78751214b36aaf94516 | |
parent | 1239a7cd64c555025a8f2f188653a062061cdfd3 (diff) |
Add support for drawing drop shadow for PointerIcons in native code.
Bug: 305193969
Test: Manual
Flag: ACONFIG com.android.systemui.enable_vector_cursors DEVELOPMENT
Change-Id: Id19c11ccc4b528afdad19f6b68b36411108853c4
-rw-r--r-- | core/jni/android_view_PointerIcon.cpp | 6 | ||||
-rw-r--r-- | core/jni/android_view_PointerIcon.h | 2 | ||||
-rw-r--r-- | libs/input/SpriteIcon.cpp | 3 | ||||
-rw-r--r-- | libs/input/SpriteIcon.h | 13 | ||||
-rw-r--r-- | services/core/jni/com_android_server_input_InputManagerService.cpp | 17 |
5 files changed, 30 insertions, 11 deletions
diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp index c6a3b52d9397..86b0009227b3 100644 --- a/core/jni/android_view_PointerIcon.cpp +++ b/core/jni/android_view_PointerIcon.cpp @@ -37,6 +37,7 @@ static struct { jfieldID mHotSpotY; jfieldID mBitmapFrames; jfieldID mDurationPerFrame; + jfieldID mDrawNativeDropShadow; } gPointerIconClassInfo; @@ -51,6 +52,8 @@ PointerIcon android_view_PointerIcon_toNative(JNIEnv* env, jobject pointerIconOb env->GetIntField(pointerIconObj, gPointerIconClassInfo.mType)); icon.hotSpotX = env->GetFloatField(pointerIconObj, gPointerIconClassInfo.mHotSpotX); icon.hotSpotY = env->GetFloatField(pointerIconObj, gPointerIconClassInfo.mHotSpotY); + icon.drawNativeDropShadow = + env->GetBooleanField(pointerIconObj, gPointerIconClassInfo.mDrawNativeDropShadow); ScopedLocalRef<jobject> bitmapObj( env, env->GetObjectField(pointerIconObj, gPointerIconClassInfo.mBitmap)); @@ -95,6 +98,9 @@ int register_android_view_PointerIcon(JNIEnv* env) { gPointerIconClassInfo.mBitmapFrames = GetFieldIDOrDie(env, gPointerIconClassInfo.clazz, "mBitmapFrames", "[Landroid/graphics/Bitmap;"); + gPointerIconClassInfo.mDrawNativeDropShadow = + GetFieldIDOrDie(env, gPointerIconClassInfo.clazz, "mDrawNativeDropShadow", "Z"); + gPointerIconClassInfo.mDurationPerFrame = GetFieldIDOrDie(env, gPointerIconClassInfo.clazz, "mDurationPerFrame", "I"); diff --git a/core/jni/android_view_PointerIcon.h b/core/jni/android_view_PointerIcon.h index ee446fb92a4f..1b6a3977bf61 100644 --- a/core/jni/android_view_PointerIcon.h +++ b/core/jni/android_view_PointerIcon.h @@ -39,6 +39,7 @@ struct PointerIcon { float hotSpotY; std::vector<graphics::Bitmap> bitmapFrames; int32_t durationPerFrame; + bool drawNativeDropShadow; inline bool isNullIcon() { return style == PointerIconStyle::TYPE_NULL; } @@ -49,6 +50,7 @@ struct PointerIcon { hotSpotY = 0; bitmapFrames.clear(); durationPerFrame = 0; + drawNativeDropShadow = false; } }; diff --git a/libs/input/SpriteIcon.cpp b/libs/input/SpriteIcon.cpp index b7e51e22a214..59e36e4b0d1e 100644 --- a/libs/input/SpriteIcon.cpp +++ b/libs/input/SpriteIcon.cpp @@ -34,6 +34,9 @@ bool SpriteIcon::draw(sp<Surface> surface) const { graphics::Paint paint; paint.setBlendMode(ABLEND_MODE_SRC); + if (drawNativeDropShadow) { + paint.setImageFilter(AIMAGE_FILTER_DROP_SHADOW_FOR_POINTER_ICON); + } graphics::Canvas canvas(outBuffer, (int32_t)surface->getBuffersDataSpace()); canvas.drawBitmap(bitmap, 0, 0, &paint); diff --git a/libs/input/SpriteIcon.h b/libs/input/SpriteIcon.h index 5f085bbd2374..9e6cc81f0bb4 100644 --- a/libs/input/SpriteIcon.h +++ b/libs/input/SpriteIcon.h @@ -29,16 +29,22 @@ namespace android { struct SpriteIcon { inline SpriteIcon() : style(PointerIconStyle::TYPE_NULL), hotSpotX(0), hotSpotY(0) {} inline SpriteIcon(const graphics::Bitmap& bitmap, PointerIconStyle style, float hotSpotX, - float hotSpotY) - : bitmap(bitmap), style(style), hotSpotX(hotSpotX), hotSpotY(hotSpotY) {} + float hotSpotY, bool drawNativeDropShadow) + : bitmap(bitmap), + style(style), + hotSpotX(hotSpotX), + hotSpotY(hotSpotY), + drawNativeDropShadow(drawNativeDropShadow) {} graphics::Bitmap bitmap; PointerIconStyle style; float hotSpotX; float hotSpotY; + bool drawNativeDropShadow; inline SpriteIcon copy() const { - return SpriteIcon(bitmap.copy(ANDROID_BITMAP_FORMAT_RGBA_8888), style, hotSpotX, hotSpotY); + return SpriteIcon(bitmap.copy(ANDROID_BITMAP_FORMAT_RGBA_8888), style, hotSpotX, hotSpotY, + drawNativeDropShadow); } inline void reset() { @@ -46,6 +52,7 @@ struct SpriteIcon { style = PointerIconStyle::TYPE_NULL; hotSpotX = 0; hotSpotY = 0; + drawNativeDropShadow = false; } inline bool isValid() const { return bitmap.isValid() && !bitmap.isEmpty(); } diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index cbc301b87295..34f9efe1e503 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -238,7 +238,7 @@ static SpriteIcon toSpriteIcon(PointerIcon pointerIcon) { // to the underlying bitmap, so even if the java object is released, we will still have access // to it. return SpriteIcon(pointerIcon.bitmap, pointerIcon.style, pointerIcon.hotSpotX, - pointerIcon.hotSpotY); + pointerIcon.hotSpotY, pointerIcon.drawNativeDropShadow); } enum { @@ -1733,13 +1733,14 @@ void NativeInputManager::loadAdditionalMouseResources( animationData.durationPerFrame = milliseconds_to_nanoseconds(pointerIcon.durationPerFrame); animationData.animationFrames.reserve(numFrames); - animationData.animationFrames.push_back(SpriteIcon( - pointerIcon.bitmap, pointerIcon.style, - pointerIcon.hotSpotX, pointerIcon.hotSpotY)); + animationData.animationFrames.emplace_back(pointerIcon.bitmap, pointerIcon.style, + pointerIcon.hotSpotX, pointerIcon.hotSpotY, + pointerIcon.drawNativeDropShadow); for (size_t i = 0; i < numFrames - 1; ++i) { - animationData.animationFrames.push_back(SpriteIcon( - pointerIcon.bitmapFrames[i], pointerIcon.style, - pointerIcon.hotSpotX, pointerIcon.hotSpotY)); + animationData.animationFrames.emplace_back(pointerIcon.bitmapFrames[i], + pointerIcon.style, pointerIcon.hotSpotX, + pointerIcon.hotSpotY, + pointerIcon.drawNativeDropShadow); } } } @@ -2570,7 +2571,7 @@ static bool nativeSetPointerIcon(JNIEnv* env, jobject nativeImplObj, jobject ico icon = std::make_unique<SpriteIcon>(pointerIcon.bitmap.copy( ANDROID_BITMAP_FORMAT_RGBA_8888), pointerIcon.style, pointerIcon.hotSpotX, - pointerIcon.hotSpotY); + pointerIcon.hotSpotY, pointerIcon.drawNativeDropShadow); } else { icon = pointerIcon.style; } |