OSDN Git Service

キャラクターデータの初回インボード時に必ず失敗していた問題の修正
[charactermanaj/CharacterManaJ.git] / src / main / java / charactermanaj / graphics / ColorConvertedImageCachedLoader.java
1 package charactermanaj.graphics;
2
3 import java.io.IOException;
4
5 import charactermanaj.graphics.colormodel.ColorModel;
6 import charactermanaj.graphics.filters.ColorConvertParameter;
7 import charactermanaj.graphics.io.ImageCache;
8 import charactermanaj.graphics.io.ImageCachedLoader;
9 import charactermanaj.graphics.io.ImageLoader;
10 import charactermanaj.graphics.io.ImageResource;
11 import charactermanaj.graphics.io.LoadedImage;
12
13 /**
14  * 画像リソースに対する色変換後の画像イメージを返します.<br>
15  * 一度読み込まれ色変換された画像は、画像ファイルの更新日が同一であり、且つ、色パラメータに変更がなければ
16  * 読み込み済みの画像イメージを返します.<br>
17  * @author seraphy
18  *
19  */
20 public class ColorConvertedImageCachedLoader extends ColorConvertedImageLoaderImpl {
21
22         private ImageCache<ColorConvertedImageKey> caches = new ImageCache<ColorConvertedImageKey>();
23
24         public ColorConvertedImageCachedLoader() {
25                 this(new ImageCachedLoader());
26         }
27
28         public ColorConvertedImageCachedLoader(ImageLoader imageLoader) {
29                 super(imageLoader);
30         }
31
32         @Override
33         public LoadedImage load(ImageResource file,
34                         ColorConvertParameter colorConvParam, ColorModel colorModel)
35                         throws IOException {
36                 if (file == null) {
37                         throw new IllegalArgumentException();
38                 }
39
40                 ColorConvertParameter param;
41                 if (colorConvParam == null) {
42                         param = new ColorConvertParameter();
43                 } else {
44                         param = colorConvParam.clone();
45                 }
46                 ColorConvertedImageKey key = new ColorConvertedImageKey(param, file);
47
48                 synchronized (caches) {
49                         LoadedImage loadedImage = caches.get(key);
50                         if (loadedImage == null) {
51                                 loadedImage = super.load(file, param, colorModel);
52                                 caches.set(key, loadedImage);
53                         }
54                         return loadedImage;
55                 }
56         }
57
58         @Override
59         public void close() {
60             caches.clear();
61             super.close();
62         }
63
64         public void unlockImages() {
65                 caches.unlockImages();
66         }
67
68 }
69
70 final class ColorConvertedImageKey {
71
72         private final ColorConvertParameter colorConvParameter;
73
74         private final ImageResource imageResource;
75
76         private final long lastModified;
77
78         private final int hashCode;
79
80         public ColorConvertedImageKey(ColorConvertParameter colorConvParameter, ImageResource imageResource) {
81                 if (colorConvParameter == null || imageResource == null) {
82                         throw new IllegalArgumentException();
83                 }
84                 this.colorConvParameter = colorConvParameter;
85                 this.imageResource = imageResource;
86                 this.lastModified = imageResource.lastModified();
87                 this.hashCode = imageResource.hashCode()
88                                 ^ colorConvParameter.hashCode() ^ (int) this.lastModified;
89         }
90
91         @Override
92         public int hashCode() {
93                 return this.hashCode;
94         }
95
96         @Override
97         public boolean equals(Object obj) {
98                 if (obj == this) {
99                         return true;
100                 }
101                 if (obj != null && obj instanceof ColorConvertedImageKey) {
102                         ColorConvertedImageKey other = (ColorConvertedImageKey) obj;
103                         return lastModified == other.lastModified
104                                         && imageResource.equals(other.imageResource)
105                                         && colorConvParameter.equals(other.colorConvParameter);
106                 }
107                 return false;
108         }
109 }