calculateBaseTiles method
Calculates the query parameters for a rectangular area of tiles.
Implementation
void calculateBaseTiles(Tile upperLeft, Tile lowerRight, SubFileParameter subFileParameter) {
if (upperLeft.zoomLevel < subFileParameter.baseZoomLevel) {
// here we need to combine multiple base tiles
int zoomLevelDifference = subFileParameter.baseZoomLevel - upperLeft.zoomLevel;
fromBaseTileX = upperLeft.tileX << zoomLevelDifference;
fromBaseTileY = upperLeft.tileY << zoomLevelDifference;
toBaseTileX = (lowerRight.tileX << zoomLevelDifference) + (1 << zoomLevelDifference) - 1;
toBaseTileY = (lowerRight.tileY << zoomLevelDifference) + (1 << zoomLevelDifference) - 1;
useTileBitmask = false;
} else if (upperLeft.zoomLevel > subFileParameter.baseZoomLevel) {
// we might have more than just one base tile as we might span boundaries
int zoomLevelDifference = upperLeft.zoomLevel - subFileParameter.baseZoomLevel;
fromBaseTileX = upperLeft.tileX >> zoomLevelDifference;
fromBaseTileY = upperLeft.tileY >> zoomLevelDifference;
toBaseTileX = lowerRight.tileX >> zoomLevelDifference;
toBaseTileY = lowerRight.tileY >> zoomLevelDifference;
// TODO understand what is going on here. The tileBitmask is used to extract just
// the data from the base tiles that is relevant for the area, but how can this work
// for a set of tiles, so not using tileBitmask for the moment.
useTileBitmask = true;
queryTileBitmask = QueryCalculations.calculateTileBitmask(upperLeft, lowerRight, zoomLevelDifference);
} else {
// we are on the base zoom level, so we just need all tiles in range
fromBaseTileX = upperLeft.tileX;
fromBaseTileY = upperLeft.tileY;
toBaseTileX = lowerRight.tileX;
toBaseTileY = lowerRight.tileY;
useTileBitmask = false;
}
}