Adding force-dark support to RippleDrawable

Add force-dark support to RippleDrawable by modifying the ink color.

Test: manual
Test: atest CanvasOp
Fixes: 186130682
Change-Id: I89eaaf3afa5ec53a74d2d08de8cff6484e55a912
diff --git a/libs/hwui/pipeline/skia/AnimatedDrawables.h b/libs/hwui/pipeline/skia/AnimatedDrawables.h
index 7d65be1..10889e7 100644
--- a/libs/hwui/pipeline/skia/AnimatedDrawables.h
+++ b/libs/hwui/pipeline/skia/AnimatedDrawables.h
@@ -22,6 +22,7 @@
 #include <math.h>
 #include <utils/RefBase.h>
 #include "CanvasProperty.h"
+#include "CanvasTransform.h"
 
 namespace android {
 namespace uirenderer {
@@ -56,89 +57,80 @@
     sp<uirenderer::CanvasPropertyPaint> mPaint;
 };
 
-class AnimatedRipple : public SkDrawable {
-public:
-    AnimatedRipple(uirenderer::CanvasPropertyPrimitive* x, uirenderer::CanvasPropertyPrimitive* y,
-                   uirenderer::CanvasPropertyPrimitive* radius,
-                   uirenderer::CanvasPropertyPaint* paint,
-                   uirenderer::CanvasPropertyPrimitive* progress,
-                   uirenderer::CanvasPropertyPrimitive* turbulencePhase,
-                   const SkRuntimeShaderBuilder& effectBuilder)
-            : mX(x)
-            , mY(y)
-            , mRadius(radius)
-            , mPaint(paint)
-            , mProgress(progress)
-            , mTurbulencePhase(turbulencePhase)
-            , mRuntimeEffectBuilder(effectBuilder) {}
+struct RippleDrawableParams {
+    sp<uirenderer::CanvasPropertyPrimitive> x;
+    sp<uirenderer::CanvasPropertyPrimitive> y;
+    sp<uirenderer::CanvasPropertyPrimitive> radius;
+    sp<uirenderer::CanvasPropertyPrimitive> progress;
+    sp<uirenderer::CanvasPropertyPrimitive> turbulencePhase;
+    SkColor color;
+    sp<uirenderer::CanvasPropertyPaint> paint;
+    SkRuntimeShaderBuilder effectBuilder;
+};
 
-protected:
-    virtual SkRect onGetBounds() override {
-        const float x = mX->value;
-        const float y = mY->value;
-        const float radius = mRadius->value;
-        return SkRect::MakeLTRB(x - radius, y - radius, x + radius, y + radius);
-    }
-    virtual void onDraw(SkCanvas* canvas) override {
-        setUniform2f("in_origin", mX->value, mY->value);
-        setUniform("in_radius", mRadius);
-        setUniform("in_progress", mProgress);
-        setUniform("in_turbulencePhase", mTurbulencePhase);
+class AnimatedRippleDrawable {
+public:
+    static void draw(SkCanvas* canvas, const RippleDrawableParams& params) {
+        auto& effectBuilder = const_cast<SkRuntimeShaderBuilder&>(params.effectBuilder);
+
+        setUniform2f(effectBuilder, "in_origin", params.x->value, params.y->value);
+        setUniform(effectBuilder, "in_radius", params.radius);
+        setUniform(effectBuilder, "in_progress", params.progress);
+        setUniform(effectBuilder, "in_turbulencePhase", params.turbulencePhase);
+
+        SkRuntimeShaderBuilder::BuilderUniform uniform = effectBuilder.uniform("in_color");
+        if (uniform.fVar != nullptr) {
+            uniform = SkV4{SkColorGetR(params.color) / 255.0f, SkColorGetG(params.color) / 255.0f,
+                           SkColorGetB(params.color) / 255.0f, SkColorGetA(params.color) / 255.0f};
+        }
+
+        const float CIRCLE_X_1 = 0.01 * cos(SCALE * 0.55);
+        const float CIRCLE_Y_1 = 0.01 * sin(SCALE * 0.55);
+        const float CIRCLE_X_2 = -0.0066 * cos(SCALE * 0.45);
+        const float CIRCLE_Y_2 = -0.0066 * sin(SCALE * 0.45);
+        const float CIRCLE_X_3 = -0.0066 * cos(SCALE * 0.35);
+        const float CIRCLE_Y_3 = -0.0066 * sin(SCALE * 0.35);
 
         //
         // Keep in sync with:
         // frameworks/base/graphics/java/android/graphics/drawable/RippleShader.java
         //
-        const float turbulencePhase = mTurbulencePhase->value;
-        setUniform2f("in_tCircle1", SCALE * 0.5 + (turbulencePhase * CIRCLE_X_1),
+        const float turbulencePhase = params.turbulencePhase->value;
+        setUniform2f(effectBuilder, "in_tCircle1", SCALE * 0.5 + (turbulencePhase * CIRCLE_X_1),
                      SCALE * 0.5 + (turbulencePhase * CIRCLE_Y_1));
-        setUniform2f("in_tCircle2", SCALE * 0.2 + (turbulencePhase * CIRCLE_X_2),
+        setUniform2f(effectBuilder, "in_tCircle2", SCALE * 0.2 + (turbulencePhase * CIRCLE_X_2),
                      SCALE * 0.2 + (turbulencePhase * CIRCLE_Y_2));
-        setUniform2f("in_tCircle3", SCALE + (turbulencePhase * CIRCLE_X_3),
+        setUniform2f(effectBuilder, "in_tCircle3", SCALE + (turbulencePhase * CIRCLE_X_3),
                      SCALE + (turbulencePhase * CIRCLE_Y_3));
         const float rotation1 = turbulencePhase * PI_ROTATE_RIGHT + 1.7 * PI;
-        setUniform2f("in_tRotation1", cos(rotation1), sin(rotation1));
+        setUniform2f(effectBuilder, "in_tRotation1", cos(rotation1), sin(rotation1));
         const float rotation2 = turbulencePhase * PI_ROTATE_LEFT + 2 * PI;
-        setUniform2f("in_tRotation2", cos(rotation2), sin(rotation2));
+        setUniform2f(effectBuilder, "in_tRotation2", cos(rotation2), sin(rotation2));
         const float rotation3 = turbulencePhase * PI_ROTATE_RIGHT + 2.75 * PI;
-        setUniform2f("in_tRotation3", cos(rotation3), sin(rotation3));
+        setUniform2f(effectBuilder, "in_tRotation3", cos(rotation3), sin(rotation3));
 
-        SkPaint paint = mPaint->value;
-        paint.setShader(mRuntimeEffectBuilder.makeShader(nullptr, false));
-        canvas->drawCircle(mX->value, mY->value, mRadius->value, paint);
+        params.paint->value.setShader(effectBuilder.makeShader(nullptr, false));
+        canvas->drawCircle(params.x->value, params.y->value, params.radius->value,
+                           params.paint->value);
     }
 
 private:
-    sp<uirenderer::CanvasPropertyPrimitive> mX;
-    sp<uirenderer::CanvasPropertyPrimitive> mY;
-    sp<uirenderer::CanvasPropertyPrimitive> mRadius;
-    sp<uirenderer::CanvasPropertyPaint> mPaint;
-    sp<uirenderer::CanvasPropertyPrimitive> mProgress;
-    sp<uirenderer::CanvasPropertyPrimitive> mTurbulencePhase;
-    SkRuntimeShaderBuilder mRuntimeEffectBuilder;
+    static constexpr float PI = 3.1415926535897932384626;
+    static constexpr float PI_ROTATE_RIGHT = PI * 0.0078125;
+    static constexpr float PI_ROTATE_LEFT = PI * -0.0078125;
+    static constexpr float SCALE = 1.5;
 
-    const float PI = 3.1415926535897932384626;
-    const float PI_ROTATE_RIGHT = PI * 0.0078125;
-    const float PI_ROTATE_LEFT = PI * -0.0078125;
-    const float SCALE = 1.5;
-    const float CIRCLE_X_1 = 0.01 * cos(SCALE * 0.55);
-    const float CIRCLE_Y_1 = 0.01 * sin(SCALE * 0.55);
-    const float CIRCLE_X_2 = -0.0066 * cos(SCALE * 0.45);
-    const float CIRCLE_Y_2 = -0.0066 * sin(SCALE * 0.45);
-    const float CIRCLE_X_3 = -0.0066 * cos(SCALE * 0.35);
-    const float CIRCLE_Y_3 = -0.0066 * sin(SCALE * 0.35);
-
-    virtual void setUniform(std::string name, sp<uirenderer::CanvasPropertyPrimitive> property) {
-        SkRuntimeShaderBuilder::BuilderUniform uniform =
-                mRuntimeEffectBuilder.uniform(name.c_str());
+    static void setUniform(SkRuntimeShaderBuilder& effectBuilder, std::string name,
+                           sp<uirenderer::CanvasPropertyPrimitive> property) {
+        SkRuntimeShaderBuilder::BuilderUniform uniform = effectBuilder.uniform(name.c_str());
         if (uniform.fVar != nullptr) {
             uniform = property->value;
         }
     }
 
-    virtual void setUniform2f(std::string name, float a, float b) {
-        SkRuntimeShaderBuilder::BuilderUniform uniform =
-                mRuntimeEffectBuilder.uniform(name.c_str());
+    static void setUniform2f(SkRuntimeShaderBuilder& effectBuilder, std::string name, float a,
+                             float b) {
+        SkRuntimeShaderBuilder::BuilderUniform uniform = effectBuilder.uniform(name.c_str());
         if (uniform.fVar != nullptr) {
             uniform = SkV2{a, b};
         }