Loading core/java/android/widget/EdgeEffect.java +2 −2 Original line number Diff line number Diff line Loading @@ -130,9 +130,9 @@ public class EdgeEffect { public @interface EdgeEffectType { } private static final float LINEAR_STRETCH_INTENSITY = 0.06f; private static final float LINEAR_STRETCH_INTENSITY = 0.016f; private static final float EXP_STRETCH_INTENSITY = 0.06f; private static final float EXP_STRETCH_INTENSITY = 0.016f; private static final float SCROLL_DIST_AFFECTED_BY_EXP_STRETCH = 0.33f; Loading libs/hwui/effects/StretchEffect.cpp +28 −9 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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)); } Loading @@ -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))); } Loading @@ -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) { Loading @@ -111,7 +124,8 @@ static const SkString stretchShader = SkString(R"( overscroll, uStretchAffectedDist, uInverseStretchAffectedDist, distanceStretched distanceStretched, interpolationStrength ); } else if (inPos >= distanceStretched) { outPos = distanceDiff + inPos; Loading @@ -126,7 +140,8 @@ static const SkString stretchShader = SkString(R"( stretchAffectedDist, uStretchAffectedDist, uInverseStretchAffectedDist, distanceStretched distanceStretched, interpolationStrength ); } else if (inPos < stretchAffectedDist) { outPos = -distanceDiff + inPos; Loading @@ -153,7 +168,8 @@ static const SkString stretchShader = SkString(R"( uStretchAffectedDistX, uInverseDistanceStretchedX, uDistanceStretchedX, uDistDiffX uDistDiffX, uInterpolationStrength ); outV = computeOverscroll( inV, Loading @@ -161,7 +177,8 @@ static const SkString stretchShader = SkString(R"( uStretchAffectedDistY, uInverseDistanceStretchedY, uDistanceStretchedY, uDistDiffY uDistDiffY, uInterpolationStrength ); coord.x = outU * viewportWidth; coord.y = outV * viewportHeight; Loading @@ -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()) { Loading Loading @@ -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); Loading Loading
core/java/android/widget/EdgeEffect.java +2 −2 Original line number Diff line number Diff line Loading @@ -130,9 +130,9 @@ public class EdgeEffect { public @interface EdgeEffectType { } private static final float LINEAR_STRETCH_INTENSITY = 0.06f; private static final float LINEAR_STRETCH_INTENSITY = 0.016f; private static final float EXP_STRETCH_INTENSITY = 0.06f; private static final float EXP_STRETCH_INTENSITY = 0.016f; private static final float SCROLL_DIST_AFFECTED_BY_EXP_STRETCH = 0.33f; Loading
libs/hwui/effects/StretchEffect.cpp +28 −9 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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)); } Loading @@ -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))); } Loading @@ -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) { Loading @@ -111,7 +124,8 @@ static const SkString stretchShader = SkString(R"( overscroll, uStretchAffectedDist, uInverseStretchAffectedDist, distanceStretched distanceStretched, interpolationStrength ); } else if (inPos >= distanceStretched) { outPos = distanceDiff + inPos; Loading @@ -126,7 +140,8 @@ static const SkString stretchShader = SkString(R"( stretchAffectedDist, uStretchAffectedDist, uInverseStretchAffectedDist, distanceStretched distanceStretched, interpolationStrength ); } else if (inPos < stretchAffectedDist) { outPos = -distanceDiff + inPos; Loading @@ -153,7 +168,8 @@ static const SkString stretchShader = SkString(R"( uStretchAffectedDistX, uInverseDistanceStretchedX, uDistanceStretchedX, uDistDiffX uDistDiffX, uInterpolationStrength ); outV = computeOverscroll( inV, Loading @@ -161,7 +177,8 @@ static const SkString stretchShader = SkString(R"( uStretchAffectedDistY, uInverseDistanceStretchedY, uDistanceStretchedY, uDistDiffY uDistDiffY, uInterpolationStrength ); coord.x = outU * viewportWidth; coord.y = outV * viewportHeight; Loading @@ -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()) { Loading Loading @@ -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); Loading