X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.maps%2Fsrc%2Forg%2Fsimantics%2Fmaps%2Feclipse%2FDiskCachingTileProvider.java;fp=org.simantics.district.maps%2Fsrc%2Forg%2Fsimantics%2Fmaps%2Feclipse%2FDiskCachingTileProvider.java;h=418b1285171ded5657a1d1e32fdfd85aa9aea493;hb=d3de128e6d55f9f6a1325985695b925a1056c469;hp=2bef3eebffb6e87f0b86ebc5826647dc071774cf;hpb=29914be09d4a237840e5c793bdb562ec83093b8d;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.maps/src/org/simantics/maps/eclipse/DiskCachingTileProvider.java b/org.simantics.district.maps/src/org/simantics/maps/eclipse/DiskCachingTileProvider.java index 2bef3eeb..418b1285 100644 --- a/org.simantics.district.maps/src/org/simantics/maps/eclipse/DiskCachingTileProvider.java +++ b/org.simantics.district.maps/src/org/simantics/maps/eclipse/DiskCachingTileProvider.java @@ -18,6 +18,7 @@ import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; import java.net.URI; +import java.util.concurrent.ForkJoinPool; import javax.imageio.ImageIO; @@ -25,14 +26,19 @@ import org.eclipse.core.runtime.IPath; 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; @@ -41,15 +47,6 @@ public class DiskCachingTileProvider implements ITileProvider { 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; @@ -79,8 +76,7 @@ public class DiskCachingTileProvider implements ITileProvider { 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; } @@ -104,40 +100,18 @@ public class DiskCachingTileProvider implements ITileProvider { 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(); @@ -165,20 +139,15 @@ public class DiskCachingTileProvider implements ITileProvider { } @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; }