From e0e435fdc5d4906ab18e0e18f4259be8ff03413b Mon Sep 17 00:00:00 2001 From: rtm516 Date: Wed, 3 Mar 2021 23:00:29 +0000 Subject: [PATCH 1/2] Fix capes being scaled wrong and invisible skins (#1940) * Fix capes being scaled wrong and invisible skins * Flush old image objects * Remove alpha workaround and fix more scaling issues * Remove unnecessary scale * Reduce diff Co-authored-by: Camotoy <20743703+Camotoy@users.noreply.github.com> --- .../org/geysermc/connector/skin/SkinProvider.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java b/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java index c4d4bc486..61c28addb 100644 --- a/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java +++ b/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java @@ -413,14 +413,23 @@ public class SkinProvider { // if the requested image is a cape if (provider != null) { if (image.getWidth() > 64) { - image = scale(image, 64, 32); + // Prevent weirdly-scaled capes from being cut off + BufferedImage newImage = new BufferedImage(128, 64, BufferedImage.TYPE_INT_ARGB); + Graphics g = newImage.createGraphics(); + g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); + g.dispose(); + image.flush(); + image = scale(newImage, 64, 32); } } else { // Very rarely, skins can be larger than Minecraft's default. // Bedrock will not render anything above a width of 128. if (image.getWidth() > 128) { - image = scale(image, 128, image.getHeight() / (image.getWidth() / 128)); + // On Height: Scale by the amount we divided width by, or simply cut down to 128 + image = scale(image, 128, image.getHeight() >= 256 ? (image.getHeight() / (image.getWidth() / 128)) : 128); } + + // TODO remove alpha channel } byte[] data = bufferedImageToImageData(image); From f926b83b33f416d2645febfecd131a8cff1788bc Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Thu, 4 Mar 2021 11:32:56 -0500 Subject: [PATCH 2/2] Fix capes of a *smaller* size throwing an error (#1998) --- .../java/org/geysermc/connector/skin/SkinProvider.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java b/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java index 61c28addb..745a23ebd 100644 --- a/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java +++ b/connector/src/main/java/org/geysermc/connector/skin/SkinProvider.java @@ -412,7 +412,7 @@ public class SkinProvider { // if the requested image is a cape if (provider != null) { - if (image.getWidth() > 64) { + if (image.getWidth() > 64 || image.getHeight() > 32) { // Prevent weirdly-scaled capes from being cut off BufferedImage newImage = new BufferedImage(128, 64, BufferedImage.TYPE_INT_ARGB); Graphics g = newImage.createGraphics(); @@ -420,6 +420,14 @@ public class SkinProvider { g.dispose(); image.flush(); image = scale(newImage, 64, 32); + } else if (image.getWidth() < 64 || image.getHeight() < 32) { + // Bedrock doesn't like smaller-sized capes, either. + BufferedImage newImage = new BufferedImage(64, 32, BufferedImage.TYPE_INT_ARGB); + Graphics g = newImage.createGraphics(); + g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); + g.dispose(); + image.flush(); + image = newImage; } } else { // Very rarely, skins can be larger than Minecraft's default.