content: package com.airbnb.lottie.value;
  
  import android.graphics.PointF;
  
  import androidx.annotation.NonNull;
  
  import com.airbnb.lottie.utils.MiscUtils;
  
  /**
   * {@link LottieValueCallback} that provides a value offset from the original animation
   * rather than an absolute value.
   */
  @SuppressWarnings({"WeakerAccess", "unused"})
  public class LottieRelativePointValueCallback extends LottieValueCallback<PointF> {
    private final PointF point = new PointF();
  
    public LottieRelativePointValueCallback() {
    }
  
    public LottieRelativePointValueCallback(@NonNull PointF staticValue) {
      super(staticValue);
    }
  
    @Override
    public final PointF getValue(LottieFrameInfo<PointF> frameInfo) {
      point.set(
          MiscUtils.lerp(
              frameInfo.getStartValue().x,
              frameInfo.getEndValue().x,
              frameInfo.getInterpolatedKeyframeProgress()),
          MiscUtils.lerp(
              frameInfo.getStartValue().y,
              frameInfo.getEndValue().y,
              frameInfo.getInterpolatedKeyframeProgress())
      );
  
      PointF offset = getOffset(frameInfo);
      point.offset(offset.x, offset.y);
      return point;
    }
  
    /**
     * Override this to provide your own offset on every frame.
     */
    public PointF getOffset(LottieFrameInfo<PointF> frameInfo) {
      if (value == null) {
        throw new IllegalArgumentException("You must provide a static value in the constructor " +
            ", call setValue, or override getValue.");
      }
      return value;
    }
  }
  