Ticket #5627: optimize-speed.patch

File optimize-speed.patch, 5.9 KB (added by bilbo, 15 years ago)

Patch to improve speed of drawing nodes

  • src/org/openstreetmap/josm/gui/mappaint/SimpleNodeElemStyle.java

     
    3232        } else {
    3333
    3434            Color color;
     35            boolean isConnection = n.isConnectionNode();
    3536
    3637            if (painter.isInactive() || n.isDisabled()) {
    3738                color = settings.getInactiveColor();
    3839            } else if (selected) {
    3940                color = member ? settings.getRelationSelectedColor() : settings.getSelectedColor();
    40             } else if (n.isConnectionNode()) {
     41            } else if (isConnection) {
    4142                if (n.isTagged()) {
    4243                    color = settings.getTaggedConnectionColor();
    4344                } else {
     
    5354
    5455            final int size = max((selected ? settings.getSelectedNodeSize() : 0),
    5556                                    (n.isTagged() ? settings.getTaggedNodeSize() : 0),
    56                                     (n.isConnectionNode() ? settings.getConnectionNodeSize() : 0),
     57                                    (isConnection ? settings.getConnectionNodeSize() : 0),
    5758                                    settings.getUnselectedNodeSize());
    5859
    5960            final boolean fill = (selected && settings.isFillSelectedNode()) ||
    6061                                    (n.isTagged() && settings.isFillTaggedNode()) ||
    61                                     (n.isConnectionNode() && settings.isFillConnectionNode()) ||
     62                                    (isConnection && settings.isFillConnectionNode()) ||
    6263                                    settings.isFillUnselectedNode();
    6364
    6465            painter.drawNode(n, color, size, fill, name);
  • src/org/openstreetmap/josm/data/osm/Node.java

     
    233233    }
    234234
    235235    public boolean isConnectionNode() {
    236         return (OsmPrimitive.getFilteredList(getReferrers(), Way.class)).size() > 1;
     236        return isReferredByWays(2);
    237237    }
    238238
    239239    public String get3892DebugInfo() {
  • src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

     
    12851285        return result;
    12861286    }
    12871287
     1288    /**
     1289      Return true, if this primitive is referred by at least n ways
     1290      @param n Minimal number of ways to return true. Must be positive
     1291     */
     1292    public final boolean isReferredByWays(int n) {
     1293        // Count only referrers that are members of the same dataset (primitive can have some fake references, for example
     1294        // when way is cloned
     1295        Object referrers = this.referrers;
     1296        if (referrers == null) return false;
     1297        checkDataset();
     1298        if (referrers instanceof OsmPrimitive) {
     1299          if (!(referrers instanceof Way)) return false;
     1300          OsmPrimitive ref = (OsmPrimitive)referrers;
     1301          if (ref.dataSet == dataSet) {
     1302            return (n<=1);
     1303          }
     1304          return false;
     1305        } else {
     1306          int counter=0;
     1307          for (OsmPrimitive o:(OsmPrimitive[])referrers) {
     1308            if (dataSet == o.dataSet && o instanceof Way) {
     1309              counter++;
     1310            }
     1311          }
     1312          return counter>=n;
     1313        }
     1314    }
     1315
     1316
    12881317    /*-----------------
    12891318     * OTHER METHODS
    12901319     *----------------/
  • src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java

     
    215215     */
    216216    public void drawNode(Node n, Color color, int size, boolean fill, String name) {
    217217        if (size > 1) {
    218             int radius = size / 2;
    219218            Point p = nc.getPoint(n);
    220             if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth())
    221                     || (p.y > nc.getHeight()))
    222                 return;
     219            if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return;
     220            int radius = size / 2;
    223221
    224222            if (inactive || n.isDisabled()) {
    225223                g.setColor(inactiveColor);
     
    227225                g.setColor(color);
    228226            }
    229227            if (fill) {
    230                 g.fillRect(p.x - radius, p.y - radius, size, size);
    231                 g.drawRect(p.x - radius, p.y - radius, size, size);
     228                g.fillRect(p.x - radius, p.y - radius, size + 1, size + 1);
    232229            } else {
    233230                g.drawRect(p.x - radius, p.y - radius, size, size);
    234231            }
  • src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintVisitor.java

     
    110110
    111111    public void drawNode(Node n) {
    112112        /* check, if the node is visible at all */
    113         if((n.getEastNorth().east()  > maxEN.east() ) ||
    114                 (n.getEastNorth().north() > maxEN.north()) ||
    115                 (n.getEastNorth().east()  < minEN.east() ) ||
    116                 (n.getEastNorth().north() < minEN.north()))
     113        EastNorth en=n.getEastNorth();
     114        if((en.east()  > maxEN.east() ) ||
     115                (en.north() > maxEN.north()) ||
     116                (en.east()  < minEN.east() ) ||
     117                (en.north() < minEN.north()))
    117118            return;
    118119
    119120        ElemStyle nodeStyle = getPrimitiveStyle(n, false);