/* --------------------------------------------------------------------------- * removes a polygon-point from a polygon */ static void * RemovePolygonPoint (LayerTypePtr Layer, PolygonTypePtr Polygon, PointTypePtr Point) { Cardinal point_idx; Cardinal i; Cardinal contour; Cardinal contour_start, contour_end, contour_points; point_idx = polygon_point_idx (Polygon, Point); contour = polygon_point_contour (Polygon, point_idx); contour_start = (contour == 0) ? 0 : Polygon->HoleIndex[contour - 1]; contour_end = (contour == Polygon->HoleIndexN) ? Polygon->PointN : Polygon->HoleIndex[contour]; contour_points = contour_end - contour_start; if (contour_points <= 3) return RemovePolygonContour (Layer, Polygon, contour); if (Layer->On) ErasePolygon (Polygon); /* insert the polygon-point into the undo list */ AddObjectToRemovePointUndoList (POLYGONPOINT_TYPE, Layer, Polygon, point_idx); r_delete_entry (Layer->polygon_tree, (BoxType *) Polygon); /* remove point from list, keep point order */ for (i = point_idx; i < Polygon->PointN - 1; i++) Polygon->Points[i] = Polygon->Points[i + 1]; Polygon->PointN--; /* Shift down indices of any holes */ for (i = 0; i < Polygon->HoleIndexN; i++) if (Polygon->HoleIndex[i] > point_idx) Polygon->HoleIndex[i]--; SetPolygonBoundingBox (Polygon); r_insert_entry (Layer->polygon_tree, (BoxType *) Polygon, 0); RemoveExcessPolygonPoints (Layer, Polygon); InitClip (PCB->Data, Layer, Polygon); /* redraw polygon if necessary */ if (Layer->On) { DrawPolygon (Layer, Polygon); if (!Bulk) Draw (); } return NULL; }
/* --------------------------------------------------------------------------- * inserts a point into a polygon */ static void * InsertPointIntoPolygon (LayerTypePtr Layer, PolygonTypePtr Polygon) { PointType save; Cardinal n; LineType line; if (!Forcible) { /* * first make sure adding the point is sensible */ line.Thickness = 0; line.Point1 = Polygon->Points[prev_contour_point (Polygon, InsertAt)]; line.Point2 = Polygon->Points[InsertAt]; if (IsPointOnLine ((float) InsertX, (float) InsertY, 0.0, &line)) return (NULL); } /* * second, shift the points up to make room for the new point */ ErasePolygon (Polygon); r_delete_entry (Layer->polygon_tree, (BoxTypePtr) Polygon); save = *CreateNewPointInPolygon (Polygon, InsertX, InsertY); for (n = Polygon->PointN - 1; n > InsertAt; n--) Polygon->Points[n] = Polygon->Points[n - 1]; /* Shift up indices of any holes */ for (n = 0; n < Polygon->HoleIndexN; n++) if (Polygon->HoleIndex[n] > InsertAt || (InsertLast && Polygon->HoleIndex[n] == InsertAt)) Polygon->HoleIndex[n]++; Polygon->Points[InsertAt] = save; SetChangedFlag (true); AddObjectToInsertPointUndoList (POLYGONPOINT_TYPE, Layer, Polygon, &Polygon->Points[InsertAt]); SetPolygonBoundingBox (Polygon); r_insert_entry (Layer->polygon_tree, (BoxType *) Polygon, 0); InitClip (PCB->Data, Layer, Polygon); if (Forcible || !RemoveExcessPolygonPoints (Layer, Polygon)) { DrawPolygon (Layer, Polygon, 0); Draw (); } return (&Polygon->Points[InsertAt]); }
/* --------------------------------------------------------------------------- * moves a polygon-point */ static void * MovePolygonPoint (LayerTypePtr Layer, PolygonTypePtr Polygon, PointTypePtr Point) { if (Layer->On) { ErasePolygon (Polygon); } r_delete_entry (Layer->polygon_tree, (BoxType *)Polygon); MOVE (Point->X, Point->Y, DeltaX, DeltaY); SetPolygonBoundingBox (Polygon); r_insert_entry (Layer->polygon_tree, (BoxType *)Polygon, 0); RemoveExcessPolygonPoints (Layer, Polygon); InitClip (PCB->Data, Layer, Polygon); if (Layer->On) { DrawPolygon (Layer, Polygon); Draw (); } return (Point); }