diff options
Diffstat (limited to 'libs/hwui/pipeline/skia/AnimatedDrawables.h')
-rw-r--r-- | libs/hwui/pipeline/skia/AnimatedDrawables.h | 114 |
1 files changed, 53 insertions, 61 deletions
diff --git a/libs/hwui/pipeline/skia/AnimatedDrawables.h b/libs/hwui/pipeline/skia/AnimatedDrawables.h index 7d65be1a76e6..10889e7a9229 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 @@ private: sp<uirenderer::CanvasPropertyPaint> mPaint; }; -class AnimatedRipple : public SkDrawable { +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; +}; + +class AnimatedRippleDrawable { 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) {} + static void draw(SkCanvas* canvas, const RippleDrawableParams& params) { + auto& effectBuilder = const_cast<SkRuntimeShaderBuilder&>(params.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); + 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; - - 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 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; + + 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}; } |