Changeset 2663 in josm


Ignore:
Timestamp:
2009-12-20T08:28:24+01:00 (12 years ago)
Author:
jttt
Message:

Simplified MapPaintVisitor (removed current* global state)

Location:
trunk/src/org/openstreetmap/josm
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java

    r2659 r2663  
    1515import java.awt.Polygon;
    1616import java.awt.Rectangle;
    17 import java.awt.Stroke;
    1817import java.awt.geom.GeneralPath;
    1918import java.awt.geom.Point2D;
     
    6564    protected Color textColor;
    6665    protected Color areaTextColor;
    67     protected float[] currentDashed = new float[0];
    68     protected Color currentDashedColor;
    69     protected int currentWidth = 0;
    70     protected Stroke currentStroke = null;
    7166    protected Font orderFont;
    7267    protected ElemStyles.StyleSet styles;
     
    294289            for(LineElemStyle s : l.overlays) {
    295290                if(!s.over) {
    296                     lastN = null;
    297                     for(Node n : w.getNodes()) {
    298                         if(lastN != null) {
    299                             drawSeg(lastN, n, s.color != null  && !data.isSelected(w) ? s.color : color,
    300                                     false, s.getWidth(width), s.getDashed(), s.dashedColor);
    301                         }
    302                         lastN = n;
    303                     }
     291                    drawWay(w, s.color != null && !data.isSelected(w) ? s.color : color, s.getWidth(width),
     292                            s.getDashed(), s.dashedColor, false, false);
    304293                }
    305294            }
     
    307296
    308297        /* draw the way */
    309         lastN = null;
    310         Iterator<Node> it = w.getNodes().iterator();
    311         while (it.hasNext())
    312         {
    313             Node n = it.next();
    314             if(lastN != null) {
    315                 drawSeg(lastN, n, color,
    316                         showOnlyHeadArrowOnly ? !it.hasNext() : showDirection, width, dashed, dashedColor);
    317             }
    318             lastN = n;
    319         }
     298        drawWay(w, color, width, dashed, dashedColor, showDirection, showOnlyHeadArrowOnly);
    320299
    321300        /* draw overlays above the way */
    322         if(l != null && l.overlays != null)
    323         {
    324             for(LineElemStyle s : l.overlays)
    325             {
    326                 if(s.over)
    327                 {
    328                     lastN = null;
    329                     for(Node n : w.getNodes())
    330                     {
    331                         if(lastN != null)
    332                         {
    333                             drawSeg(lastN, n, s.color != null && !data.isSelected(w) ? s.color : color,
    334                                     false, s.getWidth(width), s.getDashed(), s.dashedColor);
    335                         }
    336                         lastN = n;
    337                     }
     301        if(l != null && l.overlays != null)  {
     302            for(LineElemStyle s : l.overlays) {
     303                if(s.over) {
     304                    drawWay(w, s.color != null && !data.isSelected(w) ? s.color : color, s.getWidth(width),
     305                            s.getDashed(), s.dashedColor, false, false);
    338306                }
    339307            }
     
    354322            }
    355323        }
    356         displaySegments();
     324    }
     325
     326    public void drawWay(Way way, Color color, int width, float dashed[], Color dashedColor, boolean showDirection,
     327            boolean showHeadArrowOnly) {
     328
     329        GeneralPath path = new GeneralPath();
     330
     331        Node lastN = null;
     332        Iterator<Node> it = way.getNodes().iterator();
     333        while (it.hasNext()) {
     334            Node n = it.next();
     335            if(lastN != null) {
     336                drawSegment(path, nc.getPoint(lastN), nc.getPoint(n), (showHeadArrowOnly ? !it.hasNext() : showDirection));
     337            }
     338            lastN = n;
     339        }
     340        displaySegments(path, color, width, dashed, dashedColor);
     341    }
     342
     343    private void displaySegments(GeneralPath path, Color color, int width, float dashed[], Color dashedColor) {
     344        if (path != null) {
     345            g.setColor(color);
     346            if (useStrokes > dist) {
     347                if (dashed.length > 0) {
     348                    g.setStroke(new BasicStroke(width,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0, dashed,0));
     349                } else {
     350                    g.setStroke(new BasicStroke(width,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
     351                }
     352            }
     353            g.draw(path);
     354
     355            if(useStrokes > dist && dashedColor != null) {
     356                g.setColor(dashedColor);
     357                if (dashed.length > 0) {
     358                    float[] dashedOffset = new float[dashed.length];
     359                    System.arraycopy(dashed, 1, dashedOffset, 0, dashed.length - 1);
     360                    dashedOffset[dashed.length-1] = dashed[0];
     361                    float offset = dashedOffset[0];
     362                    g.setStroke(new BasicStroke(width,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,dashedOffset,offset));
     363                } else {
     364                    g.setStroke(new BasicStroke(width,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
     365                }
     366                g.draw(path);
     367            }
     368
     369            if(useStrokes > dist) {
     370                g.setStroke(new BasicStroke());
     371            }
     372        }
    357373    }
    358374
     
    11841200    }
    11851201
    1186     private void drawSeg(Node n1, Node n2, Color col, boolean showDirection, int width, float dashed[], Color dashedColor) {
    1187         if (col != currentColor || width != currentWidth || !Arrays.equals(dashed,currentDashed) || dashedColor != currentDashedColor) {
    1188             displaySegments(col, width, dashed, dashedColor);
    1189         }
    1190         Point p1 = nc.getPoint(n1);
    1191         Point p2 = nc.getPoint(n2);
    1192 
    1193         if (!isSegmentVisible(p1, p2))
    1194             return;
    1195         currentPath.moveTo(p1.x, p1.y);
    1196         currentPath.lineTo(p2.x, p2.y);
    1197 
    1198         if (showDirection) {
    1199             double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI;
    1200             currentPath.lineTo((int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
    1201             currentPath.moveTo((int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
    1202             currentPath.lineTo(p2.x, p2.y);
    1203         }
    1204     }
    1205 
    1206     @Override
    1207     protected void displaySegments() {
    1208         displaySegments(null, 0, new float[0], null);
    1209     }
    1210 
    1211     protected void displaySegments(Color newColor, int newWidth, float newDash[], Color newDashedColor) {
    1212         if (currentPath != null) {
    1213             g.setColor(inactive ? inactiveColor : currentColor);
    1214             if (currentStroke == null && useStrokes > dist) {
    1215                 if (currentDashed.length > 0) {
    1216                     g.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,currentDashed,0));
    1217                 } else {
    1218                     g.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
    1219                 }
    1220             }
    1221             g.draw(currentPath);
    1222 
    1223             if(currentDashedColor != null) {
    1224                 g.setColor(currentDashedColor);
    1225                 if (currentStroke == null && useStrokes > dist) {
    1226                     if (currentDashed.length > 0) {
    1227                         float[] currentDashedOffset = new float[currentDashed.length];
    1228                         System.arraycopy(currentDashed, 1, currentDashedOffset, 0, currentDashed.length - 1);
    1229                         currentDashedOffset[currentDashed.length-1] = currentDashed[0];
    1230                         float offset = currentDashedOffset[0];
    1231                         g.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,currentDashedOffset,offset));
    1232                     } else {
    1233                         g.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
    1234                     }
    1235                 }
    1236                 g.draw(currentPath);
    1237             }
    1238 
    1239             if(useStrokes > dist) {
    1240                 g.setStroke(new BasicStroke(1));
    1241             }
    1242 
    1243             currentPath = new GeneralPath();
    1244             currentColor = newColor;
    1245             currentWidth = newWidth;
    1246             currentDashed = newDash;
    1247             currentDashedColor = newDashedColor;
    1248             currentStroke = null;
    1249         }
    1250     }
    12511202
    12521203    /**
     
    14021353        /*** SELECTED  ***/
    14031354        for (final OsmPrimitive osm : data.getSelected()) {
    1404             if (osm.isUsable() && !(osm instanceof Node) && osm.mappaintDrawnCode != paintid
    1405             ) {
     1355            if (osm.isUsable() && !(osm instanceof Node) && osm.mappaintDrawnCode != paintid) {
    14061356                osm.visit(new AbstractVisitor() {
    14071357                    public void visit(Way w) {
     
    14101360
    14111361                    public void visit(Node n) {
    1412                         drawNode(n);
     1362                        // Selected nodes are painted in following part
    14131363                    }
    14141364
    14151365                    public void visit(Relation r) {
    14161366                        /* TODO: is it possible to do this like the nodes/ways code? */
     1367                        // Only nodes are painted, ways was already painted before (this might cause that
     1368                        // way in selected relation is hidden by another way)
    14171369                        for (RelationMember m : r.getMembers()) {
    14181370                            if (m.isNode() && m.getMember().isDrawable()) {
     
    14251377        }
    14261378
    1427         /*** DISPLAY CACHED SEGMENTS (WAYS) NOW ***/
    1428         displaySegments();
    1429 
    14301379        /*** NODES ***/
    14311380        for (final Node osm: data.searchNodes(bbox)) {
    14321381            if (!osm.isIncomplete() && !osm.isDeleted() && (data.isSelected(osm) || !osm.isFiltered())
    1433                     && osm.mappaintDrawnCode != paintid)
    1434             {
     1382                    && osm.mappaintDrawnCode != paintid) {
    14351383                drawNode(osm);
    14361384            }
    14371385        }
    14381386
    1439         /*** VIRTUAL  ***/
    1440         if (virtualNodeSize != 0) {
    1441             currentColor = nodeColor;
    1442             for (final OsmPrimitive osm: data.searchWays(bbox)) {
    1443                 if (osm.isUsable() && !osm.isFiltered())
    1444                 {
    1445                     /* TODO: move this into the SimplePaint code? */
    1446                     visitVirtual((Way)osm);
    1447                 }
    1448             }
    1449             displaySegments(null);
    1450         }
     1387        drawVirtualNodes(data.searchWays(bbox));
    14511388    }
    14521389
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java

    r2659 r2663  
    1515import java.awt.Stroke;
    1616import java.awt.geom.GeneralPath;
     17import java.util.Collection;
    1718import java.util.Iterator;
    1819
     
    215216        //}
    216217
    217         if (virtualNodeSize != 0) {
    218             //    profilerN = 0;
    219             currentColor = nodeColor;
    220             for (final OsmPrimitive osm:data.getWays()){
    221                 if (!osm.isDeleted() && !osm.isDisabled() && !osm.isFiltered()) {
    222                     visitVirtual((Way) osm);
    223                     //                profilerN++;
    224                 }
    225             }
    226             displaySegments();
    227 
    228             //    if(profiler)
    229             //    {
    230             //        System.out.format("Virtual  : %4dms, n=%5d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN);
    231             //        profilerLast = java.lang.System.currentTimeMillis();
    232             //    }
    233         }
     218        drawVirtualNodes(data.getWays());
    234219
    235220        //if(profiler)
     
    272257    }
    273258
    274     public void visitVirtual(Way w) {
     259    public void drawVirtualNodes(Collection<Way> ways) {
     260
     261        if (virtualNodeSize != 0) {
     262            GeneralPath path = new GeneralPath();
     263            for (Way osm: ways){
     264                if (osm.isUsable() && !osm.isFiltered()) {
     265                    visitVirtual(path, osm);
     266                }
     267            }
     268            g.setColor(nodeColor);
     269            g.draw(path);
     270        }
     271    }
     272
     273    public void visitVirtual(GeneralPath path, Way w) {
    275274        Iterator<Node> it = w.getNodes().iterator();
    276275        if (it.hasNext()) {
     
    283282                    int x = (p.x+lastP.x)/2;
    284283                    int y = (p.y+lastP.y)/2;
    285                     currentPath.moveTo(x-virtualNodeSize, y);
    286                     currentPath.lineTo(x+virtualNodeSize, y);
    287                     currentPath.moveTo(x, y-virtualNodeSize);
    288                     currentPath.lineTo(x, y+virtualNodeSize);
     284                    path.moveTo(x-virtualNodeSize, y);
     285                    path.lineTo(x+virtualNodeSize, y);
     286                    path.moveTo(x, y-virtualNodeSize);
     287                    path.lineTo(x, y+virtualNodeSize);
    289288                }
    290289                lastP = p;
     
    435434    }
    436435
     436    protected void drawSegment(GeneralPath path, Point p1, Point p2, boolean showDirection) {
     437        if (isSegmentVisible(p1, p2)) {
     438            path.moveTo(p1.x, p1.y);
     439            path.lineTo(p2.x, p2.y);
     440
     441            if (showDirection) {
     442                double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI;
     443                path.lineTo((int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
     444                path.moveTo((int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
     445                path.lineTo(p2.x, p2.y);
     446            }
     447        }
     448    }
     449
    437450    /**
    438451     * Draw a line with the given color.
     
    442455            displaySegments(col);
    443456        }
    444 
    445         if (isSegmentVisible(p1, p2)) {
    446             currentPath.moveTo(p1.x, p1.y);
    447             currentPath.lineTo(p2.x, p2.y);
    448 
    449             if (showDirection) {
    450                 double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI;
    451                 currentPath.lineTo((int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
    452                 currentPath.moveTo((int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
    453                 currentPath.lineTo(p2.x, p2.y);
    454             }
    455         }
     457        drawSegment(currentPath, p1, p2, showDirection);
    456458    }
    457459
  • trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java

    r2662 r2663  
    66package org.openstreetmap.josm.gui.layer.geoimage;
    77
     8import java.awt.Image;
    89import java.io.File;
    910import java.util.Date;
    10 import java.awt.Image;
    1111
    1212import org.openstreetmap.josm.data.coor.CachedLatLon;
     
    2929
    3030    Image thumbnail;
    31    
     31
    3232    ImageEntry tmp;
    3333
    3434    public CachedLatLon getPos() {
    35         if (tmp != null) {
     35        if (tmp != null)
    3636            return tmp.pos;
    37         }
    3837        return pos;
    3938    }
    4039    public Double getSpeed() {
    41         if (tmp != null) {
     40        if (tmp != null)
    4241            return tmp.speed;
    43         }
    4442        return speed;
    4543    }
    4644    public Double getElevation() {
    47         if (tmp != null) {
     45        if (tmp != null)
    4846            return tmp.elevation;
    49         }
    5047        return elevation;
    5148    }
     
    5653        this.speed = speed;
    5754    }
    58     public void setElevation(Double speed) {
     55    public void setElevation(Double elevation) {
    5956        this.elevation = elevation;
    6057    }
     
    7067        return (ImageEntry) c;
    7168    }
    72    
     69
    7370    public void setCoor(LatLon latlon)
    7471    {
     
    8683            return 1;
    8784    }
    88    
     85
    8986    public void applyTmp() {
    9087        if (tmp != null) {
     
    10097        tmp.tmp = null;
    10198    }
    102    
     99
    103100    public boolean isTagged() {
    104101        return pos != null;
    105102    }
    106    
     103
    107104    /**
    108105     * only partial info
    109106     */
     107    @Override
    110108    public String toString() {
    111109        String result = file.getName()+": "+
    112             "pos = "+pos+" | "+
    113             "exifCoor = "+exifCoor+" | "+
    114             (tmp == null ? " tmp==null" :
    115                 " [tmp] pos = "+tmp.pos+"");
     110        "pos = "+pos+" | "+
     111        "exifCoor = "+exifCoor+" | "+
     112        (tmp == null ? " tmp==null" :
     113            " [tmp] pos = "+tmp.pos+"");
    116114        return result;
    117115    }
Note: See TracChangeset for help on using the changeset viewer.