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) {
99 images.remove(mapFile);
100 final File cacheFile = cacheFiles.
getCacheFile(mapFile, prefix);
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)) {
129 images.remove(mapFile);
140 private void saveImageFile(@NotNull
final File mapFile, @NotNull
final Image image) {
141 final File imageFile = cacheFiles.
getCacheFile(mapFile, prefix);
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());
180 final File imageFile = cacheFiles.
getCacheFile(mapFile, prefix);
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());
Image loadImageFile(@NotNull final File mapFile)
Loads an image file from disk.
Reading and writing of maps, handling of paths.
Creates derived files for caching files.
Image scaleImage(@Nullable final File mapFile, @NotNull final Image image, final int width, final int height)
Scales an Image to the given size and updates the cache.
final Map< File, WeakReference< Image > > images
The cached icons.
Image getDefaultImage()
Returns the default image.
Base package of all Gridarta classes.
void saveImageFile(@NotNull final File mapFile, @NotNull final Image image)
Saves an PNG image file for a map file.
Utility class for image related functions.
static Image scaleImage(@NotNull final Image image, final int w, final int h)
Returns a scaled version of an Image.
final Image defaultImage
The default image.
An image cache entry for one ImageType.
final CacheFiles cacheFiles
The CacheFiles for generating files for cached icons and previews.
void flush(@NotNull final File mapFile)
Removes the cached image for a map file.
final String prefix
The directory prefix name for the cache directory.
static final Category LOG
The logger for printing log messages.
MapImageCacheEntry(@NotNull final CacheFiles cacheFiles, @NotNull final Image defaultImage, @NotNull final String prefix)
Creates a new instance.
final Map< File, Long > timestamps
The timestamps of the cached icons.
Image lookupCache(@NotNull final File mapFile)
Looks up an image from the cache.
Image getImageIcon(@NotNull final File mapFile)
Returns the Image for a given map file.
static void deleteCacheFile(@NotNull final File cacheFile)
Deletes a cache file if it exists.
File getCacheFile(@NotNull File file, @Nullable String prefix)
Returns the File for caching a given file.