20 package net.sf.gridarta.gui.mapimagecache;
22 import java.awt.Graphics;
23 import java.awt.Image;
24 import java.awt.image.BufferedImage;
26 import java.io.IOException;
27 import java.lang.ref.WeakReference;
28 import java.util.HashMap;
30 import javax.imageio.ImageIO;
33 import org.apache.log4j.Category;
34 import org.apache.log4j.Logger;
35 import org.jetbrains.annotations.NotNull;
36 import org.jetbrains.annotations.Nullable;
72 private final Map<File, WeakReference<Image>>
images =
new HashMap<>();
78 private final Map<File, Long>
timestamps =
new HashMap<>();
98 public void flush(@NotNull
final File mapFile) {
110 if (cacheFile.exists() && !cacheFile.delete()) {
111 LOG.warn(
"cannot delete cache file: " + cacheFile);
122 final WeakReference<Image> ref =
images.get(mapFile);
124 final Image image = ref.get();
125 if (image !=
null && mapFile.lastModified() <=
timestamps.get(mapFile)) {
140 private void saveImageFile(@NotNull
final File mapFile, @NotNull
final Image image) {
143 final File imageDir = imageFile.getParentFile();
144 if (imageDir !=
null && !imageDir.exists() && !imageDir.mkdirs()) {
145 LOG.warn(
"cannot create cache directory: " + imageDir);
148 final int width = image.getWidth(
null);
152 final int height = image.getHeight(
null);
156 final BufferedImage bufferedImage =
new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
157 final Graphics graphics = bufferedImage.getGraphics();
159 graphics.drawImage(image, 0, 0,
null);
165 ImageIO.write(bufferedImage,
"png", imageFile);
166 timestamps.put(mapFile, imageFile.lastModified());
167 }
catch (
final IOException e) {
168 LOG.warn(
"Cannot create icon file " + imageFile +
": " + e.getMessage());
182 if (!imageFile.exists()) {
187 final long imageLastModified = imageFile.lastModified();
188 if (imageLastModified == 0L) {
193 final long mapLastModified = mapFile.lastModified();
194 if (mapLastModified == 0L || mapLastModified >= imageLastModified) {
202 image = ImageIO.read(imageFile);
203 }
catch (
final IOException ignored) {
206 if (image.getWidth(
null) <= 0 || image.getHeight(
null) <= 0) {
212 timestamps.put(mapFile, imageFile.lastModified());
224 if (mapFile.isDirectory()) {
234 if (image2 ==
null) {
238 if (mapFile.lastModified() <=
timestamps.get(mapFile)) {
239 images.put(mapFile,
new WeakReference<>(image2));
264 public Image
scaleImage(@Nullable
final File mapFile, @NotNull
final Image image,
final int width,
final int height) {
269 }
catch (
final InterruptedException ignored) {
270 Thread.currentThread().interrupt();
272 }
catch (
final OutOfMemoryError ignored) {
275 if (mapFile !=
null) {
276 images.put(mapFile,
new WeakReference<>(result));
277 timestamps.put(mapFile, mapFile.lastModified());