mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-24 19:55:08 -04:00
简化调用 JavaFX 12+ API 的代码 (#4456)
This commit is contained in:
parent
9ded2e489d
commit
913ce55d43
@ -26,8 +26,6 @@ import javafx.beans.value.ObservableValue;
|
|||||||
import javafx.scene.canvas.Canvas;
|
import javafx.scene.canvas.Canvas;
|
||||||
import javafx.scene.canvas.GraphicsContext;
|
import javafx.scene.canvas.GraphicsContext;
|
||||||
import javafx.scene.image.Image;
|
import javafx.scene.image.Image;
|
||||||
import javafx.scene.image.PixelReader;
|
|
||||||
import javafx.scene.image.PixelWriter;
|
|
||||||
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;
|
||||||
@ -264,15 +262,8 @@ public final class TexturesLoader {
|
|||||||
int scale = (int) skin.getWidth() / 64;
|
int scale = (int) skin.getWidth() / 64;
|
||||||
int faceOffset = (int) Math.round(size / 18.0);
|
int faceOffset = (int) Math.round(size / 18.0);
|
||||||
|
|
||||||
try {
|
|
||||||
g.setImageSmoothing(false);
|
g.setImageSmoothing(false);
|
||||||
drawAvatar(g, skin, size, scale, faceOffset);
|
drawAvatar(g, skin, size, scale, faceOffset);
|
||||||
} catch (NoSuchMethodError ignored) {
|
|
||||||
// Earlier JavaFX did not support GraphicsContext::setImageSmoothing
|
|
||||||
// In order to prevent the blurring caused by bilinear interpolation,
|
|
||||||
// we use the self-implemented nearest neighbor interpolation to scale
|
|
||||||
drawAvatarSlow(g, skin, size, scale, faceOffset);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void drawAvatar(GraphicsContext g, Image skin, int size, int scale, int faceOffset) {
|
private static void drawAvatar(GraphicsContext g, Image skin, int size, int scale, int faceOffset) {
|
||||||
@ -284,37 +275,6 @@ public final class TexturesLoader {
|
|||||||
0, 0, size, size);
|
0, 0, size, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void drawAvatarSlow(GraphicsContext g, Image skin, int size, int scale, int faceOffset) {
|
|
||||||
PixelReader reader = skin.getPixelReader();
|
|
||||||
PixelWriter writer = g.getPixelWriter();
|
|
||||||
drawImage(writer, reader,
|
|
||||||
8 * scale, 8 * scale, 8 * scale, 8 * scale,
|
|
||||||
faceOffset, faceOffset, size - 2 * faceOffset, size - 2 * faceOffset);
|
|
||||||
drawImage(writer, reader,
|
|
||||||
40 * scale, 8 * scale, 8 * scale, 8 * scale,
|
|
||||||
0, 0, size, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Scale and draw image using nearest-neighbor interpolation
|
|
||||||
*/
|
|
||||||
private static void drawImage(PixelWriter writer, PixelReader reader,
|
|
||||||
int sx, int sy, int sw, int sh,
|
|
||||||
int dx, int dy, int dw, int dh) {
|
|
||||||
double xScale = ((double) sw) / dw;
|
|
||||||
double yScale = ((double) sh) / dh;
|
|
||||||
|
|
||||||
for (int xOffset = 0; xOffset < dw; xOffset++) {
|
|
||||||
for (int yOffset = 0; yOffset < dh; yOffset++) {
|
|
||||||
int color = reader.getArgb(sx + (int) (xOffset * xScale), sy + (int) (yOffset * yScale));
|
|
||||||
|
|
||||||
// Draw only non-transparent pixels
|
|
||||||
if ((color >>> 24) != 0)
|
|
||||||
writer.setArgb(dx + xOffset, dy + yOffset, color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class SkinBindingChangeListener implements ChangeListener<LoadedTexture> {
|
private static final class SkinBindingChangeListener implements ChangeListener<LoadedTexture> {
|
||||||
static final WeakHashMap<Canvas, SkinBindingChangeListener> hole = new WeakHashMap<>();
|
static final WeakHashMap<Canvas, SkinBindingChangeListener> hole = new WeakHashMap<>();
|
||||||
|
|
||||||
|
@ -176,17 +176,12 @@ public class DecoratorController {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
// For JavaFX 12+
|
|
||||||
MouseButton button = MouseButton.valueOf("BACK");
|
|
||||||
navigator.addEventFilter(MouseEvent.MOUSE_CLICKED, e -> {
|
navigator.addEventFilter(MouseEvent.MOUSE_CLICKED, e -> {
|
||||||
if (e.getButton() == button) {
|
if (e.getButton() == MouseButton.BACK) {
|
||||||
back();
|
back();
|
||||||
e.consume();
|
e.consume();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (IllegalArgumentException ignored) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Decorator getDecorator() {
|
public Decorator getDecorator() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user