Add support for ImageFilters to paint in APEX.

Bug: 305193969
Test: Manual
Flag: ACONFIG com.android.systemui.enable_vector_cursors DEVELOPMENT
Change-Id: I0e5310c51aea32df304cc28ce1824debfe47af44
diff --git a/libs/hwui/apex/android_paint.cpp b/libs/hwui/apex/android_paint.cpp
index cc79cba..5e73e76 100644
--- a/libs/hwui/apex/android_paint.cpp
+++ b/libs/hwui/apex/android_paint.cpp
@@ -14,12 +14,13 @@
  * limitations under the License.
  */
 
-#include "android/graphics/paint.h"
+#include <SkBlendMode.h>
+#include <SkImageFilter.h>
+#include <hwui/Paint.h>
 
 #include "TypeCast.h"
-
-#include <hwui/Paint.h>
-#include <SkBlendMode.h>
+#include "android/graphics/paint.h"
+#include "include/effects/SkImageFilters.h"
 
 using namespace android;
 
@@ -43,6 +44,22 @@
     }
 }
 
+static sk_sp<SkImageFilter> convertImageFilter(AImageFilter imageFilter) {
+    switch (imageFilter) {
+        case AIMAGE_FILTER_DROP_SHADOW_FOR_POINTER_ICON:
+            // Material Elevation Level 1 Drop Shadow.
+            sk_sp<SkImageFilter> key_shadow = SkImageFilters::DropShadow(
+                    0.0f, 1.0f, 2.0f, 2.0f, SkColorSetARGB(0x4D, 0x00, 0x00, 0x00), nullptr);
+            sk_sp<SkImageFilter> ambient_shadow = SkImageFilters::DropShadow(
+                    0.0f, 1.0f, 3.0f, 3.0f, SkColorSetARGB(0x26, 0x00, 0x00, 0x00), nullptr);
+            return SkImageFilters::Compose(ambient_shadow, key_shadow);
+    }
+}
+
 void APaint_setBlendMode(APaint* paint, ABlendMode blendMode) {
     TypeCast::toPaint(paint)->setBlendMode(convertBlendMode(blendMode));
 }
+
+void APaint_setImageFilter(APaint* paint, AImageFilter imageFilter) {
+    TypeCast::toPaint(paint)->setImageFilter(convertImageFilter(imageFilter));
+}
diff --git a/libs/hwui/apex/include/android/graphics/paint.h b/libs/hwui/apex/include/android/graphics/paint.h
index 058db8d..36b7575 100644
--- a/libs/hwui/apex/include/android/graphics/paint.h
+++ b/libs/hwui/apex/include/android/graphics/paint.h
@@ -26,6 +26,14 @@
  */
 typedef struct APaint APaint;
 
+/**
+ * Predefined Image filter type.
+ */
+enum AImageFilter {
+    /** Drop shadow image filter for PointerIcons. */
+    AIMAGE_FILTER_DROP_SHADOW_FOR_POINTER_ICON = 0,
+};
+
 /** Bitmap pixel format. */
 enum ABlendMode {
     /** replaces destination with zero: fully transparent */
@@ -42,6 +50,8 @@
 
 ANDROID_API void APaint_setBlendMode(APaint* paint, ABlendMode blendMode);
 
+ANDROID_API void APaint_setImageFilter(APaint* paint, AImageFilter imageFilter);
+
 __END_DECLS
 
 #ifdef	__cplusplus
@@ -54,6 +64,10 @@
 
         void setBlendMode(ABlendMode blendMode) { APaint_setBlendMode(mPaint, blendMode); }
 
+        void setImageFilter(AImageFilter imageFilter) {
+            APaint_setImageFilter(mPaint, imageFilter);
+        }
+
         const APaint& get() const { return *mPaint; }
 
     private:
diff --git a/libs/hwui/libhwui.map.txt b/libs/hwui/libhwui.map.txt
index fdb2373..d03ceb4 100644
--- a/libs/hwui/libhwui.map.txt
+++ b/libs/hwui/libhwui.map.txt
@@ -32,6 +32,7 @@
     APaint_createPaint;
     APaint_destroyPaint;
     APaint_setBlendMode;
+    APaint_setImageFilter;
     ARegionIterator_acquireIterator;
     ARegionIterator_releaseIterator;
     ARegionIterator_isComplex;