Fix #874: Remove the dependency on javafx.swing

This commit is contained in:
Glavo
2021-05-17 02:31:06 +08:00
committed by Yuhui Huang
parent 607248e8b3
commit f191e80100
2 changed files with 26 additions and 7 deletions

View File

@@ -19,13 +19,13 @@ package org.jackhuang.hmcl.game;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding; import javafx.beans.binding.ObjectBinding;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import org.jackhuang.hmcl.Metadata; import org.jackhuang.hmcl.Metadata;
import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.Account;
import org.jackhuang.hmcl.auth.ServerResponseMalformedException; import org.jackhuang.hmcl.auth.ServerResponseMalformedException;
import org.jackhuang.hmcl.auth.microsoft.MicrosoftAccount; import org.jackhuang.hmcl.auth.microsoft.MicrosoftAccount;
import org.jackhuang.hmcl.auth.microsoft.MicrosoftService;
import org.jackhuang.hmcl.auth.yggdrasil.Texture; import org.jackhuang.hmcl.auth.yggdrasil.Texture;
import org.jackhuang.hmcl.auth.yggdrasil.TextureModel; import org.jackhuang.hmcl.auth.yggdrasil.TextureModel;
import org.jackhuang.hmcl.auth.yggdrasil.TextureType; import org.jackhuang.hmcl.auth.yggdrasil.TextureType;
@@ -39,6 +39,7 @@ import org.jackhuang.hmcl.util.javafx.BindingMapping;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.awt.*; import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
@@ -136,6 +137,7 @@ public final class TexturesLoader {
// ==== Skins ==== // ==== Skins ====
private final static Map<TextureModel, LoadedTexture> DEFAULT_SKINS = new EnumMap<>(TextureModel.class); private final static Map<TextureModel, LoadedTexture> DEFAULT_SKINS = new EnumMap<>(TextureModel.class);
static { static {
loadDefaultSkin("/assets/img/steve.png", TextureModel.STEVE); loadDefaultSkin("/assets/img/steve.png", TextureModel.STEVE);
loadDefaultSkin("/assets/img/alex.png", TextureModel.ALEX); loadDefaultSkin("/assets/img/alex.png", TextureModel.ALEX);
@@ -231,18 +233,34 @@ public final class TexturesLoader {
public static ObjectBinding<Image> fxAvatarBinding(YggdrasilService service, UUID uuid, int size) { public static ObjectBinding<Image> fxAvatarBinding(YggdrasilService service, UUID uuid, int size) {
return BindingMapping.of(skinBinding(service, uuid)) return BindingMapping.of(skinBinding(service, uuid))
.map(it -> toAvatar(it.image, size)) .map(it -> toAvatar(it.image, size))
.map(img -> SwingFXUtils.toFXImage(img, null)); .map(TexturesLoader::toFXImage);
} }
public static ObjectBinding<Image> fxAvatarBinding(Account account, int size) { public static ObjectBinding<Image> fxAvatarBinding(Account account, int size) {
if (account instanceof YggdrasilAccount || account instanceof MicrosoftAccount) { if (account instanceof YggdrasilAccount || account instanceof MicrosoftAccount) {
return BindingMapping.of(skinBinding(account)) return BindingMapping.of(skinBinding(account))
.map(it -> toAvatar(it.image, size)) .map(it -> toAvatar(it.image, size))
.map(img -> SwingFXUtils.toFXImage(img, null)); .map(TexturesLoader::toFXImage);
} else { } else {
return Bindings.createObjectBinding( return Bindings.createObjectBinding(
() -> SwingFXUtils.toFXImage(toAvatar(getDefaultSkin(TextureModel.detectUUID(account.getUUID())).image, size), null)); () -> toFXImage(toAvatar(getDefaultSkin(TextureModel.detectUUID(account.getUUID())).image, size)));
} }
} }
// ==== // ====
// Based on https://stackoverflow.com/a/57552025
// Fix #874: Use it instead of SwingFXUtils.toFXImage
private static WritableImage toFXImage(BufferedImage image) {
WritableImage wr = new WritableImage(image.getWidth(), image.getHeight());
PixelWriter pw = wr.getPixelWriter();
final int iw = image.getWidth();
final int ih = image.getHeight();
for (int x = 0; x < iw; x++) {
for (int y = 0; y < ih; y++) {
pw.setArgb(x, y, image.getRGB(x, y));
}
}
return wr;
}
} }

View File

@@ -40,7 +40,8 @@ public class SelfDependencyPatcher {
addJfxDependency("fxml"); addJfxDependency("fxml");
addJfxDependency("graphics"); addJfxDependency("graphics");
addJfxDependency("media"); addJfxDependency("media");
addJfxDependency("swing"); // Fix #874: Remove the dependency on javafx.swing
// addJfxDependency("swing");
addJfxDependency("web"); addJfxDependency("web");
} }