// 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(); }
// 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; }
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); }