Index: /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 1253)
+++ /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 1254)
@@ -19,4 +19,5 @@
 import org.openstreetmap.josm.tools.DateParser;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.mappaint.ElemStyle;
 
 
@@ -139,4 +140,9 @@
     private static Collection<String> directionKeys = null;
 
+	
+    /* mappaint style cache */
+    public ElemStyle mappaintStyle = null;
+    public boolean isMappaintArea = false;
+	
     /**
      * Implementation of the visitor scheme. Subclasses have to call the correct
@@ -214,4 +220,5 @@
         checkTagged();
         checkDirectionTagged();
+        mappaintStyle = null;
     }
     /**
@@ -226,4 +233,5 @@
         checkTagged();
         checkDirectionTagged();
+        mappaintStyle = null;
     }
 
@@ -262,4 +270,5 @@
         tagged = osm.tagged;
         incomplete = osm.incomplete;
+        mappaintStyle = null;
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1253)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	(revision 1254)
@@ -53,4 +53,9 @@
     protected Collection<OsmPrimitive> alreadyDrawn;
     protected Collection<Way> alreadyDrawnAreas;
+    protected Boolean useStyleCache;
+    
+    protected int profilerVisibleNodes;
+    protected int profilerVisibleWays;
+    protected int profilerVisibleAreas;
 
     protected boolean isZoomOk(ElemStyle e) {
@@ -67,4 +72,26 @@
         // XXX - do we need a Preference setting for this (if things vary widely)?
         return !(circum >= e.maxScale / 22 || circum < e.minScale / 22);
+    }
+
+    public ElemStyle getPrimitiveStyle(OsmPrimitive osm) {
+        if(!useStyleCache)
+            return (styles != null) ? (IconElemStyle)styles.get(osm) : null;
+
+        if(osm.mappaintStyle == null) {
+            osm.mappaintStyle =  styles.get(osm);
+            osm.isMappaintArea = styles.isArea(osm);
+        }
+        return osm.mappaintStyle;
+    }
+
+    public boolean isPrimitiveArea(OsmPrimitive osm) {
+        if(!useStyleCache)
+            return styles.isArea((Way)osm);
+
+        if(osm.mappaintStyle == null) {
+            osm.mappaintStyle = styles.get(osm);
+            osm.isMappaintArea = styles.isArea(osm);
+        }
+        return osm.isMappaintArea;
     }
 
@@ -80,6 +107,8 @@
         if ((!selectedCall && n.selected) || (p.x < 0) || (p.y < 0)
         || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return;
-
-        IconElemStyle nodeStyle = styles != null ? (IconElemStyle)styles.get(n) : null;
+        
+        profilerVisibleNodes++;
+        
+        IconElemStyle nodeStyle = (IconElemStyle)getPrimitiveStyle(n);
         if (nodeStyle != null && isZoomOk(nodeStyle))
             drawNode(n, nodeStyle.icon, nodeStyle.annotate, n.selected);
@@ -104,26 +133,32 @@
         if(!isPolygonVisible(polygon))
             return;
-
-        ElemStyle wayStyle = styles != null ? styles.get(w) : null;
+            
+        ElemStyle wayStyle = getPrimitiveStyle(w);
 
         if(!isZoomOk(wayStyle))
             return;
 
-        LineElemStyle l = null;
-        Color areacolor = untaggedColor;
-        if(wayStyle!=null)
-        {
-            if(wayStyle instanceof LineElemStyle)
-                l = (LineElemStyle)wayStyle;
-            else if (wayStyle instanceof AreaElemStyle)
-            {
-                areacolor = ((AreaElemStyle)wayStyle).color;
-                l = ((AreaElemStyle)wayStyle).line;
-                if (fillAreas)
-                    drawArea(polygon, w.selected ? selectedColor : areacolor);
-            }
-        }
-
-        drawWay(w, l, areacolor, w.selected);
+        if(wayStyle==null)
+        {
+            // way without style
+            profilerVisibleWays++;
+            drawWay(w, null, untaggedColor, w.selected);
+        }
+        else if(wayStyle instanceof LineElemStyle)
+        {
+            // way with line style
+            profilerVisibleWays++;
+            drawWay(w, (LineElemStyle)wayStyle, untaggedColor, w.selected);
+        }
+        else if (wayStyle instanceof AreaElemStyle)
+        {
+            // way with area style
+            if (fillAreas)
+            {
+                profilerVisibleAreas++;
+                drawArea(polygon, w.selected ? selectedColor : ((AreaElemStyle)wayStyle).color);
+            }
+            drawWay(w, ((AreaElemStyle)wayStyle).line, ((AreaElemStyle)wayStyle).color, w.selected);
+        }
     }
 
@@ -785,17 +820,20 @@
 
         boolean profiler = Main.pref.getBoolean("mappaint.profiler",false);
+        useStyleCache = Main.pref.getBoolean("mappaint.cache",true);
+        fillAreas = Main.pref.getBoolean("mappaint.fillareas", true);
+        fillAlpha = Math.min(255, Math.max(0, Integer.valueOf(Main.pref.getInteger("mappaint.fillalpha", 50))));
+
         long profilerStart = java.lang.System.currentTimeMillis();
         long profilerLast = profilerStart;
         int profilerN;
         if(profiler)
-        {
-            System.out.println("Mappaint Profiler");
-        }
+            System.out.println("Mappaint Profiler (" +
+                (useStyleCache ? "cache=true, " : "cache=false, ") +
+                (fillAreas ? "fillareas=true, " : "fillareas=false, ") +
+                "fillalpha=" + fillAlpha + "%)");
 
         getSettings(virtual);
         useRealWidth = Main.pref.getBoolean("mappaint.useRealWidth",false);
         zoomLevelDisplay = Main.pref.getBoolean("mappaint.zoomLevelDisplay",false);
-        fillAreas = Main.pref.getBoolean("mappaint.fillareas", true);
-        fillAlpha = Math.min(255, Math.max(0, Integer.valueOf(Main.pref.getInteger("mappaint.fillalpha", 50))));
         circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter
         styles = MapPaintStyles.getStyles().getStyleSet();
@@ -808,4 +846,8 @@
         alreadyDrawnAreas = new LinkedList<Way>();
         selectedCall = false;
+        
+        profilerVisibleNodes = 0;
+        profilerVisibleWays = 0;
+        profilerVisibleAreas = 0;
 
         if(profiler)
@@ -831,5 +873,5 @@
             if(profiler)
             {
-                System.out.format("Relations: %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+                System.out.format("Relations: %4dms, n=%5d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
                 profilerLast = java.lang.System.currentTimeMillis();
             }
@@ -839,7 +881,9 @@
             for (final Way osm : data.ways)
             {
-                if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm))
-                {
-                    if(styles.isArea((Way)osm) && !alreadyDrawnAreas.contains(osm))
+                //if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm))
+                if (!osm.incomplete && !osm.deleted)
+                {
+                    //if(styles.isArea((Way)osm) && !alreadyDrawnAreas.contains(osm))
+                    if(isPrimitiveArea(osm))
                     {
                         osm.visit(this);
@@ -853,5 +897,6 @@
             if(profiler)
             {
-                System.out.format("Areas    : %4dms, n=%d\n",  (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+                System.out.format("Areas    : %4dms, n=%5d, visible=%d\n",
+                    (java.lang.System.currentTimeMillis()-profilerLast), profilerN, profilerVisibleAreas);
                 profilerLast = java.lang.System.currentTimeMillis();
             }
@@ -868,5 +913,6 @@
             if(profiler)
             {
-                System.out.format("Ways     : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+                System.out.format("Ways     : %4dms, n=%5d, visible=%d\n",
+                    (java.lang.System.currentTimeMillis()-profilerLast), profilerN, profilerVisibleWays);
                 profilerLast = java.lang.System.currentTimeMillis();
             }
@@ -885,5 +931,6 @@
             if(profiler)
             {
-                System.out.format("Ways     : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+                System.out.format("Ways     : %4dms, n=%5d, visible=%d\n", 
+                    (java.lang.System.currentTimeMillis()-profilerLast), profilerN, profilerVisibleWays);
                 profilerLast = java.lang.System.currentTimeMillis();
             }
@@ -895,5 +942,6 @@
         for (final OsmPrimitive osm : data.getSelected()) {
             if (!osm.incomplete && !osm.deleted
-            && !(osm instanceof Node) && !alreadyDrawn.contains(osm))
+            //&& !(osm instanceof Node) && !alreadyDrawn.contains(osm))
+            && !(osm instanceof Node))
             {
                 osm.visit(this);
@@ -904,5 +952,5 @@
         if(profiler)
         {
-            System.out.format("Selected : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+            System.out.format("Selected : %4dms, n=%5d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
             profilerLast = java.lang.System.currentTimeMillis();
         }
@@ -910,11 +958,15 @@
         /*** DISPLAY CACHED SEGMENTS (WAYS) NOW ***/
         displaySegments();
-        /*System.out.println("display segments " + (java.lang.System.currentTimeMillis()-profilerLast) + "ms");
-        profilerLast = java.lang.System.currentTimeMillis();*/
+        /*if(profiler)
+        {
+            System.out.format("DS       : %4dms\n", (java.lang.System.currentTimeMillis()-profilerLast));
+            profilerLast = java.lang.System.currentTimeMillis();
+        }*/
 
         /*** NODES ***/
         profilerN = 0;
         for (final OsmPrimitive osm : data.nodes)
-            if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm))
+            //if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm))
+            if (!osm.incomplete && !osm.deleted)
             {
                 osm.visit(this);
@@ -924,5 +976,6 @@
         if(profiler)
         {
-            System.out.format("Nodes    : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+            System.out.format("Nodes    : %4dms, n=%5d, visible=%d\n",
+                (java.lang.System.currentTimeMillis()-profilerLast), profilerN, profilerVisibleNodes);
             profilerLast = java.lang.System.currentTimeMillis();
         }
@@ -944,11 +997,14 @@
             if(profiler)
             {
-                System.out.format("Virtual  : %4dms, n=%d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
+                System.out.format("Virtual  : %4dms, n=%5d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
                 profilerLast = java.lang.System.currentTimeMillis();
             }
 
             displaySegments(null);
-            /*System.out.println("display segments virtual " + (java.lang.System.currentTimeMillis()-profilerLast) + "ms");
-            profilerLast = java.lang.System.currentTimeMillis();*/
+            /*if(profiler)
+            {
+                System.out.format("VirtualDS: %4dms\n", (java.lang.System.currentTimeMillis()-profilerLast));
+                profilerLast = java.lang.System.currentTimeMillis();
+            }*/
         }
 
Index: /trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 1253)
+++ /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 1254)
@@ -98,4 +98,5 @@
                osm.checkTagged();
                osm.checkDirectionTagged();
+               osm.mappaintStyle = null;
           }
      }
