public override void VisitTextElement(SvgTextElement element) { base.VisitTextElement(element); var fonts = SystemFonts.Collection; fonts.TryGet(DefaultFont, out FontFamily family); foreach (var f in element.Style.FontFamily.Value) { var fontName = f; if (fontName.Equals("sans-serif")) { fontName = DefaultSansSerifFont; } else if (fontName.Equals("serif")) { fontName = DefaultSerifFont; } if (fonts.TryGet(fontName, out family)) { break; } } if (family == null) { fonts.TryGet(DefaultFont, out family); } var fontSize = element.Style.FontSize.Value.Value; var origin = new PointF(element.X?.Value ?? 0, element.Y?.Value ?? 0); var font = new Font(family, fontSize); var visitor = new SvgTextSpanTextVisitor(); element.Accept(visitor); var text = visitor.Text; // offset by the ascender to account for fonts render origin of top left var ascender = ((font.FontMetrics.Ascender * font.Size) / (font.FontMetrics.UnitsPerEm * 72)) * 72; var render = new TextOptions(font) { Dpi = 72, Origin = origin - new PointF(0, ascender), HorizontalAlignment = element.Style.TextAnchor.Value.AsHorizontalAlignment() }; var glyphs = TextBuilder.GenerateGlyphs(text, render); foreach (var p in glyphs) { this.RenderShapeToCanvas(element, p); } }
public override void VisitTextElement(SvgTextElement element) { base.VisitTextElement(element); var fonts = SystemFonts.Collection; FontFamily family = null; foreach (var f in element.Style.FontFamily.Value) { var fontName = f; if (fontName.Equals("sans-serif")) { fontName = DefaultSansSerifFont; } else if (fontName.Equals("serif")) { fontName = DefaultSerifFont; } if (fonts.TryFind(fontName, out family)) { break; } } if (ReferenceEquals(family, null)) //FontFamily overrides == operator and can't handle 'null' value on the left. { family = fonts.Find(DefaultFont); } var fontSize = element.Style.FontSize.Value.Value; var origin = new PointF(element.X?.Value ?? 0, element.Y?.Value ?? 0); var font = family.CreateFont(fontSize); var visitor = new SvgTextSpanTextVisitor(); element.Accept(visitor); var text = visitor.Text; // offset by the ascender to account for fonts render origin of top left var ascender = ((font.Ascender * font.Size) / (font.EmSize * 72)) * 72; var render = new RendererOptions(font, 72, origin - new PointF(0, ascender)) { HorizontalAlignment = element.Style.TextAnchor.Value.AsHorizontalAlignment() }; var glyphs = TextBuilder.GenerateGlyphs(text, render); foreach (var p in glyphs) { this.RenderShapeToCanvas(element, p); } }