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

Reply via email to