Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java	(revision 10883)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java	(revision 10884)
@@ -29,4 +29,5 @@
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
 import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
+import org.openstreetmap.josm.gui.MapViewState.MapViewRectangle;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.draw.MapPath2D;
@@ -92,4 +93,5 @@
     private final Stroke relatedWayStroke = new BasicStroke(
             4, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL);
+    private MapViewRectangle viewClip;
 
     /**
@@ -146,15 +148,11 @@
     }
 
-    /**
-     * Renders the dataset for display.
-     *
-     * @param data <code>DataSet</code> to display
-     * @param virtual <code>true</code> if virtual nodes are used
-     * @param bounds display boundaries
-     */
     @Override
     public void render(DataSet data, boolean virtual, Bounds bounds) {
         BBox bbox = bounds.toBBox();
         this.ds = data;
+        Rectangle clip = g.getClipBounds();
+        clip.grow(50, 50);
+        viewClip = mapState.getViewArea(clip);
         getSettings(virtual);
 
@@ -316,12 +314,17 @@
         if (it.hasNext()) {
             MapViewPoint lastP = mapState.getPointFor(it.next());
+            int lastPOutside = lastP.getOutsideRectangleFlags(viewClip);
             for (int orderNumber = 1; it.hasNext(); orderNumber++) {
                 MapViewPoint p = mapState.getPointFor(it.next());
-                drawSegment(lastP, p, wayColor,
-                        showOnlyHeadArrowOnly ? !it.hasNext() : showThisDirectionArrow);
-                if (showOrderNumber && !isInactiveMode) {
-                    drawOrderNumber(lastP, p, orderNumber, g.getColor());
+                int pOutside = p.getOutsideRectangleFlags(viewClip);
+                if ((pOutside & lastPOutside) == 0) {
+                    drawSegment(lastP, p, wayColor,
+                            showOnlyHeadArrowOnly ? !it.hasNext() : showThisDirectionArrow);
+                    if (showOrderNumber && !isInactiveMode) {
+                        drawOrderNumber(lastP, p, orderNumber, g.getColor());
+                    }
                 }
                 lastP = p;
+                lastPOutside = pOutside;
             }
         }
@@ -414,12 +417,8 @@
      */
     protected void drawSegment(MapPath2D path, MapViewPoint mv1, MapViewPoint mv2, boolean showDirection) {
-        Rectangle bounds = g.getClipBounds();
-        bounds.grow(100, 100);                  // avoid arrow heads at the border
-        if (mv1.rectTo(mv2).isInView()) {
-            path.moveTo(mv1);
-            path.lineTo(mv2);
-            if (showDirection) {
-                ARROW_PAINT_HELPER.paintArrowAt(path, mv2, mv1);
-            }
+        path.moveTo(mv1);
+        path.lineTo(mv2);
+        if (showDirection) {
+            ARROW_PAINT_HELPER.paintArrowAt(path, mv2, mv1);
         }
     }
