Here is a patch to greatly speed up move operations on complex boards.
(Might help more generally too).

Its not a clean patch (it comments Draw() calls rather removing them at
this stage, as I want / need someone more familiar with the drawing
architecture to verify / confirm why this works without hurting the
drawing.

The portion to queue pending redraws to an idle function helps and is
much more like the lesstif hid, although might hurt the feel of
responsiveness when zooming. (My idle function might not have enough
priority, or perhaps it needs to be combined with a maximum elapsed time
before drawing).

Attached.

-- 
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: move.c
===================================================================
RCS file: /cvsroot/pcb/pcb/src/move.c,v
retrieving revision 1.42
diff -U3 -p -r1.42 move.c
--- move.c	2 Dec 2007 04:44:51 -0000	1.42
+++ move.c	24 Dec 2007 03:50:44 -0000
@@ -193,7 +193,7 @@ MoveElementName (ElementTypePtr Element)
       }
       END_LOOP;
       DrawElementName (Element, 0);
-      Draw ();
+//      Draw ();
     }
   else
     {
@@ -237,8 +237,8 @@ MoveElement (ElementTypePtr Element)
       DrawElementPinsAndPads (Element, 0);
       didDraw = True;
     }
-  if (didDraw)
-    Draw ();
+//  if (didDraw)
+//    Draw ();
   return (Element);
 }
 
@@ -258,7 +258,7 @@ MoveVia (PinTypePtr Via)
   if (PCB->ViaOn)
     {
       DrawVia (Via, 0);
-      Draw ();
+//      Draw ();
     }
   return (Via);
 }
@@ -279,7 +279,7 @@ MoveLine (LayerTypePtr Layer, LineTypePt
   if (Layer->On)
     {
       DrawLine (Layer, Line, 0);
-      Draw ();
+//      Draw ();
     }
   return (Line);
 }
@@ -297,7 +297,7 @@ MoveArc (LayerTypePtr Layer, ArcTypePtr 
       EraseArc (Arc);
       MOVE_ARC_LOWLEVEL (Arc, DeltaX, DeltaY);
       DrawArc (Layer, Arc, 0);
-      Draw ();
+//      Draw ();
     }
   else
     {
@@ -321,7 +321,7 @@ MoveText (LayerTypePtr Layer, TextTypePt
       EraseText (Layer, Text);
       MOVE_TEXT_LOWLEVEL (Text, DeltaX, DeltaY);
       DrawText (Layer, Text, 0);
-      Draw ();
+//      Draw ();
     }
   else
     MOVE_TEXT_LOWLEVEL (Text, DeltaX, DeltaY);
@@ -362,7 +362,7 @@ MovePolygon (LayerTypePtr Layer, Polygon
   if (Layer->On)
     {
       DrawPolygon (Layer, Polygon, 0);
-      Draw ();
+//      Draw ();
     }
   return (Polygon);
 }
@@ -386,7 +386,7 @@ MoveLinePoint (LayerTypePtr Layer, LineT
       if (Layer->On)
 	{
 	  DrawLine (Layer, Line, 0);
-	  Draw ();
+//	  Draw ();
 	}
       return (Line);
     }
@@ -401,7 +401,7 @@ MoveLinePoint (LayerTypePtr Layer, LineT
       if (PCB->RatOn)
 	{
 	  DrawRat ((RatTypePtr) Line, 0);
-	  Draw ();
+//	  Draw ();
 	}
       return (Line);
     }
@@ -427,7 +427,7 @@ MovePolygonPoint (LayerTypePtr Layer, Po
   if (Layer->On)
     {
       DrawPolygon (Layer, Polygon, 0);
-      Draw ();
+//      Draw ();
     }
   return (Point);
 }
@@ -493,7 +493,7 @@ MoveArcToLayer (LayerTypePtr Layer, ArcT
   if (Dest == Layer && Layer->On)
     {
       DrawArc (Layer, Arc, 0);
-      Draw ();
+//      Draw ();
     }
   if (((long int) Dest == -1) || Dest == Layer)
     return (Arc);
@@ -505,7 +505,7 @@ MoveArcToLayer (LayerTypePtr Layer, ArcT
   ClearFromPolygon (PCB->Data, ARC_TYPE, Dest, Arc);
   if (Dest->On)
     DrawArc (Dest, new, 0);
-  Draw ();
+//  Draw ();
   return (new);
 }
 
@@ -536,7 +536,7 @@ MoveRatToLayer (RatTypePtr Rat)
     EraseRat (Rat);
   MoveObjectToRemoveUndoList (RATLINE_TYPE, Rat, Rat, Rat);
   DrawLine (Dest, new, 0);
-  Draw ();
+//  Draw ();
   return (new);
 }
 
@@ -584,7 +584,7 @@ MoveLineToLayer (LayerTypePtr Layer, Lin
   if (Dest == Layer && Layer->On)
     {
       DrawLine (Layer, Line, 0);
-      Draw ();
+//      Draw ();
     }
   if (((long int) Dest == -1) || Dest == Layer)
     return (Line);
@@ -598,7 +598,7 @@ MoveLineToLayer (LayerTypePtr Layer, Lin
   ClearFromPolygon (PCB->Data, LINE_TYPE, Dest, new);
   if (Dest->On)
     DrawLine (Dest, new, 0);
-  Draw ();
+//  Draw ();
   if (!PCB->ViaOn || MoreToCome ||
       GetLayerGroupNumberByPointer (Layer) ==
       GetLayerGroupNumberByPointer (Dest) ||
@@ -633,7 +633,7 @@ MoveLineToLayer (LayerTypePtr Layer, Lin
       if (setjmp (info.env) == 0)
 	r_search (Layer->line_tree, &sb, NULL, moveline_callback, &info);
     }
-  Draw ();
+//  Draw ();
   return (new);
 }
 
@@ -689,8 +689,8 @@ MoveTextToLayer (LayerTypePtr Layer, Tex
       new = MoveTextToLayerLowLevel (Layer, Text, Dest);
       if (Dest->On)
 	DrawText (Dest, new, 0);
-      if (Layer->On || Dest->On)
-	Draw ();
+//      if (Layer->On || Dest->On)
+//	Draw ();
       return (new);
     }
   return (Text);
@@ -776,7 +776,7 @@ MovePolygonToLayer (LayerTypePtr Layer, 
   if (Dest->On)
     {
       DrawPolygon (Dest, new, 0);
-      Draw ();
+//      Draw ();
     }
   return (new);
 }
Index: hid/gtk/gtkhid-main.c
===================================================================
RCS file: /cvsroot/pcb/pcb/src/hid/gtk/gtkhid-main.c,v
retrieving revision 1.47
diff -U3 -p -r1.47 gtkhid-main.c
--- hid/gtk/gtkhid-main.c	30 Nov 2007 15:40:25 -0000	1.47
+++ hid/gtk/gtkhid-main.c	24 Dec 2007 03:50:44 -0000
@@ -53,6 +53,8 @@ static void zoom_by (double factor, int 
 static int cur_mask = -1;
 static int mask_seq = 0;
 
+static int redraw_queued = FALSE;
+
 int ghid_flip_x = 0, ghid_flip_y = 0;
 
 /* ------------------------------------------------------------ */
@@ -513,8 +515,9 @@ ghid_draw_bg_image(void)
             w - x, h - y, GDK_RGB_DITHER_NORMAL, 0, 0);
 	}
 
-void
-ghid_invalidate_all ()
+
+static gboolean
+ghid_idle_redraw_cb (gpointer data)
 {
   int eleft, eright, etop, ebottom;
   BoxType region;
@@ -573,10 +576,29 @@ ghid_invalidate_all ()
 
   hid_expose_callback (&ghid_hid, &region, 0);
   draw_grid ();
+  /* FIXME? rubberbanding breaks if isn't called from the invalidate function */
+//  if (ghidgui->need_restore_crosshair)
+//    RestoreCrosshair (FALSE);
+//  ghidgui->need_restore_crosshair = FALSE;
+  ghid_screen_update ();
+//  sleep(1);
+  redraw_queued = FALSE;
+  return FALSE;
+}
+
+void
+ghid_invalidate_all ()
+{
+  /* FIXME? rubberbanding breaks if this is moved into the idle function */
   if (ghidgui->need_restore_crosshair)
     RestoreCrosshair (FALSE);
   ghidgui->need_restore_crosshair = FALSE;
-  ghid_screen_update ();
+
+  if (!redraw_queued)
+    {
+      g_idle_add (ghid_idle_redraw_cb, NULL);
+      redraw_queued = TRUE;
+    }
 }
 
 

_______________________________________________
geda-dev mailing list
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-dev

Reply via email to