public void DrawSymbol(SvgSymbol svgSymbol, bool ignoreDisplay) { if (!CanDraw(svgSymbol, ignoreDisplay)) { return; } _skCanvas.Save(); float x = 0f; float y = 0f; float width = svgSymbol.ViewBox.Width; float height = svgSymbol.ViewBox.Height; if (svgSymbol.CustomAttributes.TryGetValue("width", out string?_widthString)) { if (new SvgUnitConverter().ConvertFrom(_widthString) is SvgUnit _width) { width = _width.ToDeviceValue(null, UnitRenderingType.Horizontal, svgSymbol); } } if (svgSymbol.CustomAttributes.TryGetValue("height", out string?heightString)) { if (new SvgUnitConverter().ConvertFrom(heightString) is SvgUnit _height) { height = _height.ToDeviceValue(null, UnitRenderingType.Vertical, svgSymbol); } } var skRectBounds = SKRect.Create(x, y, width, height); var skMatrixViewBox = SkiaUtil.GetSvgViewBoxTransform(svgSymbol.ViewBox, svgSymbol.AspectRatio, x, y, width, height); var skMatrix = SkiaUtil.GetSKMatrix(svgSymbol.Transforms); SKMatrix.PreConcat(ref skMatrix, ref skMatrixViewBox); SetTransform(skMatrix); SetClipPath(svgSymbol, _disposable); var skPaintOpacity = SetOpacity(svgSymbol, _disposable); var skPaintFilter = SetFilter(svgSymbol, _disposable); foreach (var svgElement in svgSymbol.Children) { Draw(svgElement, ignoreDisplay); } if (skPaintFilter != null) { _skCanvas.Restore(); } if (skPaintOpacity != null) { _skCanvas.Restore(); } _skCanvas.Restore(); }
// TODO: //public void DrawAnchor(SvgAnchor svgAnchor, bool ignoreDisplay) //{ // _skCanvas.Save(); // // var skMatrix = SkiaUtil.GetSKMatrix(svgAnchor.Transforms); // SetTransform(skMatrix); // // var skPaintOpacity = SetOpacity(svgAnchor, _disposable); // // foreach (var svgElement in svgAnchor.Children) // { // Draw(svgElement, ignoreDisplay); // } // // if (skPaintOpacity != null) // { // _skCanvas.Restore(); // } // // _skCanvas.Restore(); //} public void DrawFragment(SvgFragment svgFragment, bool ignoreDisplay) { float x = svgFragment.X.ToDeviceValue(null, UnitRenderingType.Horizontal, svgFragment); float y = svgFragment.Y.ToDeviceValue(null, UnitRenderingType.Vertical, svgFragment); var skSize = SkiaUtil.GetDimensions(svgFragment); _skCanvas.Save(); switch (svgFragment.Overflow) { case SvgOverflow.Auto: case SvgOverflow.Visible: case SvgOverflow.Inherit: break; default: var skClipRect = SKRect.Create(x, y, skSize.Width, skSize.Height); _skCanvas.ClipRect(skClipRect, SKClipOperation.Intersect); break; } var skMatrixViewBox = SkiaUtil.GetSvgViewBoxTransform(svgFragment.ViewBox, svgFragment.AspectRatio, x, y, skSize.Width, skSize.Height); var skMatrix = SkiaUtil.GetSKMatrix(svgFragment.Transforms); SKMatrix.PreConcat(ref skMatrix, ref skMatrixViewBox); SetTransform(skMatrix); var skPaintOpacity = SetOpacity(svgFragment, _disposable); foreach (var svgElement in svgFragment.Children) { Draw(svgElement, ignoreDisplay); } if (skPaintOpacity != null) { _skCanvas.Restore(); } _skCanvas.Restore(); }