public override void RenderElement(IRenderable element, Graphics graphics, Render render)
        {
            ComplexLine complex = element as ComplexLine;

            if (complex.Points == null)
            {
                return;
            }

            PointF  location;
            PointF  reference;
            Segment segment = null;

            //Save the current region
            Region current = graphics.Clip;

            //Mask out each marker
            for (int i = 0; i < complex.Points.Count - 1; i++)
            {
                location  = (PointF)complex.Points[i];
                reference = (PointF)complex.Points[i + 1];

                segment = complex.Segments[i];

                //Mask out the start marker
                if (segment.Start.Marker != null && !segment.Start.Marker.DrawBackground)
                {
                    Region region = new Region(segment.Start.Marker.GetPath());
                    region.Transform(Link.GetMarkerTransform(segment.Start.Marker, location, reference, new Matrix()));
                    graphics.SetClip(region, CombineMode.Exclude);
                }
            }

            //Mask out final marker
            if (segment.End.Marker != null && !segment.End.Marker.DrawBackground)
            {
                location  = (PointF)complex.Points[complex.Points.Count - 1];
                reference = (PointF)complex.Points[complex.Points.Count - 2];

                Region region = new Region(segment.End.Marker.GetPath());
                region.Transform(Link.GetMarkerTransform(segment.End.Marker, location, reference, new Matrix()));
                graphics.SetClip(region, CombineMode.Exclude);
            }

            //Draw the path
            Pen pen = null;

            if (complex.CustomPen == null)
            {
                pen           = new Pen(complex.BorderColor, complex.BorderWidth);
                pen.DashStyle = complex.BorderStyle;

                //Check if winforms renderer and ajdust color as required
                pen.Color = render.AdjustColor(complex.BorderColor, complex.BorderWidth, complex.Opacity);
            }
            else
            {
                pen = complex.CustomPen;
            }
            graphics.DrawPath(pen, complex.GetPath());

            //Reset the clip
            graphics.Clip = current;

            //Render the segment items
            for (int i = 0; i < complex.Points.Count - 1; i++)
            {
                segment   = complex.Segments[i];
                location  = (PointF)complex.Points[i];
                reference = (PointF)complex.Points[i + 1];

                if (segment.Start.Marker != null)
                {
                    RenderMarker(segment.Start.Marker, location, reference, graphics, render);
                }

                //Render the segment image and annotation
                RenderSegment(complex, segment, location, reference, graphics, render);
            }

            //Render final marker
            if (segment.End.Marker != null)
            {
                location  = (PointF)complex.Points[complex.Points.Count - 1];
                reference = (PointF)complex.Points[complex.Points.Count - 2];
                RenderMarker(segment.End.Marker, location, reference, graphics, render);
            }
        }
        public override void RenderShadow(IRenderable element, Graphics graphics, Render render)
        {
            ComplexLine complex = element as ComplexLine;

            if (complex.Points == null)
            {
                return;
            }

            PointF  location;
            PointF  reference;
            Segment segment = null;

            Layer        layer      = complex.Layer;
            Pen          shadowPen  = new Pen(layer.ShadowColor);
            GraphicsPath shadowPath = complex.GetPath();

            shadowPen.Color = render.AdjustColor(layer.ShadowColor, 0, complex.Opacity);

            //Save the current region
            Region current = graphics.Clip;

            //Mask out each marker
            for (int i = 0; i < complex.Points.Count - 1; i++)
            {
                location  = (PointF)complex.Points[i];
                reference = (PointF)complex.Points[i + 1];

                segment = complex.Segments[i];

                //Mask out the start marker
                if (segment.Start.Marker != null)
                {
                    Region region = new Region(segment.Start.Marker.GetPath());
                    region.Transform(Link.GetMarkerTransform(segment.Start.Marker, location, reference, new Matrix()));
                    region.Translate(layer.ShadowOffset.X, layer.ShadowOffset.Y);
                    graphics.SetClip(region, CombineMode.Exclude);
                }
            }

            //Mask out final marker
            if (segment.End.Marker != null)
            {
                location  = (PointF)complex.Points[complex.Points.Count - 1];
                reference = (PointF)complex.Points[complex.Points.Count - 2];

                Region region = new Region(segment.End.Marker.GetPath());
                region.Transform(Link.GetMarkerTransform(segment.End.Marker, location, reference, new Matrix()));
                region.Translate(layer.ShadowOffset.X, layer.ShadowOffset.Y);
                graphics.SetClip(region, CombineMode.Exclude);
            }

            //Draw the path
            graphics.TranslateTransform(layer.ShadowOffset.X, layer.ShadowOffset.Y);
            graphics.DrawPath(shadowPen, shadowPath);

            //Reset the clip
            graphics.Clip = current;

            //Render the markers
            for (int i = 0; i < complex.Points.Count - 1; i++)
            {
                segment   = complex.Segments[i];
                location  = (PointF)complex.Points[i];
                reference = (PointF)complex.Points[i + 1];

                if (segment.Start.Marker != null)
                {
                    RenderMarkerShadow(segment.Start.Marker, location, reference, graphics, render);
                }
            }

            //Render final marker
            if (segment.End.Marker != null)
            {
                location  = (PointF)complex.Points[complex.Points.Count - 1];
                reference = (PointF)complex.Points[complex.Points.Count - 2];
                RenderMarkerShadow(segment.End.Marker, location, reference, graphics, render);
            }

            graphics.TranslateTransform(-layer.ShadowOffset.X, -layer.ShadowOffset.Y);
        }
        public override void RenderAction(IRenderable element, Graphics graphics, ControlRender render)
        {
            ComplexLine complex = element as ComplexLine;

            if (complex.Points == null)
            {
                return;
            }

            PointF  location;
            PointF  reference;
            Segment segment = null;

            //Save the current region
            Region current = graphics.Clip;

            //Mask out each marker
            for (int i = 0; i < complex.Points.Count - 1; i++)
            {
                location  = (PointF)complex.Points[i];
                reference = (PointF)complex.Points[i + 1];

                segment = complex.Segments[i];

                //Mask out the start marker
                if (segment.Start.Marker != null)
                {
                    Region region = new Region(segment.Start.Marker.GetPath());
                    region.Transform(Link.GetMarkerTransform(segment.Start.Marker, location, reference, new Matrix()));
                    graphics.SetClip(region, CombineMode.Exclude);
                }
            }

            //Mask out final marker
            if (segment.End.Marker != null)
            {
                location  = (PointF)complex.Points[complex.Points.Count - 1];
                reference = (PointF)complex.Points[complex.Points.Count - 2];

                Region region = new Region(segment.End.Marker.GetPath());
                region.Transform(Link.GetMarkerTransform(segment.End.Marker, location, reference, new Matrix()));
                graphics.SetClip(region, CombineMode.Exclude);
            }

            //Draw the path
            GraphicsPath path = complex.GetPath();

            if (path == null)
            {
                return;
            }

            if (render.ActionStyle == ActionStyle.Default)
            {
                Pen pen = new Pen(render.AdjustColor(complex.BorderColor, complex.BorderWidth, complex.Opacity));
                pen.Width = complex.BorderWidth;
                graphics.DrawPath(pen, path);
            }
            else
            {
                graphics.DrawPath(Singleton.Instance.ActionPen, path);
            }

            //Reset the clip
            graphics.Clip = current;

            //Render the markers
            for (int i = 0; i < complex.Points.Count - 1; i++)
            {
                segment   = complex.Segments[i];
                location  = (PointF)complex.Points[i];
                reference = (PointF)complex.Points[i + 1];

                if (segment.Start.Marker != null)
                {
                    RenderMarkerAction(segment.Start.Marker, location, reference, graphics, render);
                }
            }

            //Render final marker
            if (segment.End.Marker != null)
            {
                location  = (PointF)complex.Points[complex.Points.Count - 1];
                reference = (PointF)complex.Points[complex.Points.Count - 2];
                RenderMarkerAction(segment.End.Marker, location, reference, graphics, render);
            }
        }