Index: trunk/src/font.c =================================================================== --- trunk/src/font.c (revision 7660) +++ trunk/src/font.c (revision 7661) @@ -200,7 +200,20 @@ return p; } +pcb_arc_t *pcb_font_new_arc_in_sym(pcb_symbol_t *Symbol, pcb_coord_t cx, pcb_coord_t cy, pcb_coord_t r, pcb_angle_t start, pcb_angle_t delta, pcb_coord_t thickness) +{ + pcb_arc_t *a = calloc(sizeof(pcb_arc_t), 1); + a->X = cx; + a->Y = cy; + a->Height = a->Width = r; + a->StartAngle = start; + a->Delta = delta; + a->Thickness = thickness; + arclist_insert(&Symbol->arcs, a); + return a; +} + static pcb_font_t *pcb_font_(pcb_board_t *pcb, pcb_font_id_t id, int fallback, int unlink) { if (id <= 0) Index: trunk/src/font.h =================================================================== --- trunk/src/font.h (revision 7660) +++ trunk/src/font.h (revision 7661) @@ -32,6 +32,8 @@ #include "global_typedefs.h" #include "obj_poly.h" #include "obj_poly_list.h" +#include "obj_arc.h" +#include "obj_arc_list.h" #include "box.h" /* --------------------------------------------------------------------------- @@ -44,6 +46,7 @@ pcb_cardinal_t LineMax; /* lines allocated */ pcb_coord_t Width, Height, Delta; /* size of cell, distance to next symbol */ polylist_t polys; /* simple (non-clipped) polygons */ + arclist_t arcs; } pcb_symbol_t; typedef long int pcb_font_id_t; /* a font is referenced by a pcb_board_t:pcb_font_id_t pair */ @@ -71,6 +74,7 @@ void pcb_font_set_info(pcb_font_t *Ptr); pcb_line_t *pcb_font_new_line_in_sym(pcb_symbol_t *Symbol, pcb_coord_t X1, pcb_coord_t Y1, pcb_coord_t X2, pcb_coord_t Y2, pcb_coord_t Thickness); +pcb_arc_t *pcb_font_new_arc_in_sym(pcb_symbol_t *Symbol, pcb_coord_t cx, pcb_coord_t cy, pcb_coord_t r, pcb_angle_t start, pcb_angle_t delta, pcb_coord_t thickness); pcb_polygon_t *pcb_font_new_poly_in_sym(pcb_symbol_t *Symbol, int num_points); Index: trunk/src/obj_arc.h =================================================================== --- trunk/src/obj_arc.h (revision 7660) +++ trunk/src/obj_arc.h (revision 7661) @@ -37,7 +37,7 @@ pcb_coord_t Width, Height, /* length of axis */ X, Y; /* center coordinates */ pcb_angle_t StartAngle, Delta; /* the two limiting angles in degrees */ - gdl_elem_t link; /* an arc is in a list: either on a layer or in an element */ + gdl_elem_t link; /* an arc is in a list: either on a layer or in an element or in a font */ }; /*** Memory ***/ Index: trunk/src/obj_text.c =================================================================== --- trunk/src/obj_text.c (revision 7660) +++ trunk/src/obj_text.c (revision 7661) @@ -142,6 +142,7 @@ for (; s && *s; s++) { if (*s <= PCB_MAX_FONTPOSITION && symbol[*s].Valid) { pcb_line_t *line = symbol[*s].Line; + pcb_arc_t *arc; for (i = 0; i < symbol[*s].LineN; line++, i++) { /* Clamp the width of text lines at the minimum thickness. * NB: Divide 4 in thickness calculation is comprised of a factor @@ -167,6 +168,12 @@ maxy = MAX(maxy, line->Point2.Y + unscaled_radius); } + for(arc = arclist_first(&symbol[*s].arcs); arc != NULL; arc = arclist_next(arc)) { + pcb_arc_bbox(arc); + maxx = MAX(maxx, arc->BoundingBox.X2); + maxy = MAX(maxy, arc->BoundingBox.X2); + } + for(poly = polylist_first(&symbol[*s].polys); poly != NULL; poly = polylist_next(poly)) { int n; pcb_point_t *pnt; @@ -531,6 +538,8 @@ x[n] = PCB_SCALE_TEXT(p->X + x0, Text->Scale); y[n] = PCB_SCALE_TEXT(p->Y, Text->Scale); PCB_COORD_ROTATE90(x[n], y[n], 0, 0, Text->Direction); +#warning TODO: backside transformation! + x[n] += Text->X; y[n] += Text->Y; } @@ -555,6 +564,7 @@ pcb_line_t *line = font->Symbol[*string].Line; pcb_line_t newline; pcb_polygon_t *p; + pcb_arc_t *a, newarc; for (n = font->Symbol[*string].LineN; n; n--, line++) { /* create one line, scale, move, rotate and swap it */ @@ -586,6 +596,27 @@ _draw_line(&newline); } + /* draw the arcs */ + for(a = arclist_first(&font->Symbol[*string].arcs); a != NULL; a = arclist_next(a)) { + newarc = *a; + + newarc.X = PCB_SCALE_TEXT(newarc.X + x, Text->Scale); + newarc.Y = PCB_SCALE_TEXT(newarc.Y, Text->Scale); + if (newarc.Thickness < min_line_width) + newarc.Thickness = min_line_width; + pcb_arc_rotate90(&newarc, 0, 0, Text->Direction); + + if (PCB_FLAG_TEST(PCB_FLAG_ONSOLDER, Text)) { + newarc.X = PCB_SWAP_SIGN_X(newarc.X); + newarc.Y = PCB_SWAP_SIGN_Y(newarc.Y); + newarc.StartAngle = PCB_SWAP_ANGLE(newarc.StartAngle); + newarc.Delta = PCB_SWAP_DELTA(newarc.Delta); + } + newarc.X += Text->X; + newarc.Y += Text->Y; + _draw_arc(&newarc); + } + /* draw the polygons */ for(p = polylist_first(&font->Symbol[*string].polys); p != NULL; p = polylist_next(p)) draw_text_poly(Text, p, x);