Esempio n. 1
0
        // Create pens and fonts we use.
        void CreateObjects(IGraphicsTarget g)
        {
            CmykColor black = CmykColor.FromCmyk(0, 0, 0, 1);

            blackBrush = new object();
            g.CreateSolidBrush(blackBrush, black);
            thinPen = new object();
            g.CreatePen(thinPen, black, PunchcardAppearance.thinLine, LineCap.Flat, LineJoin.Miter, 5F);
            thickPen = new object();
            g.CreatePen(thickPen, black, PunchcardAppearance.thickLine, LineCap.Flat, LineJoin.Miter, 5F);

            textMetrics = new GDIPlus_TextMetrics();
        }
Esempio n. 2
0
        // Draw the map and course onto a bitmap of the given size. The given rectangle is mapped onto the whole bitmap, then
        // the given clip region is applied.
        public void Draw(Bitmap bitmap, Matrix transform, Region clipRegion = null)
        {
            Debug.Assert(colorModel == ColorModel.CMYK || colorModel == ColorModel.RGB);
            GDIPlus_ColorConverter colorConverter = (colorModel == ColorModel.CMYK) ? new SwopColorConverter() : new GDIPlus_ColorConverter();

            if (bitmap.Height == 0 || bitmap.Width == 0)
            {
                return;
            }

            // Note that courses always drawn full intensity.
            using (var grTargetDimmed = new GDIPlus_BitmapGraphicsTarget(bitmap, CmykColor.FromCmyk(0, 0, 0, 0), transform, colorConverter, mapIntensity))
                using (var grTargetUndimmed = new GDIPlus_BitmapGraphicsTarget(bitmap, null, transform, colorConverter)) {
                    float      minResolution = GetMinResolution(transform);
                    RectangleF clipBounds    = grTargetDimmed.Graphics.ClipBounds;
                    DrawHelper(grTargetDimmed, grTargetUndimmed, grTargetUndimmed, clipBounds, minResolution);
                }
        }
        public LinePropertiesDialog(string dialogTitle, string usageText, string helpTopic, CmykColor purpleColor, CourseAppearance appearance)
        {
            InitializeComponent();
            this.appearance = appearance;

            if (!appearance.useDefaultPurple)
            {
                purpleColor = CmykColor.FromCmyk(appearance.purpleC, appearance.purpleM, appearance.purpleY, appearance.purpleK);
            }

            this.purpleColor           = SwopColorConverter.CmykToRgbColor(purpleColor);
            colorChooser               = new SpecialColorChooser(comboBoxColor, buttonChangeColor, purpleColor);
            colorChooser.ColorChanged += colorChooser_ColorChanged;
            LineKind        = PurplePen.LineKind.Single;
            this.Text       = dialogTitle;
            this.HelpTopic  = helpTopic;
            usageLabel.Text = usageText;
        }
Esempio n. 4
0
        public void RoundTripSpecials()
        {
            UndoMgr undomgr = new UndoMgr(5);
            EventDB eventDB = new EventDB(undomgr);

            Special sp1, sp2, sp3, sp4, sp5, sp6, sp7, sp8, sp9, sp10, sp11, sp12, sp13, sp14;

            undomgr.BeginCommand(88, "Command1");

            sp1 = new Special(SpecialKind.FirstAid, new PointF[1] {
                new PointF(4.5F, 1.2F)
            });
            sp2 = new Special(SpecialKind.OptCrossing, new PointF[1] {
                new PointF(-4.2F, 1.7F)
            });
            sp2.allCourses  = false;
            sp2.courses     = new CourseDesignator[] { Designator(1), Designator(2), Designator(3), CourseDesignator.AllControls };
            sp2.orientation = 45F;
            sp3             = new Special(SpecialKind.Boundary, new PointF[2] {
                new PointF(8, 7), new PointF(1, 2)
            });
            sp4 = new Special(SpecialKind.OOB, new PointF[4] {
                new PointF(3, 7), new PointF(11, 2), new PointF(0, -1), new PointF(-12, -3)
            });
            sp5 = new Special(SpecialKind.Text, new PointF[2] {
                new PointF(3, 7), new PointF(11, 4)
            });
            sp5.text       = "Hello";
            sp5.fontName   = "Tahoma";
            sp5.fontBold   = true;
            sp5.fontItalic = false;
            sp5.fontHeight = 6.5F;
            sp5.allCourses = false;
            sp5.color      = new SpecialColor(0.2F, 0.5F, 0.3F, 0F);
            sp5.courses    = new CourseDesignator[2] {
                Designator(2), new CourseDesignator(CourseId(3), 1)
            };
            sp6 = new Special(SpecialKind.Descriptions, new PointF[2] {
                new PointF(5, 6), new PointF(11, 6)
            });
            sp6.numColumns = 2;
            sp7            = new Special(SpecialKind.Text, new PointF[2] {
                new PointF(8, 7), new PointF(18, 5)
            });
            sp7.fontName   = "Courier New";
            sp7.fontBold   = false;
            sp7.fontItalic = true;
            sp7.text       = "$(CourseName)";
            sp7.color      = SpecialColor.Purple;
            sp8            = new Special(SpecialKind.WhiteOut, new PointF[4] {
                new PointF(13, 17), new PointF(21, 12), new PointF(10, -1), new PointF(-2, 7)
            });
            sp9 = new Special(SpecialKind.Image, new PointF[2] {
                new PointF(18, 17), new PointF(28, 15)
            });
            sp9.imageBitmap = (Bitmap)Image.FromFile(TestUtil.GetTestFile("eventDB\\testimage.jpg"));
            sp9.text        = "testimage.jpg";
            sp10            = new Special(SpecialKind.Line, new PointF[3] {
                new PointF(8, 7), new PointF(1, 2), new PointF(5, 12)
            });
            sp10.color     = SpecialColor.Black;
            sp10.lineKind  = LineKind.Single;
            sp10.lineWidth = 0.1F;
            sp11           = new Special(SpecialKind.Line, new PointF[3] {
                new PointF(8, 7), new PointF(1, 2), new PointF(5, 12)
            });
            sp11.color     = new SpecialColor(1F, 0.66F, 0.45F, 0.83F);
            sp11.lineKind  = LineKind.Double;
            sp11.lineWidth = 0.1F;
            sp11.gapSize   = 0.15F;
            sp12           = new Special(SpecialKind.Line, new PointF[2] {
                new PointF(8, 7), new PointF(1, 2)
            });
            sp12.color     = SpecialColor.Purple;
            sp12.lineKind  = LineKind.Dashed;
            sp12.lineWidth = 0.1F;
            sp12.gapSize   = 0.15F;
            sp12.dashSize  = 0.44F;
            sp13           = new Special(SpecialKind.Rectangle, new PointF[2] {
                new PointF(8, 7), new PointF(1, 2)
            });
            sp13.color        = SpecialColor.Purple;
            sp13.lineKind     = LineKind.Single;
            sp13.lineWidth    = 0.1F;
            sp13.cornerRadius = 0.23F;
            sp14 = new Special(SpecialKind.Ellipse, new PointF[2] {
                new PointF(5, 6), new PointF(1, 3)
            });
            sp14.color     = new SpecialColor(CmykColor.FromCmyk(0.8F, 0.3F, 0.2F, 0.1F));
            sp14.lineKind  = LineKind.Double;
            sp14.lineWidth = 0.25F;

            eventDB.AddSpecial(sp1);
            eventDB.AddSpecial(sp2);
            eventDB.AddSpecial(sp3);
            eventDB.AddSpecial(sp4);
            eventDB.AddSpecial(sp5);
            eventDB.AddSpecial(sp6);
            eventDB.AddSpecial(sp7);
            eventDB.AddSpecial(sp8);
            eventDB.AddSpecial(sp9);
            eventDB.AddSpecial(sp10);
            eventDB.AddSpecial(sp11);
            eventDB.AddSpecial(sp12);
            eventDB.AddSpecial(sp13);
            eventDB.AddSpecial(sp14);

            undomgr.EndCommand(88);

            eventDB.Save(TestUtil.GetTestFile("eventDB\\testoutput_temp.xml"));

            undomgr.Clear();
            eventDB = new EventDB(undomgr);

            eventDB.Load(TestUtil.GetTestFile("eventdb\\testoutput_temp.xml"));

            // The loaded image won't compare equal. Check the image is the same, then force equal.
            Special loadedSp9 = eventDB.GetSpecial(SpecialId(9));

            Assert.IsNotNull(loadedSp9.imageBitmap);
            Assert.AreEqual(loadedSp9.imageBitmap.Width, sp9.imageBitmap.Width);
            Assert.AreEqual(loadedSp9.imageBitmap.Height, sp9.imageBitmap.Height);
            Assert.AreEqual(loadedSp9.imageBitmap.RawFormat, sp9.imageBitmap.RawFormat);
            loadedSp9.imageBitmap = sp9.imageBitmap;

            TestUtil.TestEnumerableAnyOrder(eventDB.AllSpecialPairs,
                                            new KeyValuePair <Id <Special>, Special>[] {
                new KeyValuePair <Id <Special>, Special>(SpecialId(1), sp1),
                new KeyValuePair <Id <Special>, Special>(SpecialId(2), sp2),
                new KeyValuePair <Id <Special>, Special>(SpecialId(3), sp3),
                new KeyValuePair <Id <Special>, Special>(SpecialId(4), sp4),
                new KeyValuePair <Id <Special>, Special>(SpecialId(5), sp5),
                new KeyValuePair <Id <Special>, Special>(SpecialId(6), sp6),
                new KeyValuePair <Id <Special>, Special>(SpecialId(7), sp7),
                new KeyValuePair <Id <Special>, Special>(SpecialId(8), sp8),
                new KeyValuePair <Id <Special>, Special>(SpecialId(9), sp9),
                new KeyValuePair <Id <Special>, Special>(SpecialId(10), sp10),
                new KeyValuePair <Id <Special>, Special>(SpecialId(11), sp11),
                new KeyValuePair <Id <Special>, Special>(SpecialId(12), sp12),
                new KeyValuePair <Id <Special>, Special>(SpecialId(13), sp13),
                new KeyValuePair <Id <Special>, Special>(SpecialId(14), sp14),
            }
                                            );
        }
        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);
        }
        // Get a color value from the CMYK boxes
        CmykColor GetCurrentColor()
        {
            CmykColor cmykColor = CmykColor.FromCmyk((float)upDownCyan.Value / 100F, (float)upDownMagenta.Value / 100F, (float)upDownYellow.Value / 100F, (float)upDownBlack.Value / 100F);

            return(cmykColor);
        }