diff --git a/libs/hwui/effects/StretchEffect.cpp b/libs/hwui/effects/StretchEffect.cpp index df480afcbe802..807fb75e097c3 100644 --- a/libs/hwui/effects/StretchEffect.cpp +++ b/libs/hwui/effects/StretchEffect.cpp @@ -94,13 +94,14 @@ static const SkString stretchShader = SkString(R"( float uStretchAffectedDist, float uInverseStretchAffectedDist, float distanceStretched, - float interpolationStrength + float interpolationStrength, + float viewportDimension ) { float offsetPos = inPos - reverseStretchDist; float posBasedVariation = mix( 1. ,easeIn(offsetPos, uInverseStretchAffectedDist), interpolationStrength); float stretchIntensity = (-overscroll) * posBasedVariation; - return 1 - (distanceStretched - (offsetPos / (1. + stretchIntensity))); + return viewportDimension - (distanceStretched - (offsetPos / (1. + stretchIntensity))); } // Prefer usage of return values over out parameters as it enables @@ -113,7 +114,8 @@ static const SkString stretchShader = SkString(R"( float uInverseStretchAffectedDist, float distanceStretched, float distanceDiff, - float interpolationStrength + float interpolationStrength, + float viewportDimension ) { if (overscroll > 0) { if (inPos <= uStretchAffectedDist) { @@ -129,7 +131,7 @@ static const SkString stretchShader = SkString(R"( return distanceDiff + inPos; } } else if (overscroll < 0) { - float stretchAffectedDist = 1. - uStretchAffectedDist; + float stretchAffectedDist = viewportDimension - uStretchAffectedDist; if (inPos >= stretchAffectedDist) { return computeOverscrollEnd( inPos, @@ -138,7 +140,8 @@ static const SkString stretchShader = SkString(R"( uStretchAffectedDist, uInverseStretchAffectedDist, distanceStretched, - interpolationStrength + interpolationStrength, + viewportDimension ); } else { return -distanceDiff + inPos; @@ -149,12 +152,11 @@ static const SkString stretchShader = SkString(R"( } vec4 main(vec2 coord) { - // Normalize SKSL pixel coordinate into a unit vector - float inU = coord.x / viewportWidth; - float inV = coord.y / viewportHeight; + float inU = coord.x; + float inV = coord.y; float outU; float outV; - // Add the normalized scroll position within scrolling list + inU += uScrollX; inV += uScrollY; outU = computeOverscroll( @@ -164,7 +166,8 @@ static const SkString stretchShader = SkString(R"( uInverseDistanceStretchedX, uDistanceStretchedX, uDistDiffX, - uInterpolationStrength + uInterpolationStrength, + viewportWidth ); outV = computeOverscroll( inV, @@ -173,15 +176,15 @@ static const SkString stretchShader = SkString(R"( uInverseDistanceStretchedY, uDistanceStretchedY, uDistDiffY, - uInterpolationStrength + uInterpolationStrength, + viewportHeight ); - coord.x = outU * viewportWidth; - coord.y = outV * viewportHeight; + coord.x = outU; + coord.y = outV; return sample(uContentTexture, coord); })"); static const float ZERO = 0.f; -static const float CONTENT_DISTANCE_STRETCHED = 1.f; static const float INTERPOLATION_STRENGTH_VALUE = 0.7f; sk_sp StretchEffect::getShader(float width, float height, @@ -192,12 +195,12 @@ sk_sp StretchEffect::getShader(float width, float height, float normOverScrollDistX = mStretchDirection.x(); float normOverScrollDistY = mStretchDirection.y(); - float distanceStretchedX = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistX)); - float distanceStretchedY = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistY)); - float inverseDistanceStretchedX = 1.f / CONTENT_DISTANCE_STRETCHED; - float inverseDistanceStretchedY = 1.f / CONTENT_DISTANCE_STRETCHED; - float diffX = distanceStretchedX - CONTENT_DISTANCE_STRETCHED; - float diffY = distanceStretchedY - CONTENT_DISTANCE_STRETCHED; + float distanceStretchedX = width / (1 + abs(normOverScrollDistX)); + float distanceStretchedY = height / (1 + abs(normOverScrollDistY)); + float inverseDistanceStretchedX = 1.f / width; + float inverseDistanceStretchedY = 1.f / height; + float diffX = distanceStretchedX - width; + float diffY = distanceStretchedY - height; if (mBuilder == nullptr) { mBuilder = std::make_unique(getStretchEffect()); @@ -206,8 +209,8 @@ sk_sp StretchEffect::getShader(float width, float height, 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("uStretchAffectedDistX").set(&width, 1); + mBuilder->uniform("uStretchAffectedDistY").set(&height, 1); mBuilder->uniform("uDistanceStretchedX").set(&distanceStretchedX, 1); mBuilder->uniform("uDistanceStretchedY").set(&distanceStretchedY, 1); mBuilder->uniform("uInverseDistanceStretchedX").set(&inverseDistanceStretchedX, 1);