Loading libs/hwui/effects/StretchEffect.cpp +27 −8 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ static const SkString stretchShader = SkString(R"( // scale intensity uniform float uDistanceStretchedX; uniform float uDistanceStretchedY; uniform float uInverseDistanceStretchedX; uniform float uInverseDistanceStretchedY; uniform float uDistDiffX; // Difference between the peak stretch amount and overscroll amount normalized Loading @@ -58,14 +60,20 @@ static const SkString stretchShader = SkString(R"( uniform float viewportWidth; // target height in pixels uniform float viewportHeight; // target width in pixels float easeInCubic(float t, float d) { float tmp = t * d; return tmp * tmp * tmp; } float computeOverscrollStart( float inPos, float overscroll, float uStretchAffectedDist, float uInverseStretchAffectedDist, float distanceStretched ) { float offsetPos = uStretchAffectedDist - inPos; float posBasedVariation = smoothstep(0., uStretchAffectedDist, offsetPos); float posBasedVariation = easeInCubic(offsetPos, uInverseStretchAffectedDist); float stretchIntensity = overscroll * posBasedVariation; return distanceStretched - (offsetPos / (1. + stretchIntensity)); } Loading @@ -75,10 +83,11 @@ static const SkString stretchShader = SkString(R"( float overscroll, float reverseStretchDist, float uStretchAffectedDist, float uInverseStretchAffectedDist, float distanceStretched ) { float offsetPos = inPos - reverseStretchDist; float posBasedVariation = (smoothstep(0., uStretchAffectedDist, offsetPos)); float posBasedVariation = easeInCubic(offsetPos, uInverseStretchAffectedDist); float stretchIntensity = (-overscroll) * posBasedVariation; return 1 - (distanceStretched - (offsetPos / (1. + stretchIntensity))); } Loading @@ -90,6 +99,7 @@ static const SkString stretchShader = SkString(R"( float inPos, float overscroll, float uStretchAffectedDist, float uInverseStretchAffectedDist, float distanceStretched, float distanceDiff ) { Loading @@ -100,6 +110,7 @@ static const SkString stretchShader = SkString(R"( inPos, overscroll, uStretchAffectedDist, uInverseStretchAffectedDist, distanceStretched ); } else if (inPos >= distanceStretched) { Loading @@ -114,6 +125,7 @@ static const SkString stretchShader = SkString(R"( overscroll, stretchAffectedDist, uStretchAffectedDist, uInverseStretchAffectedDist, distanceStretched ); } else if (inPos < stretchAffectedDist) { Loading @@ -139,6 +151,7 @@ static const SkString stretchShader = SkString(R"( inU, uOverscrollX, uStretchAffectedDistX, uInverseDistanceStretchedX, uDistanceStretchedX, uDistDiffX ); Loading @@ -146,6 +159,7 @@ static const SkString stretchShader = SkString(R"( inV, uOverscrollY, uStretchAffectedDistY, uInverseDistanceStretchedY, uDistanceStretchedY, uDistDiffY ); Loading @@ -155,6 +169,7 @@ static const SkString stretchShader = SkString(R"( })"); static const float ZERO = 0.f; static const float CONTENT_DISTANCE_STRETCHED = 1.f; sk_sp<SkImageFilter> StretchEffect::getImageFilter(const sk_sp<SkImage>& snapshotImage) const { if (isEmpty()) { Loading @@ -169,10 +184,12 @@ sk_sp<SkImageFilter> StretchEffect::getImageFilter(const sk_sp<SkImage>& snapsho 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; float distanceStretchedX = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistX)); float distanceStretchedY = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistY)); float inverseDistanceStretchedX = 1.f / distanceStretchedX; float inverseDistanceStretchedY = 1.f / distanceStretchedY; float diffX = distanceStretchedX - CONTENT_DISTANCE_STRETCHED; float diffY = distanceStretchedY - CONTENT_DISTANCE_STRETCHED; if (mBuilder == nullptr) { mBuilder = std::make_unique<SkRuntimeShaderBuilder>(getStretchEffect()); Loading @@ -180,10 +197,12 @@ sk_sp<SkImageFilter> StretchEffect::getImageFilter(const sk_sp<SkImage>& snapsho mBuilder->child("uContentTexture") = snapshotImage->makeShader( SkTileMode::kClamp, SkTileMode::kClamp, SkSamplingOptions(SkFilterMode::kLinear)); mBuilder->uniform("uStretchAffectedDistX").set(&maxStretchAmountX, 1); mBuilder->uniform("uStretchAffectedDistY").set(&maxStretchAmountY, 1); mBuilder->uniform("uStretchAffectedDistX").set(&CONTENT_DISTANCE_STRETCHED, 1); mBuilder->uniform("uStretchAffectedDistY").set(&CONTENT_DISTANCE_STRETCHED, 1); mBuilder->uniform("uDistanceStretchedX").set(&distanceStretchedX, 1); mBuilder->uniform("uDistanceStretchedY").set(&distanceStretchedY, 1); mBuilder->uniform("uInverseDistanceStretchedX").set(&inverseDistanceStretchedX, 1); mBuilder->uniform("uInverseDistanceStretchedY").set(&inverseDistanceStretchedY, 1); mBuilder->uniform("uDistDiffX").set(&diffX, 1); mBuilder->uniform("uDistDiffY").set(&diffY, 1); mBuilder->uniform("uOverscrollX").set(&normOverScrollDistX, 1); Loading Loading
libs/hwui/effects/StretchEffect.cpp +27 −8 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ static const SkString stretchShader = SkString(R"( // scale intensity uniform float uDistanceStretchedX; uniform float uDistanceStretchedY; uniform float uInverseDistanceStretchedX; uniform float uInverseDistanceStretchedY; uniform float uDistDiffX; // Difference between the peak stretch amount and overscroll amount normalized Loading @@ -58,14 +60,20 @@ static const SkString stretchShader = SkString(R"( uniform float viewportWidth; // target height in pixels uniform float viewportHeight; // target width in pixels float easeInCubic(float t, float d) { float tmp = t * d; return tmp * tmp * tmp; } float computeOverscrollStart( float inPos, float overscroll, float uStretchAffectedDist, float uInverseStretchAffectedDist, float distanceStretched ) { float offsetPos = uStretchAffectedDist - inPos; float posBasedVariation = smoothstep(0., uStretchAffectedDist, offsetPos); float posBasedVariation = easeInCubic(offsetPos, uInverseStretchAffectedDist); float stretchIntensity = overscroll * posBasedVariation; return distanceStretched - (offsetPos / (1. + stretchIntensity)); } Loading @@ -75,10 +83,11 @@ static const SkString stretchShader = SkString(R"( float overscroll, float reverseStretchDist, float uStretchAffectedDist, float uInverseStretchAffectedDist, float distanceStretched ) { float offsetPos = inPos - reverseStretchDist; float posBasedVariation = (smoothstep(0., uStretchAffectedDist, offsetPos)); float posBasedVariation = easeInCubic(offsetPos, uInverseStretchAffectedDist); float stretchIntensity = (-overscroll) * posBasedVariation; return 1 - (distanceStretched - (offsetPos / (1. + stretchIntensity))); } Loading @@ -90,6 +99,7 @@ static const SkString stretchShader = SkString(R"( float inPos, float overscroll, float uStretchAffectedDist, float uInverseStretchAffectedDist, float distanceStretched, float distanceDiff ) { Loading @@ -100,6 +110,7 @@ static const SkString stretchShader = SkString(R"( inPos, overscroll, uStretchAffectedDist, uInverseStretchAffectedDist, distanceStretched ); } else if (inPos >= distanceStretched) { Loading @@ -114,6 +125,7 @@ static const SkString stretchShader = SkString(R"( overscroll, stretchAffectedDist, uStretchAffectedDist, uInverseStretchAffectedDist, distanceStretched ); } else if (inPos < stretchAffectedDist) { Loading @@ -139,6 +151,7 @@ static const SkString stretchShader = SkString(R"( inU, uOverscrollX, uStretchAffectedDistX, uInverseDistanceStretchedX, uDistanceStretchedX, uDistDiffX ); Loading @@ -146,6 +159,7 @@ static const SkString stretchShader = SkString(R"( inV, uOverscrollY, uStretchAffectedDistY, uInverseDistanceStretchedY, uDistanceStretchedY, uDistDiffY ); Loading @@ -155,6 +169,7 @@ static const SkString stretchShader = SkString(R"( })"); static const float ZERO = 0.f; static const float CONTENT_DISTANCE_STRETCHED = 1.f; sk_sp<SkImageFilter> StretchEffect::getImageFilter(const sk_sp<SkImage>& snapshotImage) const { if (isEmpty()) { Loading @@ -169,10 +184,12 @@ sk_sp<SkImageFilter> StretchEffect::getImageFilter(const sk_sp<SkImage>& snapsho 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; float distanceStretchedX = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistX)); float distanceStretchedY = CONTENT_DISTANCE_STRETCHED / (1 + abs(normOverScrollDistY)); float inverseDistanceStretchedX = 1.f / distanceStretchedX; float inverseDistanceStretchedY = 1.f / distanceStretchedY; float diffX = distanceStretchedX - CONTENT_DISTANCE_STRETCHED; float diffY = distanceStretchedY - CONTENT_DISTANCE_STRETCHED; if (mBuilder == nullptr) { mBuilder = std::make_unique<SkRuntimeShaderBuilder>(getStretchEffect()); Loading @@ -180,10 +197,12 @@ sk_sp<SkImageFilter> StretchEffect::getImageFilter(const sk_sp<SkImage>& snapsho mBuilder->child("uContentTexture") = snapshotImage->makeShader( SkTileMode::kClamp, SkTileMode::kClamp, SkSamplingOptions(SkFilterMode::kLinear)); mBuilder->uniform("uStretchAffectedDistX").set(&maxStretchAmountX, 1); mBuilder->uniform("uStretchAffectedDistY").set(&maxStretchAmountY, 1); mBuilder->uniform("uStretchAffectedDistX").set(&CONTENT_DISTANCE_STRETCHED, 1); mBuilder->uniform("uStretchAffectedDistY").set(&CONTENT_DISTANCE_STRETCHED, 1); mBuilder->uniform("uDistanceStretchedX").set(&distanceStretchedX, 1); mBuilder->uniform("uDistanceStretchedY").set(&distanceStretchedY, 1); mBuilder->uniform("uInverseDistanceStretchedX").set(&inverseDistanceStretchedX, 1); mBuilder->uniform("uInverseDistanceStretchedY").set(&inverseDistanceStretchedY, 1); mBuilder->uniform("uDistDiffX").set(&diffX, 1); mBuilder->uniform("uDistDiffY").set(&diffY, 1); mBuilder->uniform("uOverscrollX").set(&normOverScrollDistX, 1); Loading