diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java index 98f24842c..ba770861c 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/config/BufferedImageLoader.java @@ -27,24 +27,41 @@ import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; 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.properties.Properties; public class BufferedImageLoader implements TypeLoader { private final Loader files; - public BufferedImageLoader(Loader files) { + private final ConfigPack pack; + + public BufferedImageLoader(Loader files, ConfigPack pack) { this.files = files; + this.pack = pack; + if (!pack.getContext().has(ImageCache.class)) + pack.getContext().put(new ImageCache(new ConcurrentHashMap<>())); } @Override public BufferedImage load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) throws LoadException { - try { - return ImageIO.read(files.get((String) c)); - } catch(IOException e) { - throw new LoadException("Unable to load image", e, depthTracker); - } + System.out.println(pack.getContext().get(ImageCache.class).map); + return pack.getContext().get(ImageCache.class).map.computeIfAbsent((String) c, s -> { + try { + return ImageIO.read(files.get(s)); + } catch(IOException e) { + 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 map) implements Properties { } } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index 84f2fb382..611539c41 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -283,7 +283,7 @@ public class ConfigPackImpl implements ConfigPack { @Override public void register(TypeRegistry registry) { registry.registerLoader(ConfigType.class, configTypeRegistry) - .registerLoader(BufferedImage.class, new BufferedImageLoader(loader)); + .registerLoader(BufferedImage.class, new BufferedImageLoader(loader, this)); registryMap.forEach(registry::registerLoader); shortcuts.forEach(registry::registerLoader); // overwrite with delegated shortcuts if present }