Index: trunk/src/Makefile.dep =================================================================== --- trunk/src/Makefile.dep (revision 4617) +++ trunk/src/Makefile.dep (revision 4618) @@ -648,8 +648,8 @@ obj_text_list.h obj_rat_list.h obj_rat.h crosshair.h rubberband.h \ vtonpoint.h ../src_3rd/genvector/genvector_impl.h \ ../src_3rd/genvector/genvector_undef.h hid.h error.h drc.h buffer.h \ - paths.h plugins.h plug_footprint.h vtlibrary.h compat_fs.h compat_misc.h \ - error.h conf.h pcb-printf.h ../src_3rd/genvector/gds_char.h \ + paths.h ../src_3rd/genvector/gds_char.h plugins.h plug_footprint.h \ + vtlibrary.h compat_fs.h compat_misc.h error.h conf.h pcb-printf.h \ ../src_3rd/liblihata/lihata.h ../src_3rd/liblihata/dom.h \ ../src_3rd/liblihata/lihata.h ../src_3rd/liblihata/parser.h \ ../src_3rd/liblihata/genht/htsp.h ../src_3rd/liblihata/genht/ht.h \ @@ -1684,7 +1684,7 @@ ../src_3rd/liblihata/genht/htsp.h ../src_3rd/liblihata/genht/ht.h \ ../src_3rd/genvector/vtp0.h list_conf.h plug_import.h conf_core.h \ error.h data.h crosshair.h rubberband.h vtonpoint.h hid.h error.h drc.h \ - buffer.h rats_patch.h compat_misc.h compat_nls.h + buffer.h rats_patch.h compat_misc.h compat_nls.h paths.h ../src_plugins/import_sch/import_sch.o: \ ../src_plugins/import_sch/import_sch.c ../config.h conf_core.h conf.h \ global_typedefs.h pcb_bool.h unit.h pcb-printf.h \ @@ -1895,7 +1895,7 @@ rats_patch.h hid_actions.h misc_util.h macro.h layer.h \ ../src_plugins/io_lihata/common.h ../src_plugins/io_lihata/write_style.h \ ../src_3rd/liblhtpers/lhtpers.h ../src_plugins/io_lihata/io_lihata.h \ - conf.h ../src_plugins/io_lihata/lht_conf.h + conf.h ../src_plugins/io_lihata/lht_conf.h paths.h ../src_plugins/io_lihata/write_style.o: \ ../src_plugins/io_lihata/write_style.c ../config.h \ ../src_plugins/io_lihata/write_style.h ../src_3rd/liblhtpers/lhtpers.h \ @@ -1990,7 +1990,8 @@ library.h rats_patch.h board.h font.h box.h math_helper.h move.h \ misc_util.h plug_io.h flag_str.h ../src_plugins/io_pcb/parse_common.h \ ../src_plugins/io_pcb/parse_y.h plug_footprint.h vtlibrary.h \ - ../src_plugins/io_pcb/attribs.h compat_misc.h compat_cc.h obj_common.h + ../src_plugins/io_pcb/attribs.h compat_misc.h compat_cc.h obj_common.h \ + paths.h ../src_plugins/io_pcb/parse_y.o: ../src_plugins/io_pcb/parse_y.c \ ../config.h board.h const.h macro.h global_typedefs.h pcb_bool.h unit.h \ vtroutestyle.h ../src_3rd/genvector/genvector_impl.h \ @@ -2916,7 +2917,7 @@ obj_text_list.h obj_rat_list.h obj_rat.h library.h rats_patch.h font.h \ box.h move.h misc_util.h data.h crosshair.h rubberband.h vtonpoint.h \ hid.h error.h drc.h buffer.h draw.h rotate.h rtree.h stub_draw_fab.h \ - obj_all.h + obj_all.h obj_pinvia_draw.h error.o: error.c ../config.h data.h globalconst.h global_typedefs.h \ pcb_bool.h unit.h layer.h attrib.h obj_all_list.h obj_arc_list.h \ obj_common.h ../src_3rd/genlist/gendlist.h flag.h obj_arc.h \ @@ -3069,7 +3070,9 @@ ../src_3rd/liblihata/lihata.h ../src_3rd/liblihata/parser.h \ ../src_3rd/liblihata/genht/htsp.h ../src_3rd/liblihata/genht/ht.h \ ../src_3rd/liblihata/genht/ht_inlines.h ../config.h hid_cfg.h error.h \ - paths.h compat_misc.h + paths.h ../src_3rd/genvector/gds_char.h \ + ../src_3rd/genvector/genvector_impl.h \ + ../src_3rd/genvector/genvector_undef.h compat_misc.h hid_cfg_action.o: hid_cfg_action.c ../config.h hid_cfg_action.h hid_cfg.h \ ../src_3rd/liblihata/dom.h ../src_3rd/liblihata/lihata.h \ ../src_3rd/liblihata/parser.h ../src_3rd/liblihata/genht/htsp.h \ @@ -3568,16 +3571,17 @@ misc_util.h action_helper.h change.h undo.h funchash_core.h funchash.h \ funchash_core_list.h search.h rats.h netlist.h route_style.h draw.h \ set.h copy.h remove.h compat_misc.h compat_nls.h -paths.o: paths.c ../config.h paths.h error.h conf_core.h conf.h \ +paths.o: paths.c ../config.h paths.h ../src_3rd/genvector/gds_char.h \ + ../src_3rd/genvector/genvector_impl.h \ + ../src_3rd/genvector/genvector_undef.h error.h conf_core.h conf.h \ global_typedefs.h pcb_bool.h unit.h pcb-printf.h \ - ../src_3rd/genvector/gds_char.h ../src_3rd/genvector/genvector_impl.h \ - ../src_3rd/genvector/genvector_undef.h ../src_3rd/liblihata/lihata.h \ - ../src_3rd/liblihata/dom.h ../src_3rd/liblihata/lihata.h \ - ../src_3rd/liblihata/parser.h ../src_3rd/liblihata/genht/htsp.h \ - ../src_3rd/liblihata/genht/ht.h ../src_3rd/liblihata/genht/ht_inlines.h \ - ../src_3rd/genvector/vtp0.h list_conf.h \ - ../src_3rd/genlist/gentdlist_undef.h ../src_3rd/genlist/gentdlist_impl.h \ - ../src_3rd/genlist/gendlist.h globalconst.h + ../src_3rd/liblihata/lihata.h ../src_3rd/liblihata/dom.h \ + ../src_3rd/liblihata/lihata.h ../src_3rd/liblihata/parser.h \ + ../src_3rd/liblihata/genht/htsp.h ../src_3rd/liblihata/genht/ht.h \ + ../src_3rd/liblihata/genht/ht_inlines.h ../src_3rd/genvector/vtp0.h \ + list_conf.h ../src_3rd/genlist/gentdlist_undef.h \ + ../src_3rd/genlist/gentdlist_impl.h ../src_3rd/genlist/gendlist.h \ + globalconst.h pcb-printf.o: pcb-printf.c ../config.h pcb-printf.h \ ../src_3rd/genvector/gds_char.h ../src_3rd/genvector/genvector_impl.h \ ../src_3rd/genvector/genvector_undef.h unit.h @@ -3618,18 +3622,18 @@ ../src_3rd/liblihata/genht/ht.h ../src_3rd/liblihata/genht/ht_inlines.h \ ../src_3rd/genvector/vtp0.h list_conf.h \ ../src_3rd/genlist/gentdlist_undef.h ../src_3rd/genlist/gentdlist_impl.h \ - ../src_3rd/genlist/gendlist.h globalconst.h math_helper.h buffer.h \ - obj_common.h ../src_3rd/genlist/gendlist.h flag.h attrib.h change.h \ - data.h layer.h obj_all_list.h obj_arc_list.h obj_arc.h obj_elem_list.h \ + ../src_3rd/genlist/gendlist.h globalconst.h change.h data.h layer.h \ + attrib.h obj_all_list.h obj_arc_list.h obj_common.h \ + ../src_3rd/genlist/gendlist.h flag.h obj_arc.h obj_elem_list.h \ obj_elem.h obj_line_list.h obj_line.h obj_pad_list.h obj_pad.h \ obj_pinvia_list.h obj_pinvia.h obj_text.h ht_element.h \ ../src_3rd/liblihata/genht/ht.h ../src_3rd/liblihata/genht/hash.h \ obj_poly_list.h obj_poly.h polyarea.h obj_text_list.h obj_rat_list.h \ obj_rat.h crosshair.h rubberband.h vtonpoint.h hid.h error.h drc.h \ - plug_io.h library.h remove.h set.h paths.h rats_patch.h board.h const.h \ - macro.h vtroutestyle.h font.h box.h move.h misc_util.h hid_actions.h \ - hid_flags.h plugins.h event.h compat_misc.h route_style.h compat_fs.h \ - compat_nls.h compat_inc.h + buffer.h plug_io.h library.h remove.h set.h paths.h rats_patch.h board.h \ + const.h macro.h vtroutestyle.h font.h box.h math_helper.h move.h \ + misc_util.h hid_actions.h hid_flags.h plugins.h event.h compat_misc.h \ + route_style.h compat_fs.h compat_nls.h compat_inc.h plugins.o: plugins.c plugins.h ../config.h \ ../src_3rd/genvector/gds_char.h ../src_3rd/genvector/genvector_impl.h \ ../src_3rd/genvector/genvector_undef.h compat_misc.h hid.h error.h drc.h \ Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 4617) +++ trunk/src/draw.c (revision 4618) @@ -40,6 +40,8 @@ #include "stub_draw_fab.h" #include "obj_all.h" +#include "obj_pinvia_draw.h" + #undef NDEBUG #include @@ -61,8 +63,8 @@ BoxType pcb_draw_invalidated = { MAXINT, MAXINT, -MAXINT, -MAXINT }; -static int doing_pinout = 0; -static pcb_bool doing_assy = pcb_false; +int pcb_draw_doing_pinout = 0; +pcb_bool pcb_draw_doing_assy = pcb_false; /* --------------------------------------------------------------------------- * some local prototypes @@ -70,7 +72,6 @@ static void DrawEverything(const BoxType *); static void DrawPPV(int group, const BoxType *); static void DrawLayerGroup(int, const BoxType *); -static void SetPVColor(PinTypePtr, int); static void DrawEMark(ElementTypePtr, Coord, Coord, pcb_bool); static void DrawMask(int side, const BoxType *); static void DrawPaste(int side, const BoxType *); @@ -77,7 +78,8 @@ static void DrawRats(const BoxType *); static void DrawSilk(int side, const BoxType *); -static void LightenColor(const char *orig, char buf[8], double factor) +#warning TODO: this should be cached +void LightenColor(const char *orig, char buf[8], double factor) { unsigned int r, g, b; @@ -95,55 +97,6 @@ pcb_snprintf(buf, sizeof("#XXXXXX"), "#%02x%02x%02x", r, g, b); } - -/*-------------------------------------------------------------------------------------- - * setup color for pin or via - */ -static void SetPVColor(PinTypePtr Pin, int Type) -{ - char *color; - char buf[sizeof("#XXXXXX")]; - - if (Type == PCB_TYPE_VIA) { - if (!doing_pinout && TEST_FLAG(PCB_FLAG_WARN | PCB_FLAG_SELECTED | PCB_FLAG_FOUND, Pin)) { - if (TEST_FLAG(PCB_FLAG_WARN, Pin)) - color = PCB->WarnColor; - else if (TEST_FLAG(PCB_FLAG_SELECTED, Pin)) - color = PCB->ViaSelectedColor; - else - color = PCB->ConnectedColor; - - if (TEST_FLAG(PCB_FLAG_ONPOINT, Pin)) { - assert(color != NULL); - LightenColor(color, buf, 1.75); - color = buf; - } - } - else - color = PCB->ViaColor; - } - else { - if (!doing_pinout && TEST_FLAG(PCB_FLAG_WARN | PCB_FLAG_SELECTED | PCB_FLAG_FOUND, Pin)) { - if (TEST_FLAG(PCB_FLAG_WARN, Pin)) - color = PCB->WarnColor; - else if (TEST_FLAG(PCB_FLAG_SELECTED, Pin)) - color = PCB->PinSelectedColor; - else - color = PCB->ConnectedColor; - - if (TEST_FLAG(PCB_FLAG_ONPOINT, Pin)) { - assert(color != NULL); - LightenColor(color, buf, 1.75); - color = buf; - } - } - else - color = PCB->PinColor; - } - - gui->set_color(Output.fgGC, color); -} - /* * initiate the actual redrawing of the updated area */ @@ -168,87 +121,6 @@ gui->invalidate_all(); } -static void _draw_pv_name(PinType * pv) -{ - BoxType box; - pcb_bool vert; - TextType text; - char buff[128]; - const char *pn; - - if (!pv->Name || !pv->Name[0]) - pn = EMPTY(pv->Number); - else - pn = EMPTY(conf_core.editor.show_number ? pv->Number : pv->Name); - - if (GET_INTCONN(pv) > 0) - pcb_snprintf(buff, sizeof(buff), "%s[%d]", pn, GET_INTCONN(pv)); - else - strcpy(buff, pn); - text.TextString = buff; - - vert = TEST_FLAG(PCB_FLAG_EDGE2, pv); - - if (vert) { - box.X1 = pv->X - pv->Thickness / 2 + conf_core.appearance.pinout.text_offset_y; - box.Y1 = pv->Y - pv->DrillingHole / 2 - conf_core.appearance.pinout.text_offset_x; - } - else { - box.X1 = pv->X + pv->DrillingHole / 2 + conf_core.appearance.pinout.text_offset_x; - box.Y1 = pv->Y - pv->Thickness / 2 + conf_core.appearance.pinout.text_offset_y; - } - - gui->set_color(Output.fgGC, PCB->PinNameColor); - - text.Flags = NoFlags(); - /* Set font height to approx 56% of pin thickness */ - text.Scale = 56 * pv->Thickness / FONT_CAPHEIGHT; - text.X = box.X1; - text.Y = box.Y1; - text.Direction = vert ? 1 : 0; - - if (gui->gui) - doing_pinout++; - DrawTextLowLevel(&text, 0); - if (gui->gui) - doing_pinout--; -} - -static void _draw_pv(PinTypePtr pv, pcb_bool draw_hole) -{ - if (conf_core.editor.thin_draw) - gui->thindraw_pcb_pv(Output.fgGC, Output.fgGC, pv, draw_hole, pcb_false); - else - gui->fill_pcb_pv(Output.fgGC, Output.bgGC, pv, draw_hole, pcb_false); - - if (!TEST_FLAG(PCB_FLAG_HOLE, pv) && TEST_FLAG(PCB_FLAG_DISPLAYNAME, pv)) - _draw_pv_name(pv); -} - -static void draw_pin(PinTypePtr pin, pcb_bool draw_hole) -{ - SetPVColor(pin, PCB_TYPE_PIN); - _draw_pv(pin, draw_hole); -} - -static r_dir_t pin_callback(const BoxType * b, void *cl) -{ - draw_pin((PinType *) b, pcb_false); - return R_DIR_FOUND_CONTINUE; -} - -static void draw_via(PinTypePtr via, pcb_bool draw_hole) -{ - SetPVColor(via, PCB_TYPE_VIA); - _draw_pv(via, draw_hole); -} - -static r_dir_t via_callback(const BoxType * b, void *cl) -{ - draw_via((PinType *) b, pcb_false); - return R_DIR_FOUND_CONTINUE; -} - static void draw_pad_name(PadType * pad) { BoxType box; @@ -312,7 +184,7 @@ const char *color = NULL; char buf[sizeof("#XXXXXX")]; - if (doing_pinout) + if (pcb_draw_doing_pinout) gui->set_color(Output.fgGC, PCB->PinColor); else if (TEST_FLAG(PCB_FLAG_WARN | PCB_FLAG_SELECTED | PCB_FLAG_FOUND, pad)) { if (TEST_FLAG(PCB_FLAG_WARN, pad)) @@ -338,7 +210,7 @@ _draw_pad(Output.fgGC, pad, pcb_false, pcb_false); - if (doing_pinout || TEST_FLAG(PCB_FLAG_DISPLAYNAME, pad)) + if (pcb_draw_doing_pinout || TEST_FLAG(PCB_FLAG_DISPLAYNAME, pad)) draw_pad_name(pad); } @@ -356,7 +228,7 @@ { if ((conf_core.editor.hide_names && gui->gui) || TEST_FLAG(PCB_FLAG_HIDENAME, element)) return; - if (doing_pinout || doing_assy) + if (pcb_draw_doing_pinout || pcb_draw_doing_assy) gui->set_color(Output.fgGC, PCB->ElementColor); else if (TEST_FLAG(PCB_FLAG_SELECTED, &ELEMENT_TEXT(PCB, element))) gui->set_color(Output.fgGC, PCB->ElementSelectedColor); @@ -392,7 +264,7 @@ { PAD_LOOP(element); { - if (doing_pinout || doing_assy || FRONT(pad) || PCB->InvisibleObjectsOn) + if (pcb_draw_doing_pinout || pcb_draw_doing_assy || FRONT(pad) || PCB->InvisibleObjectsOn) draw_pad(pad); } END_LOOP; @@ -411,48 +283,6 @@ return R_DIR_FOUND_CONTINUE; } -static r_dir_t hole_callback(const BoxType * b, void *cl) -{ - PinTypePtr pv = (PinTypePtr) b; - int plated = cl ? *(int *) cl : -1; - const char *color; - char buf[sizeof("#XXXXXX")]; - - if ((plated == 0 && !TEST_FLAG(PCB_FLAG_HOLE, pv)) || (plated == 1 && TEST_FLAG(PCB_FLAG_HOLE, pv))) - return R_DIR_FOUND_CONTINUE; - - if (conf_core.editor.thin_draw) { - if (!TEST_FLAG(PCB_FLAG_HOLE, pv)) { - gui->set_line_cap(Output.fgGC, Round_Cap); - gui->set_line_width(Output.fgGC, 0); - gui->draw_arc(Output.fgGC, pv->X, pv->Y, pv->DrillingHole / 2, pv->DrillingHole / 2, 0, 360); - } - } - else - gui->fill_circle(Output.bgGC, pv->X, pv->Y, pv->DrillingHole / 2); - - if (TEST_FLAG(PCB_FLAG_HOLE, pv)) { - if (TEST_FLAG(PCB_FLAG_WARN, pv)) - color = PCB->WarnColor; - else if (TEST_FLAG(PCB_FLAG_SELECTED, pv)) - color = PCB->ViaSelectedColor; - else - color = conf_core.appearance.color.black; - - if (TEST_FLAG(PCB_FLAG_ONPOINT, pv)) { - assert(color != NULL); - LightenColor(color, buf, 1.75); - color = buf; - } - gui->set_color(Output.fgGC, color); - - gui->set_line_cap(Output.fgGC, Round_Cap); - gui->set_line_width(Output.fgGC, 0); - gui->draw_arc(Output.fgGC, pv->X, pv->Y, pv->DrillingHole / 2, pv->DrillingHole / 2, 0, 360); - } - return R_DIR_FOUND_CONTINUE; -} - static void DrawHoles(pcb_bool draw_plated, pcb_bool draw_unplated, const BoxType * drawn_area) { int plated = -1; @@ -462,8 +292,8 @@ if (!draw_plated && draw_unplated) plated = 0; - r_search(PCB->Data->pin_tree, drawn_area, NULL, hole_callback, &plated, NULL); - r_search(PCB->Data->via_tree, drawn_area, NULL, hole_callback, &plated, NULL); + r_search(PCB->Data->pin_tree, drawn_area, NULL, draw_hole_callback, &plated, NULL); + r_search(PCB->Data->via_tree, drawn_area, NULL, draw_hole_callback, &plated, NULL); } static void _draw_line(LineType * line) @@ -587,7 +417,7 @@ static void draw_element_package(ElementType * element) { /* set color and draw lines, arcs, text and pins */ - if (doing_pinout || doing_assy) + if (pcb_draw_doing_pinout || pcb_draw_doing_assy) gui->set_color(Output.fgGC, PCB->ElementColor); else if (TEST_FLAG(PCB_FLAG_SELECTED, element)) gui->set_color(Output.fgGC, PCB->ElementSelectedColor); @@ -627,7 +457,7 @@ { int side_group = GetLayerGroupNumberByNumber(max_copper_layer + side); - doing_assy = pcb_true; + pcb_draw_doing_assy = pcb_true; gui->set_draw_faded(Output.fgGC, 1); DrawLayerGroup(side_group, drawn_area); gui->set_draw_faded(Output.fgGC, 0); @@ -634,7 +464,7 @@ /* draw package */ DrawSilk(side, drawn_area); - doing_assy = pcb_false; + pcb_draw_doing_assy = pcb_false; } static void DrawEverything_holes(const BoxType * drawn_area) @@ -830,7 +660,7 @@ if (PCB->PinOn || !gui->gui) { /* draw element pins */ - r_search(PCB->Data->pin_tree, drawn_area, NULL, pin_callback, NULL, NULL); + r_search(PCB->Data->pin_tree, drawn_area, NULL, draw_pin_callback, NULL, NULL); /* draw element pads */ if (group == component_group) { @@ -846,11 +676,11 @@ /* draw vias */ if (PCB->ViaOn || !gui->gui) { - r_search(PCB->Data->via_tree, drawn_area, NULL, via_callback, NULL, NULL); - r_search(PCB->Data->via_tree, drawn_area, NULL, hole_callback, NULL, NULL); + r_search(PCB->Data->via_tree, drawn_area, NULL, draw_via_callback, NULL, NULL); + r_search(PCB->Data->via_tree, drawn_area, NULL, draw_hole_callback, NULL, NULL); } - if (PCB->PinOn || doing_assy) - r_search(PCB->Data->pin_tree, drawn_area, NULL, hole_callback, NULL, NULL); + if (PCB->PinOn || pcb_draw_doing_assy) + r_search(PCB->Data->pin_tree, drawn_area, NULL, draw_hole_callback, NULL, NULL); } static r_dir_t clearPin_callback(const BoxType * b, void *cl) @@ -1264,7 +1094,7 @@ { pcb_draw_invalidate(Pin); if ((!TEST_FLAG(PCB_FLAG_HOLE, Pin) && TEST_FLAG(PCB_FLAG_DISPLAYNAME, Pin)) - || doing_pinout) + || pcb_draw_doing_pinout) DrawPinName(Pin); } @@ -1282,7 +1112,7 @@ void DrawPad(PadTypePtr Pad) { pcb_draw_invalidate(Pad); - if (doing_pinout || TEST_FLAG(PCB_FLAG_DISPLAYNAME, Pad)) + if (pcb_draw_doing_pinout || TEST_FLAG(PCB_FLAG_DISPLAYNAME, Pad)) DrawPadName(Pad); } @@ -1394,7 +1224,7 @@ { PAD_LOOP(Element); { - if (doing_pinout || doing_assy || FRONT(pad) || PCB->InvisibleObjectsOn) + if (pcb_draw_doing_pinout || pcb_draw_doing_assy || FRONT(pad) || PCB->InvisibleObjectsOn) DrawPad(pad); } END_LOOP; @@ -1675,9 +1505,9 @@ hid->set_color(Output.bgGC, "drill"); if (item) { - doing_pinout = pcb_true; + pcb_draw_doing_pinout = pcb_true; draw_element((ElementType *) item); - doing_pinout = pcb_false; + pcb_draw_doing_pinout = pcb_false; } else DrawEverything(region); Index: trunk/src/draw.h =================================================================== --- trunk/src/draw.h (revision 4617) +++ trunk/src/draw.h (revision 4618) @@ -70,6 +70,12 @@ pcb_draw_invalidated.Y2 = MAX(pcb_draw_invalidated.Y2, box->Y2); \ } while(0) +extern int pcb_draw_doing_pinout; +extern pcb_bool pcb_draw_doing_assy; + +void LightenColor(const char *orig, char buf[8], double factor); + + void Draw(void); void Redraw(void); void DrawVia(PinTypePtr); Index: trunk/src/obj_pinvia.c =================================================================== --- trunk/src/obj_pinvia.c (revision 4617) +++ trunk/src/obj_pinvia.c (revision 4618) @@ -750,3 +750,174 @@ MoveObjectToRemoveUndoList(PCB_TYPE_VIA, Via, Via, Via); return NULL; } + +/*** draw ***/ + +/* setup color for pin or via */ +static void SetPVColor(PinTypePtr Pin, int Type) +{ + char *color; + char buf[sizeof("#XXXXXX")]; + + if (Type == PCB_TYPE_VIA) { + if (!pcb_draw_doing_pinout && TEST_FLAG(PCB_FLAG_WARN | PCB_FLAG_SELECTED | PCB_FLAG_FOUND, Pin)) { + if (TEST_FLAG(PCB_FLAG_WARN, Pin)) + color = PCB->WarnColor; + else if (TEST_FLAG(PCB_FLAG_SELECTED, Pin)) + color = PCB->ViaSelectedColor; + else + color = PCB->ConnectedColor; + + if (TEST_FLAG(PCB_FLAG_ONPOINT, Pin)) { + assert(color != NULL); + LightenColor(color, buf, 1.75); + color = buf; + } + } + else + color = PCB->ViaColor; + } + else { + if (!pcb_draw_doing_pinout && TEST_FLAG(PCB_FLAG_WARN | PCB_FLAG_SELECTED | PCB_FLAG_FOUND, Pin)) { + if (TEST_FLAG(PCB_FLAG_WARN, Pin)) + color = PCB->WarnColor; + else if (TEST_FLAG(PCB_FLAG_SELECTED, Pin)) + color = PCB->PinSelectedColor; + else + color = PCB->ConnectedColor; + + if (TEST_FLAG(PCB_FLAG_ONPOINT, Pin)) { + assert(color != NULL); + LightenColor(color, buf, 1.75); + color = buf; + } + } + else + color = PCB->PinColor; + } + + gui->set_color(Output.fgGC, color); +} + +static void _draw_pv_name(PinType * pv) +{ + BoxType box; + pcb_bool vert; + TextType text; + char buff[128]; + const char *pn; + + if (!pv->Name || !pv->Name[0]) + pn = EMPTY(pv->Number); + else + pn = EMPTY(conf_core.editor.show_number ? pv->Number : pv->Name); + + if (GET_INTCONN(pv) > 0) + pcb_snprintf(buff, sizeof(buff), "%s[%d]", pn, GET_INTCONN(pv)); + else + strcpy(buff, pn); + text.TextString = buff; + + vert = TEST_FLAG(PCB_FLAG_EDGE2, pv); + + if (vert) { + box.X1 = pv->X - pv->Thickness / 2 + conf_core.appearance.pinout.text_offset_y; + box.Y1 = pv->Y - pv->DrillingHole / 2 - conf_core.appearance.pinout.text_offset_x; + } + else { + box.X1 = pv->X + pv->DrillingHole / 2 + conf_core.appearance.pinout.text_offset_x; + box.Y1 = pv->Y - pv->Thickness / 2 + conf_core.appearance.pinout.text_offset_y; + } + + gui->set_color(Output.fgGC, PCB->PinNameColor); + + text.Flags = NoFlags(); + /* Set font height to approx 56% of pin thickness */ + text.Scale = 56 * pv->Thickness / FONT_CAPHEIGHT; + text.X = box.X1; + text.Y = box.Y1; + text.Direction = vert ? 1 : 0; + + if (gui->gui) + pcb_draw_doing_pinout++; + DrawTextLowLevel(&text, 0); + if (gui->gui) + pcb_draw_doing_pinout--; +} + +static void _draw_pv(PinTypePtr pv, pcb_bool draw_hole) +{ + if (conf_core.editor.thin_draw) + gui->thindraw_pcb_pv(Output.fgGC, Output.fgGC, pv, draw_hole, pcb_false); + else + gui->fill_pcb_pv(Output.fgGC, Output.bgGC, pv, draw_hole, pcb_false); + + if (!TEST_FLAG(PCB_FLAG_HOLE, pv) && TEST_FLAG(PCB_FLAG_DISPLAYNAME, pv)) + _draw_pv_name(pv); +} + +void draw_pin(PinTypePtr pin, pcb_bool draw_hole) +{ + SetPVColor(pin, PCB_TYPE_PIN); + _draw_pv(pin, draw_hole); +} + +r_dir_t draw_pin_callback(const BoxType * b, void *cl) +{ + draw_pin((PinType *) b, pcb_false); + return R_DIR_FOUND_CONTINUE; +} + +static void draw_via(PinTypePtr via, pcb_bool draw_hole) +{ + SetPVColor(via, PCB_TYPE_VIA); + _draw_pv(via, draw_hole); +} + +r_dir_t draw_via_callback(const BoxType * b, void *cl) +{ + draw_via((PinType *) b, pcb_false); + return R_DIR_FOUND_CONTINUE; +} + +r_dir_t draw_hole_callback(const BoxType * b, void *cl) +{ + PinTypePtr pv = (PinTypePtr) b; + int plated = cl ? *(int *) cl : -1; + const char *color; + char buf[sizeof("#XXXXXX")]; + + if ((plated == 0 && !TEST_FLAG(PCB_FLAG_HOLE, pv)) || (plated == 1 && TEST_FLAG(PCB_FLAG_HOLE, pv))) + return R_DIR_FOUND_CONTINUE; + + if (conf_core.editor.thin_draw) { + if (!TEST_FLAG(PCB_FLAG_HOLE, pv)) { + gui->set_line_cap(Output.fgGC, Round_Cap); + gui->set_line_width(Output.fgGC, 0); + gui->draw_arc(Output.fgGC, pv->X, pv->Y, pv->DrillingHole / 2, pv->DrillingHole / 2, 0, 360); + } + } + else + gui->fill_circle(Output.bgGC, pv->X, pv->Y, pv->DrillingHole / 2); + + if (TEST_FLAG(PCB_FLAG_HOLE, pv)) { + if (TEST_FLAG(PCB_FLAG_WARN, pv)) + color = PCB->WarnColor; + else if (TEST_FLAG(PCB_FLAG_SELECTED, pv)) + color = PCB->ViaSelectedColor; + else + color = conf_core.appearance.color.black; + + if (TEST_FLAG(PCB_FLAG_ONPOINT, pv)) { + assert(color != NULL); + LightenColor(color, buf, 1.75); + color = buf; + } + gui->set_color(Output.fgGC, color); + + gui->set_line_cap(Output.fgGC, Round_Cap); + gui->set_line_width(Output.fgGC, 0); + gui->draw_arc(Output.fgGC, pv->X, pv->Y, pv->DrillingHole / 2, pv->DrillingHole / 2, 0, 360); + } + return R_DIR_FOUND_CONTINUE; +} Index: trunk/src/obj_pinvia_draw.h =================================================================== --- trunk/src/obj_pinvia_draw.h (nonexistent) +++ trunk/src/obj_pinvia_draw.h (revision 4618) @@ -0,0 +1,31 @@ +/* + * COPYRIGHT + * + * PCB, interactive printed circuit board design + * Copyright (C) 1994,1995,1996 Thomas Nau + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact addresses for paper mail and Email: + * Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany + * Thomas.Nau@rz.uni-ulm.de + * + */ + +/*** Standard draw on pins and vias ***/ +r_dir_t draw_pin_callback(const BoxType * b, void *cl); +r_dir_t draw_via_callback(const BoxType * b, void *cl); +r_dir_t draw_hole_callback(const BoxType * b, void *cl); +void draw_pin(PinTypePtr pin, pcb_bool draw_hole);