]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.maps/src/org/simantics/maps/eclipse/DiskCachingTileProvider.java
Ensure ITileProviders return BufferedImages with compatible ColorModel
[simantics/district.git] / org.simantics.district.maps / src / org / simantics / maps / eclipse / DiskCachingTileProvider.java
index 2bef3eebffb6e87f0b86ebc5826647dc071774cf..418b1285171ded5657a1d1e32fdfd85aa9aea493 100644 (file)
@@ -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;
     }