package hunternif.mc.atlas.util;
import java.awt.*;
import java.awt.image.*;
import java.util.Vector;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
class RenderedImageScanned implements RenderedImage {
private final int width;
private final int height;
private int bufY;
private final BufferedImage scanBuffer;
private final Consumer<Graphics2D> generator;
private final IntConsumer rowListener;
public RenderedImageScanned(int width, int height, BufferedImage scanBuffer, Consumer<Graphics2D> generator, IntConsumer rowListener) {
this.width = width;
this.height = height;
this.scanBuffer = scanBuffer;
this.generator = generator;
this.rowListener = rowListener;
bufY = 0;
redrawToBuffer();
}
private void redrawToBuffer() {
Log.info("Redrawing at %d", bufY);
Graphics2D graphics = scanBuffer.createGraphics();
graphics.setBackground(new Color(0, 0, 0, 0));
graphics.clearRect(0, 0, scanBuffer.getWidth(), scanBuffer.getHeight());
graphics.translate(0, -bufY);
generator.accept(graphics);
}
@Override
public Raster getData(Rectangle rect) {
if(rect.height > scanBuffer.getHeight())
return null;
if(rect.y >= bufY+scanBuffer.getHeight() || rect.y + rect.height <= bufY) {
bufY = rect.y;
redrawToBuffer();
}
rowListener.accept(rect.y-bufY);
Raster r = scanBuffer.getData(new Rectangle(rect.x, rect.y-bufY, rect.width, rect.height));
r = r.createTranslatedChild(r.getMinX(), r.getMinY()+bufY);
return r;
}
@Override
public Vector<RenderedImage> getSources() {
return null;
}
@Override
public Object getProperty(String name) {
return scanBuffer.getProperty(name);
}
@Override
public String[] getPropertyNames() {
return scanBuffer.getPropertyNames();
}
@Override
public ColorModel getColorModel() {
return scanBuffer.getColorModel();
}
@Override
public SampleModel getSampleModel() {
return scanBuffer.getSampleModel();
}
@Override
public int getWidth() {
return width;
}
@Override
public int getHeight() {
return height;
}
@Override
public int getMinX() {
return 0;
}
@Override
public int getMinY() {
return 0;
}
@Override
public int getNumXTiles() {
return 1;
}
@Override
public int getNumYTiles() {
return (int)Math.ceil( (float)this.height / (float)scanBuffer.getHeight() );
}
@Override
public int getMinTileX() {
return 0;
}
@Override
public int getMinTileY() {
return 0;
}
@Override
public int getTileWidth() {
return width;
}
@Override
public int getTileHeight() {
return height;
}
@Override
public int getTileGridXOffset() {
return 0;
}
@Override
public int getTileGridYOffset() {
return 0;
}
@Override
public Raster getTile(int tileX, int tileY) {
return null;
}
@Override
public Raster getData() {
return null;
}
@Override
public WritableRaster copyData(WritableRaster raster) {
return null;
}
}