OSDN Git Service

1c7b5f47d8c2f42b37fe0a25671bc6ce1f97062f
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / graphics / io / ImageCachedLoader.java
1 package charactermanaj.graphics.io;\r
2 \r
3 import java.io.Closeable;\r
4 import java.io.IOException;\r
5 \r
6 \r
7 /**\r
8  * 一度読み込んだ画像をキャッシュする画像ローダ.<br>\r
9  * すでに読み込まれており、ファイルの更新日に変更がなければ読み込み済みの画像をかえす.<br>\r
10  * @author seraphy\r
11  */\r
12 public class ImageCachedLoader extends ImageLoaderImpl implements Closeable {\r
13 \r
14         /**\r
15          * リソースに対するイメージキャッシュ.<br>\r
16          * リソースは複数のプロファイルで共有しえるのでstaticとしている。\r
17          */\r
18         private static ImageCache<ImageResourceCacheKey> caches = new ImageCache<ImageResourceCacheKey>();\r
19 \r
20         @Override\r
21     public LoadedImage load(ImageResource imageResource) throws IOException {\r
22                 if (imageResource == null) {\r
23                         throw new IllegalArgumentException();\r
24                 }\r
25 \r
26                 ImageResourceCacheKey key = new ImageResourceCacheKey(imageResource);\r
27 \r
28                 synchronized (caches) {\r
29                         LoadedImage loadedImage = caches.get(key);\r
30 \r
31                         if (loadedImage != null) {\r
32                                 long lastModified = loadedImage.getLastModified();\r
33                                 if (lastModified != imageResource.lastModified()) {\r
34                                         // キャッシュされているが、すでに古い場合は破棄する.\r
35                                         loadedImage = null;\r
36                                 }\r
37                         }\r
38 \r
39                         if (loadedImage == null) {\r
40                                 loadedImage = super.load(imageResource);\r
41                                 caches.set(key, loadedImage);\r
42                                 caches.unlockImages(); // 即時解放許可\r
43                         }\r
44 \r
45                         return loadedImage;\r
46                 }\r
47         }\r
48 \r
49         public void close() {\r
50             caches.clear();\r
51         }\r
52 }\r
53 \r
54 final class ImageResourceCacheKey {\r
55 \r
56         private final ImageResource imageResource;\r
57 \r
58         private final int hashCode;\r
59 \r
60         public ImageResourceCacheKey(ImageResource imageResource) {\r
61                 if (imageResource == null) {\r
62                         throw new IllegalArgumentException();\r
63                 }\r
64                 this.imageResource = imageResource;\r
65                 this.hashCode = imageResource.hashCode();\r
66         }\r
67 \r
68         @Override\r
69         public int hashCode() {\r
70                 return this.hashCode;\r
71         }\r
72 \r
73         @Override\r
74         public boolean equals(Object obj) {\r
75                 if (obj == this) {\r
76                         return true;\r
77                 }\r
78                 if (obj != null && obj instanceof ImageResourceCacheKey) {\r
79                         ImageResourceCacheKey other = (ImageResourceCacheKey) obj;\r
80                         return imageResource.equals(other.imageResource);\r
81                 }\r
82                 return false;\r
83         }\r
84 }\r