public void DrawText(SvgText svgText, bool ignoreDisplay) { if (!CanDraw(svgText, ignoreDisplay)) { return; } _skCanvas.Save(); var skMatrix = SkiaUtil.GetSKMatrix(svgText.Transforms); SetTransform(skMatrix); SetClipPath(svgText, _disposable); var skPaintOpacity = SetOpacity(svgText, _disposable); var skPaintFilter = SetFilter(svgText, _disposable); // TODO: bool isValidFill = SkiaUtil.IsValidFill(svgText); bool isValidStroke = SkiaUtil.IsValidStroke(svgText); if (isValidFill || isValidStroke) { var text = svgText.Text?.Trim(); if (svgText.X.Count == 1 && svgText.Y.Count == 1 && !string.IsNullOrEmpty(text)) { // TODO: float x0 = svgText.X[0].ToDeviceValue(null, UnitRenderingType.HorizontalOffset, svgText); float y0 = svgText.Y[0].ToDeviceValue(null, UnitRenderingType.VerticalOffset, svgText); // TODO: var skBounds = SKRect.Create(0f, 0f, _skSize.Width, _skSize.Height); if (SkiaUtil.IsValidFill(svgText)) { var skPaint = SkiaUtil.GetFillSKPaint(svgText, _skSize, skBounds, _disposable); SkiaUtil.SetSKPaintText(svgText, _skSize, skBounds, skPaint, _disposable); _skCanvas.DrawText(text, x0, y0, skPaint); } if (SkiaUtil.IsValidStroke(svgText)) { var skPaint = SkiaUtil.GetStrokeSKPaint(svgText, _skSize, skBounds, _disposable); SkiaUtil.SetSKPaintText(svgText, _skSize, skBounds, skPaint, _disposable); _skCanvas.DrawText(text, x0, y0, skPaint); } } } if (skPaintFilter != null) { _skCanvas.Restore(); } if (skPaintOpacity != null) { _skCanvas.Restore(); } _skCanvas.Restore(); }