SvgRadialGradient.fromXml constructor

SvgRadialGradient.fromXml(
  1. XmlElement element,
  2. SvgPainter painter
)

Implementation

factory SvgRadialGradient.fromXml(XmlElement element, SvgPainter painter) {
  final r =
      SvgParser.getNumeric(element, 'r', null, defaultValue: .5)!.sizeValue;
  final cx =
      SvgParser.getNumeric(element, 'cx', null, defaultValue: .5)!.sizeValue;
  final cy =
      SvgParser.getNumeric(element, 'cy', null, defaultValue: .5)!.sizeValue;
  final fr =
      SvgParser.getNumeric(element, 'fr', null, defaultValue: 0)!.sizeValue;
  final fx =
      SvgParser.getNumeric(element, 'fx', null, defaultValue: cx)!.sizeValue;
  final fy =
      SvgParser.getNumeric(element, 'fy', null, defaultValue: cy)!.sizeValue;

  final colors = <PdfColor?>[];
  final stops = <double>[];
  final opacityList = <double>[];

  for (final child in element.children
      .whereType<XmlElement>()
      .where((e) => e.name.local == 'stop')) {
    SvgParser.convertStyle(child);
    final color = SvgColor.fromXml(
        child.getAttribute('stop-color') ?? 'black', painter);
    final opacity =
        SvgParser.getDouble(child, 'stop-opacity', defaultValue: 1);
    final stop = SvgParser.getNumeric(child, 'offset', null, defaultValue: 0)!
        .sizeValue;
    colors.add(color.color);
    stops.add(stop);
    opacityList.add(opacity!);
  }

  GradientUnits? gradientUnits;
  switch (element.getAttribute('gradientUnits')) {
    case 'userSpaceOnUse':
      gradientUnits = GradientUnits.userSpaceOnUse;
      break;
    case 'objectBoundingBox':
      gradientUnits = GradientUnits.objectBoundingBox;
      break;
  }

  final result = SvgRadialGradient(
      gradientUnits,
      r,
      cx,
      cy,
      fr,
      fx,
      fy,
      SvgTransform.fromString(element.getAttribute('gradientTransform')),
      colors,
      stops,
      opacityList);

  SvgRadialGradient href;
  final hrefAttr = element.getAttribute('href') ??
      element.getAttribute('href', namespace: 'http://www.w3.org/1999/xlink');

  if (hrefAttr != null) {
    final hrefElement = painter.parser.findById(hrefAttr.substring(1));
    if (hrefElement != null) {
      href = SvgRadialGradient.fromXml(hrefElement, painter);
      return href.mergeWith(result);
    }
  }

  return result;
}