Changeset 4423 in osm for applications/editors/josm


Ignore:
Timestamp:
2007-09-03T00:23:03+02:00 (17 years ago)
Author:
frederik
Message:

performance improvements by Brent Easton <b.easton@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/mappaint/src/mappaint/MapPaintVisitor.java

    r3621 r4423  
    1010import java.awt.Point;
    1111import java.awt.Polygon;
     12import java.awt.Stroke;
     13import java.awt.geom.GeneralPath;
    1214
    1315import javax.swing.ImageIcon;
     
    2123import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
    2224
    23 import java.awt.event.MouseEvent;
    24 
    25 
    2625/**
    2726 * A visitor that paints the OSM components in a map-like style.
     
    3029public class MapPaintVisitor extends SimplePaintVisitor {
    3130
     31    protected boolean useRealWidth;
     32    protected boolean zoomLevelDisplay;
     33    protected boolean fillAreas;
     34    protected Color untaggedColor;
     35    protected Color textColor;
     36    protected boolean currentDashed = false;
     37    protected int currentWidth = 0;
     38    protected Stroke currentStroke = null;   
     39    protected static final Font orderFont = new Font("Helvetica", Font.PLAIN, 8);
     40   
    3241        protected boolean isZoomOk(ElemStyle e) {
    3342                double circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter
    3443               
    3544                /* show everything, if the user wishes so */
    36                 if(!Main.pref.getBoolean("mappaint.zoomLevelDisplay",false)) {
     45                if(!zoomLevelDisplay) {
    3746                        return true;
    3847                }
     
    8190                        }
    8291                } else {
    83                         drawNode(n, n.selected ? getPreferencesColor("selected",
    84                                                                         Color.YELLOW)
    85                                 : getPreferencesColor("node", Color.RED));
     92                        drawNode(n, n.selected ? selectedColor : nodeColor);
    8693                }
    8794        }
     
    95102                ElemStyle segmentStyle = MapPaintPlugin.elemStyles.getStyle(ls);
    96103                if(isZoomOk(segmentStyle)) {
    97                         drawSegment(ls, getPreferencesColor("untagged",Color.GRAY),Main.pref.getBoolean("draw.segment.direction"));
     104                        drawSegment(ls, untaggedColor, showDirectionArrow);
    98105                }
    99106        }
     
    106113        @Override public void visit(Way w) {
    107114                double circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter
    108                 boolean showDirection = Main.pref.getBoolean("draw.segment.direction") ;
    109                 if (Main.pref.getBoolean("mappaint.useRealWidth",false) && showDirection && !w.selected) showDirection = false;
    110                 Color colour = getPreferencesColor("untagged",Color.GRAY);
     115                boolean showDirection = showDirectionArrow ;
     116                if (useRealWidth && showDirection && !w.selected) showDirection = false;
     117                Color colour = untaggedColor;
    111118                int width = 2;
    112119                int realWidth = 0; //the real width of the element in meters
     
    134141                        }
    135142                }
    136                 boolean fillAreas = Main.pref.getBoolean("mappaint.fillareas", true);
    137143               
    138144                if (area && fillAreas)
     
    144150                                if (area && fillAreas)
    145151                                        //Draw segments in a different colour so direction arrows show against the fill
    146                                         drawSegment(ls, w.selected ? getPreferencesColor("selected", Color.YELLOW) : getPreferencesColor("untagged",Color.GRAY),showDirection, width,true);
     152                                        drawSegment(ls, w.selected ? selectedColor : untaggedColor, showDirection, width,true);
    147153                                else
    148154                                        if (area)
    149                                                 drawSegment(ls, w.selected ? getPreferencesColor("selected", Color.YELLOW) : colour,showDirection, width,true);
     155                                                drawSegment(ls, w.selected ? selectedColor : colour, showDirection, width,true);
    150156                                        else
    151                                                 if (realWidth > 0 && Main.pref.getBoolean("mappaint.useRealWidth",false) && !showDirection){
     157                                                if (realWidth > 0 && useRealWidth && !showDirection){
    152158                                                        int tmpWidth = (int) (100 /  (float) (circum / realWidth));
    153159                                                        if (tmpWidth > width) width = tmpWidth;
    154160                                                }
    155161
    156                                                 drawSegment(ls, w.selected ? getPreferencesColor("selected", Color.YELLOW) : colour,showDirection, width,dashed);
    157                                 if (!ls.incomplete && Main.pref.getBoolean("draw.segment.order_number"))
     162                                                drawSegment(ls, w.selected ? selectedColor : colour,showDirection, width,dashed);
     163                                if (!ls.incomplete && showOrderNumber)
    158164                                {
    159165                                        try
    160166                                        {
    161                                                 g.setColor(w.selected ? getPreferencesColor("selected", Color.YELLOW) : colour);
     167                                                g.setColor(w.selected ? selectedColor : colour);
    162168                                                drawOrderNumber(ls, orderNumber);
    163169                                        }
     
    187193
    188194                g.setColor( w.selected ?
    189                                                 getPreferencesColor("selected", Color.YELLOW) : colour);
     195                                                selectedColor : colour);
    190196
    191197                g.fillPolygon(polygon);
     
    201207                if (name!=null && annotate)
    202208                {
    203                         g.setColor( getPreferencesColor ("text", Color.WHITE));
     209                        g.setColor(textColor);
    204210                        Font defaultFont = g.getFont();
    205                         g.setFont (new Font("Helvetica", Font.PLAIN, 8));
     211                        g.setFont (orderFont);
    206212                        g.drawString (name, p.x+w/2+2, p.y+h/2+2);
    207213                        g.setFont(defaultFont);
     
    209215                if (n.selected)
    210216                {
    211                         g.setColor (  getPreferencesColor("selected", Color.YELLOW) );
     217                        g.setColor (  selectedColor );
    212218                        g.drawRect (p.x-w/2-2,p.y-w/2-2, w+4, h+4);
    213219                }
     
    219225        // Altered - now specify width
    220226        @Override protected void drawSegment(Segment ls, Color col,boolean showDirection) {
    221                         if (Main.pref.getBoolean("mappaint.useRealWidth",false) && showDirection && !ls.selected) showDirection = false;
     227                        if (useRealWidth && showDirection && !ls.selected) showDirection = false;
    222228                        drawSegment(ls,col,showDirection,1,false);
    223229        }
     
    231237                if (ls.incomplete)
    232238                        return;
     239                if (ls.selected) {
     240                    col = selectedColor;
     241                }
     242                drawSeg(ls, col, showDirection, width, dashed);
     243        }
     244               
     245        private void drawSeg(Segment ls, Color col,boolean showDirection, int width,boolean dashed) {
     246                if (col != currentColor || width != currentWidth || dashed != currentDashed) {
     247                        displaySegments(col, width, dashed);
     248                }
    233249                Point p1 = nc.getPoint(ls.from.eastNorth);
    234250                Point p2 = nc.getPoint(ls.to.eastNorth);
     
    239255                if ((p1.x > nc.getWidth()) && (p2.x > nc.getWidth())) return ;
    240256                if ((p1.y > nc.getHeight()) && (p2.y > nc.getHeight())) return ;
    241                 Graphics2D g2d = (Graphics2D)g;
    242                 if (ls.selected)
    243                         col = getPreferencesColor("selected", Color.YELLOW);
    244                 g.setColor(col);
     257                //if (ls.selected)
     258                //      col = selectedColor;
     259                //g.setColor(col);
    245260                //g.setWidth(width);
    246                 if (dashed)
    247                         g2d.setStroke(new BasicStroke(width,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,new float[] {9},0));
    248                 else
    249                         g2d.setStroke(new BasicStroke(width,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
    250 
    251                 g.drawLine(p1.x, p1.y, p2.x, p2.y);
     261                //if (dashed)
     262                //      g2d.setStroke(new BasicStroke(width,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,new float[] {9},0));
     263                //else
     264                //      g2d.setStroke(new BasicStroke(width,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
     265
     266                //g.drawLine(p1.x, p1.y, p2.x, p2.y);
     267                currrentPath.moveTo(p1.x, p1.y);
     268                currrentPath.lineTo(p2.x, p2.y);
    252269
    253270                if (showDirection) {
    254271                        double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI;
    255                         g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
    256                         g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
    257                 }
    258                 g2d.setStroke(new BasicStroke(1));
    259                
    260         }
    261 
     272                        //g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
     273                        //g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
     274                        currrentPath.lineTo((int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
     275                        currrentPath.moveTo((int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
     276                        currrentPath.lineTo(p2.x, p2.y);
     277                }
     278                //g2d.setStroke(new BasicStroke(1));
     279               
     280        }
     281       
     282        protected void displaySegments() {
     283            displaySegments(null, 0, false);
     284        }
     285       
     286        protected void displaySegments(Color newColor, int newWidth, boolean newDash) {
     287           
     288                if (currrentPath != null) {
     289                        Graphics2D g2d = (Graphics2D)g;
     290                        g2d.setColor(currentColor);
     291                        if (currentStroke == null) {
     292                            if (currentDashed)
     293                                g2d.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,new float[] {9},0));
     294                            else
     295                                g2d.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
     296                        }
     297                        g2d.draw(currrentPath);
     298                        g2d.setStroke(new BasicStroke(1));
     299                       
     300                        currrentPath = new GeneralPath();
     301                        currentColor = newColor;
     302                        currentWidth = newWidth;
     303                        currentDashed = newDash;
     304                        currentStroke = null;
     305                }
     306        }
    262307
    263308        /**
     
    279324        // Shows areas before non-areas
    280325        public void visitAll(DataSet data) {
     326                inactiveColor = getPreferencesColor("inactive", Color.DARK_GRAY);
     327                selectedColor = getPreferencesColor("selected", Color.YELLOW);
     328                nodeColor = getPreferencesColor("node", Color.RED);
     329                segmentColor = getPreferencesColor("segment", darkgreen);
     330                dfltWayColor = getPreferencesColor("way", darkblue);
     331                incompleteColor = getPreferencesColor("incomplete way", darkerblue);
     332                backgroundColor = getPreferencesColor("background", Color.BLACK);
     333                untaggedColor = getPreferencesColor("untagged",Color.GRAY);
     334                textColor = getPreferencesColor ("text", Color.WHITE);
     335                showDirectionArrow = Main.pref.getBoolean("draw.segment.direction");
     336                showOrderNumber = Main.pref.getBoolean("draw.segment.order_number");
     337                useRealWidth = Main.pref.getBoolean("mappaint.useRealWidth",false);
     338                zoomLevelDisplay = Main.pref.getBoolean("mappaint.zoomLevelDisplay",false);
     339                fillAreas = Main.pref.getBoolean("mappaint.fillareas", true);
    281340               
    282341                Collection<Way> noAreaWays = new LinkedList<Way>();
     
    308367                                osm.visit(this);
    309368                        }
     369                displaySegments();
    310370        }
    311371}
Note: See TracChangeset for help on using the changeset viewer.