/* * Copyright 2013 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.bitmap; import org.oscim.core.MapPosition; import org.oscim.event.Event; import org.oscim.layers.tile.TileLayer; import org.oscim.layers.tile.TileLoader; import org.oscim.layers.tile.TileManager; import org.oscim.layers.tile.VectorTileRenderer; import org.oscim.map.Map; import org.oscim.renderer.bucket.TextureItem.TexturePool; import org.oscim.tiling.TileSource; import org.oscim.utils.FastMath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class BitmapTileLayer extends TileLayer { protected static final Logger log = LoggerFactory.getLogger(BitmapTileLayer.class); private final static int CACHE_LIMIT = 40; protected final TileSource mTileSource; public static class FadeStep { public final double scaleStart, scaleEnd; public final float alphaStart, alphaEnd; public FadeStep(int zoomStart, int zoomEnd, float alphaStart, float alphaEnd) { this.scaleStart = 1 << zoomStart; this.scaleEnd = 1 << zoomEnd; this.alphaStart = alphaStart; this.alphaEnd = alphaEnd; } } public BitmapTileLayer(Map map, TileSource tileSource) { this(map, tileSource, CACHE_LIMIT); } public BitmapTileLayer(Map map, TileSource tileSource, int cacheLimit) { super(map, new TileManager(map, cacheLimit), new VectorTileRenderer()); mTileManager.setZoomLevel(tileSource.getZoomLevelMin(), tileSource.getZoomLevelMax()); mTileSource = tileSource; initLoader(getNumLoaders()); } @Override public void onMapEvent(Event event, MapPosition pos) { super.onMapEvent(event, pos); if (event != Map.POSITION_EVENT) return; FadeStep[] fade = mTileSource.getFadeSteps(); if (fade == null) { //mRenderLayer.setBitmapAlpha(1); return; } float alpha = 0; for (FadeStep f : fade) { if (pos.scale < f.scaleStart || pos.scale > f.scaleEnd) continue; if (f.alphaStart == f.alphaEnd) { alpha = f.alphaStart; break; } double range = f.scaleEnd / f.scaleStart; float a = (float) ((range - (pos.scale / f.scaleStart)) / range); a = FastMath.clamp(a, 0, 1); // interpolate alpha between start and end alpha = a * f.alphaStart + (1 - a) * f.alphaEnd; break; } tileRenderer().setBitmapAlpha(alpha); } @Override protected TileLoader createLoader() { return new BitmapTileLoader(this, mTileSource); } @Override public void onDetach() { super.onDetach(); pool.clear(); } final static int POOL_FILL = 20; /** pool shared by TextLayers */ final TexturePool pool = new TexturePool(POOL_FILL) { // int sum = 0; // // public TextureItem release(TextureItem item) { // log.debug(getFill() + " " + sum + " release tex " + item.id); // return super.release(item); // }; // // public synchronized TextureItem get() { // log.debug(getFill() + " " + sum + " get tex "); // // return super.get(); // }; // // protected TextureItem createItem() { // log.debug(getFill() + " " + (sum++) + " create tex "); // // return super.createItem(); // }; // // protected void freeItem(TextureItem t) { // log.debug(getFill() + " " + (sum--) + " free tex "); // super.freeItem(t); // // }; }; }