Changeset 12054 in josm for trunk/src/org/openstreetmap/josm/data/osm/visitor
- Timestamp:
- 2017-05-03T18:24:31+02:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
r12009 r12054 99 99 private final OsmPrimitive osm; 100 100 private final int flags; 101 private final long order; 101 102 102 103 StyleRecord(StyleElement style, OsmPrimitive osm, int flags) { … … 104 105 this.osm = osm; 105 106 this.flags = flags; 107 108 long order = 0; 109 if ((this.flags & FLAG_DISABLED) != 0) { 110 order |= 1; 111 } 112 113 order <<= 24; 114 order |= floatToFixed(this.style.majorZIndex, 24, 8); 115 116 // selected on top of member of selected on top of unselected 117 // FLAG_DISABLED bit is the same at this point, but we simply ignore it 118 order <<= 4; 119 order |= this.flags & 0xf; 120 121 order <<= 24; 122 order |= floatToFixed(this.style.zIndex, 24, 8); 123 124 order <<= 1; 125 // simple node on top of icons and shapes 126 if (NodeElement.SIMPLE_NODE_ELEMSTYLE.equals(this.style)) { 127 order |= 1; 128 } 129 130 this.order = order; 131 } 132 133 /** 134 * Converts a float to a fixed pointdecimal so that the order stays the same. 135 * 136 * @param number The float to convert 137 * @param totalBits 138 * Total number of bits. 1 sign bit, then the bits before the 139 * decimal point, then those after. 140 * @param afterDecimalBits 141 * Number of fixed bits after the decimal point. 142 * @return The float converted to an integer. 143 */ 144 private static long floatToFixed(double number, int totalBits, int afterDecimalBits) { 145 long value = (long) (number * (1l << afterDecimalBits)); 146 long highestBitMask = 1l << totalBits - 1; 147 long valueMask = highestBitMask - 1; 148 long signBit = number < 0 ? 0 : highestBitMask; 149 return signBit | value & valueMask; 106 150 } 107 151 108 152 @Override 109 153 public int compareTo(StyleRecord other) { 110 if ((this.flags & FLAG_DISABLED) != 0 && (other.flags & FLAG_DISABLED) == 0) 111 return -1; 112 if ((this.flags & FLAG_DISABLED) == 0 && (other.flags & FLAG_DISABLED) != 0) 113 return 1; 114 115 int d0 = Float.compare(this.style.majorZIndex, other.style.majorZIndex); 116 if (d0 != 0) 117 return d0; 118 119 // selected on top of member of selected on top of unselected 120 // FLAG_DISABLED bit is the same at this point 121 if (this.flags > other.flags) 122 return 1; 123 if (this.flags < other.flags) 124 return -1; 125 126 int dz = Float.compare(this.style.zIndex, other.style.zIndex); 127 if (dz != 0) 128 return dz; 129 130 // simple node on top of icons and shapes 131 if (NodeElement.SIMPLE_NODE_ELEMSTYLE.equals(this.style) && !NodeElement.SIMPLE_NODE_ELEMSTYLE.equals(other.style)) 132 return 1; 133 if (!NodeElement.SIMPLE_NODE_ELEMSTYLE.equals(this.style) && NodeElement.SIMPLE_NODE_ELEMSTYLE.equals(other.style)) 134 return -1; 154 int d = Long.compare(order, other.order); 155 if (d != 0) { 156 return d; 157 } 135 158 136 159 // newer primitives to the front
Note:
See TracChangeset
for help on using the changeset viewer.