SvgText.fromXml constructor
SvgText.fromXml(
- XmlElement element,
- SvgPainter painter,
- SvgBrush brush, [
- 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,
);
}