1 package charactermanaj.graphics.io;
\r
3 import java.io.Closeable;
\r
4 import java.io.IOException;
\r
8 * 一度読み込んだ画像をキャッシュする画像ローダ.<br>
\r
9 * すでに読み込まれており、ファイルの更新日に変更がなければ読み込み済みの画像をかえす.<br>
\r
12 public class ImageCachedLoader extends ImageLoaderImpl implements Closeable {
\r
15 * リソースに対するイメージキャッシュ.<br>
\r
16 * リソースは複数のプロファイルで共有しえるのでstaticとしている。
\r
18 private static ImageCache<ImageResourceCacheKey> caches = new ImageCache<ImageResourceCacheKey>();
\r
21 public LoadedImage load(ImageResource imageResource) throws IOException {
\r
22 if (imageResource == null) {
\r
23 throw new IllegalArgumentException();
\r
26 ImageResourceCacheKey key = new ImageResourceCacheKey(imageResource);
\r
28 synchronized (caches) {
\r
29 LoadedImage loadedImage = caches.get(key);
\r
31 if (loadedImage != null) {
\r
32 long lastModified = loadedImage.getLastModified();
\r
33 if (lastModified != imageResource.lastModified()) {
\r
34 // キャッシュされているが、すでに古い場合は破棄する.
\r
39 if (loadedImage == null) {
\r
40 loadedImage = super.load(imageResource);
\r
41 caches.set(key, loadedImage);
\r
42 caches.unlockImages(); // 即時解放許可
\r
49 public void close() {
\r
54 final class ImageResourceCacheKey {
\r
56 private final ImageResource imageResource;
\r
58 private final int hashCode;
\r
60 public ImageResourceCacheKey(ImageResource imageResource) {
\r
61 if (imageResource == null) {
\r
62 throw new IllegalArgumentException();
\r
64 this.imageResource = imageResource;
\r
65 this.hashCode = imageResource.hashCode();
\r
69 public int hashCode() {
\r
70 return this.hashCode;
\r
74 public boolean equals(Object obj) {
\r
78 if (obj != null && obj instanceof ImageResourceCacheKey) {
\r
79 ImageResourceCacheKey other = (ImageResourceCacheKey) obj;
\r
80 return imageResource.equals(other.imageResource);
\r