Ignore:
Timestamp:
2014-05-04T12:55:06+02:00 (12 years ago)
Author:
bastiK
Message:

reverting [7056] because it won't work for execution in multiple threads (which will be more useful)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java

    r7056 r7057  
    5858    private ZipFile zipFile;
    5959
    60     private static int usedId = 1;
    61    
    6260    public MapCSSStyleSource(String url, String name, String shortdescription) {
    6361        super(url, name, shortdescription);
     
    120118        // optimization: filter rules for different primitive types
    121119        for (MapCSSRule r: rules) {
    122             // find the rightmost selector, this must be a GeneralSelector
    123             Selector selRightmost = r.selector;
    124             while (selRightmost instanceof ChildOrParentSelector) {
    125                 selRightmost = ((ChildOrParentSelector) selRightmost).right;
    126             }
    127             MapCSSRule optRule = new MapCSSRule(r.selector.optimizedBaseCheck(), r.declaration);
    128             switch (((GeneralSelector) selRightmost).getBase()) {
    129                 case "node":
    130                     nodeRules.add(optRule);
    131                     break;
    132                 case "way":
    133                     wayRules.add(optRule);
    134                     break;
    135                 case "area":
    136                     wayRules.add(optRule);
    137                     multipolygonRules.add(optRule);
    138                     break;
    139                 case "relation":
    140                     relationRules.add(optRule);
    141                     multipolygonRules.add(optRule);
    142                     break;
    143                 case "*":
    144                     nodeRules.add(optRule);
    145                     wayRules.add(optRule);
    146                     relationRules.add(optRule);
    147                     multipolygonRules.add(optRule);
    148                     break;
    149             }
     120            List<Selector> nodeSel = new ArrayList<>();
     121            List<Selector> waySel = new ArrayList<>();
     122            List<Selector> relationSel = new ArrayList<>();
     123            List<Selector> multipolygonSel = new ArrayList<>();
     124            for (Selector sel : r.selectors) {
     125                // find the rightmost selector, this must be a GeneralSelector
     126                Selector selRightmost = sel;
     127                while (selRightmost instanceof ChildOrParentSelector) {
     128                    selRightmost = ((ChildOrParentSelector) selRightmost).right;
     129                }
     130                Selector optimizedSel = sel.optimizedBaseCheck();
     131                switch (((GeneralSelector) selRightmost).getBase()) {
     132                    case "node":
     133                        nodeSel.add(optimizedSel);
     134                        break;
     135                    case "way":
     136                        waySel.add(optimizedSel);
     137                        break;
     138                    case "area":
     139                        waySel.add(optimizedSel);
     140                        multipolygonSel.add(optimizedSel);
     141                        break;
     142                    case "relation":
     143                        relationSel.add(optimizedSel);
     144                        multipolygonSel.add(optimizedSel);
     145                        break;
     146                    case "*":
     147                        nodeSel.add(optimizedSel);
     148                        waySel.add(optimizedSel);
     149                        relationSel.add(optimizedSel);
     150                        multipolygonSel.add(optimizedSel);
     151                        break;
     152                }
     153            }
     154            nodeRules.add(new MapCSSRule(nodeSel, r.declaration));
     155            wayRules.add(new MapCSSRule(waySel, r.declaration));
     156            relationRules.add(new MapCSSRule(relationSel, r.declaration));
     157            multipolygonRules.add(new MapCSSRule(multipolygonSel, r.declaration));
    150158        }
    151159        rules.clear();
     
    211219        NEXT_RULE:
    212220        for (MapCSSRule r : rules) {
    213             if ((r.selector instanceof GeneralSelector)) {
    214                 GeneralSelector gs = (GeneralSelector) r.selector;
    215                 if (gs.getBase().equals(type)) {
    216                     if (!gs.matchesConditions(env)) {
    217                         continue NEXT_RULE;
     221            for (Selector s : r.selectors) {
     222                if ((s instanceof GeneralSelector)) {
     223                    GeneralSelector gs = (GeneralSelector) s;
     224                    if (gs.getBase().equals(type)) {
     225                        if (!gs.matchesConditions(env)) {
     226                            continue NEXT_RULE;
     227                        }
     228                        r.execute(env);
    218229                    }
    219                     r.execute(env);
    220230                }
    221231            }
     
    244254            }
    245255        }
    246         usedId++;
    247256        RULE: for (MapCSSRule r : matchingRules) {
    248             env.clearSelectorMatchingInformation();
    249             if (r.selector.matches(env)) { // as side effect env.parent will be set (if s is a child selector)
    250                 Selector s = r.selector;
    251                 if (s.getRange().contains(scale)) {
    252                     mc.range = Range.cut(mc.range, s.getRange());
    253                 } else {
    254                     mc.range = mc.range.reduceAround(scale, s.getRange());
    255                     continue;
     257            for (Selector s : r.selectors) {
     258                env.clearSelectorMatchingInformation();
     259                if (s.matches(env)) { // as side effect env.parent will be set (if s is a child selector)
     260                    if (s.getRange().contains(scale)) {
     261                        mc.range = Range.cut(mc.range, s.getRange());
     262                    } else {
     263                        mc.range = mc.range.reduceAround(scale, s.getRange());
     264                        continue;
     265                    }
     266
     267                    String sub = s.getSubpart();
     268                    if (sub == null) {
     269                        sub = "default";
     270                    }
     271                    else if ("*".equals(sub)) {
     272                        for (Entry<String, Cascade> entry : mc.getLayers()) {
     273                            env.layer = entry.getKey();
     274                            if (Utils.equal(env.layer, "*")) {
     275                                continue;
     276                            }
     277                            r.execute(env);
     278                        }
     279                    }
     280                    env.layer = sub;
     281                    r.execute(env);
     282                    continue RULE;
    256283                }
    257 
    258                 if (r.declaration.usedId == usedId) continue; // don't apply a declaration block more than once
    259                 r.declaration.usedId = usedId;
    260                 String sub = s.getSubpart();
    261                 if (sub == null) {
    262                     sub = "default";
    263                 }
    264                 else if ("*".equals(sub)) {
    265                     for (Entry<String, Cascade> entry : mc.getLayers()) {
    266                         env.layer = entry.getKey();
    267                         if (Utils.equal(env.layer, "*")) {
    268                             continue;
    269                         }
    270                         r.execute(env);
    271                     }
    272                 }
    273                 env.layer = sub;
    274                 r.execute(env);
    275                 continue RULE;
    276284            }
    277285        }
Note: See TracChangeset for help on using the changeset viewer.