started adding Image8
This commit is contained in:
parent
4747abe678
commit
f93f35dae3
|
@ -3,6 +3,7 @@ package com.danitheskunk.skunkworks;
|
|||
import com.danitheskunk.skunkworks.backends.gl.Window;
|
||||
import com.danitheskunk.skunkworks.gfx.GraphicsBackend;
|
||||
import com.danitheskunk.skunkworks.gfx.Image32;
|
||||
import com.danitheskunk.skunkworks.gfx.Image8;
|
||||
import org.lwjgl.BufferUtils;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
|
@ -65,10 +66,14 @@ public class Engine {
|
|||
return data;
|
||||
}
|
||||
|
||||
public Image32 loadImage(String path) {
|
||||
public Image32 loadImage32(String path) {
|
||||
return new Image32(loadBytes(path));
|
||||
}
|
||||
|
||||
public Image8 loadImage8(String path) {
|
||||
return new Image8(loadBytes(path));
|
||||
}
|
||||
|
||||
public IWindow openWindow(Vec2i size, String title) {
|
||||
return switch(graphicsBackend) {
|
||||
case OPENGL -> new Window(size, title, this);
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
package com.danitheskunk.skunkworks.gfx;
|
||||
|
||||
import com.danitheskunk.skunkworks.Recti;
|
||||
import com.danitheskunk.skunkworks.Vec2i;
|
||||
import org.lwjgl.stb.STBImage;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public class Image8 {
|
||||
private final byte[] data;
|
||||
private final Vec2i size;
|
||||
|
||||
//constructors
|
||||
public Image8(ByteBuffer buffer) { //png or similar
|
||||
//todo: resource system
|
||||
int[] x = {0}, y = {0}, n = {0};
|
||||
var img = STBImage.stbi_load_from_memory(buffer, x, y, n, 1);
|
||||
size = new Vec2i(x[0], y[0]);
|
||||
data = new byte[x[0] * y[0]];
|
||||
assert img != null;
|
||||
img.get(data);
|
||||
}
|
||||
|
||||
public Image8(Vec2i size) {
|
||||
this.size = size;
|
||||
data = new byte[size.getX() * size.getY()];
|
||||
}
|
||||
|
||||
public Image8(ByteBuffer buffer, Vec2i size) {
|
||||
data = new byte[buffer.remaining()];
|
||||
buffer.get(data);
|
||||
this.size = size;
|
||||
}
|
||||
|
||||
public void drawImage(Image8 srcImage, Vec2i destPos) {
|
||||
drawImage(srcImage, destPos, new Recti(Vec2i.ZERO,
|
||||
srcImage.getSize()));
|
||||
}
|
||||
|
||||
public void drawImage(Image8 srcImage, Vec2i destPos, Recti srcRect) {
|
||||
//todo: check bounds
|
||||
//todo: write in faster way than pixel stuff
|
||||
for(int y = 0; y < srcRect.getHeight(); ++y) {
|
||||
for(int x = 0; x < srcRect.getWidth(); ++x) {
|
||||
var iterPos = new Vec2i(x, y);
|
||||
var to = Vec2i.add(destPos, iterPos);
|
||||
var from = Vec2i.add(srcRect.getPos(), iterPos);
|
||||
setPixel(to, srcImage.getPixel(from));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//getters
|
||||
public byte[] getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public int getHeight() {
|
||||
return size.getY();
|
||||
}
|
||||
|
||||
public int getPixel(Vec2i pos) {
|
||||
int i = pos.getX() + pos.getY() * size.getX();
|
||||
return (int)data[i] & 0xFF; //todo: check if that works > 127
|
||||
}
|
||||
|
||||
public Vec2i getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public Image8 getSubImage(Recti rect) {
|
||||
Image8 img = new Image8(rect.getSize());
|
||||
img.drawImage(this, Vec2i.ZERO, rect);
|
||||
return img;
|
||||
}
|
||||
|
||||
public int getWidth() {
|
||||
return size.getX();
|
||||
}
|
||||
|
||||
public void setPixel(Vec2i pos, int col) {
|
||||
int i = pos.getX() + pos.getY() * size.getX();
|
||||
data[i] = (byte) (col & 0xFF);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue