/*
* 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 <http://www.gnu.org/licenses/>.
*/
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<MapTile> coordComparator = new CoordComparator();
public static class CoordComparator implements Comparator<MapTile> {
@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;
}
}