Example #1
0
		private void CanvasAnimatedControl_OnDraw(ICanvasAnimatedControl sender, CanvasAnimatedDrawEventArgs args)
		{
			for (int i = 0; i <= _ringCount; i++)
			{
				var currentOffset = StartOffset + i*(RingPadding + RingStrokeWidth);
				using (var c = new CanvasPathBuilder(sender))
				{
					c.BeginFigure(currentOffset, 0.0f);
					c.AddArc(new Vector2(0.0f, 0.0f), currentOffset, currentOffset, 0.0f, (float)(Math.PI * 2));
					c.EndFigure(CanvasFigureLoop.Open);
					using (var g = CanvasGeometry.CreatePath(c))
					{
						var m = _pattern[_animationCounter + (_ringCount - i)];
						_brush.Transform = Matrix3x2.CreateRotation((float)(Math.PI * 2 * m), _center);
						using (args.DrawingSession.CreateLayer(_brush))
						{
							args.DrawingSession.DrawGeometry(g, _center, Color.FromArgb(255,
								m < 0.5 ? Convert.ToByte(Math.Floor(m * 2 * 255)) : Convert.ToByte(Math.Floor((1.5 - m) * 255)),
								m < 0.5 ? (byte)128 : Convert.ToByte(Math.Floor(m * 255)),
								255), RingStrokeWidth);
						}
					}
				}
			}
			_animationCounter++;
			if (_animationCounter > _pattern.Count - _ringCount - 1) _animationCounter = 0;
		}
 internal override void drawPath(CanvasPathBuilder p, Stroke stroke)
 {
     setGraphics(canvas.CreateDrawingSession());
     base.setClip(clip);
     base.drawPath(p, stroke);
     base.removeClip();
 }
        public void beginPath()
        {
            if (this.pathBuilder != null) {
                closePath();
            }

            this.pathBuilder = new CanvasPathBuilder(CanvasDevice.GetSharedDevice());
            
        }
 public PathInfo(ICanvasResourceCreator rc, Windows.UI.Color color, System.Single strokeWidth, CanvasStrokeStyle strokeStyle) //Pen pen, bool fill, int shapeType)
 {
     Vector2 offset = new Vector2(0.0f, 0.0f);
     _cpb = new CanvasPathBuilder(rc);
     //_cpb.SetSegmentOptions(CanvasFigureSegmentOptions.ForceRoundLineJoin);
     _color = color;
     //_fill = fill;
     //_type = shapeType;
 }
        public PathInfo(ICanvasResourceCreator rc, Windows.UI.Color color, System.Single strokeWidth, bool fill, int shapeType) //Pen pen, bool fill, int shapeType)
        {
            Vector2 offset = new Vector2(0.0f, 0.0f);
            _cpb = new CanvasPathBuilder(rc);

            _color = color;
            _fill = fill;
            _type = shapeType;
            CanvasGeometry path = CanvasGeometry.CreatePath(_cpb);
            //path.ComputeBounds

            //var geometry = CanvasGeometry.CreatePath(pathBuilder);
        }
 internal virtual void drawArc(int x, int y, int w, int h, int startAngle, int arcAngle)
 {
     Vector2 center = new Vector2();
     center.X = x + w / 2;
     center.Y = y + h / 2;
     if (arcAngle == 360)
         graphics.DrawEllipse(center, w / 2, h / 2, c);
     else
     {
         CanvasPathBuilder builder = new CanvasPathBuilder(graphics);
         builder.BeginFigure(center);
         builder.AddArc(center, w / 2, h / 2, -(float)(2 * Math.PI * startAngle / 360), -(float)(2 * Math.PI * arcAngle / 360));
         builder.EndFigure(CanvasFigureLoop.Closed);
         graphics.DrawGeometry(CanvasGeometry.CreatePath(builder), c);
     }
 }
        public void Draw(ICanvasAnimatedControl sender, CanvasDrawingSession drawingSession)
        {
            if (currentThunder == null)
            {
                return;
            }
            // 保护原先画布的混合模式
            var previousBlend = drawingSession.Blend;
            drawingSession.Blend = blendState;
            var builder = new CanvasPathBuilder(sender);
            builder.BeginFigure(0, 0);
            for (int i = 0; i < currentThunder.LifeLong; i++)
            {
                builder.AddLine(currentThunder.Path[i].X, currentThunder.Path[i].Y);
            }
            builder.EndFigure(CanvasFigureLoop.Open);
            builder.SetSegmentOptions(CanvasFigureSegmentOptions.ForceRoundLineJoin);

            // Draw the particle.
            var path = CanvasGeometry.CreatePath(builder);
            var NormalizeLifeTime = currentThunder.TimeSinceStart / currentThunder.Duration;
            byte opacity = (byte)((NormalizeLifeTime - 1) * (NormalizeLifeTime - 1) * 255);
            CanvasCommandList cl = new CanvasCommandList(sender);
            using (CanvasDrawingSession clds = cl.CreateDrawingSession())
            {
                clds.DrawGeometry(path, currentThunder.Position, Color.FromArgb((byte)(0.75f * opacity), 255, 255, 255), 6 * currentThunder.Luminace);
            }
            var lightAmount = 20.6f * currentThunder.Luminace * (NormalizeLifeTime - 1) * (NormalizeLifeTime - 1);
            blur.Source = cl;
            blur.BlurAmount = lightAmount;
            drawingSession.DrawImage(blur);
            drawingSession.DrawGeometry(path, currentThunder.Position, Color.FromArgb(opacity, 255, 240, 180), 2 * currentThunder.Luminace);
            drawingSession.Blend = previousBlend;
            if (NormalizeLifeTime > 1)
            {
                currentThunder = null;
            }
        }
Example #8
0
        /// <summary>
        /// Adds the Path Element to the Path.
        /// </summary>
        /// <param name="pathBuilder">CanvasPathBuilder object</param>
        /// <param name="currentPoint">The last active location in the Path before adding
        /// the Path Element</param>
        /// <param name="lastElement">The previous PathElement in the Path.</param>
        /// <param name="logger">For logging purpose. To log the set of CanvasPathBuilder
        /// commands, used for creating the CanvasGeometry, in string format.</param>
        /// <returns>The latest location in the Path after adding the Path Element</returns>
        public override Vector2 CreatePath(CanvasPathBuilder pathBuilder, Vector2 currentPoint,
                                           ref ICanvasPathElement lastElement, StringBuilder logger)
        {
            // Calculate coordinates
            var point = new Vector2(_x, _y);

            if (IsRelative)
            {
                point += currentPoint;
            }

            // Execute command
            pathBuilder.AddArc(point, _radiusX, _radiusY, _angle, _sweepDirection, _arcSize);

            // Log command
            logger?.Append($"{Indent}pathBuilder.AddArc(new Vector2({point.X}, {point.Y}), ");
            logger?.AppendLine($"{_radiusX}, {_radiusY}, {_angle}, {_sweepDirection}, {_arcSize});");

            // Set Last Element
            lastElement = this;
            // Return current point
            return(point);
        }
        public static CanvasPathBuilder BuildPathWithLines(
            this CanvasPathBuilder builder,
            IEnumerable <Vector2> vectors,
            CanvasFigureLoop canvasFigureLoop)
        {
            var first = true;

            foreach (var vector2 in vectors)
            {
                if (first)
                {
                    builder.BeginFigure(vector2);
                    first = false;
                }
                else
                {
                    builder.AddLine(vector2);
                }
            }

            builder.EndFigure(canvasFigureLoop);
            return(builder);
        }
Example #10
0
            // - - - Shape tree root for layer: icon
            // - - ShapeGroup: Group 2
            CanvasGeometry Geometry_0()
            {
                CanvasGeometry result;

                using (var builder = new CanvasPathBuilder(null))
                {
                    builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Winding);
                    builder.BeginFigure(new Vector2(2.77399993F, -79.1600037F));
                    builder.AddCubicBezier(new Vector2(1.09399998F, -80.2799988F), new Vector2(-1.09399998F, -80.2799988F), new Vector2(-2.773F, -79.1600037F));
                    builder.AddCubicBezier(new Vector2(-22.1550007F, -66.2389984F), new Vector2(-43.1170006F, -58.1769981F), new Vector2(-65.7070007F, -54.9500008F));
                    builder.AddCubicBezier(new Vector2(-68.1699982F, -54.5979996F), new Vector2(-70F, -52.487999F), new Vector2(-70F, -50F));
                    builder.AddLine(new Vector2(-70F, -5F));
                    builder.AddCubicBezier(new Vector2(-70F, 33.9129982F), new Vector2(-46.9300003F, 62.3069992F), new Vector2(-1.79499996F, 79.6669998F));
                    builder.AddCubicBezier(new Vector2(-0.639999986F, 80.1110001F), new Vector2(0.639999986F, 80.1110001F), new Vector2(1.79499996F, 79.6669998F));
                    builder.AddCubicBezier(new Vector2(46.9300003F, 62.3069992F), new Vector2(70F, 33.9129982F), new Vector2(70F, -5F));
                    builder.AddLine(new Vector2(70F, -50F));
                    builder.AddCubicBezier(new Vector2(70F, -52.487999F), new Vector2(68.1699982F, -54.5979996F), new Vector2(65.7070007F, -54.9500008F));
                    builder.AddCubicBezier(new Vector2(43.1170006F, -58.1769981F), new Vector2(22.1550007F, -66.2389984F), new Vector2(2.77399993F, -79.1600037F));
                    builder.EndFigure(CanvasFigureLoop.Closed);
                    result = CanvasGeometry.CreatePath(builder);
                }
                return(result);
            }
Example #11
0
        private CanvasGeometry CreatePathGeometry(CanvasDrawingSession drawingSession, IEnumerable <Vector2> points, bool close, Matrix3x2 transformMatrix)
        {
            var pathBuilder = new CanvasPathBuilder(drawingSession);

            pathBuilder.BeginFigure(points.First());

            foreach (var point in points.Skip(1))
            {
                pathBuilder.AddLine(Multiply(transformMatrix, point));
            }

            if (close)
            {
                pathBuilder.AddLine(Multiply(transformMatrix, new Vector2(1, 1)));
                pathBuilder.AddLine(Multiply(transformMatrix, new Vector2(0, 1)));
            }

            pathBuilder.EndFigure(close ? CanvasFigureLoop.Closed : CanvasFigureLoop.Open);

            var geometry = CanvasGeometry.CreatePath(pathBuilder);

            return(geometry);
        }
Example #12
0
        private static CanvasGeometry CreatePieCore(ICanvasResourceCreator resourceCreator, Matrix3x2 oneMatrix, float sweepAngle)
        {
            // start tooth
            Vector2 startTooth = new Vector2(1, 0);
            // end tooth
            Vector2 endTooth = TransformerGeometry.GetRotationVector(sweepAngle);

            CanvasPathBuilder pathBuilder   = new CanvasPathBuilder(resourceCreator);
            CanvasArcSize     canvasArcSize = (sweepAngle < System.Math.PI) ? CanvasArcSize.Large : CanvasArcSize.Small;

            {
                pathBuilder.BeginFigure(Vector2.Zero);

                // end notch point
                pathBuilder.AddLine(endTooth);

                // end tooth point
                pathBuilder.AddArc(startTooth, 1, 1, sweepAngle, CanvasSweepDirection.Clockwise, canvasArcSize);

                pathBuilder.EndFigure(CanvasFigureLoop.Closed);
            }
            return(CanvasGeometry.CreatePath(pathBuilder).Transform(oneMatrix));
        }
Example #13
0
        private static CanvasGeometry BuildGeometry(ICanvasResourceCreator resourceCreator, IReadOnlyList <Vector2> points)
        {
            using (var builder = new CanvasPathBuilder(resourceCreator.Device))
            {
                builder.BeginFigure(points[0]);

                for (var i = 0; i < points.Count / 3; i++)
                {
                    builder.AddQuadraticBezier(points[(i * 3) + 1], points[(i * 3) + 2]);

                    var lastIndex = (i * 3) + 3;

                    if (lastIndex < points.Count - 1)
                    {
                        builder.AddLine(points[lastIndex]);
                    }
                }

                builder.EndFigure(CanvasFigureLoop.Closed);

                return(CanvasGeometry.CreatePath(builder));
            }
        }
Example #14
0
        private static CanvasGeometry CreateFilledPath(ICanvasResourceCreator session, Vector2 point1, Vector2 point2)
        {
            var halfX = (point1.X + point2.X) * 0.5f;

            using (var builder = new CanvasPathBuilder(session.Device))
            {
                builder.BeginFigure(new Vector2(point1.X, point1.Y - StartHeightHalf));

                builder.AddCubicBezier(
                    new Vector2(halfX, point1.Y - StartHeightHalf),
                    new Vector2(halfX, point2.Y),
                    new Vector2(point2.X, point2.Y));
                builder.AddLine(point2.X, point2.Y);
                builder.AddCubicBezier(
                    new Vector2(halfX, point2.Y),
                    new Vector2(halfX, point1.Y + StartHeightHalf),
                    new Vector2(point1.X, point1.Y + StartHeightHalf));

                builder.EndFigure(CanvasFigureLoop.Closed);

                return(CanvasGeometry.CreatePath(builder));
            }
        }
Example #15
0
            // - - - - Shape tree root for layer: icon
            // - - - ShapeGroup: Group 6
            // - - Path 2+Path 1.PathGeometry
            CanvasGeometry Geometry_2()
            {
                CanvasGeometry result;

                using (var builder = new CanvasPathBuilder(null))
                {
                    builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Winding);
                    builder.BeginFigure(new Vector2(-70F, -55F));
                    builder.AddCubicBezier(new Vector2(-70F, -63.2840004F), new Vector2(-63.2840004F, -70F), new Vector2(-55F, -70F));
                    builder.AddLine(new Vector2(55F, -70F));
                    builder.AddCubicBezier(new Vector2(63.2840004F, -70F), new Vector2(70F, -63.2840004F), new Vector2(70F, -55F));
                    builder.AddLine(new Vector2(70F, 15F));
                    builder.AddCubicBezier(new Vector2(70F, 23.2840004F), new Vector2(63.2840004F, 30F), new Vector2(55F, 30F));
                    builder.AddLine(new Vector2(0F, 30F));
                    builder.AddLine(new Vector2(0F, -20F));
                    builder.AddCubicBezier(new Vector2(0F, -31.0459995F), new Vector2(-8.95400047F, -40F), new Vector2(-20F, -40F));
                    builder.AddLine(new Vector2(-70F, -40F));
                    builder.AddLine(new Vector2(-70F, -55F));
                    builder.EndFigure(CanvasFigureLoop.Closed);
                    result = CanvasGeometry.CreatePath(builder);
                }
                return(result);
            }
        void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
        {
            CanvasDevice      device = CanvasDevice.GetSharedDevice();
            CanvasPathBuilder p      = new CanvasPathBuilder(device.Device);

            args.DrawingSession.Clear(Colors.LawnGreen);
            hex   = payload.hex;
            point = payload.point;
            p.BeginFigure(hex.P1.X, hex.P1.Y);
            p.AddLine(hex.P2.X, hex.P2.Y);
            p.AddLine(hex.P3.X, hex.P3.Y);
            p.AddLine(hex.P4.X, hex.P4.Y);
            p.AddLine(hex.P5.X, hex.P5.Y);
            p.AddLine(hex.P6.X, hex.P6.Y);
            p.AddLine(hex.P1.X, hex.P1.Y);
            p.EndFigure(CanvasFigureLoop.Closed);
            CanvasGeometry geometry = CanvasGeometry.CreatePath(p);

            args.DrawingSession.FillGeometry(geometry, Colors.Red);
            string point1 = hex.P1.X + ";" + hex.P1.Y;
            string point2 = hex.P2.X + ";" + hex.P2.Y;
            string point3 = hex.P3.X + ";" + hex.P3.Y;
            string point4 = hex.P4.X + ";" + hex.P4.Y;
            string point5 = hex.P5.X + ";" + hex.P5.Y;
            string point6 = hex.P6.X + ";" + hex.P6.Y;

            args.DrawingSession.DrawText(point1, hex.P1.X, hex.P1.Y, Colors.Black);
            args.DrawingSession.DrawText(point2, hex.P2.X, hex.P2.Y, Colors.Black);
            args.DrawingSession.DrawText(point3, hex.P3.X, hex.P3.Y, Colors.Black);
            args.DrawingSession.DrawText(point4, hex.P4.X, hex.P4.Y, Colors.Black);
            args.DrawingSession.DrawText(point5, hex.P5.X, hex.P5.Y, Colors.Black);
            args.DrawingSession.DrawText(point6, hex.P6.X, hex.P6.Y, Colors.Black);
            string check = hex.IsPointInside(point).ToString();

            args.DrawingSession.DrawText(check, point.X, point.Y, Colors.Black);
            args.DrawingSession.Flush();
        }
        private CanvasRenderTarget GetRenderTarget(Size scale, Rect signatureBounds, Size imageSize, float strokeWidth, Color strokeColor, Color backgroundColor)
        {
            var device    = CanvasDevice.GetSharedDevice();
            var offscreen = new CanvasRenderTarget(device, (int)imageSize.Width, (int)imageSize.Height, 96);

            using (var session = offscreen.CreateDrawingSession())
            {
                session.Clear(backgroundColor);

                session.Transform = Multiply(
                    CreateTranslation((float)-signatureBounds.X, (float)-signatureBounds.Y),
                    CreateScale((float)scale.Width, (float)scale.Height));

                foreach (var stroke in inkPresenter.GetStrokes())
                {
                    var points   = stroke.GetPoints();
                    var position = points.First();

                    var builder = new CanvasPathBuilder(device);
                    builder.BeginFigure((float)position.X, (float)position.Y);
                    foreach (var point in points)
                    {
                        builder.AddLine(new Vector2 {
                            X = (float)point.X, Y = (float)point.Y
                        });
                    }
                    builder.EndFigure(CanvasFigureLoop.Open);

                    var path  = CanvasGeometry.CreatePath(builder);
                    var color = strokeColor;
                    var width = (float)strokeWidth;
                    session.DrawGeometry(path, color, width);
                }
            }

            return(offscreen);
        }
Example #18
0
            // - - - - Shape tree root for layer: Shape
            // - - ShapeGroup: Shape Scale:10,10
            CanvasGeometry Geometry()
            {
                CanvasGeometry result;

                using (var builder = new CanvasPathBuilder(null))
                {
                    builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Winding);
                    builder.BeginFigure(new Vector2(0.897000015F, -7.10099983F));
                    builder.AddCubicBezier(new Vector2(0.529999971F, -7.84399986F), new Vector2(-0.529999971F, -7.84399986F), new Vector2(-0.897000015F, -7.10099983F));
                    builder.AddLine(new Vector2(-2.5940001F, -3.66100001F));
                    builder.AddCubicBezier(new Vector2(-2.74000001F, -3.36599994F), new Vector2(-3.02099991F, -3.16100001F), new Vector2(-3.34699988F, -3.11400008F));
                    builder.AddLine(new Vector2(-7.14400005F, -2.56200004F));
                    builder.AddCubicBezier(new Vector2(-7.96400023F, -2.44300008F), new Vector2(-8.29199982F, -1.43599999F), new Vector2(-7.69799995F, -0.856999993F));
                    builder.AddLine(new Vector2(-7.03000021F, -0.206F));
                    builder.AddCubicBezier(new Vector2(-6.07399988F, 0.726000011F), new Vector2(-4.71799994F, 1.11899996F), new Vector2(-3.41199994F, 0.842999995F));
                    builder.AddLine(new Vector2(0.342999995F, 0.0500000007F));
                    builder.AddCubicBezier(new Vector2(0.901000023F, -0.0680000037F), new Vector2(1.16299999F, 0.713F), new Vector2(0.646000028F, 0.954999983F));
                    builder.AddLine(new Vector2(-2.90400004F, 2.61400008F));
                    builder.AddCubicBezier(new Vector2(-4.09100008F, 3.16899991F), new Vector2(-4.93100023F, 4.26999998F), new Vector2(-5.15299988F, 5.5619998F));
                    builder.AddLine(new Vector2(-5.3119998F, 6.48699999F));
                    builder.AddCubicBezier(new Vector2(-5.45200014F, 7.3039999F), new Vector2(-4.59499979F, 7.92700005F), new Vector2(-3.86100006F, 7.54099989F));
                    builder.AddLine(new Vector2(-0.465000004F, 5.75600004F));
                    builder.AddCubicBezier(new Vector2(-0.173999995F, 5.60300016F), new Vector2(0.173999995F, 5.60300016F), new Vector2(0.465000004F, 5.75600004F));
                    builder.AddLine(new Vector2(3.86100006F, 7.54099989F));
                    builder.AddCubicBezier(new Vector2(4.59499979F, 7.92700005F), new Vector2(5.45200014F, 7.3039999F), new Vector2(5.3119998F, 6.48699999F));
                    builder.AddLine(new Vector2(4.66300011F, 2.70600009F));
                    builder.AddCubicBezier(new Vector2(4.60699987F, 2.38199997F), new Vector2(4.71500015F, 2.05100012F), new Vector2(4.95100021F, 1.82099998F));
                    builder.AddLine(new Vector2(7.69799995F, -0.856999993F));
                    builder.AddCubicBezier(new Vector2(8.29199982F, -1.43599999F), new Vector2(7.96400023F, -2.44300008F), new Vector2(7.14400005F, -2.56200004F));
                    builder.AddLine(new Vector2(3.34699988F, -3.11400008F));
                    builder.AddCubicBezier(new Vector2(3.02099991F, -3.16100001F), new Vector2(2.74099994F, -3.36599994F), new Vector2(2.59500003F, -3.66100001F));
                    builder.AddLine(new Vector2(0.897000015F, -7.10099983F));
                    builder.EndFigure(CanvasFigureLoop.Closed);
                    result = CanvasGeometry.CreatePath(builder);
                }
                return(result);
            }
Example #19
0
        private void DrawSelectionLasso(CanvasControl sender, CanvasDrawingSession ds)
        {
            if (selectionPolylinePoints == null)
            {
                return;
            }
            if (selectionPolylinePoints.Count == 0)
            {
                return;
            }

            CanvasPathBuilder selectionLasso = new CanvasPathBuilder(canvasControl);

            selectionLasso.BeginFigure(selectionPolylinePoints[0].ToVector2());
            for (int i = 1; i < selectionPolylinePoints.Count; ++i)
            {
                selectionLasso.AddLine(selectionPolylinePoints[i].ToVector2());
            }
            selectionLasso.EndFigure(CanvasFigureLoop.Open);

            CanvasGeometry pathGeometry = CanvasGeometry.CreatePath(selectionLasso);

            ds.DrawGeometry(pathGeometry, Colors.Magenta, 5.0f);
        }
Example #20
0
 private void updateGlyphGeometries(ICanvasResourceCreator g, Vector2 center, Vector2 start, Vector2 end)
 {
     if (Math.Round(center.Angle(start, end), 3) == 90)
     {
         using (var pathBuilder = new CanvasPathBuilder(g))
         {
             var p1 = center.GetLinePoint(start, Pen.GlyphSize);
             var p2 = center.GetLinePoint(end, Pen.GlyphSize);
             var p3 = new Vector2(p1.X + p2.X - center.X, p1.Y + p2.Y - center.Y);
             pathBuilder.BeginFigure(p1);
             pathBuilder.AddLine(p3);
             pathBuilder.AddLine(p2);
             pathBuilder.EndFigure(CanvasFigureLoop.Open);
             var geo = CanvasGeometry.CreatePath(pathBuilder);
             AddGeometry(new GeometryConfig
             {
                 Geometry    = geo,
                 Style       = GeometryStyle.Stroke,
                 StrokeColor = Pen.Color,
                 StrokeWidth = Pen.Width
             });
         }
     }
 }
Example #21
0
        protected void DrawAlarmHighArc(CanvasControl sender, CanvasDrawEventArgs args, Color alarmColor, double alarmValue)
        {
            var ds = args.DrawingSession;

            float percentValue = (float)((alarmValue - MinValue) / (MaxValue - MinValue));

            float range         = GaugeEndAngle - GaugeStartAngle;
            float arcStartAngle = GaugeStartAngle + (range * percentValue);

            float arcSweepAngle = GaugeEndAngle - arcStartAngle;

            if (arcSweepAngle > 360)
            {
                arcSweepAngle -= 360;
            }

            float startAngle = (float)(arcStartAngle * Math.PI / 180D);
            float sweepAngle = (float)(arcSweepAngle * Math.PI / 180D);

            double  radian     = arcStartAngle * Math.PI / 180D;
            float   startX     = (float)(Math.Cos(radian) * MiddleCircleRadius) + Center.X;
            float   startY     = (float)(Math.Sin(radian) * MiddleCircleRadius) + Center.Y;
            Vector2 startPoint = new Vector2(startX, startY);

            using (var builder = new CanvasPathBuilder(sender))
            {
                builder.BeginFigure(startPoint);
                builder.AddArc(Center, MiddleCircleRadius, MiddleCircleRadius, startAngle, sweepAngle);
                builder.EndFigure(CanvasFigureLoop.Open);

                using (var geometry = CanvasGeometry.CreatePath(builder))
                {
                    ds.DrawGeometry(geometry, alarmColor, (float)MediumTicLength, arcStrokeStyle);
                }
            }
        }
Example #22
0
        public static CanvasGeometry Parse(ICanvasResourceCreator sender, IList <ClosedVectorPath> contours, float scale = 1.0f)
        {
            var builder = new CanvasPathBuilder(sender);

            foreach (var path in contours)
            {
                var last = path.Commands.Last();
                if (last is VectorPathCommandLine lastLine)
                {
                    builder.BeginFigure(lastLine.EndPoint.ToVector2(scale));
                }
                else if (last is VectorPathCommandCubicBezierCurve lastCubicBezierCurve)
                {
                    builder.BeginFigure(lastCubicBezierCurve.EndPoint.ToVector2(scale));
                }

                for (int i = 0; i < path.Commands.Count; i++)
                {
                    var command = path.Commands[i];
                    if (command is VectorPathCommandLine line)
                    {
                        builder.AddLine(line.EndPoint.ToVector2(scale));
                    }
                    else if (command is VectorPathCommandCubicBezierCurve cubicBezierCurve)
                    {
                        builder.AddCubicBezier(cubicBezierCurve.StartControlPoint.ToVector2(scale),
                                               cubicBezierCurve.EndControlPoint.ToVector2(scale),
                                               cubicBezierCurve.EndPoint.ToVector2(scale));
                    }
                }

                builder.EndFigure(CanvasFigureLoop.Closed);
            }

            return(CanvasGeometry.CreatePath(builder));
        }
Example #23
0
        protected override CanvasGeometry BuildBaseGeometry(ICanvasResourceCreator resourceCreator)
        {
            using (CanvasPathBuilder pathBuilder = new CanvasPathBuilder(resourceCreator))
            {
                pathBuilder.SetFilledRegionDetermination(fillRule);

                if (points != null)
                {
                    if (points.Length > 0)
                    {
                        pathBuilder.BeginFigure(points[0]);
                    }

                    for (int i = 1; i < points.Length; i++)
                    {
                        pathBuilder.AddLine(points[i]);
                    }
                }

                pathBuilder.EndFigure(CanvasFigureLoop);

                return(CanvasGeometry.CreatePath(pathBuilder));
            }
        }
        static CanvasGeometry CreateTimeSegmentGeometry(CanvasDrawingSession ds, long updateCount, double updatesPerSecond)
        {
            double updates             = (double)updateCount;
            double fractionSecond      = (updates / updatesPerSecond) % 1.0;
            double fractionSecondAngle = 2 * Math.PI * fractionSecond;

            fractionSecondAngle *= -1;      // increasing fractionSecond = clockwise = decreasing angle
            fractionSecondAngle += Math.PI; // we want fractionSecond = 0 to be up (not down)
            double angle = fractionSecondAngle % (2 * Math.PI);

            using (var builder = new CanvasPathBuilder(ds))
            {
                builder.BeginFigure(new Vector2(center, center));
                builder.AddLine(new Vector2(center, center - radius));

                var endArcX = new Vector2(center + (float)Math.Sin(angle) * radius, center + (float)Math.Cos(angle) * radius);

                var arcSize = angle > 0 ? CanvasArcSize.Small : CanvasArcSize.Large;
                builder.AddArc(endArcX, radius, radius, 0, CanvasSweepDirection.Clockwise, arcSize);
                builder.EndFigure(CanvasFigureLoop.Closed);

                return(CanvasGeometry.CreatePath(builder));
            }
        }
Example #25
0
        internal static CanvasGeometry GenerateGeometry(CanvasDevice device, Size size, CompositionPathInfo info, Vector2 offset)
        {
            //
            //   |--LeftTop----------------------RightTop--|
            //   |                                         |
            // TopLeft                                TopRight
            //   |                                         |
            //   |                                         |
            //   |                                         |
            //   |                                         |
            //   |                                         |
            //   |                                         |
            // BottomLeft                          BottomRight
            //   |                                         |
            //   |--LeftBottom----------------RightBottom--|
            //
            //  compute the coordinates of the key points
            var leftTop     = new Vector2(info.LeftTop.Single(), 0);
            var rightTop    = new Vector2((size.Width - info.RightTop).Single(), 0);
            var topRight    = new Vector2(size.Width.Single(), info.TopRight.Single());
            var bottomRight = new Vector2(size.Width.Single(), (size.Height - info.BottomRight).Single());
            var rightBottom = new Vector2((size.Width - info.RightBottom).Single(), size.Height.Single());
            var leftBottom  = new Vector2(info.LeftBottom.Single(), size.Height.Single());
            var bottomLeft  = new Vector2(0, (size.Height - info.BottomLeft).Single());
            var topLeft     = new Vector2(0, info.TopLeft.Single());

            //  check keypoints for overlap and resolve by partitioning corners according to
            //  the percentage of each one.

            //  top edge
            if (leftTop.X > rightTop.X)
            {
                var v = ((info.LeftTop) / (info.LeftTop + info.RightTop) * size.Width).Single();
                leftTop.X  = v;
                rightTop.X = v;
            }

            //  right edge
            if (topRight.Y > bottomRight.Y)
            {
                var v = ((info.TopRight) / (info.TopRight + info.BottomRight) * size.Height).Single();
                topRight.Y    = v;
                bottomRight.Y = v;
            }

            //  bottom edge
            if (leftBottom.X > rightBottom.X)
            {
                var v = ((info.LeftBottom) / (info.LeftBottom + info.RightBottom) * size.Width).Single();
                rightBottom.X = v;
                leftBottom.X  = v;
            }

            // left edge
            if (topLeft.Y > bottomLeft.Y)
            {
                var v = ((info.TopLeft) / (info.TopLeft + info.BottomLeft) * size.Height).Single();
                bottomLeft.Y = v;
                topLeft.Y    = v;
            }

            // Apply offset
            leftTop     += offset;
            rightTop    += offset;
            topRight    += offset;
            bottomRight += offset;
            rightBottom += offset;
            leftBottom  += offset;
            bottomLeft  += offset;
            topLeft     += offset;

            //  create the border geometry
            var pathBuilder = new CanvasPathBuilder(device);

            // Begin path
            pathBuilder.BeginFigure(leftTop);

            // Top line
            pathBuilder.AddLine(rightTop);

            // Upper-right corners
            var radiusX = size.Width - rightTop.X;
            var radiusY = (double)topRight.Y;

            if (!radiusX.IsZero() || !radiusY.IsZero())
            {
                pathBuilder.AddArc(topRight, radiusX.Single(), radiusY.Single(), (Math.PI / 2f).Single(),
                                   CanvasSweepDirection.Clockwise, CanvasArcSize.Small);
            }

            // Right line
            pathBuilder.AddLine(bottomRight);

            // Lower-right corners
            radiusX = size.Width - rightBottom.X;
            radiusY = size.Height - bottomRight.Y;
            if (!radiusX.IsZero() || !radiusY.IsZero())
            {
                pathBuilder.AddArc(rightBottom, radiusX.Single(), radiusY.Single(), (Math.PI / 2f).Single(),
                                   CanvasSweepDirection.Clockwise, CanvasArcSize.Small);
            }

            // Bottom line
            pathBuilder.AddLine(leftBottom);

            // Lower-left corners
            radiusX = leftBottom.X;
            radiusY = size.Height - bottomLeft.Y;
            if (!radiusX.IsZero() || !radiusY.IsZero())
            {
                pathBuilder.AddArc(bottomLeft, radiusX.Single(), radiusY.Single(), (Math.PI / 2f).Single(),
                                   CanvasSweepDirection.Clockwise, CanvasArcSize.Small);
            }

            // Left line
            pathBuilder.AddLine(topLeft);

            // Upper-left corners
            radiusX = leftTop.X;
            radiusY = topLeft.Y;
            if (!radiusX.IsZero() || !radiusY.IsZero())
            {
                pathBuilder.AddArc(leftTop, radiusX.Single(), radiusY.Single(), (Math.PI / 2f).Single(),
                                   CanvasSweepDirection.Clockwise, CanvasArcSize.Small);
            }

            // End path
            pathBuilder.EndFigure(CanvasFigureLoop.Closed);

            return(CanvasGeometry.CreatePath(pathBuilder));
        }
        char _token;             // Non whitespace character returned by ReadToken




        public CanvasGeometry parse(string path, CanvasPathBuilder builder)
        {
            var _builder = builder;

            //var _pathGeometry = Microsoft.Graphics.Canvas.Geometry.CanvasGeometry.CreatePath(_builder);

            //_figure = _builder.BeginFigure();
            ////GeometrySink _sink  = _pathGeometry.Open();

            _formatProvider = CultureInfo.InvariantCulture;
            _pathString = path;
            _pathLength = path.Length;
            _curIndex = 0;

            _secondLastPoint = new Point(0, 0);
            _lastPoint = new Point(0, 0);
            _lastStart = new Point(0, 0);

            _figureStarted = false;

            bool first = true;

            char last_cmd = ' ';

            while (ReadToken()) // Empty path is allowed in XAML
            {
                char cmd = _token;

                if (first)
                {
                    if ((cmd != 'M') && (cmd != 'm'))  // Path starts with M|m 
                    {
                        ThrowBadToken();
                    }

                    first = false;
                }

                switch (cmd)
                {
                    case 'm':
                    case 'M':
                        // XAML allows multiple points after M/m
                        _lastPoint = ReadPoint(cmd, !AllowComma);


                        _builder.BeginFigure((float)_lastPoint.X, (float)_lastPoint.Y, IsFilled ? CanvasFigureFill.Default : CanvasFigureFill.DoesNotAffectFills);   // FigureBegin.Filled : FigureBegin.Hollow);
                        //_figure.StartPoint = _lastPoint;
                        //_figure.IsFilled = IsFilled;
                        //if (!IsClosed) _figure.Close();
                        //_figure.IsClosed = !IsClosed;
                        //context.BeginFigure(_lastPoint, IsFilled, !IsClosed);
                        _figureStarted = true;
                        _lastStart = _lastPoint;
                        last_cmd = 'M';

                        while (IsNumber(AllowComma))
                        {
                            _lastPoint = ReadPoint(cmd, !AllowComma);

                            //LineSegment _lineSegment = new LineSegment();
                            //_lineSegment.Point = _lastPoint;
                            _builder.AddLine((float)_lastPoint.X, (float)_lastPoint.Y);
                            //_figure.Segments.Add(_lineSegment);
                            //context.LineTo(_lastPoint, IsStroked, !IsSmoothJoin);
                            last_cmd = 'L';
                        }
                        break;

                    case 'l':
                    case 'L':
                    case 'h':
                    case 'H':
                    case 'v':
                    case 'V':
                        EnsureFigure(_builder);

                        do
                        {
                            switch (cmd)
                            {
                                case 'l': _lastPoint = ReadPoint(cmd, !AllowComma); break;
                                case 'L': _lastPoint = ReadPoint(cmd, !AllowComma); break;
                                case 'h': _lastPoint.X += ReadNumber(!AllowComma); break;
                                case 'H': _lastPoint.X = ReadNumber(!AllowComma); break;
                                case 'v': _lastPoint.Y += ReadNumber(!AllowComma); break;
                                case 'V': _lastPoint.Y = ReadNumber(!AllowComma); break;
                            }

                            //LineSegment _lineSegment = new LineSegment();
                            //_lineSegment.Point = _lastPoint;
                            //_figure.Segments.Add(_lineSegment);
                            _builder.AddLine((float)_lastPoint.X, (float)_lastPoint.Y);
                            //context.LineTo(_lastPoint, IsStroked, !IsSmoothJoin);
                        }
                        while (IsNumber(AllowComma));

                        last_cmd = 'L';
                        break;

                    case 'c':
                    case 'C': // cubic Bezier 
                    case 's':
                    case 'S': // smooth cublic Bezier
                        EnsureFigure(_builder);

                        do
                        {
                            Point p;

                            if ((cmd == 's') || (cmd == 'S'))
                            {
                                if (last_cmd == 'C')
                                {
                                    p = Reflect();
                                }
                                else
                                {
                                    p = _lastPoint;
                                }

                                _secondLastPoint = ReadPoint(cmd, !AllowComma);
                            }
                            else
                            {
                                p = ReadPoint(cmd, !AllowComma);

                                _secondLastPoint = ReadPoint(cmd, AllowComma);
                            }

                            _lastPoint = ReadPoint(cmd, AllowComma);

                            //BezierSegment _bizierSegment = new BezierSegment();
                            //_bizierSegment.Point1 = p;
                            //_bizierSegment.Point2 = _secondLastPoint;
                            //_bizierSegment.Point3 = _lastPoint;
                            //_figure.Segments.Add(_bizierSegment);
                            _builder.AddCubicBezier(
                                new System.Numerics.Vector2((float)p.X, (float)p.Y),
                                new System.Numerics.Vector2((float)_secondLastPoint.X, (float)_secondLastPoint.Y),
                                new System.Numerics.Vector2((float)_lastPoint.X, (float)_lastPoint.Y)
                            );
                            //context.BezierTo(p, _secondLastPoint, _lastPoint, IsStroked, !IsSmoothJoin);

                            last_cmd = 'C';
                        }
                        while (IsNumber(AllowComma));

                        break;

                    case 'q':
                    case 'Q': // quadratic Bezier 
                    case 't':
                    case 'T': // smooth quadratic Bezier
                        EnsureFigure(_builder);

                        do
                        {
                            if ((cmd == 't') || (cmd == 'T'))
                            {
                                if (last_cmd == 'Q')
                                {
                                    _secondLastPoint = Reflect();
                                }
                                else
                                {
                                    _secondLastPoint = _lastPoint;
                                }

                                _lastPoint = ReadPoint(cmd, !AllowComma);
                            }
                            else
                            {
                                _secondLastPoint = ReadPoint(cmd, !AllowComma);
                                _lastPoint = ReadPoint(cmd, AllowComma);
                            }

                            //QuadraticBezierSegment _quadraticBezierSegment = new QuadraticBezierSegment();
                            //_quadraticBezierSegment.Point1 = _secondLastPoint;
                            //_quadraticBezierSegment.Point2 = _lastPoint;
                            //_figure.Segments.Add(_quadraticBezierSegment);
                            _builder.AddQuadraticBezier(

                                new System.Numerics.Vector2((float)_secondLastPoint.X, (float)_secondLastPoint.Y),
                                new System.Numerics.Vector2((float)_lastPoint.X, (float)_lastPoint.Y)
                            );
                            //context.QuadraticBezierTo(_secondLastPoint, _lastPoint, IsStroked, !IsSmoothJoin);

                            last_cmd = 'Q';
                        }
                        while (IsNumber(AllowComma));

                        break;

                    case 'a':
                    case 'A':
                        EnsureFigure(_builder);

                        do
                        {
                            // A 3,4 5, 0, 0, 6,7
                            double w = ReadNumber(!AllowComma);
                            double h = ReadNumber(AllowComma);
                            double rotation = ReadNumber(AllowComma);
                            bool large = ReadBool();
                            bool sweep = ReadBool();

                            _lastPoint = ReadPoint(cmd, AllowComma);

                            //ArcSegment _arcSegment = new ArcSegment();
                            //_arcSegment.Point = _lastPoint;
                            //_arcSegment.Size = new Size(w, h);
                            //_arcSegment.RotationAngle = rotation;
                            //_arcSegment.IsLargeArc = large;
                            //_arcSegment.SweepDirection = sweep ? SweepDirection.Clockwise : SweepDirection.Counterclockwise;
                            //_figure.Segments.Add(_arcSegment);

                            _builder.AddArc(
                                new System.Numerics.Vector2((float)_lastPoint.X, (float)_lastPoint.Y),
                                (float)w,
                                (float)h,
                                (float)rotation,
                                sweep ? CanvasSweepDirection.Clockwise : CanvasSweepDirection.CounterClockwise,
                                large ? CanvasArcSize.Large : CanvasArcSize.Small

                            );
                            //context.ArcTo(
                            //    _lastPoint,
                            //    new Size(w, h),
                            //    rotation,
                            //    large,
                            //    sweep ? SweepDirection.Clockwise : SweepDirection.Counterclockwise,
                            //    IsStroked,
                            //    !IsSmoothJoin
                            //    );
                        }
                        while (IsNumber(AllowComma));

                        last_cmd = 'A';
                        break;

                    case 'z':
                    case 'Z':
                        EnsureFigure(_builder);

                        //_figure.IsClosed = IsClosed;
                        //context.SetClosedState(IsClosed);
                        _builder.EndFigure(IsClosed ? CanvasFigureLoop.Closed : CanvasFigureLoop.Open);
                        _figureStarted = false;
                        last_cmd = 'Z';

                        _lastPoint = _lastStart; // Set reference point to be first point of current figure
                        break;

                    default:
                        ThrowBadToken();
                        break;
                }
            }

            //if (null != _figure)
            //{
            //    _pathGeometry = new PathGeometry(d2dfactory);
            //    _pathGeometry.Figures.Add(_figure);

            //}

            //_builder.EndFigure();
            //_sink.Close();
            var _pathGeometry = Microsoft.Graphics.Canvas.Geometry.CanvasGeometry.CreatePath(_builder);

            _builder = null;

            return _pathGeometry;
        }
Example #27
0
        public void Draw(CanvasDrawingSession graphics, float scale)
        {
            var x = X * scale;
            var y = Y * scale;

            var radius = 4;
            var color  = Color.FromArgb(200, 0xFF, 0xFF, 0xFF);
            var color2 = Color.FromArgb(200, 0x00, 0x00, 0x00);

            graphics.FillCircle((float)x, (float)y, radius, color);
            graphics.DrawCircle((float)x, (float)y, radius, color2);
            if (!_translated)
            {
                _translated = true;
                if (TagType == 0)
                {
                    TagText = "@" + TagText;
                }
                else if (TagType == 1)
                {
                    TagText = "#" + TagText + "#";
                }
                else
                {
                    //TagText = "↓" + TagText;
                }
            }
            var ctFormat = new CanvasTextFormat {
                FontSize = 11.0f * scale, WordWrapping = CanvasWordWrapping.NoWrap, FontFamily = "微软雅黑"
            };
            var ctLayout = new CanvasTextLayout(graphics, TagText, ctFormat, 0.0f, 0.0f);
            //字体占用高度、宽度
            var width  = ctLayout.DrawBounds.Width + 10 * scale;
            var height = ctLayout.DrawBounds.Height + 12 * scale;

            var w           = x + width + 10 * scale + height;
            var pathBuilder = new CanvasPathBuilder(graphics);


            if (w > Bound.Width * scale)  //超出画布边界
            {
                pathBuilder.BeginFigure((float)x - 5 * scale, (float)y);
                pathBuilder.AddLine((float)x - 5 * scale - 6 * scale, (float)y - (float)height / 2);
                pathBuilder.AddLine((float)x - (float)width - 5 * scale - 6 * scale, (float)y - (float)height / 2);
                pathBuilder.AddLine((float)x - (float)width - 5 * scale - 6 * scale, (float)y + (float)height / 2);
                pathBuilder.AddLine((float)x - 5 * scale - 6 * scale, (float)y + (float)height / 2);

                pathBuilder.EndFigure(CanvasFigureLoop.Closed);

                var geometry = CanvasGeometry.CreatePath(pathBuilder);

                graphics.FillGeometry(geometry, color2);
                graphics.DrawText(TagText, (float)x - (float)width - 5 * scale - 6 * scale + 5 * scale, (float)y - (float)height / 2 + 4 * scale, Colors.White, ctFormat);


                _region       = new Rect((float)x - (float)width - 5 * scale - 6 * scale, (float)y - (float)height / 2, width, height);
                _close_region = new Rect((float)x - (float)width - 5 * scale - 6 * scale - height, (float)y - (float)height / 2, height, height);

                if (ShowCloseBtn && scale == 1) //显示关闭按钮 且没有缩放
                {
                    graphics.FillRectangle(_close_region, color2);
                    graphics.DrawLine((float)_close_region.Left, (float)_close_region.Top, (float)_close_region.Left, (float)_close_region.Top + (float)height, Colors.White, 0.5f);
                    graphics.DrawText("×", (float)_close_region.Left + 6, (float)_close_region.Top, Colors.White, new CanvasTextFormat()
                    {
                        FontSize = 15, FontFamily = "微软雅黑"
                    });
                }
            }
            else
            {
                pathBuilder.BeginFigure((float)x + 5 * scale, (float)y);
                pathBuilder.AddLine((float)x + 5 * scale + 6 * scale, (float)y - (float)height / 2);
                pathBuilder.AddLine((float)x + (float)width + 5 * scale + 6 * scale, (float)y - (float)height / 2);
                pathBuilder.AddLine((float)x + (float)width + 5 * scale + 6 * scale, (float)y + (float)height / 2);
                pathBuilder.AddLine((float)x + 5 * scale + 6 + scale, (float)y + (float)height / 2);

                pathBuilder.EndFigure(CanvasFigureLoop.Closed);

                var geo = CanvasGeometry.CreatePath(pathBuilder);

                graphics.FillGeometry(geo, color2);
                graphics.DrawText(TagText, (float)x + 5 * scale + 4 * scale + 5 * scale, (float)y - (float)height / 2 + 4 * scale, Colors.White, ctFormat);

                _region       = new Rect((float)x + 5 * scale + 6 * scale, (float)y - (float)height / 2, width, height);
                _close_region = new Rect((float)x + (float)width + 5 * scale + 6 * scale, (float)y - (float)height / 2, height, height);

                if (ShowCloseBtn && scale == 1) //显示关闭按钮  且 没有缩放
                {
                    graphics.FillRectangle(_close_region, color2);
                    graphics.DrawLine((float)_close_region.Left, (float)_close_region.Top, (float)_close_region.Left, (float)_close_region.Top + (float)height, Colors.White, 0.5f);
                    graphics.DrawText("×", (float)_close_region.Left + 6, (float)_close_region.Top, Colors.White, new CanvasTextFormat()
                    {
                        FontSize = 15, FontFamily = "微软雅黑"
                    });
                }
            }
        }
Example #28
0
        protected override void drawChart(CanvasDrawingSession canvas)
        {
            if (chartData == null)
            {
                return;
            }

            int transitionAlpha = 255;

            //canvas.save();
            if (transitionMode == TRANSITION_MODE_CHILD)
            {
                transitionAlpha  = (int)(transitionParams.progress * transitionParams.progress * 255);
                canvas.Transform = Matrix3x2.CreateScale(
                    new Vector2(transitionParams.progress, transitionParams.progress),
                    new Vector2(chartArea.centerX(), chartArea.centerY())
                    );
            }

            if (isEmpty)
            {
                if (emptyDataAlpha != 0)
                {
                    emptyDataAlpha -= 0.12f;
                    if (emptyDataAlpha < 0)
                    {
                        emptyDataAlpha = 0;
                    }
                    invalidate();
                }
            }
            else
            {
                if (emptyDataAlpha != 1f)
                {
                    emptyDataAlpha += 0.12f;
                    if (emptyDataAlpha > 1f)
                    {
                        emptyDataAlpha = 1f;
                    }
                    invalidate();
                }
            }

            transitionAlpha = (int)(transitionAlpha * emptyDataAlpha);
            float sc = 0.4f + emptyDataAlpha * 0.6f;

            canvas.Transform = Matrix3x2.CreateScale(
                new Vector2(sc, sc),
                new Vector2(chartArea.centerX(), chartArea.centerY())
                );

            int radius = (int)((chartArea.Width > chartArea.Height ? chartArea.Height : chartArea.Width) * 0.45f);

            rectF = createRect(
                chartArea.centerX() - radius,
                chartArea.centerY() + 16 - radius,
                chartArea.centerX() + radius,
                chartArea.centerY() + 16 + radius
                );


            float a = -90f;
            float rText;

            int n = lines.Count;

            float localSum = 0f;

            for (int i = 0; i < n; i++)
            {
                float v = lines[i].drawingPart * lines[i].alpha;
                localSum += v;
            }
            if (localSum == 0)
            {
                //canvas.restore();
                return;
            }
            for (int i = 0; i < n; i++)
            {
                if (lines[i].alpha <= 0 && !lines[i].enabled)
                {
                    continue;
                }
                lines[i].paint.A = (byte)transitionAlpha;

                float currentPercent = lines[i].drawingPart / localSum * lines[i].alpha;
                darawingValuesPercentage[i] = currentPercent;

                if (currentPercent == 0)
                {
                    continue;
                }

                //canvas.save();

                double textAngle = a + (currentPercent / 2f) * 360f;

                if (lines[i].selectionA > 0f)
                {
                    float ai = INTERPOLATOR.getInterpolation(lines[i].selectionA);
                    canvas.Transform = Matrix3x2.CreateTranslation(
                        (float)(Math.Cos(MathEx.ToRadians(textAngle)) * 8 * ai),
                        (float)(Math.Sin(MathEx.ToRadians(textAngle)) * 8 * ai)
                        );
                }

                //lines[i].paint.setStyle(Paint.Style.FILL_AND_STROKE);
                lines[i].paint.StrokeWidth = 1;
                //lines[i].paint.setAntiAlias(!USE_LINES);

                //canvas.drawArc(
                //        rectF,
                //        a,
                //        (currentPercent) * 360f,
                //        true,
                //        lines[i].paint);

                var b = a + (currentPercent) * 360f;

                var builder = new CanvasPathBuilder(canvas);
                var center  = new Vector2((float)rectF.X + (float)rectF.Width / 2, (float)rectF.Y + (float)rectF.Height / 2);
                builder.BeginFigure(center);
                builder.AddLine(
                    new Vector2(
                        (float)(center.X + Math.Sin(a * Math.PI / 180) * (float)rectF.Width / 2),
                        (float)(center.Y - Math.Cos(a * Math.PI / 180) * (float)rectF.Height / 2)));

                builder.AddArc(
                    new Vector2(
                        (float)(center.X + Math.Sin(b * Math.PI / 180) * (float)rectF.Width / 2),
                        (float)(center.Y - Math.Cos(b * Math.PI / 180) * (float)rectF.Height / 2)),
                    (float)rectF.Width / 2,
                    (float)rectF.Height / 2,
                    0, CanvasSweepDirection.Clockwise,
                    (b - a) >= 180.0 ? CanvasArcSize.Large : CanvasArcSize.Small);

                builder.EndFigure(CanvasFigureLoop.Closed);
                canvas.FillGeometry(CanvasGeometry.CreatePath(builder), lines[i].paint.Color);

                //lines[i].paint.setStyle(Paint.Style.STROKE);

                //canvas.restore();
                canvas.Transform = Matrix3x2.Identity;

                lines[i].paint.A = 255;
                a += currentPercent * 360f;
            }
            a = -90f;

            for (int i = 0; i < n; i++)
            {
                if (lines[i].alpha <= 0 && !lines[i].enabled)
                {
                    continue;
                }
                float currentPercent = (lines[i].drawingPart * lines[i].alpha / localSum);
                //canvas.save();

                double textAngle = a + (currentPercent / 2f) * 360f;

                if (lines[i].selectionA > 0f)
                {
                    float ai = INTERPOLATOR.getInterpolation(lines[i].selectionA);
                    canvas.Transform = Matrix3x2.CreateTranslation(
                        (float)(Math.Cos(MathEx.ToRadians(textAngle)) * 8 * ai),
                        (float)(Math.Sin(MathEx.ToRadians(textAngle)) * 8 * ai)
                        );
                }

                int percent = (int)(100f * currentPercent);
                if (currentPercent >= 0.02f && percent > 0 && percent <= 100)
                {
                    rText = (float)(rectF.Width * 0.42f * Math.Sqrt(1f - currentPercent));
                    //textPaint.setTextSize(MIN_TEXT_SIZE + currentPercent * MAX_TEXT_SIZE);
                    //textPaint.setAlpha((int)(transitionAlpha * lines[i].alpha));
                    //canvas.DrawText(
                    //        lookupTable[percent],
                    //        (float)(rectF.centerX() + rText * Math.Cos(MathEx.ToRadians(textAngle))),
                    //        (float)(rectF.centerY() + rText * Math.Sin(MathEx.ToRadians(textAngle))) - ((textPaint.descent() + textPaint.ascent()) / 2),
                    //        textPaint);
                }

                //canvas.restore();
                canvas.Transform = Matrix3x2.Identity;

                lines[i].paint.A = 255;
                a += currentPercent * 360f;
            }

            //canvas.restore();
            canvas.Transform = Matrix3x2.Identity;
        }
Example #29
0
 internal override void fillPath(CanvasPathBuilder p)
 {
     pendingRenderingOperations.Add(new FillPathPainter(clip, color, alpha, p));
 }
Example #30
0
        public static CanvasGeometry ToCanvasGeometry(this XPathGeometry pg, CanvasDrawingSession ds)
        {
            CanvasGeometry g;

            using (var builder = new CanvasPathBuilder(ds))
            {
                if (pg.FillRule == XFillRule.EvenOdd)
                {
                    builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Alternate);
                }
                else
                {
                    builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Winding);
                }

                foreach (var pf in pg.Figures)
                {
                    builder.BeginFigure(
                        (float)pf.StartPoint.X,
                        (float)pf.StartPoint.Y,
                        pf.IsFilled ? CanvasFigureFill.Default : CanvasFigureFill.DoesNotAffectFills);

                    foreach (var segment in pf.Segments)
                    {
                        var options = CanvasFigureSegmentOptions.None;
                        if (!segment.IsStroked)
                        {
                            options |= CanvasFigureSegmentOptions.ForceUnstroked;
                        }

                        if (segment.IsSmoothJoin)
                        {
                            options |= CanvasFigureSegmentOptions.ForceRoundLineJoin;
                        }

                        builder.SetSegmentOptions(options);

                        if (segment is XArcSegment)
                        {
                            var arcSegment = segment as XArcSegment;
                            builder.AddArc(
                                new N.Vector2(
                                    (float)arcSegment.Point.X,
                                    (float)arcSegment.Point.Y),
                                (float)(arcSegment.Size.Width / 2.0),
                                (float)(arcSegment.Size.Height / 2.0),
                                (float)arcSegment.RotationAngle,
                                arcSegment.SweepDirection == XSweepDirection.Clockwise ? CanvasSweepDirection.Clockwise : CanvasSweepDirection.CounterClockwise,
                                arcSegment.IsLargeArc ? CanvasArcSize.Large : CanvasArcSize.Small);
                        }
                        else if (segment is XBezierSegment)
                        {
                            var bezierSegment = segment as XBezierSegment;
                            builder.AddCubicBezier(
                                new N.Vector2(
                                    (float)bezierSegment.Point1.X,
                                    (float)bezierSegment.Point1.Y),
                                new N.Vector2(
                                    (float)bezierSegment.Point2.X,
                                    (float)bezierSegment.Point2.Y),
                                new N.Vector2(
                                    (float)bezierSegment.Point3.X,
                                    (float)bezierSegment.Point3.Y));
                        }
                        else if (segment is XLineSegment)
                        {
                            var lineSegment = segment as XLineSegment;
                            builder.AddLine(
                                new N.Vector2(
                                    (float)lineSegment.Point.X,
                                    (float)lineSegment.Point.Y));
                        }
                        else if (segment is XPolyBezierSegment)
                        {
                            var polyBezierSegment = segment as XPolyBezierSegment;
                            if (polyBezierSegment.Points.Count >= 3)
                            {
                                builder.AddCubicBezier(
                                    new N.Vector2(
                                        (float)polyBezierSegment.Points[0].X,
                                        (float)polyBezierSegment.Points[0].Y),
                                    new N.Vector2(
                                        (float)polyBezierSegment.Points[1].X,
                                        (float)polyBezierSegment.Points[1].Y),
                                    new N.Vector2(
                                        (float)polyBezierSegment.Points[2].X,
                                        (float)polyBezierSegment.Points[2].Y));
                            }

                            if (polyBezierSegment.Points.Count > 3 &&
                                polyBezierSegment.Points.Count % 3 == 0)
                            {
                                for (int i = 3; i < polyBezierSegment.Points.Count; i += 3)
                                {
                                    builder.AddCubicBezier(
                                        new N.Vector2(
                                            (float)polyBezierSegment.Points[i].X,
                                            (float)polyBezierSegment.Points[i].Y),
                                        new N.Vector2(
                                            (float)polyBezierSegment.Points[i + 1].X,
                                            (float)polyBezierSegment.Points[i + 1].Y),
                                        new N.Vector2(
                                            (float)polyBezierSegment.Points[i + 2].X,
                                            (float)polyBezierSegment.Points[i + 2].Y));
                                }
                            }
                        }
                        else if (segment is XPolyLineSegment)
                        {
                            var polyLineSegment = segment as XPolyLineSegment;

                            if (polyLineSegment.Points.Count >= 1)
                            {
                                builder.AddLine(
                                    new N.Vector2(
                                        (float)polyLineSegment.Points[0].X,
                                        (float)polyLineSegment.Points[0].Y));
                            }

                            if (polyLineSegment.Points.Count > 1)
                            {
                                for (int i = 1; i < polyLineSegment.Points.Count; i++)
                                {
                                    builder.AddLine(
                                        new N.Vector2(
                                            (float)polyLineSegment.Points[i].X,
                                            (float)polyLineSegment.Points[i].Y));
                                }
                            }
                        }
                        else if (segment is XPolyQuadraticBezierSegment)
                        {
                            var polyQuadraticSegment = segment as XPolyQuadraticBezierSegment;
                            if (polyQuadraticSegment.Points.Count >= 2)
                            {
                                builder.AddQuadraticBezier(
                                    new N.Vector2(
                                        (float)polyQuadraticSegment.Points[0].X,
                                        (float)polyQuadraticSegment.Points[0].Y),
                                    new N.Vector2(
                                        (float)polyQuadraticSegment.Points[1].X,
                                        (float)polyQuadraticSegment.Points[1].Y));
                            }

                            if (polyQuadraticSegment.Points.Count > 2 &&
                                polyQuadraticSegment.Points.Count % 2 == 0)
                            {
                                for (int i = 3; i < polyQuadraticSegment.Points.Count; i += 3)
                                {
                                    builder.AddQuadraticBezier(
                                        new N.Vector2(
                                            (float)polyQuadraticSegment.Points[i].X,
                                            (float)polyQuadraticSegment.Points[i].Y),
                                        new N.Vector2(
                                            (float)polyQuadraticSegment.Points[i + 1].X,
                                            (float)polyQuadraticSegment.Points[i + 1].Y));
                                }
                            }
                        }
                        else if (segment is XQuadraticBezierSegment)
                        {
                            var qbezierSegment = segment as XQuadraticBezierSegment;
                            builder.AddQuadraticBezier(
                                new N.Vector2(
                                    (float)qbezierSegment.Point1.X,
                                    (float)qbezierSegment.Point1.Y),
                                new N.Vector2(
                                    (float)qbezierSegment.Point2.X,
                                    (float)qbezierSegment.Point2.Y));
                        }
                        else
                        {
                            throw new NotSupportedException("Not supported segment type: " + segment.GetType());
                        }
                    }

                    builder.EndFigure(pf.IsClosed ? CanvasFigureLoop.Closed : CanvasFigureLoop.Open);
                }

                g = CanvasGeometry.CreatePath(builder);
            }

            return(g);
        }
 public static void AddOneLineFigure(this CanvasPathBuilder builder, float x1, float y1, float x2, float y2)
 {
     builder.BeginFigure(x1, y1);
     builder.AddLine(x2, y2);
     builder.EndFigure(CanvasFigureLoop.Open);
 }
Example #32
0
        void Canvas_Draw(CanvasControl sender, CanvasDrawEventArgs args)
        {
            var ds = args.DrawingSession;

            var centerPoint = (arcPoints[0] + arcPoints[1]) / 2;

            // Draw the end point markers.
            if (!ThumbnailGenerator.IsDrawingThumbnail)
            {
                for (int i = 0; i < 2; i++)
                {
                    ds.DrawCircle(arcPoints[i], hitTestRadius, (i == activeDrag) ? Colors.White : Colors.Gray);
                }
            }

            switch (CurrentOverload)
            {
                case AddArcOverload.AroundEllipse:
                    // Compute positions.
                    var ellipseRadius = (arcPoints[1] - arcPoints[0]) / 2;

                    ellipseRadius.X = Math.Abs(ellipseRadius.X);
                    ellipseRadius.Y = Math.Abs(ellipseRadius.Y);

                    float startAngle = Utils.DegreesToRadians(ArcStartAngle);
                    float sweepAngle = Utils.DegreesToRadians(ArcSweepAngle);

                    var startPoint = centerPoint + Vector2.Transform(Vector2.UnitX, Matrix3x2.CreateRotation(startAngle)) * ellipseRadius;

                    // Draw the bounding rectangle.
                    if (!ThumbnailGenerator.IsDrawingThumbnail)
                    {
                        ds.DrawRectangle(new Rect(arcPoints[0].ToPoint(), arcPoints[1].ToPoint()), Color.FromArgb(255, 64, 64, 64));
                    }

                    // Draw the arc.
                    using (var builder = new CanvasPathBuilder(sender))
                    {
                        builder.BeginFigure(startPoint);
                        builder.AddArc(centerPoint, ellipseRadius.X, ellipseRadius.Y, startAngle, sweepAngle);
                        builder.EndFigure(CanvasFigureLoop.Open);

                        using (var geometry = CanvasGeometry.CreatePath(builder))
                        {
                            ds.DrawGeometry(geometry, Colors.Yellow, strokeWidth, strokeStyle);
                        }
                    }
                    break;

                case AddArcOverload.PointToPoint:
                    // Display a warning if this is an invalid arc configuration.
                    bool isRadiusTooSmall = IsArcRadiusTooSmall();

                    if (isRadiusTooSmall)
                    {
                        ds.DrawText("Radius is less than the\ndistance between the\nstart and end points", centerPoint, Colors.Red, textFormat);
                    }

                    // Draw the arc.
                    using (var builder = new CanvasPathBuilder(sender))
                    {
                        builder.BeginFigure(arcPoints[0]);
                        builder.AddArc(arcPoints[1], ArcRadiusX, ArcRadiusY, Utils.DegreesToRadians(ArcRotation), ArcSweepDirection, ArcSize);
                        builder.EndFigure(CanvasFigureLoop.Open);

                        using (var geometry = CanvasGeometry.CreatePath(builder))
                        {
                            ds.DrawGeometry(geometry, isRadiusTooSmall ? Colors.Red : Colors.Yellow, strokeWidth, strokeStyle);
                        }
                    }
                    break;
            }
        }
Example #33
0
        CanvasGeometry MakeConvexGeometry()
        {
            if (currentPointsInContact.Count == 0)
                return null;

            var hull = ConvexHull.Create(currentPointsInContact.Values.Select(x => x.ToVector2()));

            // Figure out where the center is
            var hullCenter = Vector2.Zero;
            foreach (var p in hull)
            {
                hullCenter += p;
            }
            hullCenter /= hull.Count;

            // Build the geometry, made up of arcs around the hull
            using (var builder = new CanvasPathBuilder(device))
            {
                builder.BeginFigure(hull[0]);

                for (int i = 1; i <= hull.Count; ++i)
                {
                    //
                    // i-2 --- i-1 ---  i  --- i+1
                    //  a  ---  b  ---  c  ---  d
                    //
                    // The bezier is between i-1 and i.  We need to figure out the control points
                    // that make this smooth.

                    var a = hull[(i + hull.Count - 2) % hull.Count];
                    var b = hull[(i + hull.Count - 1) % hull.Count];
                    var c = hull[i % hull.Count];
                    var d = hull[(i + 1) % hull.Count];

                    var ab = Vector2.Normalize(b - a);
                    var bc = Vector2.Normalize(c - b);
                    var cp1 = b + Vector2.Normalize(ab + bc) * (c - b).Length() * 0.5f;

                    var cd = Vector2.Normalize(d - c);
                    var cp2 = c - Vector2.Normalize(bc + cd) * (c - b).Length() * 0.5f;

                    builder.AddCubicBezier(cp1, cp2, c);
                }

                builder.EndFigure(CanvasFigureLoop.Closed);

                return CanvasGeometry.CreatePath(builder);
            }
        }
Example #34
0
        public void Draw(object ds, XArc arc, double dx, double dy, ImmutableArray<ShapeProperty> db, Record r)
        {
            var a = WpfArc.FromXArc(arc, dx, dy);

            var _ds = ds as CanvasDrawingSession;

            double thickness = arc.Style.Thickness / _state.Zoom;
            var brush = ToColor(arc.Style.Fill);
            var pen = ToColor(arc.Style.Stroke);
            var ss = CreateStrokeStyle(arc.Style);

            CanvasGeometry g;
            using (var builder = new CanvasPathBuilder(_ds))
            {
                builder.BeginFigure((float)a.Start.X, (float)a.Start.Y);
                builder.AddArc(
                    new N.Vector2(
                        (float)a.End.X,
                        (float)a.End.Y),
                    (float)a.Radius.Width,
                    (float)a.Radius.Height,
                    0f,
                    CanvasSweepDirection.Clockwise,
                    a.IsLargeArc ? CanvasArcSize.Large : CanvasArcSize.Small);
                builder.EndFigure(CanvasFigureLoop.Open);
                g = CanvasGeometry.CreatePath(builder);
            }

            if (arc.IsFilled)
            {
                _ds.FillGeometry(g, brush);
            }

            if (arc.IsStroked)
            {
                _ds.DrawGeometry(g, pen, (float)thickness, ss);
            }

            g.Dispose();
            ss.Dispose();
        }
        internal static CanvasGeometry GenerateGeometry(CanvasDevice device, Size size, CompositionPathInfo info, Vector2 offset)
        {
            //
            //   |--LeftTop----------------------RightTop--|
            //   |                                         |
            // TopLeft                                TopRight
            //   |                                         |
            //   |                                         |
            //   |                                         |
            //   |                                         |
            //   |                                         |
            //   |                                         |
            // BottomLeft                          BottomRight
            //   |                                         |
            //   |--LeftBottom----------------RightBottom--|
            //
            //  compute the coordinates of the key points
            var leftTop = new Vector2(info.LeftTop.Single(), 0);
            var rightTop = new Vector2((size.Width - info.RightTop).Single(), 0);
            var topRight = new Vector2(size.Width.Single(), info.TopRight.Single());
            var bottomRight = new Vector2(size.Width.Single(), (size.Height - info.BottomRight).Single());
            var rightBottom = new Vector2((size.Width - info.RightBottom).Single(), size.Height.Single());
            var leftBottom = new Vector2(info.LeftBottom.Single(), size.Height.Single());
            var bottomLeft = new Vector2(0, (size.Height - info.BottomLeft).Single());
            var topLeft = new Vector2(0, info.TopLeft.Single());

            //  check keypoints for overlap and resolve by partitioning corners according to
            //  the percentage of each one.  

            //  top edge
            if (leftTop.X > rightTop.X)
            {
                var v = ((info.LeftTop) / (info.LeftTop + info.RightTop) * size.Width).Single();
                leftTop.X = v;
                rightTop.X = v;
            }

            //  right edge
            if (topRight.Y > bottomRight.Y)
            {
                var v = ((info.TopRight) / (info.TopRight + info.BottomRight) * size.Height).Single();
                topRight.Y = v;
                bottomRight.Y = v;
            }

            //  bottom edge
            if (leftBottom.X > rightBottom.X)
            {
                var v = ((info.LeftBottom) / (info.LeftBottom + info.RightBottom) * size.Width).Single();
                rightBottom.X = v;
                leftBottom.X = v;
            }

            // left edge
            if (topLeft.Y > bottomLeft.Y)
            {
                var v = ((info.TopLeft) / (info.TopLeft + info.BottomLeft) * size.Height).Single();
                bottomLeft.Y = v;
                topLeft.Y = v;
            }

            // Apply offset
            leftTop += offset;
            rightTop += offset;
            topRight += offset;
            bottomRight += offset;
            rightBottom += offset;
            leftBottom += offset;
            bottomLeft += offset;
            topLeft += offset;

            //  create the border geometry
            var pathBuilder = new CanvasPathBuilder(device);

            // Begin path
            pathBuilder.BeginFigure(leftTop);

            // Top line
            pathBuilder.AddLine(rightTop);

            // Upper-right corners
            var radiusX = size.Width - rightTop.X;
            var radiusY = (double)topRight.Y;
            if (!radiusX.IsZero() || !radiusY.IsZero())
            {
                pathBuilder.AddArc(topRight, radiusX.Single(), radiusY.Single(), (Math.PI / 2f).Single(),
                    CanvasSweepDirection.Clockwise, CanvasArcSize.Small);
            }

            // Right line
            pathBuilder.AddLine(bottomRight);

            // Lower-right corners
            radiusX = size.Width - rightBottom.X;
            radiusY = size.Height - bottomRight.Y;
            if (!radiusX.IsZero() || !radiusY.IsZero())
            {
                pathBuilder.AddArc(rightBottom, radiusX.Single(), radiusY.Single(), (Math.PI / 2f).Single(),
                    CanvasSweepDirection.Clockwise, CanvasArcSize.Small);
            }

            // Bottom line
            pathBuilder.AddLine(leftBottom);

            // Lower-left corners
            radiusX = leftBottom.X;
            radiusY = size.Height - bottomLeft.Y;
            if (!radiusX.IsZero() || !radiusY.IsZero())
            {
                pathBuilder.AddArc(bottomLeft, radiusX.Single(), radiusY.Single(), (Math.PI / 2f).Single(),
                    CanvasSweepDirection.Clockwise, CanvasArcSize.Small);
            }

            // Left line
            pathBuilder.AddLine(topLeft);

            // Upper-left corners
            radiusX = leftTop.X;
            radiusY = topLeft.Y;
            if (!radiusX.IsZero() || !radiusY.IsZero())
            {
                pathBuilder.AddArc(leftTop, radiusX.Single(), radiusY.Single(), (Math.PI / 2f).Single(),
                    CanvasSweepDirection.Clockwise, CanvasArcSize.Small);
            }

            // End path
            pathBuilder.EndFigure(CanvasFigureLoop.Closed);

            return CanvasGeometry.CreatePath(pathBuilder);
        }
        void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
        {
            CanvasTextFormat centeredTextFormat = new CanvasTextFormat();
            centeredTextFormat.HorizontalAlignment = CanvasHorizontalAlignment.Center;
            centeredTextFormat.VerticalAlignment = CanvasVerticalAlignment.Center;
            centeredTextFormat.FontSize = 30;

            if (photoCanvasBitmap != null)
            {
                CanvasRenderTarget tempRenderTarget = new CanvasRenderTarget(sender, photoCanvasBitmap.Size);

                using (CanvasDrawingSession ds = tempRenderTarget.CreateDrawingSession())
                {
                    // Begin by drawing the captured photo into the temporary render target
                    ds.DrawImage(photoCanvasBitmap, new System.Numerics.Vector2(0, 0));

                    foreach (Face face in lastCapturedFaces)
                    {
                        Rect faceRect = new Rect(face.FaceRectangle.Left, face.FaceRectangle.Top, face.FaceRectangle.Width, face.FaceRectangle.Height);
                        ds.DrawRectangle(faceRect, Colors.Red);

                        CanvasPathBuilder pathBuilder = new CanvasPathBuilder(sender);
                        Vector2 startingPoint = new Vector2((float)(faceRect.Left + faceRect.Width / 2), (float)faceRect.Top);
                        pathBuilder.BeginFigure(startingPoint);
                        pathBuilder.AddLine(startingPoint - new Vector2(Math.Max(70.0f, (float)faceRect.Width / 2), 10));
                        pathBuilder.AddLine(startingPoint - new Vector2(Math.Max(70.0f, (float)faceRect.Width / 2), 50));
                        pathBuilder.AddLine(startingPoint + new Vector2(Math.Max(70.0f, (float)faceRect.Width / 2), - 50));
                        pathBuilder.AddLine(startingPoint + new Vector2(Math.Max(70.0f, (float)faceRect.Width / 2), - 10));
                        pathBuilder.EndFigure(CanvasFigureLoop.Closed);

                        // Draw the speech bubble above the face
                        CanvasGeometry geometry = CanvasGeometry.CreatePath(pathBuilder);
                        ds.FillGeometry(geometry, Colors.Yellow);

                        // Draw the person's age and gender above the face
                        String descString = face.Attributes.Gender.ToString() + ", " + face.Attributes.Age.ToString();
                        ds.DrawText(descString, startingPoint - new Vector2(0, 30), Colors.Orange, centeredTextFormat);
                    }
                }

                // End by drawing the rendertarget into the center of the screen
                double imageScale = Math.Min(sender.RenderSize.Width / photoCanvasBitmap.Size.Width, sender.RenderSize.Height / tempRenderTarget.Size.Height);
                double newWidth = imageScale * tempRenderTarget.Size.Width;
                double newHeight = imageScale * tempRenderTarget.Size.Height;
                Rect targetRect = new Rect((sender.RenderSize.Width - newWidth) / 2, (sender.RenderSize.Height - newHeight) / 2, newWidth, newHeight);

                args.DrawingSession.DrawImage(tempRenderTarget, targetRect);
            }
            else
            {
                args.DrawingSession.DrawText("Processing...", (float)(sender.Size.Width / 2), (float)(sender.Size.Height / 2), Colors.White, centeredTextFormat);
            }
        }
        private CanvasGeometry CreateGeometry(ICanvasResourceCreator resourceCreator, GeometryType type)
        {
            switch (type)
            {
                case GeometryType.Rectangle: return CanvasGeometry.CreateRectangle(resourceCreator, 100, 100, 300, 350);
                case GeometryType.RoundedRectangle: return CanvasGeometry.CreateRoundedRectangle(resourceCreator, 80, 80, 400, 400, 100, 100);
                case GeometryType.Ellipse: return CanvasGeometry.CreateEllipse(resourceCreator, 275, 275, 225, 275);
                case GeometryType.Star:
                    {
                        return Utils.CreateStarGeometry(resourceCreator, 250, new Vector2(250, 250));
                    }
                case GeometryType.Group:
                    {
                        CanvasGeometry geo0 = CanvasGeometry.CreateRectangle(resourceCreator, 100, 100, 100, 100);
                        CanvasGeometry geo1 = CanvasGeometry.CreateRoundedRectangle(resourceCreator, 300, 100, 100, 100, 50, 50);

                        CanvasPathBuilder pathBuilder = new CanvasPathBuilder(resourceCreator);
                        pathBuilder.BeginFigure(200, 200);
                        pathBuilder.AddLine(500, 200);
                        pathBuilder.AddLine(200, 350);
                        pathBuilder.EndFigure(CanvasFigureLoop.Closed);
                        CanvasGeometry geo2 = CanvasGeometry.CreatePath(pathBuilder);

                        return CanvasGeometry.CreateGroup(resourceCreator, new CanvasGeometry[] { geo0, geo1, geo2 });
                    }
            }
            System.Diagnostics.Debug.Assert(false);
            return null;
        }
Example #38
0
            public void AddPathSegment(CanvasPathBuilder canvasPathBuilder, ref bool closed)
            {
                canvasPathBuilder.AddLine(_points[0], _points[1]);

                closed = false;
            }
Example #39
0
        private static void renderPath(IList <PathSegment> segments, CanvasPathBuilder builder)
        {
            Vector2?currentPoint = null;
            Vector2?cubicPoint   = null;
            Vector2?quadrPoint   = null;
            Vector2?initialPoint = null;

            void M(float x, float y)
            {
                var point = new Vector2(x, y);

                builder.BeginFigure(point);
                //context.move(to: point);
                setInitPoint(point);
            }

            void m(float x, float y)
            {
                if (currentPoint is Vector2 cur)
                {
                    var next = new Vector2(x + cur.X, y + cur.Y);
                    builder.BeginFigure(next);
                    //context.move(to: next);
                    setInitPoint(next);
                }
                else
                {
                    M(x, y: y);
                }
            }

            void L(float x, float y)
            {
                lineTo(new Vector2(x, y));
            }

            void l(float x, float y)
            {
                if (currentPoint is Vector2 cur)
                {
                    lineTo(new Vector2(x + cur.X, y + cur.Y));
                }
                else
                {
                    L(x, y: y);
                }
            }

            void H(float x)
            {
                if (currentPoint is Vector2 cur)
                {
                    lineTo(new Vector2(x, cur.Y));
                }
            }

            void h(float x)
            {
                if (currentPoint is Vector2 cur)
                {
                    lineTo(new Vector2(x + cur.X, cur.Y));
                }
            }

            void V(float y)
            {
                if (currentPoint is Vector2 cur)
                {
                    lineTo(new Vector2(cur.X, y));
                }
            }

            void v(float y)
            {
                if (currentPoint is Vector2 cur)
                {
                    lineTo(new Vector2(cur.X, y + cur.Y));
                }
            }

            void lineTo(Vector2 p)
            {
                builder.AddLine(p);
                //context.addLine(to: p);
                setPoint(p);
            }

            void c(float x1, float y1, float x2, float y2, float x, float y)
            {
                if (currentPoint is Vector2 cur)
                {
                    var endPoint      = new Vector2(x + cur.X, y + cur.Y);
                    var controlPoint1 = new Vector2(x1 + cur.X, y1 + cur.Y);
                    var controlPoint2 = new Vector2(x2 + cur.X, y2 + cur.Y);
                    builder.AddCubicBezier(controlPoint1, controlPoint2, endPoint);
                    //context.addCurve(to: endPoint, control1: controlPoint1, control2: controlPoint2);
                    setCubicPoint(endPoint, cubic: controlPoint2);
                }
            }

            void C(float x1, float y1, float x2, float y2, float x, float y)
            {
                var endPoint      = new Vector2(x, y);
                var controlPoint1 = new Vector2(x1, y1);
                var controlPoint2 = new Vector2(x2, y2);

                builder.AddCubicBezier(controlPoint1, controlPoint2, endPoint);
                //context.addCurve(to: endPoint, control1: controlPoint1, control2: controlPoint2);
                setCubicPoint(endPoint, cubic: controlPoint2);
            }

            void s(float x2, float y2, float x, float y)
            {
                if (currentPoint is Vector2 cur)
                {
                    var     nextCubic = new Vector2(x2 + cur.X, y2 + cur.Y);
                    var     next      = new Vector2(x + cur.X, y + cur.Y);
                    Vector2 xy1;
                    if (cubicPoint is Vector2 curCubicVal)
                    {
                        xy1 = new Vector2((2 * cur.X) - curCubicVal.X, (2 * cur.Y) - curCubicVal.Y);
                    }
                    else
                    {
                        xy1 = cur;
                    }
                    builder.AddCubicBezier(xy1, nextCubic, next);
                    //context.addCurve(to: next, control1: xy1, control2: nextCubic);
                    setCubicPoint(next, cubic: nextCubic);
                }
            }

            void S(float x2, float y2, float x, float y)
            {
                if (currentPoint is Vector2 cur)
                {
                    var     nextCubic = new Vector2(x2, y2);
                    var     next      = new Vector2(x, y);
                    Vector2 xy1;
                    if (cubicPoint is Vector2 curCubicVal)
                    {
                        xy1 = new Vector2((2 * cur.X) - curCubicVal.X, (2 * cur.Y) - curCubicVal.Y);
                    }
                    else
                    {
                        xy1 = cur;
                    }
                    builder.AddCubicBezier(xy1, nextCubic, next);
                    //context.addCurve(to: next, control1: xy1, control2: nextCubic);
                    setCubicPoint(next, cubic: nextCubic);
                }
            }

            void z()
            {
                builder.EndFigure(CanvasFigureLoop.Closed);
                //context.fillPath();
            }

            void setQuadrPoint(Vector2 p, Vector2 quadr)
            {
                currentPoint = p;
                quadrPoint   = quadr;
                cubicPoint   = null;
            }

            void setCubicPoint(Vector2 p, Vector2 cubic)
            {
                currentPoint = p;
                cubicPoint   = cubic;
                quadrPoint   = null;
            }

            void setInitPoint(Vector2 p)
            {
                setPoint(p);
                initialPoint = p;
            }

            void setPoint(Vector2 p)
            {
                currentPoint = p;
                cubicPoint   = null;
                quadrPoint   = null;
            }

            foreach (var segment in segments)
            {
                var data = segment.data.AsSpan();
                switch (segment.type)
                {
                case PathSegment.SegmentType.M:
                    M(data[0], data[1]);
                    data = data.Slice(2);
                    //data.removeSubrange(Range(uncheckedBounds: (lower: 0, upper: 2)));
                    while (data.Length >= 2)
                    {
                        L(data[0], data[1]);
                        data = data.Slice(2);
                        //data.removeSubrange((0.. < 2));
                    }
                    break;

                case PathSegment.SegmentType.m:
                    m(data[0], data[1]);
                    data = data.Slice(2);
                    //data.removeSubrange((0.. < 2));
                    while (data.Length >= 2)
                    {
                        l(data[0], data[1]);
                        data = data.Slice(2);
                        //data.removeSubrange((0.. < 2));
                    }
                    break;

                case PathSegment.SegmentType.L:
                    while (data.Length >= 2)
                    {
                        L(data[0], data[1]);
                        data = data.Slice(2);
                        //data.removeSubrange((0.. < 2));
                    }
                    break;

                case PathSegment.SegmentType.l:
                    while (data.Length >= 2)
                    {
                        l(data[0], data[1]);
                        data = data.Slice(2);
                        //data.removeSubrange((0.. < 2));
                    }
                    break;

                case PathSegment.SegmentType.H:
                    H(data[0]);
                    break;

                case PathSegment.SegmentType.h:
                    h(data[0]);
                    break;

                case PathSegment.SegmentType.V:
                    V(data[0]);
                    break;

                case PathSegment.SegmentType.v:
                    v(data[0]);
                    break;

                case PathSegment.SegmentType.C:
                    while (data.Length >= 6)
                    {
                        C(data[0], data[1], data[2], data[3], data[4], data[5]);
                        data = data.Slice(6);
                        //data.removeSubrange((0.. < 6));
                    }
                    break;

                case PathSegment.SegmentType.c:
                    while (data.Length >= 6)
                    {
                        c(data[0], data[1], data[2], data[3], data[4], data[5]);
                        data = data.Slice(6);
                        //data.removeSubrange((0.. < 6));
                    }
                    break;

                case PathSegment.SegmentType.S:
                    while (data.Length >= 4)
                    {
                        S(data[0], data[1], data[2], data[3]);
                        data = data.Slice(4);
                        //data.removeSubrange((0.. < 4));
                    }
                    break;

                case PathSegment.SegmentType.s:
                    while (data.Length >= 4)
                    {
                        s(data[0], y2: data[1], x: data[2], y: data[3]);
                        data = data.Slice(4);
                        //data.removeSubrange((0.. < 4));
                    }
                    break;

                case PathSegment.SegmentType.z:
                    z();
                    break;

                default:
                    //print("unknown");
                    break;
                }
            }
        }
        CanvasGeometry MakeDirectionIcon(ICanvasResourceCreator creator)
        {
            var builder = new CanvasPathBuilder(creator);

            float radius = 3;
            float lineWidth = 20;

            builder.BeginFigure(0, 0);
            builder.AddLine(0, radius * 2);
            builder.EndFigure(CanvasFigureLoop.Open);

            float y = radius;
            builder.BeginFigure(0, y);
            builder.AddArc(new Vector2(lineWidth + radius, y + radius), radius, radius, -(float)Math.PI/2, (float)Math.PI);
            y += radius * 2;
            builder.AddArc(new Vector2(radius, y + radius), radius, radius, -(float)Math.PI/2, -(float)Math.PI);

            y += radius * 2;
            float x = lineWidth * 2 / 3;
            builder.AddLine(x, y);

            builder.EndFigure(CanvasFigureLoop.Open);

            builder.BeginFigure(x - radius, y - radius/3);
            builder.AddLine(x, y);
            builder.AddLine(x - radius, y + radius/3);
            builder.EndFigure(CanvasFigureLoop.Open);

            return CanvasGeometry.CreatePath(builder);
        }
Example #41
0
        private void Canvas_Draw(CanvasControl sender, CanvasDrawEventArgs args)
        {
            if (ItemTemplate == null)
            {
                return;
            }
            if (ItemsSource == null)
            {
                return;
            }


            var repairedItemsSource = ItemsSource.Cast <ChartDataItem>().Where(item => item.Part > 0.01).ToList();
            var newSum = repairedItemsSource.Sum(i => i.Value);

            foreach (var item in repairedItemsSource)
            {
                item.Part = item.Value / newSum;
            }


            var d = 0d;

            foreach (var item in repairedItemsSource)
            {
                var chartItem = (DoughnutChartItem)ItemTemplate.LoadContent();
                if (chartItem == null)
                {
                    return;
                }

                chartItem.DataContext = item;

                if (chartItem.Color == default(Color))
                {
                    chartItem.Color = DefaultColors.GetRandom();
                }

                var sweepAngle = chartItem.Angle;


                var startAngle = (float)(d - Math.PI / 2);
                d += sweepAngle;

                var center = new Vector2((float)(ActualWidth / 2), (float)(ActualHeight / 2));
                var radius = center.X > center.Y
                    ? new Vector2(center.Y)
                    : new Vector2(center.X);
                var startPoint = center + Vector2.Transform(Vector2.UnitX, Matrix3x2.CreateRotation(startAngle)) * radius;

                var relativeDistance       = Distance / radius.X;
                var relativeSecondDistance = Distance / (radius.X - Thickness / 2);
                var repairSweepAngle       = sweepAngle > relativeDistance ? sweepAngle - relativeDistance : 0;
                var repairSecondSweepAngle = sweepAngle > relativeSecondDistance / 2 ? sweepAngle - relativeSecondDistance / 2 : 0;

                using (var builder = new CanvasPathBuilder(canvas)) {
                    builder.BeginFigure(startPoint);
                    builder.AddArc(center, radius.X, radius.Y, (float)(startAngle + relativeDistance / 2), (float)repairSweepAngle);
                    builder.AddArc(center, radius.X - (float)Thickness / 2, (float)(radius.Y - Thickness / 2), (float)(startAngle + sweepAngle - relativeSecondDistance / 2), -(float)repairSecondSweepAngle);
                    builder.EndFigure(CanvasFigureLoop.Closed);

                    args.DrawingSession.FillGeometry(
                        CanvasGeometry.CreatePath(builder),
                        chartItem.Color);
                }
            }
        }
 public void closePath()
 {
     if (this.pathBuilder != null) {
         this.pathBuilder.Dispose();
         this.pathBuilder = null;
     }
 }
        private static CanvasGeometry CreateHeart(ICanvasResourceCreator resourceCreator, float scale, Vector2 center)
        {
            center = center - new Vector2(center.X / 2, center.Y / 2);
            CanvasPathBuilder pathBuilder = new CanvasPathBuilder(resourceCreator);
            var begin = new Vector2(0.47f, 0.34f) * scale + center;
            pathBuilder.BeginFigure(begin);
            pathBuilder.AddCubicBezier(new Vector2(0.66f, 0.19f) * scale + center, new Vector2(0.88f, 0.30f) * scale + center, new Vector2(0.88f, 0.48f) * scale + center);
            pathBuilder.AddCubicBezier(new Vector2(0.88f, 0.66f) * scale + center, new Vector2(0.49f, 1) * scale + center, new Vector2(0.49f, 1)* scale + center);
            pathBuilder.AddCubicBezier(new Vector2(0.49f, 1) * scale + center, new Vector2(0, 0.66f) * scale + center, new Vector2(0, 0.48f) * scale + center);
            pathBuilder.AddCubicBezier(new Vector2(0, 0.30f) * scale + center, new Vector2(0.33f, 0.19f) * scale + center, begin);

            pathBuilder.SetSegmentOptions(CanvasFigureSegmentOptions.ForceRoundLineJoin);
            pathBuilder.EndFigure(CanvasFigureLoop.Closed);
            var geometry = CanvasGeometry.CreatePath(pathBuilder);
            return geometry;
        }
 internal virtual void drawPath(CanvasPathBuilder p, Stroke stroke)
 {
     graphics.DrawGeometry(CanvasGeometry.CreatePath(p), c, stroke.getLineWidth());
 }
        private void Canvas_Draw(CanvasControl sender, CanvasDrawEventArgs args)
        {
            var ds = args.DrawingSession;

            foreach (var link in Links)
            {
                var centerPoint = (link.Node1.Position + link.Node2.Position) / 2;

                //if (Math.Abs(link.Node1.PositionX - link.Node2.PositionX) > Math.Abs(link.Node1.PositionY - link.Node2.PositionY))
                //{
                //    ds.DrawText(link.Weight.ToString(), centerPoint.X, centerPoint.Y - 10, foregroundColor);
                //}

                ds.DrawEllipse((float)Canvas.ActualWidth / 2, (float)Canvas.ActualHeight / 2, 500, 500, foregroundColor);

                using (var builder = new CanvasPathBuilder(sender))
                {
                    builder.BeginFigure(link.Node1.Position);
                    builder.AddArc(link.Node2.Position, arcRadiusX, arcRadiusY, 0, CanvasSweepDirection.Clockwise, CanvasArcSize.Small);
                    builder.EndFigure(CanvasFigureLoop.Open);

                    using (var geometry = CanvasGeometry.CreatePath(builder))
                    {
                        ds.DrawGeometry(geometry, foregroundColor, strokeWidth);
                    }
                }
            }

            foreach (var node in Nodes)
            {
                DrawNode(ds, node);
            }
        }
 internal virtual void fillPath(CanvasPathBuilder p)
 {
     graphics.DrawGeometry(CanvasGeometry.CreatePath(p), c);
 }
        private void EnsureFigure(CanvasPathBuilder builder)
        {
            if (!_figureStarted)
            {
                //_figure = _builder.BeginFigure();
                //_figure = new PathFigure();
                //_figure.StartPoint = _lastStart;
                builder.BeginFigure((float)_lastStart.X, (float)_lastStart.Y, CanvasFigureFill.Default);

                //_context.BeginFigure(_lastStart, IsFilled, !IsClosed);
                _figureStarted = true;
            }
        }
Example #48
0
        public static CanvasGeometry ToCanvasGeometry(this XPathGeometry pg, CanvasDrawingSession ds)
        {
            CanvasGeometry g;

            using (var builder = new CanvasPathBuilder(ds))
            {
                if (pg.FillRule == XFillRule.EvenOdd)
                    builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Alternate);
                else
                    builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Winding);

                foreach (var pf in pg.Figures)
                {
                    builder.BeginFigure(
                        (float)pf.StartPoint.X,
                        (float)pf.StartPoint.Y,
                        pf.IsFilled ? CanvasFigureFill.Default : CanvasFigureFill.DoesNotAffectFills);

                    foreach (var segment in pf.Segments)
                    {
                        var options = CanvasFigureSegmentOptions.None;
                        if (!segment.IsStroked)
                            options |= CanvasFigureSegmentOptions.ForceUnstroked;

                        if (segment.IsSmoothJoin)
                            options |= CanvasFigureSegmentOptions.ForceRoundLineJoin;

                        builder.SetSegmentOptions(options);

                        if (segment is XArcSegment)
                        {
                            var arcSegment = segment as XArcSegment;
                            builder.AddArc(
                                new N.Vector2(
                                    (float)arcSegment.Point.X,
                                    (float)arcSegment.Point.Y),
                                (float)(arcSegment.Size.Width / 2.0),
                                (float)(arcSegment.Size.Height / 2.0),
                                (float)arcSegment.RotationAngle,
                                arcSegment.SweepDirection == XSweepDirection.Clockwise ? CanvasSweepDirection.Clockwise : CanvasSweepDirection.CounterClockwise,
                                arcSegment.IsLargeArc ? CanvasArcSize.Large : CanvasArcSize.Small);
                        }
                        else if (segment is XBezierSegment)
                        {
                            var bezierSegment = segment as XBezierSegment;
                            builder.AddCubicBezier(
                                new N.Vector2(
                                    (float)bezierSegment.Point1.X,
                                    (float)bezierSegment.Point1.Y),
                                new N.Vector2(
                                    (float)bezierSegment.Point2.X,
                                    (float)bezierSegment.Point2.Y),
                                new N.Vector2(
                                    (float)bezierSegment.Point3.X,
                                    (float)bezierSegment.Point3.Y));
                        }
                        else if (segment is XLineSegment)
                        {
                            var lineSegment = segment as XLineSegment;
                            builder.AddLine(
                                new N.Vector2(
                                    (float)lineSegment.Point.X,
                                    (float)lineSegment.Point.Y));
                        }
                        else if (segment is XPolyBezierSegment)
                        {
                            var polyBezierSegment = segment as XPolyBezierSegment;
                            if (polyBezierSegment.Points.Count >= 3)
                            {
                                builder.AddCubicBezier(
                                    new N.Vector2(
                                        (float)polyBezierSegment.Points[0].X,
                                        (float)polyBezierSegment.Points[0].Y),
                                    new N.Vector2(
                                        (float)polyBezierSegment.Points[1].X,
                                        (float)polyBezierSegment.Points[1].Y),
                                    new N.Vector2(
                                        (float)polyBezierSegment.Points[2].X,
                                        (float)polyBezierSegment.Points[2].Y));
                            }

                            if (polyBezierSegment.Points.Count > 3
                                && polyBezierSegment.Points.Count % 3 == 0)
                            {
                                for (int i = 3; i < polyBezierSegment.Points.Count; i += 3)
                                {
                                    builder.AddCubicBezier(
                                        new N.Vector2(
                                            (float)polyBezierSegment.Points[i].X,
                                            (float)polyBezierSegment.Points[i].Y),
                                        new N.Vector2(
                                            (float)polyBezierSegment.Points[i + 1].X,
                                            (float)polyBezierSegment.Points[i + 1].Y),
                                        new N.Vector2(
                                            (float)polyBezierSegment.Points[i + 2].X,
                                            (float)polyBezierSegment.Points[i + 2].Y));
                                }
                            }
                        }
                        else if (segment is XPolyLineSegment)
                        {
                            var polyLineSegment = segment as XPolyLineSegment;

                            if (polyLineSegment.Points.Count >= 1)
                            {
                                builder.AddLine(
                                    new N.Vector2(
                                        (float)polyLineSegment.Points[0].X,
                                        (float)polyLineSegment.Points[0].Y));
                            }

                            if (polyLineSegment.Points.Count > 1)
                            {
                                for (int i = 1; i < polyLineSegment.Points.Count; i++)
                                {
                                    builder.AddLine(
                                        new N.Vector2(
                                            (float)polyLineSegment.Points[i].X,
                                            (float)polyLineSegment.Points[i].Y));
                                }
                            }
                        }
                        else if (segment is XPolyQuadraticBezierSegment)
                        {
                            var polyQuadraticSegment = segment as XPolyQuadraticBezierSegment;
                            if (polyQuadraticSegment.Points.Count >= 2)
                            {
                                builder.AddQuadraticBezier(
                                    new N.Vector2(
                                        (float)polyQuadraticSegment.Points[0].X,
                                        (float)polyQuadraticSegment.Points[0].Y),
                                    new N.Vector2(
                                        (float)polyQuadraticSegment.Points[1].X,
                                        (float)polyQuadraticSegment.Points[1].Y));
                            }

                            if (polyQuadraticSegment.Points.Count > 2
                                && polyQuadraticSegment.Points.Count % 2 == 0)
                            {
                                for (int i = 3; i < polyQuadraticSegment.Points.Count; i += 3)
                                {
                                    builder.AddQuadraticBezier(
                                        new N.Vector2(
                                            (float)polyQuadraticSegment.Points[i].X,
                                            (float)polyQuadraticSegment.Points[i].Y),
                                        new N.Vector2(
                                            (float)polyQuadraticSegment.Points[i + 1].X,
                                            (float)polyQuadraticSegment.Points[i + 1].Y));
                                }
                            }
                        }
                        else if (segment is XQuadraticBezierSegment)
                        {
                            var qbezierSegment = segment as XQuadraticBezierSegment;
                            builder.AddQuadraticBezier(
                                new N.Vector2(
                                    (float)qbezierSegment.Point1.X,
                                    (float)qbezierSegment.Point1.Y),
                                new N.Vector2(
                                    (float)qbezierSegment.Point2.X,
                                    (float)qbezierSegment.Point2.Y));
                        }
                        else
                        {
                            throw new NotSupportedException("Not supported segment type: " + segment.GetType());
                        }
                    }

                    builder.EndFigure(pf.IsClosed ? CanvasFigureLoop.Closed : CanvasFigureLoop.Open);
                }

                g = CanvasGeometry.CreatePath(builder);
            }

            return g;
        }
 internal override void fillPath(CanvasPathBuilder p)
 {
     setGraphics(canvas.CreateDrawingSession());
     base.setClip(clip);
     base.fillPath(p);
     base.removeClip();
 }
        // changes the drawing points in graph to be actual graph geometry item which can be used for drawing
        private CanvasGeometry getDrawChartGeometry(CanvasDevice device, List<DataPoint> offsetList)
        {
            if (offsetList == null || offsetList.Count <= 0)
            {
                return null;
            }

            CanvasPathBuilder pathBuilder = new CanvasPathBuilder(device);

            //start with first point
            pathBuilder.BeginFigure((float)offsetList[0].OffsetX, (float)offsetList[0].OffsetY);

            for (int i = 0; i < offsetList.Count; i++)
            {   // add line to the next point in the offset list
                pathBuilder.AddLine((float)offsetList[i].OffsetX, (float)offsetList[i].OffsetY);
            }
            //end it with open loop, we are not closed geometry object but just a chart-graph
            pathBuilder.EndFigure(CanvasFigureLoop.Open);

            return CanvasGeometry.CreatePath(pathBuilder);
        }
Example #51
0
        private void DrawSpectrumSpline(IReadOnlyList <float> data, CanvasDrawingSession session, Vector2 offset, float width, float height, float heightScale, Color color, bool rightToLeft = false)
        {
            int segmentCount = data.Count - 1;

            if (segmentCount <= 1 || width <= 0f)
            {
                return;
            }

            CanvasPathBuilder path = new CanvasPathBuilder(session);

            float segmentWidth = width / (float)segmentCount;

            Vector2 prevPosition = rightToLeft ? new Vector2(width + offset.X, data[0] * heightScale * height + offset.Y)
                                               : new Vector2(offset.X, data[0] * heightScale * height + offset.Y);

            if (rightToLeft)
            {
                path.BeginFigure(width + offset.X, height + offset.Y);
            }
            else
            {
                path.BeginFigure(offset.X, height + offset.Y);
            }

            path.AddLine(prevPosition);

            for (int i = 1; i < data.Count; i++)
            {
                Vector2 position = rightToLeft ? new Vector2(width - (float)i * segmentWidth + offset.X, data[i] * heightScale * height + offset.Y)
                                               : new Vector2((float)i * segmentWidth + offset.X, data[i] * heightScale * height + offset.Y);

                if (rightToLeft)
                {
                    Vector2 c1 = new Vector2(position.X + segmentWidth / 2.0f, prevPosition.Y);
                    Vector2 c2 = new Vector2(prevPosition.X - segmentWidth / 2.0f, position.Y);
                    path.AddCubicBezier(c1, c2, position);
                }
                else
                {
                    Vector2 c1 = new Vector2(position.X - segmentWidth / 2.0f, prevPosition.Y);
                    Vector2 c2 = new Vector2(prevPosition.X + segmentWidth / 2.0f, position.Y);
                    path.AddCubicBezier(c1, c2, position);
                }

                prevPosition = position;
            }

            if (rightToLeft)
            {
                path.AddLine(offset.X, height + offset.Y);
            }
            else
            {
                path.AddLine(width + offset.X, height + offset.Y);
            }

            path.EndFigure(CanvasFigureLoop.Closed);

            CanvasGeometry geometry = CanvasGeometry.CreatePath(path);

            session.FillGeometry(geometry, color);
        }
Example #52
0
        public void Draw(object ds, XQBezier qbezier, double dx, double dy, ImmutableArray<ShapeProperty> db, Record r)
        {
            var _ds = ds as CanvasDrawingSession;

            double thickness = qbezier.Style.Thickness / _state.Zoom;
            var brush = ToColor(qbezier.Style.Fill);
            var pen = ToColor(qbezier.Style.Stroke);
            var ss = CreateStrokeStyle(qbezier.Style);

            CanvasGeometry g;
            using (var builder = new CanvasPathBuilder(_ds))
            {
                builder.BeginFigure((float)qbezier.Point1.X, (float)qbezier.Point1.Y);
                builder.AddQuadraticBezier(
                    new N.Vector2(
                        (float)qbezier.Point2.X,
                        (float)qbezier.Point2.Y),
                    new N.Vector2(
                        (float)qbezier.Point3.X,
                        (float)qbezier.Point3.Y));
                builder.EndFigure(CanvasFigureLoop.Open);
                g = CanvasGeometry.CreatePath(builder);
            }

            if (qbezier.IsFilled)
            {
                _ds.FillGeometry(g, brush);
            }

            if (qbezier.IsStroked)
            {
                _ds.DrawGeometry(g, pen, (float)thickness, ss);
            }

            g.Dispose();
            ss.Dispose();
        }
Example #53
0
        private void DrawSelectionLasso(CanvasControl sender, CanvasDrawingSession ds)
        {
            if (selectionPolylinePoints == null) return;
            if (selectionPolylinePoints.Count == 0) return;

            CanvasPathBuilder selectionLasso = new CanvasPathBuilder(canvasControl);
            selectionLasso.BeginFigure(selectionPolylinePoints[0].ToVector2());
            for (int i = 1; i < selectionPolylinePoints.Count; ++i)
            {
                selectionLasso.AddLine(selectionPolylinePoints[i].ToVector2());
            }
            selectionLasso.EndFigure(CanvasFigureLoop.Open);

            CanvasGeometry pathGeometry = CanvasGeometry.CreatePath(selectionLasso);
            ds.DrawGeometry(pathGeometry, Colors.Magenta, 5.0f);
        }
        void CreateClockFace(ICanvasResourceCreator sender)
        {
            const float begin = center - radius - lineLength / 2;
            const float end = center + radius + lineLength / 2;

            using (var builder = new CanvasPathBuilder(sender))
            {

                // Since we have concentric circles that we want to remain filled we want to use Winding to determine the filled region.
                builder.SetFilledRegionDetermination(CanvasFilledRegionDetermination.Winding);

                builder.AddCircleFigure(new Vector2(center), radius);
                builder.AddCircleFigure(new Vector2(center), radius * 0.6f);

                builder.AddOneLineFigure(center, begin, center, begin + lineLength);
                builder.AddOneLineFigure(center, end - lineLength, center, end);
                builder.AddOneLineFigure(begin, center, begin + lineLength, center);
                builder.AddOneLineFigure(end - lineLength, center, end, center);

                using (CanvasGeometry clockFaceGeometry = CanvasGeometry.CreatePath(builder))
                {
                    clockFaceCachedFill = CanvasCachedGeometry.CreateFill(clockFaceGeometry);
                    clockFaceCachedStroke18 = CanvasCachedGeometry.CreateStroke(clockFaceGeometry, 18, timeCircleStrokeStyle);
                    clockFaceCachedStroke16 = CanvasCachedGeometry.CreateStroke(clockFaceGeometry, 16, timeCircleStrokeStyle);
                }
            }
        }
 public static void AddCircleFigure(this CanvasPathBuilder builder, Vector2 center, float radius)
 {
     builder.BeginFigure(center + Vector2.UnitX * radius);
     builder.AddArc(center, radius, radius, 0, (float)Math.PI * 2);
     builder.EndFigure(CanvasFigureLoop.Closed);
 }
        static CanvasGeometry CreateTimeSegmentGeometry(CanvasDrawingSession ds, double fractionSecond)
        {
            double fractionSecondAngle = 2 * Math.PI * fractionSecond;
            double angle = fractionSecondAngle % (2 * Math.PI);

            using (var builder = new CanvasPathBuilder(ds))
            {
                builder.BeginFigure(center, center);
                builder.AddArc(new Vector2(center), radius, radius, (float)Math.PI * 3 / 2, (float)angle);
                builder.EndFigure(CanvasFigureLoop.Closed);

                return CanvasGeometry.CreatePath(builder);
            }
        }
Example #57
0
            public void AddPathSegment(CanvasPathBuilder canvasPathBuilder, ref bool closed)
            {
                canvasPathBuilder.AddCubicBezier(_control1, _control2, _vertex);

                closed = false;
            }
        void DrawBezier(CanvasDrawingSession drawingSession, Vector2 start, Vector2 ctrl0, Vector2 ctrl1, Vector2 end)
        {
            CanvasPathBuilder pathBuilder = new CanvasPathBuilder(canvasControl);
            pathBuilder.BeginFigure(start);
            pathBuilder.AddCubicBezier(ctrl0, ctrl1, end);
            pathBuilder.EndFigure(CanvasFigureLoop.Open);

            CanvasGeometry geometry = CanvasGeometry.CreatePath(pathBuilder);
            drawingSession.DrawGeometry(geometry, Colors.White, 5.0f);            
        }
Example #59
0
            public void AddPathSegment(CanvasPathBuilder canvasPathBuilder, ref bool closed)
            {
                canvasPathBuilder.AddArc(_endPoint, _a / 2, _b / 2, _sweepAngle, CanvasSweepDirection.Clockwise, CanvasArcSize.Small);

                closed = false;
            }
        void Redraw(CanvasControl canvas, CanvasDrawEventArgs args)
        {
            for (int y = -2; y <= (int)Math.Ceiling(canvas.ActualHeight / TileSize.Height * 2) + 1; ++y)
            {
                for (int x = -2; x <= (int)Math.Ceiling(canvas.ActualWidth / TileSize.Width) + 1; ++x)
                {
                    Vector2 onscreenTile = new Vector2(0.0f, 0.0f);

                    var path = new CanvasPathBuilder(canvas);

                    if (TileShape == MapTileShape.Square)
                    {
                        onscreenTile.X = (float)Math.Floor((double)(x + (y / 2)));
                        onscreenTile.Y = (float)Math.Floor((double)(-x + (y / 2) + (y % 2)));

                        var tileRect = new Rect(onscreenTile.X, onscreenTile.Y, 1, 1);

                        path.BeginFigure(
                            MapToScreen(
                                new Vector2((float)tileRect.Left, (float)tileRect.Top)));

                        path.AddLine(
                            MapToScreen(
                                new Vector2((float)tileRect.Right, (float)tileRect.Top)));
                        path.AddLine(
                            MapToScreen(
                                new Vector2((float)tileRect.Right, (float)tileRect.Bottom)));
                        path.AddLine(
                            MapToScreen(
                                new Vector2((float)tileRect.Left, (float)tileRect.Bottom)));

                        path.EndFigure(CanvasFigureLoop.Closed);
                    }
                    else if (TileShape == MapTileShape.Hexagon)
                    {
                        onscreenTile.X = (float)x;
                        onscreenTile.Y = (float)y;

                        var topLeft = MapToScreen(onscreenTile);

                        var bottomRight = new Vector2(
                            (float)(topLeft.X + TileSize.Width),
                            (float)(topLeft.Y + TileSize.Height));

#if HORIZONTAL_HEXAGONS
                        path.BeginFigure(new Vector2(
                            topLeft.X + 0.25f * (float)TileSize.Width,
                            topLeft.Y));

                        path.AddLine(new Vector2(
                            bottomRight.X - 0.25f * (float)TileSize.Width,
                            topLeft.Y));
                        path.AddLine(new Vector2(
                            bottomRight.X,
                            topLeft.Y + 0.5f * (float)TileSize.Height));
                        path.AddLine(new Vector2(
                            bottomRight.X - 0.25f * (float)TileSize.Width,
                            bottomRight.Y));
                        path.AddLine(new Vector2(
                            topLeft.X + 0.25f * (float)TileSize.Width,
                            bottomRight.Y));
                        path.AddLine(new Vector2(
                            topLeft.X,
                            topLeft.Y + 0.5f * (float)TileSize.Height));
#else
                        path.BeginFigure(new Vector2(
                            topLeft.X + 0.5f * (float)TileSize.Width,
                            topLeft.Y));
                        
                        path.AddLine(new Vector2(
                            bottomRight.X,
                            topLeft.Y + 0.25f * (float)TileSize.Height));
                        path.AddLine(new Vector2(
                            bottomRight.X,
                            bottomRight.Y - 0.25f * (float)TileSize.Height));
                        path.AddLine(new Vector2(
                            bottomRight.X - 0.5f * (float)TileSize.Width,
                            bottomRight.Y));
                        path.AddLine(new Vector2(
                            topLeft.X,
                            bottomRight.Y - 0.25f * (float)TileSize.Height));
                        path.AddLine(new Vector2(
                            topLeft.X,
                            topLeft.Y + 0.25f * (float)TileSize.Height));
#endif

                        path.EndFigure(CanvasFigureLoop.Closed);
                    }
                    
                    var tile = onscreenTile + TileOffset;
                    var geometry = CanvasGeometry.CreatePath(path);

                    if (tile == HighlightedTile)
                    {
                        args.DrawingSession.FillGeometry(geometry, Colors.CornflowerBlue);
                        args.DrawingSession.DrawGeometry(geometry, Color.FromArgb(255, 40, 40, 40));
                    }
                    else
                    {
                        args.DrawingSession.FillGeometry(geometry, Colors.White);
                        args.DrawingSession.DrawGeometry(geometry, Colors.Black);
                    }
                }
            }
        }