// ============================================================================
// RadialGradient
// ============================================================================

///|
/// Radial gradient definition
pub(all) struct RadialGradient {
  cx : Double // Center x (0.0-1.0 relative)
  cy : Double // Center y
  fx : Double // Focal point x
  fy : Double // Focal point y
  r : Double // Radius
  stops : Array[GradientStop]
  spread_method : SpreadMethod
  units : GradientUnits
  transform : Transform
}

///|
pub fn RadialGradient::new(
  cx : Double,
  cy : Double,
  r : Double,
  stops : Array[GradientStop],
) -> RadialGradient {
  {
    cx,
    cy,
    fx: cx,
    fy: cy,
    r,
    stops,
    spread_method: Pad,
    units: ObjectBoundingBox,
    transform: Transform::identity(),
  }
}

///|
fn interpolate_gradient_color(t : Double, stops : Array[GradientStop]) -> Color {
  if stops.is_empty() {
    return Color::black()
  }
  if stops.length() == 1 {
    return stops[0].color
  }
  if t < stops[0].offset {
    return stops[0].color
  }
  let mut left_index = 0
  for index in 1..