public void DrawUse(SvgUse svgUse, bool ignoreDisplay) { if (!CanDraw(svgUse, ignoreDisplay)) { return; } var svgVisualElement = SkiaUtil.GetReference <SvgVisualElement>(svgUse, svgUse.ReferencedElement); if (svgVisualElement == null || SkiaUtil.HasRecursiveReference(svgUse)) { return; } float x = svgUse.X.ToDeviceValue(null, UnitRenderingType.Horizontal, svgUse); float y = svgUse.Y.ToDeviceValue(null, UnitRenderingType.Vertical, svgUse); var skMatrixTranslateXY = SKMatrix.MakeTranslation(x, y); var skMatrix = SkiaUtil.GetSKMatrix(svgUse.Transforms); SKMatrix.PreConcat(ref skMatrix, ref skMatrixTranslateXY); var ew = svgUse.Width.ToDeviceValue(null, UnitRenderingType.Horizontal, svgUse); var eh = svgUse.Height.ToDeviceValue(null, UnitRenderingType.Vertical, svgUse); if (ew > 0 && eh > 0) { var _attributes = svgVisualElement.GetType().GetField("_attributes", BindingFlags.NonPublic | BindingFlags.Instance); if (_attributes != null) { var attributes = _attributes.GetValue(svgVisualElement) as SvgAttributeCollection; if (attributes != null) { var viewBox = attributes.GetAttribute <SvgViewBox>("viewBox"); if (viewBox != SvgViewBox.Empty && Math.Abs(ew - viewBox.Width) > float.Epsilon && Math.Abs(eh - viewBox.Height) > float.Epsilon) { var sw = ew / viewBox.Width; var sh = eh / viewBox.Height; var skMatrixTranslateSWSH = SKMatrix.MakeTranslation(sw, sh); SKMatrix.PreConcat(ref skMatrix, ref skMatrixTranslateSWSH); } } } } var originalParent = svgUse.Parent; var useParent = svgUse.GetType().GetField("_parent", BindingFlags.NonPublic | BindingFlags.Instance); if (useParent != null) { useParent.SetValue(svgVisualElement, svgUse); } svgVisualElement.InvalidateChildPaths(); _skCanvas.Save(); SetTransform(skMatrix); SetClipPath(svgUse, _disposable); var skPaintOpacity = SetOpacity(svgUse, _disposable); var skPaintFilter = SetFilter(svgUse, _disposable); if (svgVisualElement is SvgSymbol svgSymbol) { DrawSymbol(svgSymbol, ignoreDisplay); } else { Draw(svgVisualElement, ignoreDisplay); } if (skPaintFilter != null) { _skCanvas.Restore(); } if (skPaintOpacity != null) { _skCanvas.Restore(); } _skCanvas.Restore(); if (useParent != null) { useParent.SetValue(svgVisualElement, originalParent); } }