예제 #1
0
        /// <inheritdoc/>
        public void DrawLineSegments(
            IList <ScreenPoint> points,
            OxyColor stroke,
            double thickness,
            EdgeRenderingMode edgeRenderingMode,
            double[] dashArray = null,
            LineJoin lineJoin  = LineJoin.Miter)
        {
            if (points.Count < 2 || !stroke.IsVisible() || thickness <= 0)
            {
                return;
            }

            var paint = this.GetLinePaint(stroke, thickness, edgeRenderingMode, dashArray, lineJoin);

            var skPoints = new SKPoint[points.Count];

            switch (edgeRenderingMode)
            {
            case EdgeRenderingMode.Automatic when this.RendersToPixels:
            case EdgeRenderingMode.Adaptive when this.RendersToPixels:
            case EdgeRenderingMode.PreferSharpness when this.RendersToPixels:
                var snapOffset = this.GetSnapOffset(thickness, edgeRenderingMode);
                for (var i = 0; i < points.Count - 1; i += 2)
                {
                    var p1 = points[i];
                    var p2 = points[i + 1];
                    if (RenderContextBase.IsStraightLine(p1, p2))
                    {
                        skPoints[i]     = this.ConvertSnap(p1, snapOffset);
                        skPoints[i + 1] = this.ConvertSnap(p2, snapOffset);
                    }
                    else
                    {
                        skPoints[i]     = this.Convert(p1);
                        skPoints[i + 1] = this.Convert(p2);
                    }
                }

                break;

            default:
                for (var i = 0; i < points.Count; i += 2)
                {
                    skPoints[i]     = this.Convert(points[i]);
                    skPoints[i + 1] = this.Convert(points[i + 1]);
                }

                break;
            }

            this.SkCanvas.DrawPoints(SKPointMode.Lines, skPoints, paint);
        }
예제 #2
0
        /// <summary>
        /// Gets the <see cref="SKPoint"/>s that should actually be rendered from the list of <see cref="ScreenPoint"/>s, taking into account DPI scaling and snapping if necessary.
        /// </summary>
        /// <param name="screenPoints">The points.</param>
        /// <param name="strokeThickness">The stroke thickness.</param>
        /// <param name="edgeRenderingMode">The edge rendering mode.</param>
        /// <returns>The actual points.</returns>
        private IEnumerable <SKPoint> GetActualPoints(IList <ScreenPoint> screenPoints, double strokeThickness, EdgeRenderingMode edgeRenderingMode)
        {
            switch (edgeRenderingMode)
            {
            case EdgeRenderingMode.Automatic when this.RendersToPixels && RenderContextBase.IsStraightLine(screenPoints):
            case EdgeRenderingMode.Adaptive when this.RendersToPixels && RenderContextBase.IsStraightLine(screenPoints):
            case EdgeRenderingMode.PreferSharpness when this.RendersToPixels:
                var snapOffset = this.GetSnapOffset(strokeThickness, edgeRenderingMode);
                return(screenPoints.Select(p => this.ConvertSnap(p, snapOffset)));

            default:
                return(screenPoints.Select(this.Convert));
            }
        }