Updated EdgeEffect parameters for overscroll stretch
Added dampening logic to caluclate the distance to
overscroll.
Updated StretchEffect to support independent
maximum stretch amounts for the x/y axis
Removed debugging parameters to configure
stretch distance since they are no longer
used. Removed hidden API calls to configure
stretch distance in ScrollView/HorizontalScrollView
Bug: 179047472
Test: re-ran EdgeEffectTests
Change-Id: I4698669273d364695a21c2cce00ec2cfec41b2cc
diff --git a/libs/hwui/effects/StretchEffect.cpp b/libs/hwui/effects/StretchEffect.cpp
index d4fd105..9e4fb8f 100644
--- a/libs/hwui/effects/StretchEffect.cpp
+++ b/libs/hwui/effects/StretchEffect.cpp
@@ -33,7 +33,8 @@
uniform float uMaxStretchIntensity;
// Maximum percentage to stretch beyond bounds of target
- uniform float uStretchAffectedDist;
+ uniform float uStretchAffectedDistX;
+ uniform float uStretchAffectedDistY;
// Distance stretched as a function of the normalized overscroll times
// scale intensity
@@ -138,7 +139,7 @@
outU,
inU,
uOverscrollX,
- uStretchAffectedDist,
+ uStretchAffectedDistX,
uDistanceStretchedX,
uDistDiffX
);
@@ -146,7 +147,7 @@
outV,
inV,
uOverscrollY,
- uStretchAffectedDist,
+ uStretchAffectedDistY,
uDistanceStretchedY,
uDistDiffY
);
@@ -166,16 +167,14 @@
return mStretchFilter;
}
- float distanceNotStretchedX = maxStretchAmount / stretchArea.width();
- float distanceNotStretchedY = maxStretchAmount / stretchArea.height();
- float normOverScrollDistX = mStretchDirection.x();
- float normOverScrollDistY = mStretchDirection.y();
- float distanceStretchedX = maxStretchAmount / (1 + abs(normOverScrollDistX));
- float distanceStretchedY = maxStretchAmount / (1 + abs(normOverScrollDistY));
- float diffX = distanceStretchedX - distanceNotStretchedX;
- float diffY = distanceStretchedY - distanceNotStretchedY;
float viewportWidth = stretchArea.width();
float viewportHeight = stretchArea.height();
+ float normOverScrollDistX = mStretchDirection.x();
+ float normOverScrollDistY = mStretchDirection.y();
+ float distanceStretchedX = maxStretchAmountX / (1 + abs(normOverScrollDistX));
+ float distanceStretchedY = maxStretchAmountY / (1 + abs(normOverScrollDistY));
+ float diffX = distanceStretchedX;
+ float diffY = distanceStretchedY;
if (mBuilder == nullptr) {
mBuilder = std::make_unique<SkRuntimeShaderBuilder>(getStretchEffect());
@@ -183,7 +182,8 @@
mBuilder->child("uContentTexture") = snapshotImage->makeShader(
SkTileMode::kClamp, SkTileMode::kClamp, SkSamplingOptions(SkFilterMode::kLinear));
- mBuilder->uniform("uStretchAffectedDist").set(&maxStretchAmount, 1);
+ mBuilder->uniform("uStretchAffectedDistX").set(&maxStretchAmountX, 1);
+ mBuilder->uniform("uStretchAffectedDistY").set(&maxStretchAmountY, 1);
mBuilder->uniform("uDistanceStretchedX").set(&distanceStretchedX, 1);
mBuilder->uniform("uDistanceStretchedY").set(&distanceStretchedY, 1);
mBuilder->uniform("uDistDiffX").set(&diffX, 1);
diff --git a/libs/hwui/effects/StretchEffect.h b/libs/hwui/effects/StretchEffect.h
index d2da06b..8221b41 100644
--- a/libs/hwui/effects/StretchEffect.h
+++ b/libs/hwui/effects/StretchEffect.h
@@ -33,8 +33,12 @@
SmoothStep,
};
- StretchEffect(const SkRect& area, const SkVector& direction, float maxStretchAmount)
- : stretchArea(area), maxStretchAmount(maxStretchAmount), mStretchDirection(direction) {}
+ StretchEffect(const SkRect& area, const SkVector& direction, float maxStretchAmountX,
+ float maxStretchAmountY)
+ : stretchArea(area)
+ , maxStretchAmountX(maxStretchAmountX)
+ , maxStretchAmountY(maxStretchAmountY)
+ , mStretchDirection(direction) {}
StretchEffect() {}
@@ -50,7 +54,8 @@
this->stretchArea = other.stretchArea;
this->mStretchDirection = other.mStretchDirection;
this->mStretchFilter = nullptr;
- this->maxStretchAmount = other.maxStretchAmount;
+ this->maxStretchAmountX = other.maxStretchAmountX;
+ this->maxStretchAmountY = other.maxStretchAmountY;
return *this;
}
@@ -67,13 +72,15 @@
return setEmpty();
}
stretchArea.join(other.stretchArea);
- maxStretchAmount = std::max(maxStretchAmount, other.maxStretchAmount);
+ maxStretchAmountX = std::max(maxStretchAmountX, other.maxStretchAmountX);
+ maxStretchAmountY = std::max(maxStretchAmountY, other.maxStretchAmountY);
}
sk_sp<SkImageFilter> getImageFilter(const sk_sp<SkImage>& snapshotImage) const;
SkRect stretchArea {0, 0, 0, 0};
- float maxStretchAmount = 0;
+ float maxStretchAmountX = 0;
+ float maxStretchAmountY = 0;
void setStretchDirection(const SkVector& direction) {
mStretchFilter = nullptr;
diff --git a/libs/hwui/jni/android_graphics_RenderNode.cpp b/libs/hwui/jni/android_graphics_RenderNode.cpp
index fc7d0d1..fffa806 100644
--- a/libs/hwui/jni/android_graphics_RenderNode.cpp
+++ b/libs/hwui/jni/android_graphics_RenderNode.cpp
@@ -181,9 +181,10 @@
static jboolean android_view_RenderNode_stretch(CRITICAL_JNI_PARAMS_COMMA jlong renderNodePtr,
jfloat left, jfloat top, jfloat right,
- jfloat bottom, jfloat vX, jfloat vY, jfloat max) {
- StretchEffect effect =
- StretchEffect(SkRect::MakeLTRB(left, top, right, bottom), {.fX = vX, .fY = vY}, max);
+ jfloat bottom, jfloat vX, jfloat vY, jfloat maxX,
+ jfloat maxY) {
+ StretchEffect effect = StretchEffect(SkRect::MakeLTRB(left, top, right, bottom),
+ {.fX = vX, .fY = vY}, maxX, maxY);
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
renderNode->mutateStagingProperties().mutateLayerProperties().mutableStretchEffect().mergeWith(
effect);
@@ -662,7 +663,7 @@
env->CallVoidMethod(localref, gPositionListener_ApplyStretchMethod,
info.canvasContext.getFrameNumber(), area.left, area.top,
area.right, area.bottom, stretchDirection.fX, stretchDirection.fY,
- effect->maxStretchAmount);
+ effect->maxStretchAmountX, effect->maxStretchAmountY);
#endif
env->DeleteLocalRef(localref);
}
@@ -738,7 +739,7 @@
{"nSetOutlineEmpty", "(J)Z", (void*)android_view_RenderNode_setOutlineEmpty},
{"nSetOutlineNone", "(J)Z", (void*)android_view_RenderNode_setOutlineNone},
{"nClearStretch", "(J)Z", (void*)android_view_RenderNode_clearStretch},
- {"nStretch", "(JFFFFFFF)Z", (void*)android_view_RenderNode_stretch},
+ {"nStretch", "(JFFFFFFFF)Z", (void*)android_view_RenderNode_stretch},
{"nHasShadow", "(J)Z", (void*)android_view_RenderNode_hasShadow},
{"nSetSpotShadowColor", "(JI)Z", (void*)android_view_RenderNode_setSpotShadowColor},
{"nGetSpotShadowColor", "(J)I", (void*)android_view_RenderNode_getSpotShadowColor},