Index: shape.c =================================================================== --- shape.c (revision 28669) +++ shape.c (revision 28670) @@ -204,6 +204,43 @@ } #undef CORNER +void pcb_shape_roundrect(pcb_pstk_shape_t *shape, pcb_coord_t width, pcb_coord_t height, double roundness) +{ + pcb_pstk_poly_t *dst = &shape->data.poly; + pcb_poly_t *p; + pcb_layer_t *layer; + static pcb_data_t data = {0}; + int inited = 0, n; + pcb_coord_t rr, minor = MIN(width, height); + pcb_shape_corner_t corner[4] = { PCB_CORN_ROUND, PCB_CORN_ROUND, PCB_CORN_ROUND, PCB_CORN_ROUND}; + + + if (!inited) { + pcb_data_init(&data); + data.LayerN = 1; + layer = &data.Layer[0]; + memset(layer, 0, sizeof(pcb_layer_t)); + layer->parent.data = &data; + layer->parent_type = PCB_PARENT_DATA; + inited = 1; + } + else + layer = &data.Layer[0]; + + rr = pcb_round(minor * roundness); + p = pcb_genpoly_roundrect(layer, width, height, rr, rr, 0, 0, 0, corner, 4.0); + pcb_pstk_shape_alloc_poly(dst, p->PointN); + shape->shape = PCB_PSSH_POLY; + + for(n = 0; n < p->PointN; n++) { + dst->x[n] = p->Points[n].X; + dst->y[n] = p->Points[n].Y; + } + pcb_poly_free_fields(p); + free(p); +} + + static pcb_poly_t *any_poly_place(pcb_data_t *data, pcb_layer_t *layer, pcb_poly_t *p) { if (p == NULL) Index: shape.h =================================================================== --- shape.h (revision 28669) +++ shape.h (revision 28670) @@ -45,6 +45,9 @@ pcb_poly_t *pcb_genpoly_roundrect(pcb_layer_t *layer, pcb_coord_t w, pcb_coord_t h, pcb_coord_t rx, pcb_coord_t ry, double rot_deg, pcb_coord_t cx, pcb_coord_t cy, pcb_shape_corner_t corner[4], double roundres); +/* shorthand rounded rectangle: rounding radius is roundness * smaller_size */ +void pcb_shape_roundrect(pcb_pstk_shape_t *shape, pcb_coord_t width, pcb_coord_t height, double roundness); + #endif