From e9db14f52cbe186604e29ce012c4a50d231739a2 Mon Sep 17 00:00:00 2001 From: Astrash Date: Fri, 25 Nov 2022 14:35:26 +1100 Subject: [PATCH] Wrap BufferedImage access --- .../terra/addons/image/ImageLibraryAddon.java | 6 +-- .../image/config/BufferedImageLoader.java | 33 --------------- .../addons/image/config/ImageLoader.java | 41 +++++++++++++++++++ .../config/sampler/ColorSamplerTemplate.java | 5 +-- .../image/image/BufferedImageWrapper.java | 28 +++++++++++++ .../dfsek/terra/addons/image/image/Image.java | 9 ++++ .../image/sampler/SimpleColorSampler.java | 7 ++-- .../image/sampler/TileColorSampler.java | 7 ++-- .../image/sampler/transform/Alignment.java | 10 ++--- .../transform/ImageTransformation.java | 6 +-- 10 files changed, 97 insertions(+), 55 deletions(-) delete mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java create mode 100644 common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java index b360ef756..40a35fc70 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/ImageLibraryAddon.java @@ -2,12 +2,12 @@ package com.dfsek.terra.addons.image; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import java.awt.image.BufferedImage; import java.util.function.Supplier; -import com.dfsek.terra.addons.image.config.BufferedImageLoader; +import com.dfsek.terra.addons.image.config.ImageLoader; import com.dfsek.terra.addons.image.config.sampler.SingleColorSamplerTemplate; import com.dfsek.terra.addons.image.config.sampler.TileColorSamplerTemplate; +import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -37,7 +37,7 @@ public class ImageLibraryAddon implements AddonInitializer { .register(addon, ConfigPackPreLoadEvent.class) .priority(10) .then(event -> { - event.getPack().applyLoader(BufferedImage.class, new BufferedImageLoader(event.getPack().getLoader())); + event.getPack().applyLoader(Image.class, new ImageLoader(event.getPack().getLoader())); }) .then(event -> { CheckedRegistry>> colorSamplerRegistry = event.getPack().getOrCreateRegistry( diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java deleted file mode 100644 index d31bce66d..000000000 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/BufferedImageLoader.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.dfsek.terra.addons.image.config; - -import com.dfsek.tectonic.api.depth.DepthTracker; -import com.dfsek.tectonic.api.exception.LoadException; -import com.dfsek.tectonic.api.loader.ConfigLoader; -import com.dfsek.tectonic.api.loader.type.TypeLoader; -import org.jetbrains.annotations.NotNull; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.lang.reflect.AnnotatedType; - -import com.dfsek.terra.api.config.Loader; - - -public class BufferedImageLoader implements TypeLoader { - private final Loader files; - - public BufferedImageLoader(Loader files) { - this.files = files; - } - - @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); - } - } -} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java new file mode 100644 index 000000000..15cbe4c52 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/ImageLoader.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.addons.image.config; + +import com.dfsek.tectonic.api.depth.DepthTracker; +import com.dfsek.tectonic.api.exception.LoadException; +import com.dfsek.tectonic.api.loader.ConfigLoader; +import com.dfsek.tectonic.api.loader.type.TypeLoader; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.imageio.ImageIO; +import java.io.IOException; +import java.lang.reflect.AnnotatedType; + +import com.dfsek.terra.addons.image.image.BufferedImageWrapper; +import com.dfsek.terra.addons.image.image.Image; +import com.dfsek.terra.api.config.Loader; + + +public class ImageLoader implements TypeLoader { + + private static final Logger logger = LoggerFactory.getLogger(ImageLoader.class); + + private final Loader files; + + public ImageLoader(Loader files) { + this.files = files; + } + + @Override + public Image load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader, DepthTracker depthTracker) + throws LoadException { + try { + return new BufferedImageWrapper(ImageIO.read(files.get((String) c))); + } catch(IllegalArgumentException e) { + throw new LoadException("Unable to load image (image might be too large?)", e, depthTracker); + } catch(IOException e) { + throw new LoadException("Unable to load image", e, depthTracker); + } + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java index 90c69515e..1dfe84152 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/config/sampler/ColorSamplerTemplate.java @@ -4,8 +4,7 @@ import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; -import java.awt.image.BufferedImage; - +import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.ColorSampler; import com.dfsek.terra.addons.image.sampler.transform.Alignment; @@ -13,7 +12,7 @@ import com.dfsek.terra.addons.image.sampler.transform.Alignment; public abstract class ColorSamplerTemplate implements ObjectTemplate { @Value("path") - protected BufferedImage image; + protected Image image; @Value("align") @Default diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java new file mode 100644 index 000000000..16df31a74 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/BufferedImageWrapper.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.addons.image.image; + +import java.awt.image.BufferedImage; + + +public class BufferedImageWrapper implements Image { + + private final BufferedImage image; + + public BufferedImageWrapper(BufferedImage image) { + this.image = image; + } + + @Override + public int getRGB(int x, int y) { + return image.getRGB(x, y); + } + + @Override + public int getWidth() { + return image.getWidth(); + } + + @Override + public int getHeight() { + return image.getHeight(); + } +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java new file mode 100644 index 000000000..f8eb83793 --- /dev/null +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/image/Image.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.addons.image.image; + +public interface Image { + int getRGB(int x, int y); + + int getWidth(); + + int getHeight(); +} diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java index 4bf38cff1..dbff9cb47 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/SimpleColorSampler.java @@ -1,19 +1,18 @@ package com.dfsek.terra.addons.image.sampler; -import java.awt.image.BufferedImage; - +import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.transform.ImageTransformation; public class SimpleColorSampler implements ColorSampler { - private final BufferedImage image; + private final Image image; private final Integer fallback; private final ImageTransformation transformation; - public SimpleColorSampler(BufferedImage image, int fallbackColor, ImageTransformation transformation) { + public SimpleColorSampler(Image image, ColorSampler fallback, ImageTransformation transformation) { this.image = image; this.fallback = fallbackColor; this.transformation = transformation; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java index 99f57ad28..19812a3db 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/TileColorSampler.java @@ -2,18 +2,17 @@ package com.dfsek.terra.addons.image.sampler; import net.jafama.FastMath; -import java.awt.image.BufferedImage; - +import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.sampler.transform.ImageTransformation; public class TileColorSampler implements ColorSampler { - private final BufferedImage image; + private final Image image; private final ImageTransformation transformation; - public TileColorSampler(BufferedImage image, ImageTransformation transformation) { + public TileColorSampler(Image image, ImageTransformation transformation) { this.image = image; this.transformation = transformation; } diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java index c212a2ff4..474772a0a 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/Alignment.java @@ -1,29 +1,29 @@ package com.dfsek.terra.addons.image.sampler.transform; -import java.awt.image.BufferedImage; +import com.dfsek.terra.addons.image.image.Image; public enum Alignment implements ImageTransformation { NONE() { @Override - public int transformX(BufferedImage image, int x) { + public int transformX(Image image, int x) { return x; } @Override - public int transformZ(BufferedImage image, int z) { + public int transformZ(Image image, int z) { return z; } }, CENTER { @Override - public int transformX(BufferedImage image, int x) { + public int transformX(Image image, int x) { return x + image.getWidth() / 2; } @Override - public int transformZ(BufferedImage image, int z) { + public int transformZ(Image image, int z) { return z + image.getHeight() / 2; } }; diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java index da3f7c0c1..5a22e6a05 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/sampler/transform/ImageTransformation.java @@ -1,11 +1,11 @@ package com.dfsek.terra.addons.image.sampler.transform; -import java.awt.image.BufferedImage; +import com.dfsek.terra.addons.image.image.Image; public interface ImageTransformation { - int transformX(BufferedImage image, int x); + int transformX(Image image, int x); - int transformZ(BufferedImage image, int z); + int transformZ(Image image, int z); }