Fix double cloning issue of MapElement, use copy-constructor in GeometryBuffer and MapElement (#455)
This commit is contained in:
parent
9a6da018a9
commit
bc1dee49a4
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* Copyright 2013 Hannes Janetzek
|
||||
* Copyright 2016 Andrey Novikov
|
||||
* Copyright 2017 Gustl22
|
||||
*
|
||||
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
|
||||
*
|
||||
@ -17,6 +18,8 @@
|
||||
*/
|
||||
package org.oscim.core;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/* TODO
|
||||
* - check indexPos < Short.Max
|
||||
* - should make internals private, maybe
|
||||
@ -128,6 +131,22 @@ public class GeometryBuffer {
|
||||
this.pointLimit = points.length - 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param buffer the buffer to copy
|
||||
*/
|
||||
public GeometryBuffer(GeometryBuffer buffer) {
|
||||
int indexSize = 0;
|
||||
while (indexSize < buffer.index.length && buffer.index[indexSize] != -1) {
|
||||
indexSize++;
|
||||
}
|
||||
this.points = Arrays.copyOf(buffer.points, buffer.pointNextPos);
|
||||
this.index = Arrays.copyOf(buffer.index, indexSize);
|
||||
|
||||
this.pointNextPos = buffer.pointNextPos;
|
||||
this.indexCurrentPos = buffer.indexCurrentPos;
|
||||
this.type = buffer.type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param out PointF to set coordinates to.
|
||||
* @return when out is null a temporary PointF is
|
||||
|
@ -18,15 +18,13 @@
|
||||
*/
|
||||
package org.oscim.core;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* The MapElement class is a reusable containter for a geometry
|
||||
* The MapElement class is a reusable container for a geometry
|
||||
* with tags.
|
||||
* MapElement is created by TileDataSource(s) and passed to
|
||||
* MapTileLoader via ITileDataSink.process().
|
||||
* This is just a buffer that belongs to TileDataSource,
|
||||
* so dont keep a reference to it when passed as parameter.
|
||||
* so don't keep a reference to it when passed as parameter.
|
||||
*/
|
||||
public class MapElement extends GeometryBuffer {
|
||||
|
||||
@ -51,6 +49,16 @@ public class MapElement extends GeometryBuffer {
|
||||
super(points, index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param element the map element to copy
|
||||
*/
|
||||
public MapElement(MapElement element) {
|
||||
super(element);
|
||||
this.tags.set(element.tags.asArray());
|
||||
this.labelPosition = element.labelPosition;
|
||||
this.setLayer(element.layer);
|
||||
}
|
||||
|
||||
public void setLabelPosition(float x, float y) {
|
||||
labelPosition = new PointF(x, y);
|
||||
}
|
||||
@ -68,32 +76,6 @@ public class MapElement extends GeometryBuffer {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
return tags.toString() + '\n' + super.toString() + '\n';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a deep copy of this MapElement
|
||||
*/
|
||||
public MapElement clone() {
|
||||
int indexSize = this.indexCurrentPos + 1;
|
||||
for (int i = 0; i < this.index.length; i++) {
|
||||
if (this.index[i] == -1) {
|
||||
indexSize = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
float[] copyPoints = Arrays.copyOf(this.points, this.pointNextPos);
|
||||
int[] copyIndex = Arrays.copyOf(this.index, indexSize);
|
||||
|
||||
MapElement copy = new MapElement(copyPoints, copyIndex);
|
||||
copy.tags.set(this.tags.asArray());
|
||||
copy.pointNextPos = this.pointNextPos;
|
||||
copy.labelPosition = this.labelPosition;
|
||||
copy.setLayer(this.layer);
|
||||
copy.indexCurrentPos = this.indexCurrentPos;
|
||||
copy.type = this.type;
|
||||
return copy;
|
||||
}
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
|
||||
buildingElements = new ArrayList<>();
|
||||
mBuildings.put(tile.hashCode(), buildingElements);
|
||||
}
|
||||
element = element.clone(); // Deep copy, because element will be cleared
|
||||
element = new MapElement(element); // Deep copy, because element will be cleared
|
||||
buildingElements.add(new BuildingElement(element, extrusion, isBuildingPart));
|
||||
return true;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user