import java.io.File;
import java.io.IOException;
import java.net.URI;
+import java.util.concurrent.ForkJoinPool;
import javax.imageio.ImageIO;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
import org.simantics.maps.ProvisionException;
+import org.simantics.maps.internal.ImageUtil;
import org.simantics.maps.tile.ITileProvider;
import org.simantics.maps.tile.TileKey;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* @author Tuukka Lehtonen
*/
public class DiskCachingTileProvider implements ITileProvider {
+ private static final Logger LOGGER = LoggerFactory.getLogger(DiskCachingTileProvider.class);
+
private final String CACHED_IMAGE_FORMAT = "png";
ITileProvider provider;
boolean supportAlpha;
-// private ImageWriter writer;
-//
-// private ImageReader reader;
-//
-// private ImageTypeSpecifier noAlphaType = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_3BYTE_BGR);
-//
-// private ImageTypeSpecifier alphaType = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR);
-
-
public DiskCachingTileProvider(ITileProvider provider, Boolean supportAlpha) {
this.provider = provider;
this.supportAlpha = supportAlpha;
if (!f.exists()) {
f.mkdirs();
} else if (!f.isDirectory()) {
-// FIXME
-// ErrorLogger.defaultLogError("Cache directory " + f.toString() + " already exists as a file, cannot use it for cache", new Exception());
+ LOGGER.error("Tile cache directory " + f.toString() + " already exists as a file, cannot use it as a cache directory", new Exception());
return;
}
IPath cachePath = toTileCachePath(key).addFileExtension(CACHED_IMAGE_FORMAT);
File f = cachePath.toFile();
if (f.exists()) {
-// ImageInputStream iis = null;
try {
-// iis = ImageIO.createImageInputStream(f);
-// ImageReadParam param = reader.getDefaultReadParam();
-// param.setDestinationType(supportAlpha ? alphaType : noAlphaType);
-// reader.setInput(iis, true, true);
-// BufferedImage img = reader.read(0, param);
BufferedImage img = ImageIO.read(f);
if (img != null) {
//System.out.println("[" + provider + "] Disk cache hit: " + key);
//System.out.println("[" + provider + "] image: " + img);
// Need to make sure that the type of the loaded image is
// something that can be rendered in an accelerated fashion.
- if (img.getType() != BufferedImage.TYPE_CUSTOM)
- return img;
-
- BufferedImage img2 = null;
- if (img.getAlphaRaster() != null) {
- img2 = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
- } else {
- img2 = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
- }
- //System.out.println("[" + provider + "] image2: " + img2);
-
- img.copyData(img2.getRaster());
- return img2;
+ return ImageUtil.toScreenCompatibleImage(img);
}
} catch (IOException e) {
- e.printStackTrace();
+ LOGGER.warn("Failed to load cached tile from {}", f.toString(), e);
} finally {
-// try {
-// iis.close();
-// } catch (IOException e) {
-// }
}
// Data is most likely corrupted, just destroy it.
f.delete();
}
@Override
- public Image get(final TileKey key) throws ProvisionException {
+ public Image get(TileKey key) throws ProvisionException {
Image img = lookupFromDisk(key);
if (img == null) {
img = provider.get(key);
final Image image = img;
-
- // Write image to disk in the background
- // TODO: use somekind of worker executor system instead of just threads.
- new Thread() {
- @Override
- public void run() {
- cacheToDisk(key, image);
- }
- }.start();
+ if (cachePath != null) {
+ // Write image to disk in the background
+ ForkJoinPool.commonPool().submit(() -> cacheToDisk(key, image));
+ }
}
return img;
}