From 7fc05df240a00a214bb303d095b967e7cd1a5988 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Sun, 22 Feb 2026 14:35:57 +0100 Subject: [PATCH] Svg image rendering --- build.gradle | 3 + .../ui2/resources/SvgTexture.java | 65 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/main/java/org/saturnclient/ui2/resources/SvgTexture.java diff --git a/build.gradle b/build.gradle index 3fcc938..208e588 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,9 @@ dependencies { implementation 'com.github.selimaj-dev:session-java:0.1.4' + modImplementation "org.apache.xmlgraphics:batik-transcoder:1.19" + modImplementation "org.apache.xmlgraphics:batik-codec:1.19" + include modImplementation("dev.kosmx.player-anim:player-animation-lib-fabric:${project.player_anim}") //You might want bendy-lib. playerAnimator will wrap it. // include modRuntimeOnly("io.github.kosmx.bendy-lib:bendy-lib-fabric:${project.bendylib_version}") diff --git a/src/main/java/org/saturnclient/ui2/resources/SvgTexture.java b/src/main/java/org/saturnclient/ui2/resources/SvgTexture.java new file mode 100644 index 0000000..f1baacc --- /dev/null +++ b/src/main/java/org/saturnclient/ui2/resources/SvgTexture.java @@ -0,0 +1,65 @@ +package org.saturnclient.ui2.resources; + +import java.awt.image.BufferedImage; +import java.io.InputStream; + +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.image.ImageTranscoder; +import org.jetbrains.annotations.Nullable; +import org.saturnclient.saturnclient.SaturnClient; +import org.saturnclient.saturnclient.cosmetics.cloaks.utils.IdentifierUtils; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.util.Identifier; + +public class SvgTexture { + private static BufferedImage renderSvg(InputStream svgStream, float width, float height) throws Exception { + TranscoderInput input = new TranscoderInput(svgStream); + + final BufferedImage[] imagePointer = new BufferedImage[1]; + + ImageTranscoder transcoder = new ImageTranscoder() { + + @Override + public BufferedImage createImage(int w, int h) { + return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); + } + + @Override + public void writeImage(BufferedImage img, org.apache.batik.transcoder.TranscoderOutput out) { + imagePointer[0] = img; + } + }; + + transcoder.addTranscodingHint(ImageTranscoder.KEY_WIDTH, width); + transcoder.addTranscodingHint(ImageTranscoder.KEY_HEIGHT, height); + + transcoder.transcode(input, null); + + return imagePointer[0]; + } + + @Nullable + @SuppressWarnings("resource") + public static Identifier getSvg(MinecraftClient client, Identifier svgImage, int width, int height, float scale) { + try (InputStream svgStream = client + .getResourceManager() + .getResource(svgImage).get() + .getInputStream()) { + + BufferedImage image = renderSvg(svgStream, width, height); + + System.out.println(svgImage.toString()); + + Identifier id = Identifier.of(SaturnClient.MOD_ID, "img_svg_render_" + (int) (Math.random() * 30)); + IdentifierUtils.registerBufferedImageTexture(id, image); + + return id; + + } catch (Exception e) { + e.printStackTrace(); + + return null; + } + } +}