org.oscim.layers.tile.TileSet Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of vtm Show documentation
Show all versions of vtm Show documentation
OpenGL vector map library written in Java - running on Android, iOS, Desktop and within the browser.
/*
* Copyright 2012 Hannes Janetzek
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see .
*/
package org.oscim.layers.tile;
import java.util.Arrays;
import java.util.Comparator;
/**
* TileSet for use with TileManager.getActiveTiles(TileSet) to get the current
* tiles. Tiles will locked and not be modifed until getActiveTiles passes them
* back to TileManager on a second invocation or TileManager.releaseTiles().
*/
public final class TileSet {
public int cnt = 0;
public MapTile[] tiles;
/**
* update counter will be set by getActiveTiles when TileSet has changed
*/
int serial;
public TileSet() {
tiles = new MapTile[1];
}
public TileSet(int numTiles) {
tiles = new MapTile[numTiles];
}
public MapTile getTile(int x, int y) {
for (int i = 0; i < cnt; i++)
if (tiles[i].tileX == x && tiles[i].tileY == y)
return tiles[i];
return null;
}
/**
* Locked tiles to ensure that they are not released from cache.
* Call releaseTiles() when tiles are not needed any longer.
*/
public void lockTiles() {
synchronized (TileSet.class) {
for (int i = 0; i < cnt; i++)
tiles[i].lock();
}
}
/**
* Release locked tiles.
*/
public void releaseTiles() {
synchronized (TileSet.class) {
for (int i = 0; i < cnt; i++)
tiles[i].unlock();
}
Arrays.fill(tiles, null);
cnt = 0;
serial = 0;
}
/**
* Clone TileSet from source. Release previous tiles and lock
* new tiles.
*/
public void setTiles(TileSet source) {
/* lock tiles (and their proxies) to not be removed from cache */
source.lockTiles();
/* unlock previous tiles */
releaseTiles();
if (source.tiles.length != tiles.length) {
tiles = new MapTile[source.tiles.length];
}
System.arraycopy(source.tiles, 0, tiles, 0, source.cnt);
cnt = source.cnt;
}
public static Comparator coordComparator = new CoordComparator();
public static class CoordComparator implements Comparator {
@Override
public int compare(MapTile lhs, MapTile rhs) {
if (lhs.tileX == rhs.tileX) {
if (lhs.tileY == rhs.tileY)
return 0;
if (lhs.tileY < rhs.tileY)
return 1;
return -1;
}
if (lhs.tileX < rhs.tileX)
return 1;
return -1;
}
}
public boolean contains(MapTile t) {
for (int i = 0; i < cnt; i++)
if (tiles[i].equals(t))
return true;
return false;
}
}