Win32's GDK doesn't let you line from (X,Y) -> (X,Y) to draw a square.
Instead we must explicitly fill a rectangle.
The attached patch implements this change.
A more generic patch supporting arbitrary rotations and polygonal pads
would be a nice thing to see eventually, as it would condense the
special casing of code-paths.
Regards,
--
Peter Clifton
Electrical Engineering Division,
Engineering Department,
University of Cambridge,
9, JJ Thomson Avenue,
Cambridge
CB3 0FA
Tel: +44 (0)7729 980173 - (No signal in the lab!)
Index: src/draw.c
===================================================================
RCS file: /cvsroot/pcb/pcb/src/draw.c,v
retrieving revision 1.73
diff -U3 -p -r1.73 draw.c
--- src/draw.c 20 Apr 2007 11:31:13 -0000 1.73
+++ src/draw.c 25 May 2007 13:25:06 -0000
@@ -974,26 +974,24 @@ DrawPinOrViaLowLevel (PinTypePtr Ptr, Bo
}
if (TEST_FLAG (SQUAREFLAG, Ptr))
{
+ int l, r, t, b;
+ l = Ptr->X - Ptr->Thickness / 2;
+ b = Ptr->Y - Ptr->Thickness / 2;
+ r = l + Ptr->Thickness;
+ t = b + Ptr->Thickness;
if (TEST_FLAG (THINDRAWFLAG, PCB))
- {
- int l, r, t, b;
- l = Ptr->X - Ptr->Thickness / 2;
- b = Ptr->Y - Ptr->Thickness / 2;
- r = l + Ptr->Thickness;
- t = b + Ptr->Thickness;
- gui->set_line_cap (Output.fgGC, Round_Cap);
- gui->set_line_width (Output.fgGC, 1);
- gui->draw_line (Output.fgGC, r, t, r, b);
- gui->draw_line (Output.fgGC, l, t, l, b);
- gui->draw_line (Output.fgGC, r, t, l, t);
- gui->draw_line (Output.fgGC, r, b, l, b);
- }
+ {
+ gui->set_line_cap (Output.fgGC, Round_Cap);
+ gui->set_line_width (Output.fgGC, 1);
+ gui->draw_line (Output.fgGC, r, t, r, b);
+ gui->draw_line (Output.fgGC, l, t, l, b);
+ gui->draw_line (Output.fgGC, r, t, l, t);
+ gui->draw_line (Output.fgGC, r, b, l, b);
+ }
else
- {
- gui->set_line_cap (Output.fgGC, Square_Cap);
- gui->set_line_width (Output.fgGC, Ptr->Thickness);
- gui->draw_line (Output.fgGC, Ptr->X, Ptr->Y, Ptr->X, Ptr->Y);
- }
+ {
+ gui->fill_rect (Output.fgGC, l, b, r, t);
+ }
}
else if (TEST_FLAG (OCTAGONFLAG, Ptr))
{
@@ -1095,9 +1093,12 @@ ClearOnlyPin (PinTypePtr Pin, Boolean ma
/* Clear the area around the pin */
if (TEST_FLAG (SQUAREFLAG, Pin))
{
- gui->set_line_cap (Output.pmGC, Square_Cap);
- gui->set_line_width (Output.pmGC, half * 2);
- gui->draw_line (Output.pmGC, Pin->X, Pin->Y, Pin->X, Pin->Y);
+ int l, r, t, b;
+ l = Pin->X - half;
+ b = Pin->Y - half;
+ r = l + half * 2;
+ t = b + half * 2;
+ gui->fill_rect (Output.pmGC, l, b, r, t);
}
else if (TEST_FLAG (OCTAGONFLAG, Pin))
{
@@ -1129,9 +1130,12 @@ ClearPin (PinTypePtr Pin, int Type, int
/* Clear the area around the pin */
if (TEST_FLAG (SQUAREFLAG, Pin))
{
- gui->set_line_cap (Output.pmGC, Square_Cap);
- gui->set_line_width (Output.pmGC, half * 2);
- gui->draw_line (Output.pmGC, Pin->X, Pin->Y, Pin->X, Pin->Y);
+ int l, r, t, b;
+ l = Pin->X - half;
+ b = Pin->Y - half;
+ r = l + half * 2;
+ t = b + half * 2;
+ gui->fill_rect (Output.pmGC, l, b, r, t);
}
else if (TEST_FLAG (OCTAGONFLAG, Pin))
{
@@ -1336,21 +1340,33 @@ DrawPadLowLevel (PadTypePtr Pad)
}
}
else if (Pad->Point1.X == Pad->Point2.X
- && Pad->Point1.Y == Pad->Point2.Y && !TEST_FLAG (SQUAREFLAG, Pad))
+ && Pad->Point1.Y == Pad->Point2.Y)
{
- gui->fill_circle (Output.fgGC,
- Pad->Point1.X, Pad->Point1.Y, Pad->Thickness / 2);
+ if (TEST_FLAG (SQUAREFLAG, Pad))
+ {
+ int l, r, t, b;
+ l = Pad->Point1.X - Pad->Thickness / 2;
+ b = Pad->Point1.Y - Pad->Thickness / 2;
+ r = l + Pad->Thickness;
+ t = b + Pad->Thickness;
+ gui->fill_rect (Output.fgGC, l, b, r, t);
+ }
+ else
+ {
+ gui->fill_circle (Output.fgGC,
+ Pad->Point1.X, Pad->Point1.Y, Pad->Thickness / 2);
+ }
}
else
{
gui->set_line_cap (Output.fgGC,
- TEST_FLAG (SQUAREFLAG,
- Pad) ? Square_Cap : Round_Cap);
+ TEST_FLAG (SQUAREFLAG,
+ Pad) ? Square_Cap : Round_Cap);
gui->set_line_width (Output.fgGC, Pad->Thickness);
gui->draw_line (Output.fgGC,
- Pad->Point1.X, Pad->Point1.Y,
- Pad->Point2.X, Pad->Point2.Y);
+ Pad->Point1.X, Pad->Point1.Y,
+ Pad->Point2.X, Pad->Point2.Y);
}
}
@@ -1434,19 +1450,31 @@ ClearPad (PadTypePtr Pad, Boolean mask)
int w = mask ? Pad->Mask : Pad->Thickness + Pad->Clearance;
if (Pad->Point1.X == Pad->Point2.X
- && Pad->Point1.Y == Pad->Point2.Y && !TEST_FLAG (SQUAREFLAG, Pad))
+ && Pad->Point1.Y == Pad->Point2.Y)
{
- gui->fill_circle (Output.pmGC, Pad->Point1.X, Pad->Point1.Y, w / 2);
+ if (TEST_FLAG (SQUAREFLAG, Pad))
+ {
+ int l, r, t, b;
+ l = Pad->Point1.X - w;
+ b = Pad->Point1.Y - w;
+ r = l + w * 2;
+ t = b + w * 2;
+ gui->fill_rect (Output.pmGC, l, b, r, t);
+ }
+ else
+ {
+ gui->fill_circle (Output.pmGC, Pad->Point1.X, Pad->Point1.Y, w / 2);
+ }
}
else
{
gui->set_line_cap (Output.pmGC,
- TEST_FLAG (SQUAREFLAG,
- Pad) ? Square_Cap : Round_Cap);
+ TEST_FLAG (SQUAREFLAG,
+ Pad) ? Square_Cap : Round_Cap);
gui->set_line_width (Output.pmGC, w);
gui->draw_line (Output.pmGC,
- Pad->Point1.X, Pad->Point1.Y,
- Pad->Point2.X, Pad->Point2.Y);
+ Pad->Point1.X, Pad->Point1.Y,
+ Pad->Point2.X, Pad->Point2.Y);
}
}
_______________________________________________
geda-dev mailing list
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-dev