changed Image32 to use ImageIO rather than STBImage

This commit is contained in:
DaniTheSkunk 2022-12-19 01:29:47 +00:00
parent f93f35dae3
commit 931b3fc114
2 changed files with 102 additions and 6 deletions

View File

@ -0,0 +1,78 @@
package com.danitheskunk.skunkworks;
import java.io.InputStream;
import java.nio.ByteBuffer;
public final class ByteBufferInputStream extends InputStream {
private final ByteBuffer buf;
public ByteBufferInputStream(ByteBuffer buffer) {
if(buffer == null) throw new NullPointerException();
buf = buffer;
}
@Override
public synchronized int available() {
return buf.remaining();
}
@Override
public void close() {
}
@Override
public synchronized void mark(int readAheadLimit) {
buf.mark();
}
@Override
public boolean markSupported() {
return true;
}
@Override
public synchronized int read() {
if(buf.hasRemaining()) return buf.get() & 0xff;
return -1;
}
@Override
public synchronized int read(byte b[]) {
return read(0, b.length, b);
}
@Override
public synchronized int read(byte b[], int off, int len) {
if((off | len | off + len | b.length - (off + len)) < 0) {
throw new IndexOutOfBoundsException();
}
return read(off, len, b);
}
private int read(int off, int len, byte[] b) {
if(len == 0) return 0;
int rem = buf.remaining();
if(rem <= 0) return -1;
if(rem > len) rem = len;
buf.get(b, off, rem);
return rem;
}
@Override
public synchronized void reset() {
buf.reset();
}
@Override
public synchronized long skip(long n) {
if(n <= 0) return 0;
int rem = buf.remaining();
if(n > rem) n = rem;
buf.position((int) (buf.position() + n));
return n;
}
}

View File

@ -1,9 +1,13 @@
package com.danitheskunk.skunkworks.gfx; package com.danitheskunk.skunkworks.gfx;
import com.danitheskunk.skunkworks.ByteBufferInputStream;
import com.danitheskunk.skunkworks.Recti; import com.danitheskunk.skunkworks.Recti;
import com.danitheskunk.skunkworks.Vec2i; import com.danitheskunk.skunkworks.Vec2i;
import org.lwjgl.stb.STBImage; import org.lwjgl.stb.STBImage;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
public class Image32 { public class Image32 {
@ -13,12 +17,26 @@ public class Image32 {
//constructors //constructors
public Image32(ByteBuffer buffer) { //png or similar public Image32(ByteBuffer buffer) { //png or similar
//todo: resource system //todo: resource system
int[] x = {0}, y = {0}, n = {0}; BufferedImage img = null;
var img = STBImage.stbi_load_from_memory(buffer, x, y, n, 4); try {
size = new Vec2i(x[0], y[0]); img = ImageIO.read(new ByteBufferInputStream(buffer));
data = new byte[x[0] * y[0] * 4]; } catch(IOException e) {
assert img != null; throw new RuntimeException(e);
img.get(data); }
size = new Vec2i(img.getWidth(), img.getHeight());
data = new byte[img.getWidth() * img.getHeight() * 4];
var raster = img.getData();
//todo: find faster way?
for(int y = 0; y < img.getHeight(); ++y) {
for(int x = 0; x < img.getWidth(); ++x) {
var pix = raster.getPixel(x, y, (int[])null);
int i = x * 4 + y * 4 * img.getWidth();
data[i] = (byte)(pix[0] & 0xFF);
data[i+1] = (byte)(pix[1] & 0xFF);
data[i+2] = (byte)(pix[2] & 0xFF);
data[i+3] = (byte)(pix[3] & 0xFF);
}
}
} }
public Image32(Vec2i size) { public Image32(Vec2i size) {