mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-03 08:25:31 +00:00
Cache loaded BufferedImages
This commit is contained in:
parent
5bc34eb626
commit
b10130c5c6
@ -27,24 +27,41 @@ import javax.imageio.ImageIO;
|
|||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.AnnotatedType;
|
import java.lang.reflect.AnnotatedType;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.config.ConfigPack;
|
||||||
import com.dfsek.terra.api.config.Loader;
|
import com.dfsek.terra.api.config.Loader;
|
||||||
|
import com.dfsek.terra.api.properties.Properties;
|
||||||
|
|
||||||
|
|
||||||
public class BufferedImageLoader implements TypeLoader<BufferedImage> {
|
public class BufferedImageLoader implements TypeLoader<BufferedImage> {
|
||||||
private final Loader files;
|
private final Loader files;
|
||||||
|
|
||||||
public BufferedImageLoader(Loader files) {
|
private final ConfigPack pack;
|
||||||
|
|
||||||
|
public BufferedImageLoader(Loader files, ConfigPack pack) {
|
||||||
this.files = files;
|
this.files = files;
|
||||||
|
this.pack = pack;
|
||||||
|
if (!pack.getContext().has(ImageCache.class))
|
||||||
|
pack.getContext().put(new ImageCache(new ConcurrentHashMap<>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BufferedImage load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker)
|
public BufferedImage load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker)
|
||||||
throws LoadException {
|
throws LoadException {
|
||||||
|
System.out.println(pack.getContext().get(ImageCache.class).map);
|
||||||
|
return pack.getContext().get(ImageCache.class).map.computeIfAbsent((String) c, s -> {
|
||||||
try {
|
try {
|
||||||
return ImageIO.read(files.get((String) c));
|
return ImageIO.read(files.get(s));
|
||||||
} catch(IOException e) {
|
} catch(IOException e) {
|
||||||
throw new LoadException("Unable to load image", e, depthTracker);
|
throw new LoadException("Unable to load image", e, depthTracker);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cache prevents configs from loading the same image multiple times into memory
|
||||||
|
*/
|
||||||
|
private record ImageCache(ConcurrentHashMap<String, BufferedImage> map) implements Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -283,7 +283,7 @@ public class ConfigPackImpl implements ConfigPack {
|
|||||||
@Override
|
@Override
|
||||||
public void register(TypeRegistry registry) {
|
public void register(TypeRegistry registry) {
|
||||||
registry.registerLoader(ConfigType.class, configTypeRegistry)
|
registry.registerLoader(ConfigType.class, configTypeRegistry)
|
||||||
.registerLoader(BufferedImage.class, new BufferedImageLoader(loader));
|
.registerLoader(BufferedImage.class, new BufferedImageLoader(loader, this));
|
||||||
registryMap.forEach(registry::registerLoader);
|
registryMap.forEach(registry::registerLoader);
|
||||||
shortcuts.forEach(registry::registerLoader); // overwrite with delegated shortcuts if present
|
shortcuts.forEach(registry::registerLoader); // overwrite with delegated shortcuts if present
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user