Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 19388) +++ trunk/src/draw.c (revision 19389) @@ -1070,7 +1070,7 @@ if (pcb_gui->gui) pcb_draw_doing_pinout++; - pcb_text_draw_string(font, label, x, y, scale, direction, mirror, 1, 0, 0, 0, PCB_TXT_TINY_HIDE); + pcb_text_draw_string(NULL, font, label, x, y, scale, direction, mirror, 1, 0, 0, 0, PCB_TXT_TINY_HIDE); if (pcb_gui->gui) pcb_draw_doing_pinout--; } Index: trunk/src/obj_text.c =================================================================== --- trunk/src/obj_text.c (revision 19388) +++ trunk/src/obj_text.c (revision 19389) @@ -917,11 +917,10 @@ return 0; } -static void pcb_text_draw_string_(pcb_font_t *font, const unsigned char *string, pcb_coord_t x0, pcb_coord_t y0, int scale, int direction, int mirror, pcb_coord_t min_line_width, int xordraw, pcb_coord_t xordx, pcb_coord_t xordy, pcb_text_tiny_t tiny) +static void pcb_text_draw_string_(pcb_draw_info_t *info, pcb_font_t *font, const unsigned char *string, pcb_coord_t x0, pcb_coord_t y0, int scale, int direction, int mirror, pcb_coord_t min_line_width, int xordraw, pcb_coord_t xordx, pcb_coord_t xordy, pcb_text_tiny_t tiny) { pcb_coord_t x = 0; pcb_cardinal_t n; - pcb_draw_info_t *info = NULL; /* cheap draw */ if (tiny != PCB_TXT_TINY_ACCURATE) { @@ -1033,16 +1032,16 @@ } } -void pcb_text_draw_string(pcb_font_t *font, const unsigned char *string, pcb_coord_t x0, pcb_coord_t y0, int scale, int direction, int mirror, pcb_coord_t min_line_width, int xordraw, pcb_coord_t xordx, pcb_coord_t xordy, pcb_text_tiny_t tiny) +void pcb_text_draw_string(pcb_draw_info_t *info, pcb_font_t *font, const unsigned char *string, pcb_coord_t x0, pcb_coord_t y0, int scale, int direction, int mirror, pcb_coord_t min_line_width, int xordraw, pcb_coord_t xordx, pcb_coord_t xordy, pcb_text_tiny_t tiny) { - pcb_text_draw_string_(font, string, x0, y0, scale, direction, mirror, min_line_width, xordraw, xordx, xordy, tiny); + pcb_text_draw_string_(info, font, string, x0, y0, scale, direction, mirror, min_line_width, xordraw, xordx, xordy, tiny); } /* lowlevel drawing routine for text objects */ -static void DrawTextLowLevel_(pcb_text_t *Text, pcb_coord_t min_line_width, int xordraw, pcb_coord_t xordx, pcb_coord_t xordy, pcb_text_tiny_t tiny) +static void DrawTextLowLevel_(pcb_draw_info_t *info, pcb_text_t *Text, pcb_coord_t min_line_width, int xordraw, pcb_coord_t xordx, pcb_coord_t xordy, pcb_text_tiny_t tiny) { unsigned char *rendered = pcb_text_render_str(Text); - pcb_text_draw_string_(pcb_font(PCB, Text->fid, 1), rendered, Text->X, Text->Y, Text->Scale, Text->Direction, PCB_FLAG_TEST(PCB_FLAG_ONSOLDER, Text), min_line_width, xordraw, xordx, xordy, tiny); + pcb_text_draw_string_(info, pcb_font(PCB, Text->fid, 1), rendered, Text->X, Text->Y, Text->Scale, Text->Direction, PCB_FLAG_TEST(PCB_FLAG_ONSOLDER, Text), min_line_width, xordraw, xordx, xordy, tiny); pcb_text_free_str(Text, rendered); } @@ -1077,7 +1076,7 @@ } -void pcb_text_draw_(pcb_text_t *text, pcb_coord_t min_line_width, int allow_term_gfx, pcb_text_tiny_t tiny) +void pcb_text_draw_(pcb_draw_info_t *info, pcb_text_t *text, pcb_coord_t min_line_width, int allow_term_gfx, pcb_text_tiny_t tiny) { if (delayed_terms_enabled && (text->term != NULL)) { pcb_draw_delay_obj_add((pcb_any_obj_t *)text); @@ -1084,7 +1083,7 @@ return; } - DrawTextLowLevel_(text, min_line_width, 0, 0, 0, tiny); + DrawTextLowLevel_(info, text, min_line_width, 0, 0, 0, tiny); if (text->term != NULL) { if ((allow_term_gfx) && ((pcb_draw_doing_pinout) || PCB_FLAG_TEST(PCB_FLAG_TERMNAME, text))) @@ -1092,7 +1091,7 @@ } } -static void pcb_text_draw(pcb_text_t *text, int allow_term_gfx) +static void pcb_text_draw(pcb_draw_info_t *info, pcb_text_t *text, int allow_term_gfx) { int min_silk_line; unsigned int flg = 0; @@ -1126,12 +1125,13 @@ else min_silk_line = conf_core.design.min_wid; - pcb_text_draw_(text, min_silk_line, allow_term_gfx, PCB_TXT_TINY_CHEAP); + pcb_text_draw_(info, text, min_silk_line, allow_term_gfx, PCB_TXT_TINY_CHEAP); } pcb_r_dir_t pcb_text_draw_callback(const pcb_box_t * b, void *cl) { pcb_text_t *text = (pcb_text_t *) b; + pcb_draw_info_t *info = cl; if (pcb_hidden_floater((pcb_any_obj_t*)b)) return PCB_R_DIR_FOUND_CONTINUE; @@ -1139,7 +1139,7 @@ if (!PCB->SubcPartsOn && pcb_lobj_parent_subc(text->parent_type, &text->parent)) return PCB_R_DIR_FOUND_CONTINUE; - pcb_text_draw(text, 0); + pcb_text_draw(info, text, 0); return PCB_R_DIR_FOUND_CONTINUE; } @@ -1146,6 +1146,7 @@ pcb_r_dir_t pcb_text_draw_term_callback(const pcb_box_t * b, void *cl) { pcb_text_t *text = (pcb_text_t *) b; + pcb_draw_info_t *info = cl; if (pcb_hidden_floater((pcb_any_obj_t*)b)) return PCB_R_DIR_FOUND_CONTINUE; @@ -1153,7 +1154,7 @@ if (!PCB->SubcPartsOn && pcb_lobj_parent_subc(text->parent_type, &text->parent)) return PCB_R_DIR_FOUND_CONTINUE; - pcb_text_draw(text, 1); + pcb_text_draw(info, text, 1); return PCB_R_DIR_FOUND_CONTINUE; } @@ -1170,7 +1171,7 @@ void pcb_text_draw_xor(pcb_text_t *text, pcb_coord_t x, pcb_coord_t y) { - DrawTextLowLevel_(text, 0, 1, x, y, PCB_TXT_TINY_CHEAP); + DrawTextLowLevel_(NULL, text, 0, 1, x, y, PCB_TXT_TINY_CHEAP); if (conf_core.appearance.text_host_bbox) { pcb_gui->draw_line(pcb_crosshair.GC, x + text->BoundingBox.X1, y + text->BoundingBox.Y1, x + text->BoundingBox.X1, y + text->BoundingBox.Y2); pcb_gui->draw_line(pcb_crosshair.GC, x + text->BoundingBox.X1, y + text->BoundingBox.Y1, x + text->BoundingBox.X2, y + text->BoundingBox.Y1); Index: trunk/src/obj_text_draw.h =================================================================== --- trunk/src/obj_text_draw.h (revision 19388) +++ trunk/src/obj_text_draw.h (revision 19389) @@ -28,6 +28,7 @@ /*** Standard draw of text ***/ +#include "draw.h" /* Include rtree.h for these */ #ifdef PCB_RTREE_H @@ -41,7 +42,7 @@ PCB_TXT_TINY_ACCURATE /* always draw text accurately, even if it will end up unreadable */ } pcb_text_tiny_t; -void pcb_text_draw_(pcb_text_t *Text, pcb_coord_t min_line_width, int allow_term_gfx, pcb_text_tiny_t tiny); +void pcb_text_draw_(pcb_draw_info_t *info, pcb_text_t *Text, pcb_coord_t min_line_width, int allow_term_gfx, pcb_text_tiny_t tiny); void pcb_text_invalidate_erase(pcb_layer_t *Layer, pcb_text_t *Text); void pcb_text_invalidate_draw(pcb_layer_t *Layer, pcb_text_t *Text); void pcb_text_draw_xor(pcb_text_t *text, pcb_coord_t x, pcb_coord_t y); @@ -49,7 +50,7 @@ void pcb_text_draw_label(pcb_text_t *text); /* lowlevel drawing routine for text strings */ -void pcb_text_draw_string(pcb_font_t *font, const unsigned char *string, pcb_coord_t x0, pcb_coord_t y0, int scale, int direction, int mirror, pcb_coord_t min_line_width, int xordraw, pcb_coord_t xordx, pcb_coord_t xordy, pcb_text_tiny_t tiny); +void pcb_text_draw_string(pcb_draw_info_t *info, pcb_font_t *font, const unsigned char *string, pcb_coord_t x0, pcb_coord_t y0, int scale, int direction, int mirror, pcb_coord_t min_line_width, int xordraw, pcb_coord_t xordx, pcb_coord_t xordy, pcb_text_tiny_t tiny); /* lowlevel text bounding box calculation */ pcb_coord_t pcb_text_width(pcb_font_t *font, int scale, const unsigned char *string); Index: trunk/src/stub_draw.c =================================================================== --- trunk/src/stub_draw.c (revision 19388) +++ trunk/src/stub_draw.c (revision 19389) @@ -44,7 +44,7 @@ t.fid = 0; /* use the default font */ t.Scale = 150; t.Flags = pcb_no_flags(); - pcb_text_draw_(&t, 0, 0, PCB_TXT_TINY_ACCURATE); + pcb_text_draw_(NULL, &t, 0, 0, PCB_TXT_TINY_ACCURATE); } static pcb_bool dummy_mouse(void *widget, pcb_hid_mouse_ev_t kind, pcb_coord_t x, pcb_coord_t y) Index: trunk/src_plugins/draw_csect/draw_csect.c =================================================================== --- trunk/src_plugins/draw_csect/draw_csect.c (revision 19388) +++ trunk/src_plugins/draw_csect/draw_csect.c (revision 19389) @@ -71,7 +71,7 @@ t.Scale = scale; t.fid = 0; /* use the default font */ t.Flags = pcb_no_flags(); - pcb_text_draw_(&t, 0, 0, PCB_TXT_TINY_ACCURATE); + pcb_text_draw_(NULL, &t, 0, 0, PCB_TXT_TINY_ACCURATE); return &t; } @@ -87,7 +87,7 @@ t.Scale = scale; t.fid = 0; /* use the default font */ t.Flags = pcb_no_flags(); - pcb_text_draw_(&t, th, 0, PCB_TXT_TINY_ACCURATE); + pcb_text_draw_(NULL, &t, th, 0, PCB_TXT_TINY_ACCURATE); return &t; } @@ -106,11 +106,11 @@ if (pcb_gui->gui) { /* it is unreadable on black&white and on most exporters */ pcb_gui->set_color(gc, bgcolor); - pcb_text_draw_(&t, 1000000, 0, PCB_TXT_TINY_ACCURATE); + pcb_text_draw_(NULL, &t, 1000000, 0, PCB_TXT_TINY_ACCURATE); } pcb_gui->set_color(gc, fgcolor); - pcb_text_draw_(&t, 0, 0, PCB_TXT_TINY_ACCURATE); + pcb_text_draw_(NULL, &t, 0, 0, PCB_TXT_TINY_ACCURATE); return &t; } Index: trunk/src_plugins/draw_fab/draw_fab.c =================================================================== --- trunk/src_plugins/draw_fab/draw_fab.c (revision 19388) +++ trunk/src_plugins/draw_fab/draw_fab.c (revision 19389) @@ -72,7 +72,7 @@ } /* align is 0=left, 1=center, 2=right, add 8 for underline */ -static void text_at(pcb_hid_gc_t gc, int x, int y, int align, const char *fmt, ...) +static void text_at(pcb_draw_info_t *info, pcb_hid_gc_t gc, int x, int y, int align, const char *fmt, ...) { char tmp[512]; int w = 0, i; @@ -95,7 +95,7 @@ t.X -= w * (align & 3) / 2; if (t.X < 0) t.X = 0; - pcb_text_draw_(&t, 0,0, PCB_TXT_TINY_ACCURATE); + pcb_text_draw_(info, &t, 0,0, PCB_TXT_TINY_ACCURATE); if (align & 8) fab_line(gc, t.X, t.Y + PCB_SCALE_TEXT(font->MaxHeight, t.Scale) + PCB_MIL_TO_COORD(10), @@ -176,7 +176,7 @@ return (ds + 2) * TEXT_LINE; } -static void draw_fab_layer(pcb_hid_gc_t gc, const pcb_hid_expose_ctx_t *e, pcb_layer_t *layer, int found) +static void draw_fab_layer(pcb_draw_info_t *info, pcb_hid_gc_t gc, const pcb_hid_expose_ctx_t *e, pcb_layer_t *layer, int found) { pcb_hid_set_line_width(gc, PCB_MIL_TO_COORD(10)); PCB_LINE_LOOP(layer); @@ -191,12 +191,12 @@ PCB_END_LOOP; PCB_TEXT_LOOP(layer); { - pcb_text_draw_(text, 0, 0, PCB_TXT_TINY_ACCURATE); + pcb_text_draw_(info, text, 0, 0, PCB_TXT_TINY_ACCURATE); } PCB_END_LOOP; if (!found) { pcb_hid_set_line_width(gc, FAB_LINE_W); - text_at(gc, PCB->MaxWidth / 2, PCB->MaxHeight + PCB_MIL_TO_COORD(20), 1, "Board outline is the centerline of this path"); + text_at(info, gc, PCB->MaxWidth / 2, PCB->MaxHeight + PCB_MIL_TO_COORD(20), 1, "Board outline is the centerline of this path"); } } @@ -205,6 +205,9 @@ pcb_drill_info_t *AllDrills; int i, n, yoff, total_drills = 0, ds = 0, found; char utcTime[64]; +#warning TODO: get this as an arg + pcb_draw_info_t *info = NULL; + AllDrills = drill_get_info(PCB->Data); if (conf_core.editor.grid_unit->family == PCB_UNIT_IMPERIAL) drill_round_info(AllDrills, PCB_MIL_TO_COORD(1)); @@ -249,8 +252,8 @@ } if (plated_sym != -1) { drill_sym(gc, plated_sym, TEXT_SIZE, yoff + TEXT_SIZE / 4); - text_at(gc, PCB_MIL_TO_COORD(1350), yoff, PCB_MIL_TO_COORD(2), "YES"); - text_at(gc, PCB_MIL_TO_COORD(980), yoff, PCB_MIL_TO_COORD(2), "%d", drill->PinCount + drill->ViaCount - drill->UnplatedCount); + text_at(info, gc, PCB_MIL_TO_COORD(1350), yoff, PCB_MIL_TO_COORD(2), "YES"); + text_at(info, gc, PCB_MIL_TO_COORD(980), yoff, PCB_MIL_TO_COORD(2), "%d", drill->PinCount + drill->ViaCount - drill->UnplatedCount); if (unplated_sym != -1) yoff -= TEXT_LINE; @@ -257,19 +260,19 @@ } if (unplated_sym != -1) { drill_sym(gc, unplated_sym, TEXT_SIZE, yoff + TEXT_SIZE / 4); - text_at(gc, PCB_MIL_TO_COORD(1400), yoff, PCB_MIL_TO_COORD(2), "NO"); - text_at(gc, PCB_MIL_TO_COORD(980), yoff, PCB_MIL_TO_COORD(2), "%d", drill->UnplatedCount); + text_at(info, gc, PCB_MIL_TO_COORD(1400), yoff, PCB_MIL_TO_COORD(2), "NO"); + text_at(info, gc, PCB_MIL_TO_COORD(980), yoff, PCB_MIL_TO_COORD(2), "%d", drill->UnplatedCount); } pcb_gui->set_color(gc, conf_core.appearance.color.element); if (conf_core.editor.grid_unit->family == PCB_UNIT_IMPERIAL) - text_at(gc, PCB_MIL_TO_COORD(450), yoff, PCB_MIL_TO_COORD(2), "%0.3f", PCB_COORD_TO_INCH(drill->DrillSize)); + text_at(info, gc, PCB_MIL_TO_COORD(450), yoff, PCB_MIL_TO_COORD(2), "%0.3f", PCB_COORD_TO_INCH(drill->DrillSize)); else - text_at(gc, PCB_MIL_TO_COORD(450), yoff, PCB_MIL_TO_COORD(2), "%1.2f", PCB_COORD_TO_MM(drill->DrillSize)); + text_at(info, gc, PCB_MIL_TO_COORD(450), yoff, PCB_MIL_TO_COORD(2), "%1.2f", PCB_COORD_TO_MM(drill->DrillSize)); if (plated_sym != -1 && unplated_sym != -1) { if (conf_core.editor.grid_unit->family == PCB_UNIT_IMPERIAL) - text_at(gc, PCB_MIL_TO_COORD(450), yoff + TEXT_LINE, PCB_MIL_TO_COORD(2), "%0.3f", PCB_COORD_TO_INCH(drill->DrillSize)); + text_at(info, gc, PCB_MIL_TO_COORD(450), yoff + TEXT_LINE, PCB_MIL_TO_COORD(2), "%0.3f", PCB_COORD_TO_INCH(drill->DrillSize)); else - text_at(gc, PCB_MIL_TO_COORD(450), yoff + TEXT_LINE, PCB_MIL_TO_COORD(2), "%1.2f", PCB_COORD_TO_MM(drill->DrillSize)); + text_at(info, gc, PCB_MIL_TO_COORD(450), yoff + TEXT_LINE, PCB_MIL_TO_COORD(2), "%1.2f", PCB_COORD_TO_MM(drill->DrillSize)); } yoff -= TEXT_LINE; total_drills += drill->PinCount; @@ -277,15 +280,15 @@ } pcb_gui->set_color(gc, conf_core.appearance.color.element); - text_at(gc, 0, yoff, PCB_MIL_TO_COORD(9), "Symbol"); + text_at(info, gc, 0, yoff, PCB_MIL_TO_COORD(9), "Symbol"); if (conf_core.editor.grid_unit->family == PCB_UNIT_IMPERIAL) - text_at(gc, PCB_MIL_TO_COORD(410), yoff, PCB_MIL_TO_COORD(9), "Diam. (Inch)"); + text_at(info, gc, PCB_MIL_TO_COORD(410), yoff, PCB_MIL_TO_COORD(9), "Diam. (Inch)"); else - text_at(gc, PCB_MIL_TO_COORD(410), yoff, PCB_MIL_TO_COORD(9), "Diam. (mm)"); - text_at(gc, PCB_MIL_TO_COORD(950), yoff, PCB_MIL_TO_COORD(9), "Count"); - text_at(gc, PCB_MIL_TO_COORD(1300), yoff, PCB_MIL_TO_COORD(9), "Plated?"); + text_at(info, gc, PCB_MIL_TO_COORD(410), yoff, PCB_MIL_TO_COORD(9), "Diam. (mm)"); + text_at(info, gc, PCB_MIL_TO_COORD(950), yoff, PCB_MIL_TO_COORD(9), "Count"); + text_at(info, gc, PCB_MIL_TO_COORD(1300), yoff, PCB_MIL_TO_COORD(9), "Plated?"); yoff -= TEXT_LINE; - text_at(gc, 0, yoff, 0, + text_at(info, gc, 0, yoff, 0, "There are %d different drill sizes used in this layout, %d holes total", AllDrills->DrillN, total_drills); /* Create a portable timestamp. */ @@ -300,7 +303,7 @@ pcb_layer_type_t flags = pcb_layer_flags(PCB, i); int purpi = pcb_layer_purpose(PCB, i, NULL); if (PCB_LAYER_IS_ROUTE(flags, purpi) && (!PCB_RTREE_EMPTY(l->line_tree) || !PCB_RTREE_EMPTY(l->arc_tree))) { - draw_fab_layer(gc, e, l, found); + draw_fab_layer(info, gc, e, l, found); found = 1; } } @@ -312,9 +315,9 @@ pcb_gui->draw_line(gc, 0, PCB->MaxHeight, PCB->MaxWidth, PCB->MaxHeight); /*FPrintOutline (); */ pcb_hid_set_line_width(gc, FAB_LINE_W); - text_at(gc, PCB_MIL_TO_COORD(2000), yoff, 0, + text_at(info, gc, PCB_MIL_TO_COORD(2000), yoff, 0, "Maximum Dimensions: %f mils wide, %f mils high", PCB_COORD_TO_MIL(PCB->MaxWidth), PCB_COORD_TO_MIL(PCB->MaxHeight)); - text_at(gc, PCB->MaxWidth / 2, PCB->MaxHeight + PCB_MIL_TO_COORD(20), 1, + text_at(info, gc, PCB->MaxWidth / 2, PCB->MaxHeight + PCB_MIL_TO_COORD(20), 1, "Board outline is the centerline of this %f mil" " rectangle - 0,0 to %f,%f mils", PCB_COORD_TO_MIL(FAB_LINE_W), PCB_COORD_TO_MIL(PCB->MaxWidth), PCB_COORD_TO_MIL(PCB->MaxHeight)); @@ -321,11 +324,11 @@ } yoff -= TEXT_LINE; - text_at(gc, PCB_MIL_TO_COORD(2000), yoff, 0, "Date: %s", utcTime); + text_at(info, gc, PCB_MIL_TO_COORD(2000), yoff, 0, "Date: %s", utcTime); yoff -= TEXT_LINE; - text_at(gc, PCB_MIL_TO_COORD(2000), yoff, 0, "Author: %s", pcb_author()); + text_at(info, gc, PCB_MIL_TO_COORD(2000), yoff, 0, "Author: %s", pcb_author()); yoff -= TEXT_LINE; - text_at(gc, PCB_MIL_TO_COORD(2000), yoff, 0, "Title: %s - Fabrication Drawing", PCB_UNKNOWN(PCB->Name)); + text_at(info, gc, PCB_MIL_TO_COORD(2000), yoff, 0, "Title: %s - Fabrication Drawing", PCB_UNKNOWN(PCB->Name)); } int pplg_check_ver_draw_fab(int ver_needed) { return 0; } Index: trunk/src_plugins/draw_fontsel/draw_fontsel.c =================================================================== --- trunk/src_plugins/draw_fontsel/draw_fontsel.c (revision 19388) +++ trunk/src_plugins/draw_fontsel/draw_fontsel.c (revision 19389) @@ -57,7 +57,7 @@ t.Scale = scale; t.fid = fid; t.Flags = pcb_no_flags(); - pcb_text_draw_(&t, 0, 0, PCB_TXT_TINY_ACCURATE); + pcb_text_draw_(NULL, &t, 0, 0, PCB_TXT_TINY_ACCURATE); return &t; }