Changeset 4074 in josm


Ignore:
Timestamp:
2011-05-05T20:49:14+02:00 (10 years ago)
Author:
bastiK
Message:

mapcss: performance improvement for parent selector (by Gubaer)

Location:
trunk
Files:
3 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/.classpath

    r3715 r4074  
    44        <classpathentry kind="src" path="test/unit"/>
    55        <classpathentry kind="src" path="test/functional"/>
    6         <classpathentry excluding="build/|data_nodist/|dist/|doc/|lib/|macosx/|src/|test/|test/build/|test/functional/|test/performance/|test/unit/|tools/|utils/" kind="src" path=""/>
     6        <classpathentry excluding="build/|data_nodist/|dist/|doc/|lib/|macosx/|nb/|src/|test/|test/build/|test/functional/|test/performance/|test/unit/|tools/|utils/" kind="src" path=""/>
    77        <classpathentry kind="src" path="test/performance"/>
    88        <classpathentry kind="lib" path="lib/metadata-extractor-2.3.1-nosun.jar"/>
  • trunk/build.xml

    r3875 r4074  
    316316
    317317        </target>
    318 
    319 
    320318</project>
  • trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    r4000 r4074  
    1717import java.util.Locale;
    1818import java.util.Map;
     19import java.util.Map.Entry;
    1920import java.util.Set;
    20 import java.util.Map.Entry;
    2121import java.util.concurrent.atomic.AtomicLong;
    2222
     
    13021302            }
    13031303        }
    1304 
    13051304        return result;
     1305    }
     1306
     1307    /**
     1308     * <p>Visits {@code visitor} for all referrers.</p>
     1309     *
     1310     * @param visitor the visitor. Ignored, if null.
     1311     */
     1312    public void visitReferrers(Visitor visitor){
     1313        if (visitor == null) return;
     1314        if (this.referrers == null)
     1315            return;
     1316        else if (this.referrers instanceof OsmPrimitive) {
     1317            OsmPrimitive ref = (OsmPrimitive) this.referrers;
     1318            if (ref.dataSet == dataSet) {
     1319                ref.visit(visitor);
     1320            }
     1321        } else if (this.referrers instanceof OsmPrimitive[]) {
     1322            OsmPrimitive[] refs = (OsmPrimitive[]) this.referrers;
     1323            for (OsmPrimitive ref: refs) {
     1324                if (ref.dataSet == dataSet) {
     1325                    ref.visit(visitor);
     1326                }
     1327            }
     1328        }
    13061329    }
    13071330
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintVisitor.java

    r4040 r4074  
    66import java.util.ArrayList;
    77import java.util.Collections;
    8 import java.util.Comparator;
    98import java.util.List;
    109
     
    2423import org.openstreetmap.josm.gui.mappaint.NodeElemStyle;
    2524import org.openstreetmap.josm.gui.mappaint.StyleCache.StyleList;
    26 import org.openstreetmap.josm.tools.Pair;
    2725
    2826public class MapPaintVisitor implements PaintVisitor {
  • trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java

    r4055 r4074  
    8484    private Pair<StyleList, Range> getImpl(OsmPrimitive osm, double scale, NavigatableComponent nc) {
    8585        if (osm instanceof Node)
    86         {
    8786            return generateStyles(osm, scale, null, false);
    88         }
    8987        else if (osm instanceof Way)
    9088        {
     
    235233
    236234        for (Entry<String, Cascade> e : mc.getLayers()) {
    237             if ("*".equals(e.getKey()))
     235            if ("*".equals(e.getKey())) {
    238236                continue;
     237            }
    239238            env.layer = e.getKey();
    240239            Cascade c = e.getValue();
  • trunk/src/org/openstreetmap/josm/gui/mappaint/TextElement.java

    r4007 r4074  
    114114     * @param c the style properties
    115115     * @param defaultTextColor the default text color. Must not be null.
     116     * @param defaultAnnotate true, if a text label shall be rendered by default, even if the style sheet
     117     *   doesn't include respective style declarations
    116118     * @return the text element or null, if the style properties don't include
    117119     * properties for text rendering
     
    212214        final TextElement other = (TextElement) obj;
    213215        return  equal(labelCompositionStrategy, other.labelCompositionStrategy) &&
    214                 equal(font, other.font) &&
    215                 xOffset == other.xOffset &&
    216                 yOffset == other.yOffset &&
    217                 equal(color, other.color) &&
    218                 equal(haloRadius, other.haloRadius) &&
    219                 equal(haloColor, other.haloColor);
     216        equal(font, other.font) &&
     217        xOffset == other.xOffset &&
     218        yOffset == other.yOffset &&
     219        equal(color, other.color) &&
     220        equal(haloRadius, other.haloRadius) &&
     221        equal(haloColor, other.haloColor);
    220222    }
    221223}
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSRule.java

    r3876 r4074  
    44import java.util.List;
    55
     6import org.openstreetmap.josm.gui.mappaint.Environment;
    67import org.openstreetmap.josm.tools.Utils;
    78
     
    1617    }
    1718
     19    /**
     20     * <p>Executes the instructions against the environment {@code env}</p>
     21     *
     22     * @param env the environment
     23     */
     24    public void execute(Environment env) {
     25        for (Instruction i : declaration) {
     26            i.execute(env);
     27        }
     28    }
     29
    1830    @Override
    1931    public String toString() {
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java

    r4069 r4074  
    134134                if ((s instanceof GeneralSelector)) {
    135135                    GeneralSelector gs = (GeneralSelector) s;
    136                     if (gs.base.equals(type)) {
    137                         for (Condition cnd : gs.conds) {
    138                             if (!cnd.applies(env))
    139                                 continue NEXT_RULE;
     136                    if (gs.getBase().equals(type)) {
     137                        if (!gs.matchesConditions(env)) {
     138                            continue NEXT_RULE;
    140139                        }
    141                         for (Instruction i : r.declaration) {
    142                             i.execute(env);
    143                         }
     140                        r.execute(env);
    144141                    }
    145142                }
     
    179176                                continue;
    180177                            }
    181                             for (Instruction i : r.declaration) {
    182                                 i.execute(env);
    183                             }
     178                            r.execute(env);
    184179                        }
    185180                    }
    186181                    env.layer = sub;
    187                     for (Instruction i : r.declaration) {
    188                         i.execute(env);
    189                     }
     182                    r.execute(env);
    190183                }
    191184            }
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java

    r4069 r4074  
    1010import org.openstreetmap.josm.data.osm.RelationMember;
    1111import org.openstreetmap.josm.data.osm.Way;
     12import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
    1213import org.openstreetmap.josm.gui.mappaint.Environment;
    1314import org.openstreetmap.josm.gui.mappaint.Range;
     
    6768        }
    6869
     70        /**
     71         * <p>Finds the first referrer matching {@link #left}</p>
     72         *
     73         * <p>The visitor works on an environment and it saves the matching
     74         * referrer in {@code e.parent} and its relative position in the
     75         * list referrers "child list" in {@code e.index}.</p>
     76         *
     77         * <p>If after execution {@code e.parent} is null, no matching
     78         * referrer was found.</p>
     79         *
     80         */
     81        private  class MatchingReferrerFinder extends AbstractVisitor{
     82            private Environment e;
     83
     84            /**
     85             * Constructor
     86             * @param e the environment against which we match
     87             */
     88            public MatchingReferrerFinder(Environment e){
     89                this.e = e;
     90            }
     91
     92            @Override
     93            public void visit(Node n) {
     94                // node should never be a referrer
     95                throw new AssertionError();
     96            }
     97
     98            @Override
     99            public void visit(Way w) {
     100                /*
     101                 * If e.parent is already set to the first matching referrer. We skip any following
     102                 * referrer injected into the visitor.
     103                 */
     104                if (e.parent != null) return;
     105
     106                if (!left.matches(e.withPrimitive(w)))
     107                    return;
     108                for (int i=0; i<w.getNodesCount(); i++) {
     109                    Node n = w.getNode(i);
     110                    if (n.equals(e.osm)) {
     111                        if (link.matches(e.withParent(w).withIndex(i).withLinkContext())) {
     112                            e.parent = w;
     113                            e.index = i;
     114                            return;
     115                        }
     116                    }
     117                }
     118            }
     119
     120            @Override
     121            public void visit(Relation r) {
     122                /*
     123                 * If e.parent is already set to the first matching referrer. We skip any following
     124                 * referrer injected into the visitor.
     125                 */
     126                if (e.parent != null) return;
     127
     128                if (!left.matches(e.withPrimitive(r)))
     129                    return;
     130                for (int i=0; i < r.getMembersCount(); i++) {
     131                    RelationMember m = r.getMember(i);
     132                    if (m.getMember().equals(e.osm)) {
     133                        if (link.matches(e.withParent(r).withIndex(i).withLinkContext())) {
     134                            e.parent = r;
     135                            e.index = i;
     136                            return;
     137                        }
     138                    }
     139                }
     140            }
     141        }
     142
    69143        @Override
    70144        public boolean matches(Environment e) {
     
    73147
    74148            if (!parentSelector) {
    75                 for (OsmPrimitive ref : e.osm.getReferrers()) {
    76                     if (!left.matches(e.withPrimitive(ref)))
    77                         continue;
    78                     if (ref instanceof Way) {
    79                         List<Node> wayNodes = ((Way) ref).getNodes();
    80                         for (int i=0; i<wayNodes.size(); i++) {
    81                             if (wayNodes.get(i).equals(e.osm)) {
    82                                 if (link.matches(e.withParent(ref).withIndex(i).withLinkContext())) {
    83                                     e.parent = ref;
    84                                     e.index = i;
    85                                     return true;
    86                                 }
    87                             }
    88                         }
    89                     } else if (ref instanceof Relation) {
    90                         List<RelationMember> members = ((Relation) ref).getMembers();
    91                         for (int i=0; i<members.size(); i++) {
    92                             RelationMember m = members.get(i);
    93                             if (m.getMember().equals(e.osm)) {
    94                                 if (link.matches(e.withParent(ref).withIndex(i).withLinkContext())) {
    95                                     e.parent = ref;
    96                                     e.index = i;
    97                                     return true;
    98                                 }
    99                             }
    100                         }
    101                     }
    102                 }
     149                MatchingReferrerFinder collector = new MatchingReferrerFinder(e);
     150                e.osm.visitReferrers(collector);
     151                if (e.parent != null)
     152                    return true;
    103153            } else {
    104154                if (e.osm instanceof Way) {
     
    181231
    182232    public static class GeneralSelector implements Selector {
    183         public String base;
     233        private String base;
    184234        public Range range;
    185         protected List<Condition> conds;
     235        private List<Condition> conds;
    186236        private String subpart;
    187237
     
    198248                range = new Range();
    199249            }
    200             this.conds = conds;
     250            if (conds == null || conds.isEmpty()) {
     251                this.conds = null;
     252            } else {
     253                this.conds = conds;
     254            }
    201255            this.subpart = subpart;
    202256        }
     
    211265        }
    212266
    213         @Override
    214         public boolean matches(Environment e) {
    215             if (!baseApplies(e.osm))
    216                 return false;
     267        public boolean matchesBase(Environment e){
     268            if (base.equals("*"))
     269                return true;
     270            if (base.equals("area")) {
     271                if (e.osm instanceof Way)
     272                    return true;
     273                if (e.osm instanceof Relation && ((Relation) e.osm).isMultipolygon())
     274                    return true;
     275            }
     276            if (base.equals(OsmPrimitiveType.from(e.osm).getAPIName()))
     277                return true;
     278            return false;
     279        }
     280
     281        public boolean matchesConditions(Environment e){
     282            if (conds == null) return true;
    217283            for (Condition c : conds) {
    218284                if (!c.applies(e))
     
    222288        }
    223289
    224         private boolean baseApplies(OsmPrimitive osm) {
    225             if (base.equals("*"))
    226                 return true;
    227             if (base.equals("area")) {
    228                 if (osm instanceof Way)
    229                     return true;
    230                 if (osm instanceof Relation && ((Relation) osm).isMultipolygon())
    231                     return true;
    232             }
    233             if (base.equals(OsmPrimitiveType.from(osm).getAPIName()))
    234                 return true;
    235             return false;
     290        @Override
     291        public boolean matches(Environment e) {
     292            if (!matchesBase(e)) return false;
     293            return matchesConditions(e);
     294        }
     295
     296        public String getBase() {
     297            return base;
    236298        }
    237299
  • trunk/test/config/test-unit-env.properties

    r1752 r4074  
    99# This is the home directory for JOSM plugins: ${josm.home}\plugins\*.jar
    1010#
    11 josm.home=C:\\data\\projekte\\osm\\tag-editor-plugin
     11josm.home=C:\\data\\projekte\\osm\\repositories\\josm-github-Gubaer\\test\\config\\unit-josm.home
    1212
  • trunk/test/unit/org/openstreetmap/josm/gui/mappaint/MapCSSWithExtendedTextDirectivesTest.groovy

    r4069 r4074  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.gui.mappaint
    3 
    43import java.awt.Color
    54
     
    87import org.openstreetmap.josm.gui.mappaint.LabelCompositionStrategy.DeriveLabelFromNameTagsCompositionStrategy
    98import org.openstreetmap.josm.gui.mappaint.LabelCompositionStrategy.TagLookupCompositionStrategy
     9import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.TagKeyReference
    1010class MapCSSWithExtendedTextDirectivesTest {
    1111   
     
    2121        c.put("text", new Keyword("auto"))
    2222       
    23         TextElement te = TextElement.create(c, Color.WHITE)
     23        TextElement te = TextElement.create(c, Color.WHITE, false /* no default annotate */)
    2424        assert te.labelCompositionStrategy != null
    2525        assert te.labelCompositionStrategy instanceof DeriveLabelFromNameTagsCompositionStrategy
     
    2929    public void createTextElementComposingTextFromTag() {
    3030        Cascade c = new Cascade()
    31         c.put("text", "my_name")
     31        c.put("text", new TagKeyReference("my_name"))
    3232       
    33         TextElement te = TextElement.create(c, Color.WHITE)
    34         assert te.labelCompositionStrategy != null
    35         assert te.labelCompositionStrategy instanceof TagLookupCompositionStrategy
    36         assert te.labelCompositionStrategy.getDefaultLabelTag() == "my_name"
    37     }
    38    
    39     @Test
    40     public void createTextElementComposingTextFromTag_2() {
    41         Cascade c = new Cascade()
    42         c.put("text", new Keyword("my_name"))
    43        
    44         TextElement te = TextElement.create(c, Color.WHITE)
     33        TextElement te = TextElement.create(c, Color.WHITE, false /* no default annotate */)
    4534        assert te.labelCompositionStrategy != null
    4635        assert te.labelCompositionStrategy instanceof TagLookupCompositionStrategy
     
    5241        Cascade c = new Cascade()
    5342       
    54         TextElement te = TextElement.create(c, Color.WHITE)
     43        TextElement te = TextElement.create(c, Color.WHITE, false /* no default annotate */)
    5544        assert te.labelCompositionStrategy == null
    5645    }
  • trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/KeyConditionTest.groovy

    r4069 r4074  
    101101    }   
    102102}
     103
  • trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/KeyValueConditionTest.groovy

    r4069 r4074  
    9090   
    9191}
     92
  • trunk/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ParsingLinkSelectorTest.groovy

    r4069 r4074  
    5656    }
    5757}
     58
Note: See TracChangeset for help on using the changeset viewer.