From f93f35dae3c10c57a38fba3c10469ab5657dbe96 Mon Sep 17 00:00:00 2001 From: DaniTheSkunk <> Date: Mon, 19 Dec 2022 00:53:33 +0000 Subject: [PATCH] started adding Image8 --- com/danitheskunk/skunkworks/Engine.java | 7 +- com/danitheskunk/skunkworks/gfx/Image8.java | 85 +++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 com/danitheskunk/skunkworks/gfx/Image8.java diff --git a/com/danitheskunk/skunkworks/Engine.java b/com/danitheskunk/skunkworks/Engine.java index b351099..e072094 100644 --- a/com/danitheskunk/skunkworks/Engine.java +++ b/com/danitheskunk/skunkworks/Engine.java @@ -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); diff --git a/com/danitheskunk/skunkworks/gfx/Image8.java b/com/danitheskunk/skunkworks/gfx/Image8.java new file mode 100644 index 0000000..ce6be2b --- /dev/null +++ b/com/danitheskunk/skunkworks/gfx/Image8.java @@ -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); + } +}