public void DrawPolyline(SvgPolyline svgPolyline, bool ignoreDisplay) { if (!CanDraw(svgPolyline, ignoreDisplay)) { return; } _skCanvas.Save(); var skMatrix = SkiaUtil.GetSKMatrix(svgPolyline.Transforms); SetTransform(skMatrix); SetClipPath(svgPolyline, _disposable); var skPaintOpacity = SetOpacity(svgPolyline, _disposable); var skPaintFilter = SetFilter(svgPolyline, _disposable); var skPath = SkiaUtil.ToSKPath(svgPolyline.Points, svgPolyline.FillRule, false, _disposable); if (skPath != null && !skPath.IsEmpty) { var skBounds = skPath.Bounds; if (SkiaUtil.IsValidFill(svgPolyline)) { var skPaint = SkiaUtil.GetFillSKPaint(svgPolyline, _skSize, skBounds, _disposable); _skCanvas.DrawPath(skPath, skPaint); } if (SkiaUtil.IsValidStroke(svgPolyline)) { var skPaint = SkiaUtil.GetStrokeSKPaint(svgPolyline, _skSize, skBounds, _disposable); _skCanvas.DrawPath(skPath, skPaint); } DrawMarkers(svgPolyline, skPath); } if (skPaintFilter != null) { _skCanvas.Restore(); } if (skPaintOpacity != null) { _skCanvas.Restore(); } _skCanvas.Restore(); }
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(); }
public void DrawRectangle(SvgRectangle svgRectangle, bool ignoreDisplay) { if (!CanDraw(svgRectangle, ignoreDisplay)) { return; } float x = svgRectangle.X.ToDeviceValue(null, UnitRenderingType.Horizontal, svgRectangle); float y = svgRectangle.Y.ToDeviceValue(null, UnitRenderingType.Vertical, svgRectangle); float width = svgRectangle.Width.ToDeviceValue(null, UnitRenderingType.Horizontal, svgRectangle); float height = svgRectangle.Height.ToDeviceValue(null, UnitRenderingType.Vertical, svgRectangle); float rx = svgRectangle.CornerRadiusX.ToDeviceValue(null, UnitRenderingType.Horizontal, svgRectangle); float ry = svgRectangle.CornerRadiusY.ToDeviceValue(null, UnitRenderingType.Vertical, svgRectangle); if (width <= 0f || height <= 0f || rx < 0f || ry < 0f) { return; } if (rx > 0f) { float halfWidth = width / 2f; if (rx > halfWidth) { rx = halfWidth; } } if (ry > 0f) { float halfHeight = height / 2f; if (ry > halfHeight) { ry = halfHeight; } } bool isRound = rx > 0f && ry > 0f; var skRectBounds = SKRect.Create(x, y, width, height); _skCanvas.Save(); var skMatrix = SkiaUtil.GetSKMatrix(svgRectangle.Transforms); SetTransform(skMatrix); SetClipPath(svgRectangle, _disposable); var skPaintOpacity = SetOpacity(svgRectangle, _disposable); var skPaintFilter = SetFilter(svgRectangle, _disposable); if (SkiaUtil.IsValidFill(svgRectangle)) { var skPaintFill = SkiaUtil.GetFillSKPaint(svgRectangle, _skSize, skRectBounds, _disposable); if (isRound) { _skCanvas.DrawRoundRect(x, y, width, height, rx, ry, skPaintFill); } else { _skCanvas.DrawRect(x, y, width, height, skPaintFill); } } if (SkiaUtil.IsValidStroke(svgRectangle)) { var skPaintStroke = SkiaUtil.GetStrokeSKPaint(svgRectangle, _skSize, skRectBounds, _disposable); if (isRound) { _skCanvas.DrawRoundRect(skRectBounds, rx, ry, skPaintStroke); } else { _skCanvas.DrawRect(skRectBounds, skPaintStroke); } } if (skPaintFilter != null) { _skCanvas.Restore(); } if (skPaintOpacity != null) { _skCanvas.Restore(); } _skCanvas.Restore(); }