Wrap BufferedImage access

This commit is contained in:
Astrash
2022-11-25 14:35:26 +11:00
parent b3f072d689
commit e9db14f52c
10 changed files with 97 additions and 55 deletions

View File

@@ -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<Supplier<ObjectTemplate<ColorSampler>>> colorSamplerRegistry = event.getPack().getOrCreateRegistry(

View File

@@ -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<BufferedImage> {
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);
}
}
}

View File

@@ -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<Image> {
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);
}
}
}

View File

@@ -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<ColorSampler> {
@Value("path")
protected BufferedImage image;
protected Image image;
@Value("align")
@Default

View File

@@ -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();
}
}

View File

@@ -0,0 +1,9 @@
package com.dfsek.terra.addons.image.image;
public interface Image {
int getRGB(int x, int y);
int getWidth();
int getHeight();
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}
};

View File

@@ -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);
}