From 04acc6b7cebed3f70f4735c72da9e061ab592a7e Mon Sep 17 00:00:00 2001 From: Sebastiaan de Schaetzen Date: Tue, 16 Dec 2025 13:12:09 +0100 Subject: [PATCH] Add ResourceLoader for efficient Pixmap management and enhance CursorService functionality --- .../diceos/system/CursorService.java | 40 +++++++++++++----- .../diceos/system/ResourceLoader.java | 19 +++++++++ .../seeseemelk/diceos/system/utils/Utils.java | 6 +++ src/main/resources/menubar.png | Bin 303 -> 305 bytes src/main/resources/{ => system}/cursor.png | Bin 5 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 src/main/java/be/seeseemelk/diceos/system/ResourceLoader.java rename src/main/resources/{ => system}/cursor.png (100%) diff --git a/src/main/java/be/seeseemelk/diceos/system/CursorService.java b/src/main/java/be/seeseemelk/diceos/system/CursorService.java index b957c5b..788eba2 100644 --- a/src/main/java/be/seeseemelk/diceos/system/CursorService.java +++ b/src/main/java/be/seeseemelk/diceos/system/CursorService.java @@ -1,22 +1,37 @@ package be.seeseemelk.diceos.system; +import be.seeseemelk.diceos.system.utils.Utils; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Cursor; import com.badlogic.gdx.graphics.Pixmap; import io.avaje.inject.Component; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import java.util.HashMap; +import java.util.Map; + @Slf4j @Component +@RequiredArgsConstructor public class CursorService { + private final ResourceLoader resourceLoader; + private final Map cursors = new HashMap<>(); private int cursorScale = 1; private Cursor currentCursor; + private record Key( + int scale + ) {} + void setScale(int scale) { + if (!Utils.isPowerOfTwo(scale)) { + return; + } + if (cursorScale != scale) { cursorScale = scale; if (currentCursor != null) { - currentCursor.dispose(); currentCursor = null; } } @@ -27,17 +42,22 @@ public class CursorService { return; } - var original = new Pixmap(Gdx.files.internal("cursor.png")); + currentCursor = cursors.computeIfAbsent(new Key(cursorScale), this::createCursor); + Gdx.graphics.setCursor(currentCursor); + } + + private Cursor createCursor(Key key) { + var original = resourceLoader.loadPixmap("system/cursor.png"); var scaled = new Pixmap(original.getWidth() * cursorScale, original.getHeight() * cursorScale, original.getFormat()); - scaled.setFilter(Pixmap.Filter.NearestNeighbour); - scaled.drawPixmap(original, 0, 0, original.getWidth(), original.getHeight(), - 0, 0, scaled.getWidth(), scaled.getHeight()); + try { + scaled.setFilter(Pixmap.Filter.NearestNeighbour); + scaled.drawPixmap(original, 0, 0, original.getWidth(), original.getHeight(), + 0, 0, scaled.getWidth(), scaled.getHeight()); - currentCursor = Gdx.graphics.newCursor(scaled, 0, 0); - Gdx.graphics.setCursor(currentCursor); - - original.dispose(); - scaled.dispose(); + return Gdx.graphics.newCursor(scaled, 0, 0); + } finally { + scaled.dispose(); + } } } diff --git a/src/main/java/be/seeseemelk/diceos/system/ResourceLoader.java b/src/main/java/be/seeseemelk/diceos/system/ResourceLoader.java new file mode 100644 index 0000000..dea2329 --- /dev/null +++ b/src/main/java/be/seeseemelk/diceos/system/ResourceLoader.java @@ -0,0 +1,19 @@ +package be.seeseemelk.diceos.system; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Pixmap; +import io.avaje.inject.Component; +import lombok.RequiredArgsConstructor; + +import java.util.HashMap; +import java.util.Map; + +@RequiredArgsConstructor +@Component +public class ResourceLoader { + private final Map pixmaps = new HashMap<>(); + + public Pixmap loadPixmap(String path) { + return pixmaps.computeIfAbsent(path, p -> new Pixmap(Gdx.files.internal(p))); + } +} diff --git a/src/main/java/be/seeseemelk/diceos/system/utils/Utils.java b/src/main/java/be/seeseemelk/diceos/system/utils/Utils.java index bfebb08..592e7db 100644 --- a/src/main/java/be/seeseemelk/diceos/system/utils/Utils.java +++ b/src/main/java/be/seeseemelk/diceos/system/utils/Utils.java @@ -1,9 +1,15 @@ package be.seeseemelk.diceos.system.utils; import com.badlogic.gdx.utils.Disposable; +import lombok.experimental.UtilityClass; +@UtilityClass public class Utils { public static Disposer disposing(T disposable) { return new Disposer<>(disposable); } + + public static boolean isPowerOfTwo(int value) { + return (value & (value - 1)) == 0 && value != 0; + } } diff --git a/src/main/resources/menubar.png b/src/main/resources/menubar.png index a46b6b09d159a95cf0b79fa9f3c9b2a4b07e0ac5..9d6e300998b6c0b7106e3cb3820ee1eeb18abebd 100644 GIT binary patch delta 50 zcmZ3_w2^5-H#ZNr?8A9tObiSR?GvZf%UsL5X}f@rfnnh#%d<62b^C$h44$rjF6*2U FngFn*5lsL9 delta 48 zcmdnUw4P}~H#e66(?Q)e_Zb)%S|?7cm)dYO>I)0QtL0W@i`VK|07V%*UHx3vIVCg! E0IDw$B>(^b diff --git a/src/main/resources/cursor.png b/src/main/resources/system/cursor.png similarity index 100% rename from src/main/resources/cursor.png rename to src/main/resources/system/cursor.png