Index: test.c =================================================================== --- test.c (revision 8172) +++ test.c (revision 8173) @@ -1,6 +1,8 @@ +#include #include #include #include +#include #include "unit.h" #include "pcb_bool.h" #include "rtree.h" @@ -7,6 +9,8 @@ #include "polyarea.h" #include "polygon.h" +extern void pcb_poly_insert_holes(jmp_buf * e1, pcb_polyarea_t * dest, pcb_pline_t ** src); + pcb_polyarea_t *pcb_poly_from_contour(pcb_pline_t * contour) { pcb_polyarea_t *p; @@ -64,6 +68,27 @@ printf("!!!animator end\n"); } +static void pline_update_bbox(pcb_pline_t *pl) +{ + pcb_vnode_t *n; + + n = &pl->head; + pl->xmin = pl->xmax = n->point[0]; + pl->ymin = pl->ymax = n->point[1]; + + for (n = n->next; n != &pl->head; n = n->next) { + pcb_coord_t x = n->point[0], y = n->point[1]; + if (x < pl->xmin) + pl->xmin = x; + if (y < pl->ymin) + pl->ymin = y; + if (x > pl->xmax) + pl->xmax = x; + if (y > pl->ymax) + pl->ymax = y; + } +} + pcb_polyarea_t *ply_parse(const char *vect) { pcb_pline_t *contour = NULL; @@ -70,21 +95,54 @@ long int x, y; int len; pcb_vector_t v; + pcb_polyarea_t *pa = NULL; + pcb_pline_t *holes[2] = { NULL, NULL }; if (sscanf(vect, "%ld %ld%n", &x, &y, &len) != 2) return NULL; + +fprintf(stderr, "Outer:\n"); +fprintf(stderr, " %ld %ld!\n", x, y); + vect += len; v[0] = x; v[1] = y; if ((contour = pcb_poly_contour_new(v)) == NULL) return NULL; - while(sscanf(vect, "%ld %ld%n", &x, &y, &len) == 2) { + + for(;;) { + while(isspace(*vect)) vect++; + if (*vect == 'h') { + +fprintf(stderr, "HOLE!\n"); + if (pa == NULL) + pa = pcb_poly_from_contour(contour); + else { + pline_update_bbox(holes[0]); + pcb_poly_insert_holes(NULL, pa, holes); + } + + holes[0] = (pcb_pline_t *) calloc(1, sizeof(pcb_pline_t)); + pcb_poly_contour_init(holes[0]); + contour = holes[0]; + vect++; + } + if (sscanf(vect, "%ld %ld%n", &x, &y, &len) != 2) + break; + +fprintf(stderr, " %ld %ld!\n", x, y); vect += len; v[0] = x; v[1] = y; pcb_poly_vertex_include(contour->head.prev, pcb_poly_node_create(v)); } - return pcb_poly_from_contour(contour); + if (pa == NULL) + pa = pcb_poly_from_contour(contour); + else { + pline_update_bbox(holes[0]); + pcb_poly_insert_holes(NULL, pa, holes); + } + return pa; } int main()