#define MAX_COLORS 10

vec4 radialGradient(
  int amount,
  vec4 colors[MAX_COLORS],
  float stops[MAX_COLORS],
  vec2 center,
  float radius
) {
  vec2 fragCoord = destCoord();

  float d = distance(center, fragCoord.xy) / radius;

  vec4 color = colors[0];
  for (int i = 1; i < amount; i++) {
    color = mix(color, colors[i], clamp((d - stops[i - 1]) / (stops[i] - stops[i - 1]), 0.0, 1.0));
  }
  return color;
}

kernel vec4 radialGradient1Kernel(
  __color color0,
  float stop0,
  vec2 center,
  float radius
) {
  vec4 colors[MAX_COLORS];
  colors[0] = color0;

  float stops[MAX_COLORS];
  stops[0] = stop0;

  return radialGradient(1, colors, stops, center, radius);
}

kernel vec4 radialGradient2Kernel(
  __color color0,
  float stop0,
  __color color1,
  float stop1,
  vec2 center,
  float radius
) {
  vec4 colors[MAX_COLORS];
  colors[0] = color0;
  colors[1] = color1;

  float stops[MAX_COLORS];
  stops[0] = stop0;
  stops[1] = stop1;

  return radialGradient(2, colors, stops, center, radius);
}

kernel vec4 radialGradient3Kernel(
  __color color0,
  float stop0,
  __color color1,
  float stop1,
  __color color2,
  float stop2,
  vec2 center,
  float radius
) {
  vec4 colors[MAX_COLORS];
  colors[0] = color0;
  colors[1] = color1;
  colors[2] = color2;

  float stops[MAX_COLORS];
  stops[0] = stop0;
  stops[1] = stop1;
  stops[2] = stop2;

  return radialGradient(3, colors, stops, center, radius);
}

kernel vec4 radialGradient4Kernel(
  __color color0,
  float stop0,
  __color color1,
  float stop1,
  __color color2,
  float stop2,
  __color color3,
  float stop3,
  vec2 center,
  float radius
) {
  vec4 colors[MAX_COLORS];
  colors[0] = color0;
  colors[1] = color1;
  colors[2] = color2;
  colors[3] = color3;

  float stops[MAX_COLORS];
  stops[0] = stop0;
  stops[1] = stop1;
  stops[2] = stop2;
  stops[3] = stop3;

  return radialGradient(4, colors, stops, center, radius);
}

kernel vec4 radialGradient5Kernel(
  __color color0,
  float stop0,
  __color color1,
  float stop1,
  __color color2,
  float stop2,
  __color color3,
  float stop3,
  __color color4,
  float stop4,
  vec2 center,
  float radius
) {
  vec4 colors[MAX_COLORS];
  colors[0] = color0;
  colors[1] = color1;
  colors[2] = color2;
  colors[3] = color3;
  colors[4] = color4;

  float stops[MAX_COLORS];
  stops[0] = stop0;
  stops[1] = stop1;
  stops[2] = stop2;
  stops[3] = stop3;
  stops[4] = stop4;

  return radialGradient(5, colors, stops, center, radius);
}

kernel vec4 radialGradient6Kernel(
  __color color0,
  float stop0,
  __color color1,
  float stop1,
  __color color2,
  float stop2,
  __color color3,
  float stop3,
  __color color4,
  float stop4,
  __color color5,
  float stop5,
  vec2 center,
  float radius
) {
  vec4 colors[MAX_COLORS];
  colors[0] = color0;
  colors[1] = color1;
  colors[2] = color2;
  colors[3] = color3;
  colors[4] = color4;
  colors[5] = color5;

  float stops[MAX_COLORS];
  stops[0] = stop0;
  stops[1] = stop1;
  stops[2] = stop2;
  stops[3] = stop3;
  stops[4] = stop4;
  stops[5] = stop5;

  return radialGradient(6, colors, stops, center, radius);
}

kernel vec4 radialGradient7Kernel(
  __color color0,
  float stop0,
  __color color1,
  float stop1,
  __color color2,
  float stop2,
  __color color3,
  float stop3,
  __color color4,
  float stop4,
  __color color5,
  float stop5,
  __color color6,
  float stop6,
  vec2 center,
  float radius
) {
  vec4 colors[MAX_COLORS];
  colors[0] = color0;
  colors[1] = color1;
  colors[2] = color2;
  colors[3] = color3;
  colors[4] = color4;
  colors[5] = color5;
  colors[6] = color6;

  float stops[MAX_COLORS];
  stops[0] = stop0;
  stops[1] = stop1;
  stops[2] = stop2;
  stops[3] = stop3;
  stops[4] = stop4;
  stops[5] = stop5;
  stops[6] = stop6;

  return radialGradient(7, colors, stops, center, radius);
}

kernel vec4 radialGradient8Kernel(
  __color color0,
  float stop0,
  __color color1,
  float stop1,
  __color color2,
  float stop2,
  __color color3,
  float stop3,
  __color color4,
  float stop4,
  __color color5,
  float stop5,
  __color color6,
  float stop6,
  __color color7,
  float stop7,
  vec2 center,
  float radius
) {
  vec4 colors[MAX_COLORS];
  colors[0] = color0;
  colors[1] = color1;
  colors[2] = color2;
  colors[3] = color3;
  colors[4] = color4;
  colors[5] = color5;
  colors[6] = color6;
  colors[7] = color7;

  float stops[MAX_COLORS];
  stops[0] = stop0;
  stops[1] = stop1;
  stops[2] = stop2;
  stops[3] = stop3;
  stops[4] = stop4;
  stops[5] = stop5;
  stops[6] = stop6;
  stops[7] = stop7;

  return radialGradient(8, colors, stops, center, radius);
}

kernel vec4 radialGradient9Kernel(
  __color color0,
  float stop0,
  __color color1,
  float stop1,
  __color color2,
  float stop2,
  __color color3,
  float stop3,
  __color color4,
  float stop4,
  __color color5,
  float stop5,
  __color color6,
  float stop6,
  __color color7,
  float stop7,
  __color color8,
  float stop8,
  vec2 center,
  float radius
) {
  vec4 colors[MAX_COLORS];
  colors[0] = color0;
  colors[1] = color1;
  colors[2] = color2;
  colors[3] = color3;
  colors[4] = color4;
  colors[5] = color5;
  colors[6] = color6;
  colors[7] = color7;
  colors[8] = color8;

  float stops[MAX_COLORS];
  stops[0] = stop0;
  stops[1] = stop1;
  stops[2] = stop2;
  stops[3] = stop3;
  stops[4] = stop4;
  stops[5] = stop5;
  stops[6] = stop6;
  stops[7] = stop7;
  stops[8] = stop8;

  return radialGradient(9, colors, stops, center, radius);
}

kernel vec4 radialGradient10Kernel(
  __color color0,
  float stop0,
  __color color1,
  float stop1,
  __color color2,
  float stop2,
  __color color3,
  float stop3,
  __color color4,
  float stop4,
  __color color5,
  float stop5,
  __color color6,
  float stop6,
  __color color7,
  float stop7,
  __color color8,
  float stop8,
  __color color9,
  float stop9,
  vec2 center,
  float radius
) {
  vec4 colors[MAX_COLORS];
  colors[0] = color0;
  colors[1] = color1;
  colors[2] = color2;
  colors[3] = color3;
  colors[4] = color4;
  colors[5] = color5;
  colors[6] = color6;
  colors[7] = color7;
  colors[8] = color8;
  colors[9] = color9;

  float stops[MAX_COLORS];
  stops[0] = stop0;
  stops[1] = stop1;
  stops[2] = stop2;
  stops[3] = stop3;
  stops[4] = stop4;
  stops[5] = stop5;
  stops[6] = stop6;
  stops[7] = stop7;
  stops[8] = stop8;
  stops[9] = stop9;

  return radialGradient(10, colors, stops, center, radius);
}
