private void pictureBoxPreview_Paint(object sender, PaintEventArgs e)
        {
            // Get the graphics, size to 10 mm high.
            const int bitmapScaleFactor = 4;  // Scale bitmap by 4x for better accuracy.
            RectangleF rect = new RectangleF(0, 0, 10F * pictureBoxPreview.ClientSize.Width / pictureBoxPreview.ClientSize.Height, 10F);
            var grTarget = new GDIPlus_BitmapGraphicsTarget(pictureBoxPreview.ClientSize.Width * bitmapScaleFactor, pictureBoxPreview.ClientSize.Height * bitmapScaleFactor,
                false, CmykColor.FromCmyk(0, 0, 0, 0), rect, false, new SwopColorConverter());
            Bitmap bitmap;

            using (grTarget) {
                grTarget.PushAntiAliasing(true);

                // Get sizes and colors and so forth.
                float lineWidth = (float)upDownLineWidth.Value;
                float circleDiameter = (float)upDownControlCircle.Value;    // outside diameter
                float dotDiameter = (float)upDownCenterDot.Value;
                float numberHeight = (float)upDownNumberHeight.Value;     // number height
                float autoLegGapSize = (float)upDownLegGapSize.Value;
                float circleDrawRadius = (circleDiameter - lineWidth) / 2;    // radius to pen center
                float finishDrawRadiusOuter = ((circleDiameter * 7F / NormalCourseAppearance.controlOutsideDiameter) - lineWidth) / 2F;
                float finishDrawRadiusInner = ((circleDiameter * 5.35F / NormalCourseAppearance.controlOutsideDiameter) - 2F * lineWidth) / 2F;

                PointF centerCircle = new PointF(40, 5);

                CmykColor purple = GetCurrentColor();
                object brush = new object(), pen = new object(), lightGreenBrush = new object();

                grTarget.CreateSolidBrush(brush, purple);
                grTarget.CreatePen(pen, purple, lineWidth, LineCap.Round, LineJoin.Round, 5F);
                grTarget.CreateSolidBrush(lightGreenBrush, CmykColor.FromCmyk(0.455F, 0, 0.545F, 0));

                // Draw light green background.
                grTarget.FillEllipse(lightGreenBrush, new PointF(44F, -5), 6F, 25);

                // Draw road
                object roadPen = new object();
                grTarget.CreatePen(roadPen, CmykColor.FromCmyk(0, 0, 0, 1), 0.35F, LineCap.Flat, LineJoin.Round, 5F);
                PointF[] roadPts = { new PointF(28.3F, 8.7F), new PointF(28.7F, 6.7F), new PointF(30.8F, 6.3F), new PointF(33.1F, 5.9F),
                                       new PointF(34.4F, 6.3F), new PointF(36.5F, 5.4F), new PointF(38.9F, 4.3F), new PointF(38.4F, 1.1F), new PointF(37.6F, -0.5F)};
                GraphicsPathPart roadPathStart = new GraphicsPathPart(GraphicsPathPartKind.Start, new PointF[1] { new PointF(27.8F, 10.5F) });
                GraphicsPathPart roadPathPart = new GraphicsPathPart(GraphicsPathPartKind.Beziers, roadPts);
                grTarget.DrawPath(roadPen, new List<GraphicsPathPart> { roadPathStart, roadPathPart });

                // Draw boulder cluster.
                object boulderBrush = new object();
                grTarget.CreateSolidBrush(boulderBrush, CmykColor.FromCmyk(0, 0, 0, 1));
                PointF[] boulderPts = {new PointF(0, -0.4F), new PointF(0.4F, 0.3F), new PointF(-0.4F, 0.3F)};
                Matrix xformBoulder = new Matrix();
                xformBoulder.Translate(18, 5.1F);
                grTarget.PushTransform(xformBoulder);
                grTarget.FillPolygon(boulderBrush, boulderPts, FillMode.Alternate);
                grTarget.PopTransform();

                // Calculate control number position
                bool bold = NormalCourseAppearance.controlNumberFont.Bold;
                bool italic = NormalCourseAppearance.controlNumberFont.Italic;
                if (comboBoxControlNumberStyle.SelectedIndex == 1)
                    bold = true;

                object font = new object();
                grTarget.CreateFont(font, NormalCourseAppearance.controlNumberFont.Name, NormalCourseAppearance.controlNumberHeightFactor * numberHeight, Util.GetTextEffects(bold, italic));

                string controlNumberText = "13";
                PointF controlNumberLocation = new PointF(centerCircle.X + circleDiameter / 2 + NormalCourseAppearance.controlNumberCircleDistance, centerCircle.Y - numberHeight * 0.75F);

                // Draw control number outline.
                if (upDownOutlineWidth.Value > 0) {
                    object whitePen = new object();
                    object whiteBrush = new object();
                    grTarget.CreatePen(whitePen, CmykColor.FromCmyk(0, 0, 0, 0), (float)upDownOutlineWidth.Value * 2, LineCap.Round, LineJoin.Round, 5F);
                    grTarget.CreateSolidBrush(whiteBrush, CmykColor.FromCmyk(0, 0, 0, 0));
                    grTarget.DrawText(controlNumberText, font, whiteBrush, controlNumberLocation);
                    grTarget.DrawTextOutline(controlNumberText, font, whitePen, controlNumberLocation);
                }

                if (checkBoxBlendPurple.Checked)
                    grTarget.PushBlending(BlendMode.Darken);

                // Draw control circle
                grTarget.DrawEllipse(pen, centerCircle, circleDrawRadius, circleDrawRadius);

                // Draw center dot.
                if (dotDiameter > 0.0F) {
                    grTarget.FillEllipse(brush, centerCircle, dotDiameter / 2, dotDiameter / 2);
                }

                // Draw finish
                PointF centerFinish = new PointF(7, 5);
                grTarget.DrawEllipse(pen, centerFinish, finishDrawRadiusInner, finishDrawRadiusInner);
                grTarget.DrawEllipse(pen, centerFinish, finishDrawRadiusOuter, finishDrawRadiusOuter);

                // Draw legs
                double angle = (Math.PI * 1.4);
                grTarget.DrawLine(pen, new PointF((float)(centerCircle.X + Math.Cos(angle) * 15), (float)(centerCircle.Y + Math.Sin(angle) * 15)),
                                        new PointF((float)(centerCircle.X + Math.Cos(angle) * circleDrawRadius), (float)(centerCircle.Y + Math.Sin(angle) * circleDrawRadius)));

                grTarget.DrawLine(pen, new PointF(centerFinish.X + finishDrawRadiusOuter, centerFinish.Y), new PointF(centerCircle.X - circleDrawRadius, centerFinish.Y));

                // Draw crossing leg.
                double crossAngle = (110 * Math.PI / 180.0);
                PointF crossPt = new PointF((centerFinish.X + centerCircle.X) / 2, (centerFinish.Y + centerCircle.Y) / 2);
                PointF start1 = new PointF(crossPt.X + (float)Math.Cos(crossAngle) * 10, crossPt.Y + (float)Math.Sin(crossAngle) * 10);
                PointF end1 = new PointF(crossPt.X + (float)Math.Cos(crossAngle) * (autoLegGapSize / 2), crossPt.Y + (float)Math.Sin(crossAngle) * (autoLegGapSize / 2));
                PointF start2 = new PointF(crossPt.X - (float)Math.Cos(crossAngle) * 10, crossPt.Y - (float)Math.Sin(crossAngle) * 10);
                PointF end2 = new PointF(crossPt.X - (float)Math.Cos(crossAngle) * (autoLegGapSize / 2), crossPt.Y - (float)Math.Sin(crossAngle) * (autoLegGapSize / 2));
                grTarget.DrawLine(pen, start1, end1);
                grTarget.DrawLine(pen, start2, end2);

                // Draw control number.
                grTarget.DrawText(controlNumberText, font, brush, controlNumberLocation);

                if (checkBoxBlendPurple.Checked)
                    grTarget.PopBlending();

                grTarget.PopAntiAliasing();

                bitmap = grTarget.Bitmap;
            }

            e.Graphics.DrawImage(bitmap, pictureBoxPreview.ClientRectangle);
        }
        private void pictureBoxPreview_Paint(object sender, PaintEventArgs e)
        {
            // Get the graphics, size to 10 mm high.
            const int  bitmapScaleFactor = 4; // Scale bitmap by 4x for better accuracy.
            RectangleF rect     = new RectangleF(0, 0, 10F * pictureBoxPreview.ClientSize.Width / pictureBoxPreview.ClientSize.Height, 10F);
            var        grTarget = new GDIPlus_BitmapGraphicsTarget(pictureBoxPreview.ClientSize.Width * bitmapScaleFactor, pictureBoxPreview.ClientSize.Height * bitmapScaleFactor,
                                                                   false, CmykColor.FromCmyk(0, 0, 0, 0), rect, false, new SwopColorConverter());
            Bitmap bitmap;

            using (grTarget) {
                grTarget.PushAntiAliasing(true);

                // Get sizes and colors and so forth.
                float lineWidth        = (float)upDownLineWidth.Value;
                float circleDiameter   = (float)upDownControlCircle.Value; // outside diameter
                float dotDiameter      = (float)upDownCenterDot.Value;
                float numberHeight     = (float)upDownNumberHeight.Value;  // number height
                float autoLegGapSize   = (float)upDownLegGapSize.Value;
                float circleDrawRadius = (circleDiameter - lineWidth) / 2; // radius to pen center

                float finishDrawRadiusOuter, finishDrawRadiusInner;

                if (mapStandard == "2000")
                {
                    finishDrawRadiusOuter = ((circleDiameter * NormalCourseAppearance.finishOutsideDiameter2000 / NormalCourseAppearance.controlOutsideDiameter2000) - lineWidth) / 2F;
                    finishDrawRadiusInner = ((circleDiameter * (NormalCourseAppearance.finishInsideDiameter2000 + NormalCourseAppearance.lineThickness) / NormalCourseAppearance.controlOutsideDiameter2000) - 2F * lineWidth) / 2F;
                }
                else
                {
                    finishDrawRadiusOuter = ((circleDiameter * NormalCourseAppearance.finishOutsideDiameter2017 / NormalCourseAppearance.controlOutsideDiameter2017) - lineWidth) / 2F;
                    finishDrawRadiusInner = ((circleDiameter * (NormalCourseAppearance.finishInsideDiameter2017 + NormalCourseAppearance.lineThickness) / NormalCourseAppearance.controlOutsideDiameter2017) - 2F * lineWidth) / 2F;
                }

                PointF centerCircle = new PointF(40, 5);

                CmykColor purple = GetCurrentColor();
                object    brush = new object(), pen = new object(), lightGreenBrush = new object();

                grTarget.CreateSolidBrush(brush, purple);
                grTarget.CreatePen(pen, purple, lineWidth, LineCap.Round, LineJoin.Round, 5F);
                grTarget.CreateSolidBrush(lightGreenBrush, CmykColor.FromCmyk(0.455F, 0, 0.545F, 0));

                // Draw light green background.
                grTarget.FillEllipse(lightGreenBrush, new PointF(44F, -5), 6F, 25);

                // Draw road
                object roadPen = new object();
                grTarget.CreatePen(roadPen, CmykColor.FromCmyk(0, 0, 0, 1), 0.35F, LineCap.Flat, LineJoin.Round, 5F);
                PointF[]         roadPts = { new PointF(28.3F, 8.7F), new PointF(28.7F, 6.7F), new PointF(30.8F, 6.3F), new PointF(33.1F, 5.9F),
                                             new PointF(34.4F,         6.3F), new PointF(36.5F, 5.4F), new PointF(38.9F, 4.3F), new PointF(38.4F, 1.1F),new PointF(37.6F, -0.5F) };
                GraphicsPathPart roadPathStart = new GraphicsPathPart(GraphicsPathPartKind.Start, new PointF[1] {
                    new PointF(27.8F, 10.5F)
                });
                GraphicsPathPart roadPathPart = new GraphicsPathPart(GraphicsPathPartKind.Beziers, roadPts);
                grTarget.DrawPath(roadPen, new List <GraphicsPathPart> {
                    roadPathStart, roadPathPart
                });

                // Draw boulder cluster.
                object boulderBrush = new object();
                grTarget.CreateSolidBrush(boulderBrush, CmykColor.FromCmyk(0, 0, 0, 1));
                PointF[] boulderPts   = { new PointF(0, -0.4F), new PointF(0.4F, 0.3F), new PointF(-0.4F, 0.3F) };
                Matrix   xformBoulder = new Matrix();
                xformBoulder.Translate(18, 5.1F);
                grTarget.PushTransform(xformBoulder);
                grTarget.FillPolygon(boulderBrush, boulderPts, FillMode.Alternate);
                grTarget.PopTransform();

                // Calculate control number position
                bool bold   = NormalCourseAppearance.controlNumberFont.Bold;
                bool italic = NormalCourseAppearance.controlNumberFont.Italic;
                if (comboBoxControlNumberStyle.SelectedIndex == 1)
                {
                    bold = true;
                }

                object font = new object();
                grTarget.CreateFont(font, NormalCourseAppearance.controlNumberFont.Name, NormalCourseAppearance.controlNumberHeightFactor * numberHeight, Util.GetTextEffects(bold, italic));

                string controlNumberText     = "13";
                PointF controlNumberLocation = new PointF(centerCircle.X + circleDiameter / 2 + NormalCourseAppearance.controlNumberCircleDistance, centerCircle.Y - numberHeight * 0.75F);

                // Draw control number outline.
                if (upDownOutlineWidth.Value > 0)
                {
                    object whitePen   = new object();
                    object whiteBrush = new object();
                    grTarget.CreatePen(whitePen, CmykColor.FromCmyk(0, 0, 0, 0), (float)upDownOutlineWidth.Value * 2, LineCap.Round, LineJoin.Round, 5F);
                    grTarget.CreateSolidBrush(whiteBrush, CmykColor.FromCmyk(0, 0, 0, 0));
                    grTarget.DrawText(controlNumberText, font, whiteBrush, controlNumberLocation);
                    grTarget.DrawTextOutline(controlNumberText, font, whitePen, controlNumberLocation);
                }

                if (checkBoxBlendPurple.Checked)
                {
                    grTarget.PushBlending(BlendMode.Darken);
                }

                // Draw control circle
                grTarget.DrawEllipse(pen, centerCircle, circleDrawRadius, circleDrawRadius);

                // Draw center dot.
                if (dotDiameter > 0.0F)
                {
                    grTarget.FillEllipse(brush, centerCircle, dotDiameter / 2, dotDiameter / 2);
                }

                // Draw finish
                PointF centerFinish = new PointF(7, 5);
                grTarget.DrawEllipse(pen, centerFinish, finishDrawRadiusInner, finishDrawRadiusInner);
                grTarget.DrawEllipse(pen, centerFinish, finishDrawRadiusOuter, finishDrawRadiusOuter);

                // Draw legs
                double angle = (Math.PI * 1.4);
                grTarget.DrawLine(pen, new PointF((float)(centerCircle.X + Math.Cos(angle) * 15), (float)(centerCircle.Y + Math.Sin(angle) * 15)),
                                  new PointF((float)(centerCircle.X + Math.Cos(angle) * circleDrawRadius), (float)(centerCircle.Y + Math.Sin(angle) * circleDrawRadius)));

                grTarget.DrawLine(pen, new PointF(centerFinish.X + finishDrawRadiusOuter, centerFinish.Y), new PointF(centerCircle.X - circleDrawRadius, centerFinish.Y));

                // Draw crossing leg.
                double crossAngle = (110 * Math.PI / 180.0);
                PointF crossPt    = new PointF((centerFinish.X + centerCircle.X) / 2, (centerFinish.Y + centerCircle.Y) / 2);
                PointF start1     = new PointF(crossPt.X + (float)Math.Cos(crossAngle) * 10, crossPt.Y + (float)Math.Sin(crossAngle) * 10);
                PointF end1       = new PointF(crossPt.X + (float)Math.Cos(crossAngle) * (autoLegGapSize / 2), crossPt.Y + (float)Math.Sin(crossAngle) * (autoLegGapSize / 2));
                PointF start2     = new PointF(crossPt.X - (float)Math.Cos(crossAngle) * 10, crossPt.Y - (float)Math.Sin(crossAngle) * 10);
                PointF end2       = new PointF(crossPt.X - (float)Math.Cos(crossAngle) * (autoLegGapSize / 2), crossPt.Y - (float)Math.Sin(crossAngle) * (autoLegGapSize / 2));
                grTarget.DrawLine(pen, start1, end1);
                grTarget.DrawLine(pen, start2, end2);

                // Draw control number.
                grTarget.DrawText(controlNumberText, font, brush, controlNumberLocation);

                if (checkBoxBlendPurple.Checked)
                {
                    grTarget.PopBlending();
                }

                grTarget.PopAntiAliasing();

                bitmap = grTarget.Bitmap;
            }

            e.Graphics.DrawImage(bitmap, pictureBoxPreview.ClientRectangle);
        }