package com.airbnb.lottie;

import android.graphics.ColorFilter;
import android.graphics.PointF;

import com.airbnb.lottie.value.ScaleXY;
import com.airbnb.lottie.value.LottieValueCallback;

/**
 * Property values are the same type as the generic type of their corresponding
 * {@link LottieValueCallback}. With this, we can use generics to maintain type safety
 * of the callbacks.
 *
 * Supported properties:
 * Transform:
 *    {@link #TRANSFORM_ANCHOR_POINT}
 *    {@link #TRANSFORM_POSITION}
 *    {@link #TRANSFORM_OPACITY}
 *    {@link #TRANSFORM_SCALE}
 *    {@link #TRANSFORM_ROTATION}
 *    {@link #TRANSFORM_SKEW}
 *    {@link #TRANSFORM_SKEW_ANGLE}
 *
 * Fill:
 *    {@link #COLOR} (non-gradient)
 *    {@link #OPACITY}
 *    {@link #COLOR_FILTER}
 *
 * Stroke:
 *    {@link #COLOR} (non-gradient)
 *    {@link #STROKE_WIDTH}
 *    {@link #OPACITY}
 *    {@link #COLOR_FILTER}
 *
 * Ellipse:
 *    {@link #POSITION}
 *    {@link #ELLIPSE_SIZE}
 *
 * Polystar:
 *    {@link #POLYSTAR_POINTS}
 *    {@link #POLYSTAR_ROTATION}
 *    {@link #POSITION}
 *    {@link #POLYSTAR_INNER_RADIUS} (star)
 *    {@link #POLYSTAR_OUTER_RADIUS}
 *    {@link #POLYSTAR_INNER_ROUNDEDNESS} (star)
 *    {@link #POLYSTAR_OUTER_ROUNDEDNESS}
 *
 * Repeater:
 *    All transform properties
 *    {@link #REPEATER_COPIES}
 *    {@link #REPEATER_OFFSET}
 *    {@link #TRANSFORM_ROTATION}
 *    {@link #TRANSFORM_START_OPACITY}
 *    {@link #TRANSFORM_END_OPACITY}
 *
 * Layers:
 *    All transform properties
 *    {@link #TIME_REMAP} (composition layers only)
 */
public interface LottieProperty {
  /** ColorInt **/
  Integer COLOR = 1;
  Integer STROKE_COLOR = 2;
  /** Opacity value are 0-100 to match after effects **/
  Integer TRANSFORM_OPACITY = 3;
  /** [0,100] */
  Integer OPACITY = 4;
  /** In Px */
  PointF TRANSFORM_ANCHOR_POINT = new PointF();
  /** In Px */
  PointF TRANSFORM_POSITION = new PointF();
  /** In Px */
  PointF ELLIPSE_SIZE = new PointF();
  /** In Px */
  PointF RECTANGLE_SIZE = new PointF();
  /** In degrees */
  Float CORNER_RADIUS = 0f;
  /** In Px */
  PointF POSITION = new PointF();
  ScaleXY TRANSFORM_SCALE = new ScaleXY();
  /** In degrees */
  Float TRANSFORM_ROTATION = 1f;
  /** 0-85 */
  Float TRANSFORM_SKEW = 0f;
  /** In degrees */
  Float TRANSFORM_SKEW_ANGLE = 0f;
  /** In Px */
  Float STROKE_WIDTH = 2f;
  Float TEXT_TRACKING = 3f;
  Float REPEATER_COPIES = 4f;
  Float REPEATER_OFFSET = 5f;
  Float POLYSTAR_POINTS = 6f;
  /** In degrees */
  Float POLYSTAR_ROTATION = 7f;
  /** In Px */
  Float POLYSTAR_INNER_RADIUS = 8f;
  /** In Px */
  Float POLYSTAR_OUTER_RADIUS = 9f;
  /** [0,100] */
  Float POLYSTAR_INNER_ROUNDEDNESS = 10f;
  /** [0,100] */
  Float POLYSTAR_OUTER_ROUNDEDNESS = 11f;
  /** [0,100] */
  Float TRANSFORM_START_OPACITY = 12f;
  /** [0,100] */
  Float TRANSFORM_END_OPACITY = 12.1f;
  /** The time value in seconds */
  Float TIME_REMAP = 13f;
  /** In Dp */
  Float TEXT_SIZE = 14f;

  ColorFilter COLOR_FILTER = new ColorFilter();

  Integer[] GRADIENT_COLOR = new Integer[0];
}
