summaryrefslogtreecommitdiff
path: root/graphics/java
diff options
context:
space:
mode:
author Jay Aliomer <aaliomer@google.com> 2022-04-19 13:37:46 -0400
committer Jay Aliomer <aaliomer@google.com> 2022-04-28 21:01:30 +0000
commitdd1b5b147ea498cdd8c68ea2da172d45afd8ad18 (patch)
treeafde03d50552b449711238c50c0319504db3c287 /graphics/java
parentb45b8bdc941f2a337ccb8e9d3b35929a93316a63 (diff)
Set mask shader after matrix is set
When the size of the drawable bounds changes, the mask shader is not updated properly Assumed passed by reference instead of pass by value which resulted in the wrong behavior Fixes: 227624349 Test: RippleMicrobenchmark Change-Id: Iedc3f06441414455fcfedf8cabd61e5b334a7441
Diffstat (limited to 'graphics/java')
-rw-r--r--graphics/java/android/graphics/drawable/RippleDrawable.java21
-rw-r--r--graphics/java/android/graphics/drawable/RippleForeground.java4
2 files changed, 13 insertions, 12 deletions
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index bfa6ce5d36c5..74cad1aaa057 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -881,7 +881,7 @@ public class RippleDrawable extends LayerDrawable {
mAddRipple = false;
if (mRunningAnimations.size() > 0 && !addRipple) {
// update paint when view is invalidated
- getRipplePaint();
+ updateRipplePaint();
}
drawContent(canvas);
drawPatternedBackground(canvas, cx, cy);
@@ -940,7 +940,7 @@ public class RippleDrawable extends LayerDrawable {
startBackgroundAnimation();
}
if (mBackgroundOpacity == 0) return;
- Paint p = getRipplePaint();
+ Paint p = updateRipplePaint();
float newOpacity = mBackgroundOpacity;
final int origAlpha = p.getAlpha();
final int alpha = Math.min((int) (origAlpha * newOpacity + 0.5f), 255);
@@ -968,7 +968,7 @@ public class RippleDrawable extends LayerDrawable {
@NonNull
private RippleAnimationSession.AnimationProperties<Float, Paint> createAnimationProperties(
float x, float y, float cx, float cy, float w, float h) {
- Paint p = new Paint(getRipplePaint());
+ Paint p = new Paint(updateRipplePaint());
float radius = getComputedRadius();
RippleAnimationSession.AnimationProperties<Float, Paint> properties;
RippleShader shader = new RippleShader();
@@ -1108,11 +1108,6 @@ public class RippleDrawable extends LayerDrawable {
drawContent(mMaskCanvas);
}
mMaskCanvas.restoreToCount(saveCount);
- if (mState.mRippleStyle == STYLE_PATTERNED) {
- for (int i = 0; i < mRunningAnimations.size(); i++) {
- mRunningAnimations.get(i).getProperties().getShader().setShader(mMaskShader);
- }
- }
}
private int getMaskType() {
@@ -1169,7 +1164,7 @@ public class RippleDrawable extends LayerDrawable {
final float y = mHotspotBounds.exactCenterY();
canvas.translate(x, y);
- final Paint p = getRipplePaint();
+ final Paint p = updateRipplePaint();
if (background != null && background.isVisible()) {
background.draw(canvas, p);
@@ -1194,7 +1189,7 @@ public class RippleDrawable extends LayerDrawable {
}
@UnsupportedAppUsage
- Paint getRipplePaint() {
+ Paint updateRipplePaint() {
if (mRipplePaint == null) {
mRipplePaint = new Paint();
mRipplePaint.setAntiAlias(true);
@@ -1215,6 +1210,12 @@ public class RippleDrawable extends LayerDrawable {
mMaskMatrix.setTranslate(bounds.left - x, bounds.top - y);
}
mMaskShader.setLocalMatrix(mMaskMatrix);
+
+ if (mState.mRippleStyle == STYLE_PATTERNED) {
+ for (int i = 0; i < mRunningAnimations.size(); i++) {
+ mRunningAnimations.get(i).getProperties().getShader().setShader(mMaskShader);
+ }
+ }
}
// Grab the color for the current state and cut the alpha channel in
diff --git a/graphics/java/android/graphics/drawable/RippleForeground.java b/graphics/java/android/graphics/drawable/RippleForeground.java
index 0f376957c8ff..1655fba93878 100644
--- a/graphics/java/android/graphics/drawable/RippleForeground.java
+++ b/graphics/java/android/graphics/drawable/RippleForeground.java
@@ -252,7 +252,7 @@ class RippleForeground extends RippleComponent {
mPropX = CanvasProperty.createFloat(getCurrentX());
mPropY = CanvasProperty.createFloat(getCurrentY());
mPropRadius = CanvasProperty.createFloat(getCurrentRadius());
- final Paint paint = mOwner.getRipplePaint();
+ final Paint paint = mOwner.updateRipplePaint();
mPropPaint = CanvasProperty.createPaint(paint);
final RenderNodeAnimator radius = new RenderNodeAnimator(mPropRadius, mTargetRadius);
@@ -290,7 +290,7 @@ class RippleForeground extends RippleComponent {
opacity.setInterpolator(LINEAR_INTERPOLATOR);
opacity.addListener(mAnimationListener);
opacity.setStartDelay(computeFadeOutDelay());
- opacity.setStartValue(mOwner.getRipplePaint().getAlpha());
+ opacity.setStartValue(mOwner.updateRipplePaint().getAlpha());
mPendingHwAnimators.add(opacity);
invalidateSelf();
}