Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 5208) +++ trunk/src/obj_poly.c (revision 5209) @@ -235,7 +235,42 @@ return (Dest); } +static double poly_area(pcb_point_t *points, pcb_cardinal_t n_points) +{ + double area = 0; + int n; + for(n = 1; n < n_points; n++) + area += (double)(points[n-1].X - points[n].X) * (double)(points[n-1].Y + points[n].Y); + area +=(double)(points[n_points-1].X - points[0].X) * (double)(points[n_points-1].Y + points[0].Y); + + if (area > 0) + area /= 2.0; + else + area /= -2.0; + + return area; +} + +double pcb_poly_area(const pcb_polygon_t *poly) +{ + double area; + + if (poly->HoleIndexN > 0) { + int h; + area = poly_area(poly->Points, poly->HoleIndex[0]); + for(h = 0; h < poly->HoleIndexN - 1; h++) + area -= poly_area(poly->Points + poly->HoleIndex[h], poly->HoleIndex[h+1] - poly->HoleIndex[h]); + area -= poly_area(poly->Points + poly->HoleIndex[h], poly->PointN - poly->HoleIndex[h]); + } + else + area = poly_area(poly->Points, poly->PointN); + + return area; +} + + + /*** ops ***/ /* copies a polygon to buffer */ void *AddPolygonToBuffer(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_polygon_t *Polygon) Index: trunk/src/obj_poly.h =================================================================== --- trunk/src/obj_poly.h (revision 5208) +++ trunk/src/obj_poly.h (revision 5209) @@ -70,6 +70,8 @@ /* Add objects without creating them or making any "sanity modifications" to them */ void pcb_add_polygon_on_layer(pcb_layer_t *Layer, pcb_polygon_t *polygon); +double pcb_poly_area(const pcb_polygon_t *poly); + #define PCB_POLY_LOOP(layer) do { \ pcb_polygon_t *polygon; \ gdl_iterator_t __it__; \