Changeset 1263 in josm


Ignore:
Timestamp:
14.01.2009 23:46:14 (3 years ago)
Author:
ulfl
Message:

from Dirk Stoecker: fix multipolygon display after (my) performance tweaks

from myself: some minor changes like adding a "mappaint.showname" option to be able to globally switch off icon annotations

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

Legend:

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

    r1254 r1263  
    3939    public Map<String, String> keys; 
    4040 
    41     /** 
    42      * The key/value list for this primitive. 
    43      */ 
     41    /* mappaint data */ 
     42    public ElemStyle mappaintStyle = null; 
     43    public boolean isMappaintArea = false; 
     44    public Integer mappaintVisibleCode = 0; 
     45    public Integer mappaintDrawnCode = 0; 
     46    public Integer mappaintDrawnAreaCode = 0; 
    4447    public Collection<String> errors; 
     48 
     49    public void putError(String text, Boolean isError) 
     50    { 
     51        if(errors == null) 
     52            errors = new ArrayList<String>(); 
     53        String s = isError ? tr("Error: {0}", text) : tr("Warning: {0}", text); 
     54        errors.add(s); 
     55    } 
     56    public void clearErrors() 
     57    { 
     58        errors = null; 
     59    } 
     60    /* end of mappaint data */ 
    4561 
    4662    /** 
     
    140156    private static Collection<String> directionKeys = null; 
    141157 
    142          
    143     /* mappaint style cache */ 
    144     public ElemStyle mappaintStyle = null; 
    145     public boolean isMappaintArea = false; 
    146          
    147158    /** 
    148159     * Implementation of the visitor scheme. Subclasses have to call the correct 
     
    331342        } 
    332343    } 
    333  
    334     public void putError(String text, Boolean isError) 
    335     { 
    336         if(errors == null) 
    337             errors = new ArrayList<String>(); 
    338         String s = isError ? tr("Error: {0}", text) : tr("Warning: {0}", text); 
    339         errors.add(s); 
    340     } 
    341     public void clearErrors() 
    342     { 
    343         errors = null; 
    344     } 
    345344} 
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java

    r1255 r1263  
    4040    protected boolean fillAreas; 
    4141    protected boolean drawMultipolygon; 
     42    protected boolean showName; 
    4243    protected int fillAlpha; 
    4344    protected Color untaggedColor; 
     
    5152    protected String regionalNameOrder[]; 
    5253    protected Boolean selectedCall; 
    53     protected Collection<OsmPrimitive> alreadyDrawn; 
    54     protected Collection<Way> alreadyDrawnAreas; 
    5554    protected Boolean useStyleCache; 
    56      
     55    private static int paintid = 0; 
     56    private static int viewid = 0; 
     57 
    5758    protected int profilerVisibleNodes; 
    5859    protected int profilerVisibleWays; 
    5960    protected int profilerVisibleAreas; 
     61    protected int profilerSegments; 
     62    protected int profilerVisibleSegments; 
     63    protected boolean profilerOmitDraw; 
    6064 
    6165    protected boolean isZoomOk(ElemStyle e) { 
     
    105109        // check, if the node is visible at all 
    106110        Point p = nc.getPoint(n.eastNorth); 
    107         if ((!selectedCall && n.selected) || (p.x < 0) || (p.y < 0) 
    108         || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return; 
    109          
     111        if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) 
     112        { 
     113            n.mappaintVisibleCode = viewid; 
     114            return; 
     115        } 
     116        n.mappaintVisibleCode = 0; 
     117 
    110118        profilerVisibleNodes++; 
    111119         
    112120        IconElemStyle nodeStyle = (IconElemStyle)getPrimitiveStyle(n); 
     121 
     122        if(profilerOmitDraw) 
     123            return; 
     124             
    113125        if (nodeStyle != null && isZoomOk(nodeStyle)) 
    114126            drawNode(n, nodeStyle.icon, nodeStyle.annotate, n.selected); 
     
    126138     */ 
    127139    public void visit(Way w) { 
    128         if(w.nodes.size() < 2 && (!selectedCall && w.selected)) 
     140        if(w.nodes.size() < 2) 
     141        { 
     142            w.mappaintVisibleCode = viewid; 
    129143            return; 
     144        } 
    130145 
    131146        // check, if the way is visible at all 
    132147        Polygon polygon = getPolygon(w); 
    133148        if(!isPolygonVisible(polygon)) 
     149        { 
     150            w.mappaintVisibleCode = viewid; 
    134151            return; 
    135              
     152        } 
     153 
    136154        ElemStyle wayStyle = getPrimitiveStyle(w); 
    137155 
    138156        if(!isZoomOk(wayStyle)) 
     157        { 
     158            w.mappaintVisibleCode = viewid; 
    139159            return; 
     160        } 
     161 
     162        w.mappaintVisibleCode = 0; 
    140163 
    141164        if(wayStyle==null) 
     
    143166            // way without style 
    144167            profilerVisibleWays++; 
    145             drawWay(w, null, untaggedColor, w.selected); 
     168            if(!profilerOmitDraw) 
     169                drawWay(w, null, untaggedColor, w.selected); 
    146170        } 
    147171        else if(wayStyle instanceof LineElemStyle) 
     
    149173            // way with line style 
    150174            profilerVisibleWays++; 
    151             drawWay(w, (LineElemStyle)wayStyle, untaggedColor, w.selected); 
     175            if(!profilerOmitDraw) 
     176                drawWay(w, (LineElemStyle)wayStyle, untaggedColor, w.selected); 
    152177        } 
    153178        else if (wayStyle instanceof AreaElemStyle) 
    154179        { 
    155180            // way with area style 
    156             if (fillAreas) 
    157             { 
    158                 profilerVisibleAreas++; 
    159                 drawArea(polygon, w.selected ? selectedColor : ((AreaElemStyle)wayStyle).color); 
    160             } 
    161             drawWay(w, ((AreaElemStyle)wayStyle).line, ((AreaElemStyle)wayStyle).color, w.selected); 
     181            if(!profilerOmitDraw) 
     182            { 
     183                if (fillAreas) 
     184                { 
     185                    profilerVisibleAreas++; 
     186                    drawArea(polygon, w.selected ? selectedColor : ((AreaElemStyle)wayStyle).color); 
     187                } 
     188                drawWay(w, ((AreaElemStyle)wayStyle).line, ((AreaElemStyle)wayStyle).color, w.selected); 
     189            } 
    162190        } 
    163191    } 
     
    360388                    drawSelected(m.member, styles != null ? styles.get(m.member) 
    361389                    : null, true, true); 
    362                 alreadyDrawn.add(m.member); 
    363390            } 
    364391        } 
     
    390417                drawNode((Node)osm, selectedColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode); 
    391418        } 
     419        osm.mappaintDrawnCode = paintid; 
    392420    } 
    393421 
    394422    public void visit(Relation r) { 
     423    
     424        r.mappaintVisibleCode = 0; 
     425        /* TODO implement visible handling for relations too */ 
     426 
     427        // TODO: is it possible to do this like the nodes/ways code? 
     428        if(profilerOmitDraw) 
     429            return; 
     430 
    395431        // draw multipolygon relations including their ways 
    396432        // other relations are only drawn when selected 
    397         if(r.selected) 
    398         { 
    399             if(selectedCall) 
    400             { 
    401                 for (RelationMember m : r.members) 
    402                 { 
    403                     /* second call - draw nodes */ 
    404                     if (m.member != null && !m.member.incomplete && !m.member.deleted 
    405                     && m.member instanceof Node) 
    406                     { 
    407                         drawSelected(m.member, styles != null ? styles.get(m.member) : null, true, true); 
    408                         alreadyDrawn.add(m.member); 
    409                     } 
    410                 } 
    411                 return; 
    412             } 
     433        if(r.selected && selectedCall) 
     434        { 
     435            for (RelationMember m : r.members) 
     436            { 
     437                if (m.member != null && !m.member.incomplete && !m.member.deleted 
     438                && m.member instanceof Node) 
     439                { 
     440                    drawSelected(m.member, styles != null ? styles.get(m.member) : null, true, true); 
     441                } 
     442            } 
     443            return; 
    413444        } 
    414445        if (!drawMultipolygon || r.keys == null || !"multipolygon".equals(r.keys.get("type"))) 
     
    429460        for (RelationMember m : r.members) 
    430461        { 
    431             if(m.member == null) /* Should not happen, must be a bug elsewhere */ 
     462            if(m.member == null)  
    432463                r.putError(tr("Empty member in relation."), true); 
    433464            else if(m.member.deleted) 
     
    462493                else 
    463494                { 
    464                     /* nodes drawn on second call */ 
    465495                    r.putError(tr("Non-Way ''{0}'' in multipolygon.", 
    466496                    m.member.getName()), true); 
     
    470500 
    471501        ElemStyle wayStyle = styles != null ? styles.get(r) : null; 
    472         /* find one wayStyle, prefer the style from Relation or take the first 
    473         one of outer rings */ 
    474502        if(styles != null && (wayStyle == null || !(wayStyle instanceof AreaElemStyle))) 
    475503        { 
     
    486514            Collection<Way> join = new LinkedList<Way>(); 
    487515 
    488             /* parse all outer rings and join them */ 
    489516            for (Way w : outer) 
    490517            { 
     
    498525            } 
    499526 
    500             /* parse all inner rings and join them */ 
    501527            join.clear(); 
    502528            for (Way w : inner) 
     
    516542                r.getName()), true); 
    517543            } 
    518             else if(zoomok) /* draw */ 
     544            else if(zoomok)  
    519545            { 
    520546                class PolyData { 
     
    540566                                --contains; 
    541567                        } 
    542                         if(contains == 0) return 1; /* inside */ 
    543                         if(contains == p.npoints) return 0; /* outside */ 
    544                         return 2; /* mixed */ 
     568                        if(contains == 0) return 1;  
     569                        if(contains == p.npoints) return 0;  
     570                        return 2;  
    545571                    } 
    546572                    public void addInner(Polygon p) 
     
    627653                        || r.selected); 
    628654                    } 
    629                     alreadyDrawn.add(wInner); 
     655                    wInner.mappaintDrawnCode = paintid; 
    630656                } 
    631657                else 
     
    635661                        drawSelected(wInner, innerStyle, 
    636662                        !wayStyle.equals(innerStyle), wInner.selected); 
    637                         alreadyDrawn.add(wInner); 
    638663                    } 
    639664                    if(wayStyle.equals(innerStyle)) 
     
    642667                        wInner.getName()), false); 
    643668                        if(!r.selected) 
    644                             alreadyDrawnAreas.add(wInner); 
     669                            wInner.mappaintDrawnAreaCode = paintid; 
    645670                    } 
    646671                } 
     
    657682                        || r.selected); 
    658683                    } 
    659                     alreadyDrawn.add(wOuter); 
     684                    wOuter.mappaintDrawnCode = paintid; 
    660685                } 
    661686                else 
     
    670695                    { 
    671696                        drawSelected(wOuter, outerStyle, false, false); 
    672                         alreadyDrawn.add(wOuter); 
    673                     } 
    674 //                    else if(outerStyle instanceof AreaElemStyle) 
    675                         alreadyDrawnAreas.add(wOuter); 
     697                    } 
     698                    else if(outerStyle instanceof AreaElemStyle) 
     699                        wOuter.mappaintDrawnAreaCode = paintid; 
    676700                } 
    677701            } 
     
    705729        int w = icon.getIconWidth(), h=icon.getIconHeight(); 
    706730        icon.paintIcon ( Main.map.mapView, g, p.x-w/2, p.y-h/2 ); 
    707         String name = getNodeName(n); 
    708         if (name!=null && annotate) 
    709         { 
    710             g.setColor(textColor); 
    711             Font defaultFont = g.getFont(); 
    712             g.setFont (orderFont); 
    713             g.drawString (name, p.x+w/2+2, p.y+h/2+2); 
    714             g.setFont(defaultFont); 
     731        if(showName) 
     732        { 
     733            String name = getNodeName(n); 
     734            if (name!=null && annotate) 
     735            { 
     736                g.setColor(textColor); 
     737                Font defaultFont = g.getFont(); 
     738                g.setFont (orderFont); 
     739                g.drawString (name, p.x+w/2+2, p.y+h/2+2); 
     740                g.setFont(defaultFont); 
     741            } 
    715742        } 
    716743        if (selected) 
     
    733760 
    734761    private void drawSeg(Node n1, Node n2, Color col, boolean showDirection, int width, boolean dashed) { 
     762        profilerSegments++; 
    735763        if (col != currentColor || width != currentWidth || dashed != currentDashed) { 
    736764            displaySegments(col, width, dashed); 
     
    742770            return; 
    743771        } 
     772        profilerVisibleSegments++; 
    744773        currentPath.moveTo(p1.x, p1.y); 
    745774        currentPath.lineTo(p2.x, p2.y); 
     
    797826                g.drawRect(p.x - radius, p.y - radius, size, size); 
    798827 
    799             String name = getNodeName(n); 
    800             if (name!=null /* && annotate */) 
    801             { 
    802                 g.setColor(textColor); 
    803                 Font defaultFont = g.getFont(); 
    804                 g.setFont (orderFont); 
    805                 g.drawString (name, p.x+radius+2, p.y+radius+2); 
    806                 g.setFont(defaultFont); 
     828            if(showName) 
     829            { 
     830                String name = getNodeName(n); 
     831                if (name!=null /* && annotate */) 
     832                { 
     833                    g.setColor(textColor); 
     834                    Font defaultFont = g.getFont(); 
     835                    g.setFont (orderFont); 
     836                    g.drawString (name, p.x+radius+2, p.y+radius+2); 
     837                    g.setFont(defaultFont); 
     838                } 
    807839            } 
    808840        } 
     
    820852 
    821853        boolean profiler = Main.pref.getBoolean("mappaint.profiler",false); 
     854        profilerOmitDraw = Main.pref.getBoolean("mappaint.profiler.omitdraw",false); 
     855         
    822856        useStyleCache = Main.pref.getBoolean("mappaint.cache",true); 
    823857        fillAreas = Main.pref.getBoolean("mappaint.fillareas", true); 
    824858        fillAlpha = Math.min(255, Math.max(0, Integer.valueOf(Main.pref.getInteger("mappaint.fillalpha", 50)))); 
     859        showName = Main.pref.getBoolean("mappaint.showname", true); 
    825860 
    826861        long profilerStart = java.lang.System.currentTimeMillis(); 
     
    838873        circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter 
    839874        styles = MapPaintStyles.getStyles().getStyleSet(); 
    840         drawMultipolygon = Main.pref.getBoolean("mappaint.multipolygon",false); 
     875        drawMultipolygon = Main.pref.getBoolean("mappaint.multipolygon",true); 
    841876        orderFont = new Font(Main.pref.get("mappaint.font","Helvetica"), Font.PLAIN, Main.pref.getInteger("mappaint.fontsize", 8)); 
    842877        String currentLocale = Locale.getDefault().getLanguage(); 
    843878        regionalNameOrder = Main.pref.get("mappaint.nameOrder", "name:"+currentLocale+";name;int_name;ref;operator;brand").split(";"); 
    844879 
    845         alreadyDrawn = new LinkedList<OsmPrimitive>(); 
    846         alreadyDrawnAreas = new LinkedList<Way>(); 
    847880        selectedCall = false; 
    848          
     881        ++paintid; 
     882        viewid = nc.getViewID(); 
     883 
    849884        profilerVisibleNodes = 0; 
    850885        profilerVisibleWays = 0; 
    851886        profilerVisibleAreas = 0; 
     887        profilerSegments = 0; 
     888        profilerVisibleSegments = 0; 
    852889 
    853890        if(profiler) 
     
    864901            for (final Relation osm : data.relations) 
    865902            { 
    866                 if(!osm.deleted && !osm.incomplete) 
     903                if(!osm.deleted && !osm.incomplete && osm.mappaintVisibleCode != viewid) 
    867904                { 
    868905                    osm.visit(this); 
     
    873910            if(profiler) 
    874911            { 
    875                 System.out.format("Relations: %4dms, n=%5d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN); 
     912                System.out.format("Relations: %4dms, calls=%5d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN); 
    876913                profilerLast = java.lang.System.currentTimeMillis(); 
    877914            } 
     
    881918            for (final Way osm : data.ways) 
    882919            { 
    883                 //if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm)) 
    884                 if (!osm.incomplete && !osm.deleted) 
    885                 { 
    886                     //if(styles.isArea((Way)osm) && !alreadyDrawnAreas.contains(osm)) 
    887                     if(isPrimitiveArea(osm)) 
     920                if (!osm.incomplete && !osm.deleted 
     921                && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid) 
     922                { 
     923                    if(isPrimitiveArea(osm) && osm.mappaintDrawnAreaCode != paintid) 
    888924                    { 
    889925                        osm.visit(this); 
     
    893929                } 
    894930            } 
    895             alreadyDrawnAreas = null; 
    896931 
    897932            if(profiler) 
    898933            { 
    899                 System.out.format("Areas    : %4dms, n=%5d, visible=%d\n", 
     934                System.out.format("Areas    : %4dms, calls=%5d, visible=%d\n", 
    900935                    (java.lang.System.currentTimeMillis()-profilerLast), profilerN, profilerVisibleAreas); 
    901936                profilerLast = java.lang.System.currentTimeMillis(); 
     
    913948            if(profiler) 
    914949            { 
    915                 System.out.format("Ways     : %4dms, n=%5d, visible=%d\n", 
     950                System.out.format("Ways     : %4dms, calls=%5d, visible=%d\n", 
    916951                    (java.lang.System.currentTimeMillis()-profilerLast), profilerN, profilerVisibleWays); 
    917952                profilerLast = java.lang.System.currentTimeMillis(); 
     
    923958            profilerN = 0; 
    924959            for (final OsmPrimitive osm : data.ways) 
    925                 if (!osm.incomplete && !osm.deleted && !osm.selected) 
     960                if (!osm.incomplete && !osm.deleted && !osm.selected 
     961                && osm.mappaintVisibleCode != viewid ) 
    926962                { 
    927963                    osm.visit(this); 
     
    931967            if(profiler) 
    932968            { 
    933                 System.out.format("Ways     : %4dms, n=%5d, visible=%d\n",  
     969                System.out.format("Ways     : %4dms, calls=%5d, visible=%d\n", 
    934970                    (java.lang.System.currentTimeMillis()-profilerLast), profilerN, profilerVisibleWays); 
    935971                profilerLast = java.lang.System.currentTimeMillis(); 
     
    941977        profilerN = 0; 
    942978        for (final OsmPrimitive osm : data.getSelected()) { 
    943             if (!osm.incomplete && !osm.deleted 
    944             //&& !(osm instanceof Node) && !alreadyDrawn.contains(osm)) 
    945             && !(osm instanceof Node)) 
     979            if (!osm.incomplete && !osm.deleted && !(osm instanceof Node) 
     980            && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid) 
    946981            { 
    947982                osm.visit(this); 
     
    952987        if(profiler) 
    953988        { 
    954             System.out.format("Selected : %4dms, n=%5d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN); 
     989            System.out.format("Selected : %4dms, calls=%5d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN); 
    955990            profilerLast = java.lang.System.currentTimeMillis(); 
    956991        } 
     
    9671002        profilerN = 0; 
    9681003        for (final OsmPrimitive osm : data.nodes) 
    969             //if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm)) 
    970             if (!osm.incomplete && !osm.deleted) 
     1004            if (!osm.incomplete && !osm.deleted 
     1005            && osm.mappaintVisibleCode != viewid && osm.mappaintDrawnCode != paintid) 
    9711006            { 
    9721007                osm.visit(this); 
     
    9761011        if(profiler) 
    9771012        { 
    978             System.out.format("Nodes    : %4dms, n=%5d, visible=%d\n", 
     1013            System.out.format("Nodes    : %4dms, calls=%5d, visible=%d\n", 
    9791014                (java.lang.System.currentTimeMillis()-profilerLast), profilerN, profilerVisibleNodes); 
    9801015            profilerLast = java.lang.System.currentTimeMillis(); 
    9811016        } 
    982  
    983         alreadyDrawn = null; 
    9841017 
    9851018        /*** VIRTUAL  ***/ 
     
    9891022            currentColor = nodeColor; 
    9901023            for (final OsmPrimitive osm : data.ways) 
    991                 if (!osm.incomplete && !osm.deleted) 
    992                 { 
    993                     visitVirtual((Way)osm); 
     1024                if (!osm.incomplete && !osm.deleted 
     1025                && osm.mappaintVisibleCode != viewid ) 
     1026                { 
     1027                    // TODO: move this into the SimplePaint code? 
     1028                    if(!profilerOmitDraw) 
     1029                        visitVirtual((Way)osm); 
    9941030                    profilerN++; 
    9951031                } 
     
    9971033            if(profiler) 
    9981034            { 
    999                 System.out.format("Virtual  : %4dms, n=%5d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN); 
     1035                System.out.format("Virtual  : %4dms, calls=%5d\n", (java.lang.System.currentTimeMillis()-profilerLast), profilerN); 
    10001036                profilerLast = java.lang.System.currentTimeMillis(); 
    10011037            } 
     
    10111047        if(profiler) 
    10121048        { 
     1049            System.out.format("Segments :         calls=%5d, visible=%d\n", profilerSegments, profilerVisibleSegments); 
    10131050            System.out.format("All      : %4dms\n", (profilerLast-profilerStart)); 
    10141051        } 
  • trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java

    r1169 r1263  
    6767                return zoom; 
    6868        return 32; 
     69    } 
     70 
     71    /** 
     72     * Return a ID which is unique as long as viewport dimensions are the same 
     73     */ 
     74    public Integer getViewID() 
     75    { 
     76        String x = center.east() + "_" + center.north() + "_" + scale + "_" + 
     77        getWidth() + "_" + getHeight(); 
     78        java.util.zip.CRC32 id = new java.util.zip.CRC32(); 
     79        id.update(x.getBytes()); 
     80        return new Long(id.getValue()).intValue(); 
    6981    } 
    7082 
Note: See TracChangeset for help on using the changeset viewer.