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, ®ion, 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