summaryrefslogtreecommitdiff
path: root/libs/hwui/effects/StretchEffect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/hwui/effects/StretchEffect.cpp')
-rw-r--r--libs/hwui/effects/StretchEffect.cpp37
1 files changed, 28 insertions, 9 deletions
diff --git a/libs/hwui/effects/StretchEffect.cpp b/libs/hwui/effects/StretchEffect.cpp
index de14bebe5cbc..c2642d3fdb55 100644
--- a/libs/hwui/effects/StretchEffect.cpp
+++ b/libs/hwui/effects/StretchEffect.cpp
@@ -60,6 +60,14 @@ static const SkString stretchShader = SkString(R"(
uniform float viewportWidth; // target height in pixels
uniform float viewportHeight; // target width in pixels
+ // uInterpolationStrength is the intensity of the interpolation.
+ // if uInterpolationStrength is 0, then the stretch is constant for all the
+ // uStretchAffectedDist. if uInterpolationStrength is 1, then stretch intensity
+ // is interpolated based on the pixel position in the uStretchAffectedDist area;
+ // The closer we are from the scroll anchor point, the more it stretches,
+ // and the other way around.
+ uniform float uInterpolationStrength;
+
float easeInCubic(float t, float d) {
float tmp = t * d;
return tmp * tmp * tmp;
@@ -70,10 +78,12 @@ static const SkString stretchShader = SkString(R"(
float overscroll,
float uStretchAffectedDist,
float uInverseStretchAffectedDist,
- float distanceStretched
+ float distanceStretched,
+ float interpolationStrength
) {
float offsetPos = uStretchAffectedDist - inPos;
- float posBasedVariation = easeInCubic(offsetPos, uInverseStretchAffectedDist);
+ float posBasedVariation = mix(
+ 1. ,easeInCubic(offsetPos, uInverseStretchAffectedDist), interpolationStrength);
float stretchIntensity = overscroll * posBasedVariation;
return distanceStretched - (offsetPos / (1. + stretchIntensity));
}
@@ -84,10 +94,12 @@ static const SkString stretchShader = SkString(R"(
float reverseStretchDist,
float uStretchAffectedDist,
float uInverseStretchAffectedDist,
- float distanceStretched
+ float distanceStretched,
+ float interpolationStrength
) {
float offsetPos = inPos - reverseStretchDist;
- float posBasedVariation = easeInCubic(offsetPos, uInverseStretchAffectedDist);
+ float posBasedVariation = mix(
+ 1. ,easeInCubic(offsetPos, uInverseStretchAffectedDist), interpolationStrength);
float stretchIntensity = (-overscroll) * posBasedVariation;
return 1 - (distanceStretched - (offsetPos / (1. + stretchIntensity)));
}
@@ -101,7 +113,8 @@ static const SkString stretchShader = SkString(R"(
float uStretchAffectedDist,
float uInverseStretchAffectedDist,
float distanceStretched,
- float distanceDiff
+ float distanceDiff,
+ float interpolationStrength
) {
float outPos = inPos;
if (overscroll > 0) {
@@ -111,7 +124,8 @@ static const SkString stretchShader = SkString(R"(
overscroll,
uStretchAffectedDist,
uInverseStretchAffectedDist,
- distanceStretched
+ distanceStretched,
+ interpolationStrength
);
} else if (inPos >= distanceStretched) {
outPos = distanceDiff + inPos;
@@ -126,7 +140,8 @@ static const SkString stretchShader = SkString(R"(
stretchAffectedDist,
uStretchAffectedDist,
uInverseStretchAffectedDist,
- distanceStretched
+ distanceStretched,
+ interpolationStrength
);
} else if (inPos < stretchAffectedDist) {
outPos = -distanceDiff + inPos;
@@ -153,7 +168,8 @@ static const SkString stretchShader = SkString(R"(
uStretchAffectedDistX,
uInverseDistanceStretchedX,
uDistanceStretchedX,
- uDistDiffX
+ uDistDiffX,
+ uInterpolationStrength
);
outV = computeOverscroll(
inV,
@@ -161,7 +177,8 @@ static const SkString stretchShader = SkString(R"(
uStretchAffectedDistY,
uInverseDistanceStretchedY,
uDistanceStretchedY,
- uDistDiffY
+ uDistDiffY,
+ uInterpolationStrength
);
coord.x = outU * viewportWidth;
coord.y = outV * viewportHeight;
@@ -170,6 +187,7 @@ static const SkString stretchShader = SkString(R"(
static const float ZERO = 0.f;
static const float CONTENT_DISTANCE_STRETCHED = 1.f;
+static const float INTERPOLATION_STRENGTH_VALUE = 0.7f;
sk_sp<SkShader> StretchEffect::getShader(const sk_sp<SkImage>& snapshotImage) const {
if (isEmpty()) {
@@ -197,6 +215,7 @@ sk_sp<SkShader> StretchEffect::getShader(const sk_sp<SkImage>& snapshotImage) co
mBuilder->child("uContentTexture") = snapshotImage->makeShader(
SkTileMode::kClamp, SkTileMode::kClamp, SkSamplingOptions(SkFilterMode::kLinear));
+ mBuilder->uniform("uInterpolationStrength").set(&INTERPOLATION_STRENGTH_VALUE, 1);
mBuilder->uniform("uStretchAffectedDistX").set(&CONTENT_DISTANCE_STRETCHED, 1);
mBuilder->uniform("uStretchAffectedDistY").set(&CONTENT_DISTANCE_STRETCHED, 1);
mBuilder->uniform("uDistanceStretchedX").set(&distanceStretchedX, 1);