From 5a55e33f76e6497c93905ba9df5c19f520559c5b Mon Sep 17 00:00:00 2001
From: Hannes Janetzek <hannes.janetzek@gmail.com>
Date: Sun, 9 Mar 2014 05:44:34 +0100
Subject: [PATCH] fix: ElementLayers, make sure setFrom() clears previous items

---
 .../renderer/elements/ElementLayers.java      | 41 ++++++++++++-------
 1 file changed, 26 insertions(+), 15 deletions(-)

diff --git a/vtm/src/org/oscim/renderer/elements/ElementLayers.java b/vtm/src/org/oscim/renderer/elements/ElementLayers.java
index 3ad594f6..756daeee 100644
--- a/vtm/src/org/oscim/renderer/elements/ElementLayers.java
+++ b/vtm/src/org/oscim/renderer/elements/ElementLayers.java
@@ -147,6 +147,9 @@ public class ElementLayers {
 		return textLayer;
 	}
 
+	/**
+	 * Set new Base-Layers and clear previous.
+	 */
 	public void setBaseLayers(RenderElement layers) {
 		for (RenderElement l = baseLayers; l != null; l = l.next)
 			l.clear();
@@ -158,6 +161,9 @@ public class ElementLayers {
 		return baseLayers;
 	}
 
+	/**
+	 * Set new TextureLayers and clear previous.
+	 */
 	public void setTextureLayers(TextureLayer tl) {
 		for (RenderElement l = textureLayers; l != null; l = l.next)
 			l.clear();
@@ -169,6 +175,9 @@ public class ElementLayers {
 		return textureLayers;
 	}
 
+	/**
+	 * Set new ExtrusionLayers and clear previous.
+	 */
 	public void setExtrusionLayers(ExtrusionLayer el) {
 		for (RenderElement l = extrusionLayers; l != null; l = l.next)
 			l.clear();
@@ -180,17 +189,6 @@ public class ElementLayers {
 		return (ExtrusionLayer) extrusionLayers;
 	}
 
-	/** cleanup only when layers are not used by tile or overlay anymore! */
-	public void clear() {
-		setBaseLayers(null);
-		setTextureLayers(null);
-		setExtrusionLayers(null);
-		mCurLayer = null;
-
-		if (vbo != null)
-			vbo = BufferObject.release(vbo);
-	}
-
 	private RenderElement getLayer(int level, int type) {
 		RenderElement layer = null;
 
@@ -364,15 +362,28 @@ public class ElementLayers {
 	}
 
 	public void setFrom(ElementLayers layers) {
-		baseLayers = layers.baseLayers;
-		textureLayers = layers.textureLayers;
-		extrusionLayers = layers.extrusionLayers;
-		mCurLayer = null;
+		setBaseLayers(layers.baseLayers);
+		setTextureLayers((TextureLayer) layers.textureLayers);
+		setExtrusionLayers((ExtrusionLayer) layers.extrusionLayers);
 
+		mCurLayer = null;
 		layers.baseLayers = null;
 		layers.textureLayers = null;
 		layers.extrusionLayers = null;
 		layers.mCurLayer = null;
 
 	}
+
+	/** cleanup only when layers are not used by tile or layer anymore! */
+	public void clear() {
+		/* NB: set null calls clear() on each layer! */
+		setBaseLayers(null);
+		setTextureLayers(null);
+		setExtrusionLayers(null);
+		mCurLayer = null;
+
+		if (vbo != null)
+			vbo = BufferObject.release(vbo);
+	}
+
 }