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);
            }
        }
Esempio n. 2
0
        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);
            }
        }