SvgText.fromXml constructor

SvgText.fromXml(
  1. XmlElement element,
  2. SvgPainter painter,
  3. SvgBrush brush, [
  4. PdfPoint offset = PdfPoint.zero,
])

Implementation

factory SvgText.fromXml(
  XmlElement element,
  SvgPainter painter,
  SvgBrush brush, [
  PdfPoint offset = PdfPoint.zero,
]) {
  final _brush = SvgBrush.fromXml(element, brush, painter);

  final dx =
      SvgParser.getNumeric(element, 'dx', _brush, defaultValue: 0)!.sizeValue;
  final dy =
      SvgParser.getNumeric(element, 'dy', _brush, defaultValue: 0)!.sizeValue;
  final x = SvgParser.getNumeric(element, 'x', _brush)?.sizeValue;
  final y = SvgParser.getNumeric(element, 'y', _brush)?.sizeValue;

  final text = element.children
      .where((node) => node is XmlText || node is XmlCDATA)
      .map((node) => node.value)
      .join()
      .trim();

  final font = painter.getFontCache(
      _brush.fontFamily!, _brush.fontStyle!, _brush.fontWeight!)!;
  final pdfFont = font.getFont(Context(document: painter.document));
  final metrics = pdfFont.stringMetrics(text) * _brush.fontSize!.sizeValue;
  offset = PdfPoint((x ?? offset.x) + dx, (y ?? offset.y) + dy);

  switch (_brush.textAnchor!) {
    case SvgTextAnchor.start:
      break;
    case SvgTextAnchor.middle:
      offset = PdfPoint(offset.x - metrics.width / 2, offset.y);
      break;
    case SvgTextAnchor.end:
      offset = PdfPoint(offset.x - metrics.width, offset.y);
      break;
  }

  var childOffset = PdfPoint(offset.x + metrics.advanceWidth, offset.y);

  final tspan = element.children.whereType<XmlElement>().map<SvgText>((e) {
    final child = SvgText.fromXml(e, painter, _brush, childOffset);
    childOffset = PdfPoint(child.x! + child.dx, child.y!);
    return child;
  });

  return SvgText(
    offset.x,
    offset.y,
    metrics.advanceWidth,
    text,
    pdfFont,
    tspan,
    metrics,
    _brush,
    SvgClipPath.fromXml(element, painter, _brush),
    SvgTransform.fromXml(element),
    painter,
  );
}