Initial framework needed to draw circle with RuntimeShader.
This also adds the ability for RenderThread to animate a few
predefined shader uniforms.
Bug: 177051137
Test: demo in ag/13296877
Change-Id: I6e58e671ad1242a07ecb1cf4cdb48031f85c2088
diff --git a/libs/hwui/canvas/CanvasOps.h b/libs/hwui/canvas/CanvasOps.h
index 62c26c7..ea9fea97 100644
--- a/libs/hwui/canvas/CanvasOps.h
+++ b/libs/hwui/canvas/CanvasOps.h
@@ -23,6 +23,7 @@
#include <SkVertices.h>
#include <SkImage.h>
#include <SkPicture.h>
+#include <SkRuntimeEffect.h>
#include <hwui/Bitmap.h>
#include <log/log.h>
#include "CanvasProperty.h"
@@ -142,6 +143,42 @@
ASSERT_DRAWABLE()
};
+template<>
+struct CanvasOp<CanvasOpType::DrawRippleProperty> {
+ sp<uirenderer::CanvasPropertyPrimitive> x;
+ sp<uirenderer::CanvasPropertyPrimitive> y;
+ sp<uirenderer::CanvasPropertyPrimitive> radius;
+ sp<uirenderer::CanvasPropertyPaint> paint;
+ sp<uirenderer::CanvasPropertyPrimitive> progress;
+ sk_sp<SkRuntimeEffect> effect;
+
+ void draw(SkCanvas* canvas) const {
+ SkRuntimeShaderBuilder runtimeEffectBuilder(effect);
+
+ SkRuntimeShaderBuilder::BuilderUniform center = runtimeEffectBuilder.uniform("in_origin");
+ if (center.fVar != nullptr) {
+ center = SkV2{x->value, y->value};
+ }
+
+ SkRuntimeShaderBuilder::BuilderUniform radiusU =
+ runtimeEffectBuilder.uniform("in_maxRadius");
+ if (radiusU.fVar != nullptr) {
+ radiusU = radius->value;
+ }
+
+ SkRuntimeShaderBuilder::BuilderUniform progressU =
+ runtimeEffectBuilder.uniform("in_progress");
+ if (progressU.fVar != nullptr) {
+ progressU = progress->value;
+ }
+
+ SkPaint paintMod = paint->value;
+ paintMod.setShader(runtimeEffectBuilder.makeShader(nullptr, false));
+ canvas->drawCircle(x->value, y->value, radius->value, paintMod);
+ }
+ ASSERT_DRAWABLE()
+};
+
template <>
struct CanvasOp<CanvasOpType::DrawColor> {
SkColor4f color;