GH-2026 avoid using awt Dimension class to fix input issues on macOS
This commit is contained in:
parent
7add9de1cf
commit
b76bdf9368
@ -12,15 +12,14 @@ set(SRC
|
|||||||
net/minecraft/Launcher.java
|
net/minecraft/Launcher.java
|
||||||
org/multimc/LegacyFrame.java
|
org/multimc/LegacyFrame.java
|
||||||
|
|
||||||
# onesix launcher
|
|
||||||
org/multimc/onesix/OneSixLauncher.java
|
|
||||||
|
|
||||||
# generic launcher
|
# generic launcher
|
||||||
org/multimc/EntryPoint.java
|
org/multimc/EntryPoint.java
|
||||||
org/multimc/Launcher.java
|
org/multimc/Launcher.java
|
||||||
|
org/multimc/LaunchParams.java
|
||||||
org/multimc/ParseException.java
|
org/multimc/ParseException.java
|
||||||
org/multimc/Utils.java
|
org/multimc/Utils.java
|
||||||
org/multimc/IconLoader.java
|
|
||||||
|
org/multimc/onesix/OneSixLauncher.java
|
||||||
)
|
)
|
||||||
add_jar(NewLaunch ${SRC})
|
add_jar(NewLaunch ${SRC})
|
||||||
|
|
||||||
|
@ -1,132 +0,0 @@
|
|||||||
package org.multimc;
|
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* A convenience class for loading icons from images.
|
|
||||||
*
|
|
||||||
* Icons loaded from this class are formatted to fit within the required
|
|
||||||
* dimension (16x16, 32x32, or 128x128). If the source image is larger than the
|
|
||||||
* target dimension, it is shrunk down to the minimum size that will fit. If it
|
|
||||||
* is smaller, then it is only scaled up if the new scale can be a per-pixel
|
|
||||||
* linear scale (i.e., x2, x3, x4, etc). In both cases, the image's width/height
|
|
||||||
* ratio is kept the same as the source image.
|
|
||||||
*
|
|
||||||
* @author Chris Molini
|
|
||||||
*****************************************************************************/
|
|
||||||
public class IconLoader
|
|
||||||
{
|
|
||||||
/*************************************************************************
|
|
||||||
* Loads an icon in ByteBuffer form.
|
|
||||||
*
|
|
||||||
* @param filepath
|
|
||||||
* The location of the Image to use as an icon.
|
|
||||||
*
|
|
||||||
* @return An array of ByteBuffers containing the pixel data for the icon in
|
|
||||||
* various sizes (as recommended by the OS).
|
|
||||||
*************************************************************************/
|
|
||||||
public static ByteBuffer[] load(String filepath)
|
|
||||||
{
|
|
||||||
BufferedImage image;
|
|
||||||
try {
|
|
||||||
image = ImageIO.read ( new File( filepath ) );
|
|
||||||
} catch ( IOException e ) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return new ByteBuffer[0];
|
|
||||||
}
|
|
||||||
ByteBuffer[] buffers;
|
|
||||||
buffers = new ByteBuffer[1];
|
|
||||||
buffers[0] = loadInstance(image, 128);
|
|
||||||
return buffers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Copies the supplied image into a square icon at the indicated size.
|
|
||||||
*
|
|
||||||
* @param image
|
|
||||||
* The image to place onto the icon.
|
|
||||||
* @param dimension
|
|
||||||
* The desired size of the icon.
|
|
||||||
*
|
|
||||||
* @return A ByteBuffer of pixel data at the indicated size.
|
|
||||||
*************************************************************************/
|
|
||||||
private static ByteBuffer loadInstance(BufferedImage image, int dimension)
|
|
||||||
{
|
|
||||||
BufferedImage scaledIcon = new BufferedImage(dimension, dimension,
|
|
||||||
BufferedImage.TYPE_INT_ARGB_PRE);
|
|
||||||
Graphics2D g = scaledIcon.createGraphics();
|
|
||||||
double ratio = getIconRatio(image, scaledIcon);
|
|
||||||
double width = image.getWidth() * ratio;
|
|
||||||
double height = image.getHeight() * ratio;
|
|
||||||
g.drawImage(image, (int) ((scaledIcon.getWidth() - width) / 2),
|
|
||||||
(int) ((scaledIcon.getHeight() - height) / 2), (int) (width),
|
|
||||||
(int) (height), null);
|
|
||||||
g.dispose();
|
|
||||||
|
|
||||||
return convertToByteBuffer(scaledIcon);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Gets the width/height ratio of the icon. This is meant to simplify
|
|
||||||
* scaling the icon to a new dimension.
|
|
||||||
*
|
|
||||||
* @param src
|
|
||||||
* The base image that will be placed onto the icon.
|
|
||||||
* @param icon
|
|
||||||
* The icon that will have the image placed on it.
|
|
||||||
*
|
|
||||||
* @return The amount to scale the source image to fit it onto the icon
|
|
||||||
* appropriately.
|
|
||||||
*************************************************************************/
|
|
||||||
private static double getIconRatio(BufferedImage src, BufferedImage icon)
|
|
||||||
{
|
|
||||||
double ratio = 1;
|
|
||||||
if (src.getWidth() > icon.getWidth())
|
|
||||||
ratio = (double) (icon.getWidth()) / src.getWidth();
|
|
||||||
else
|
|
||||||
ratio = (int) (icon.getWidth() / src.getWidth());
|
|
||||||
if (src.getHeight() > icon.getHeight())
|
|
||||||
{
|
|
||||||
double r2 = (double) (icon.getHeight()) / src.getHeight();
|
|
||||||
if (r2 < ratio)
|
|
||||||
ratio = r2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
double r2 = (int) (icon.getHeight() / src.getHeight());
|
|
||||||
if (r2 < ratio)
|
|
||||||
ratio = r2;
|
|
||||||
}
|
|
||||||
return ratio;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Converts a BufferedImage into a ByteBuffer of pixel data.
|
|
||||||
*
|
|
||||||
* @param image
|
|
||||||
* The image to convert.
|
|
||||||
*
|
|
||||||
* @return A ByteBuffer that contains the pixel data of the supplied image.
|
|
||||||
*************************************************************************/
|
|
||||||
public static ByteBuffer convertToByteBuffer(BufferedImage image)
|
|
||||||
{
|
|
||||||
byte[] buffer = new byte[image.getWidth() * image.getHeight() * 4];
|
|
||||||
int counter = 0;
|
|
||||||
for (int i = 0; i < image.getHeight(); i++)
|
|
||||||
for (int j = 0; j < image.getWidth(); j++)
|
|
||||||
{
|
|
||||||
int colorSpace = image.getRGB(j, i);
|
|
||||||
buffer[counter + 0] = (byte) ((colorSpace << 8) >> 24);
|
|
||||||
buffer[counter + 1] = (byte) ((colorSpace << 16) >> 24);
|
|
||||||
buffer[counter + 2] = (byte) ((colorSpace << 24) >> 24);
|
|
||||||
buffer[counter + 3] = (byte) (colorSpace >> 24);
|
|
||||||
counter += 4;
|
|
||||||
}
|
|
||||||
return ByteBuffer.wrap(buffer);
|
|
||||||
}
|
|
||||||
}
|
|
@ -43,7 +43,7 @@ public class LegacyFrame extends Frame implements WindowListener
|
|||||||
this.addWindowListener ( this );
|
this.addWindowListener ( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start ( Applet mcApplet, String user, String session, Dimension winSize, boolean maximize )
|
public void start ( Applet mcApplet, String user, String session, int winSizeW, int winSizeH, boolean maximize )
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
appletWrap = new Launcher( mcApplet, new URL ( "http://www.minecraft.net/game" ) );
|
appletWrap = new Launcher( mcApplet, new URL ( "http://www.minecraft.net/game" ) );
|
||||||
@ -56,7 +56,7 @@ public class LegacyFrame extends Frame implements WindowListener
|
|||||||
appletWrap.setParameter("fullscreen", "false");
|
appletWrap.setParameter("fullscreen", "false");
|
||||||
mcApplet.setStub(appletWrap);
|
mcApplet.setStub(appletWrap);
|
||||||
this.add ( appletWrap );
|
this.add ( appletWrap );
|
||||||
appletWrap.setPreferredSize ( winSize );
|
appletWrap.setPreferredSize ( new Dimension (winSizeW, winSizeH) );
|
||||||
this.pack();
|
this.pack();
|
||||||
this.setLocationRelativeTo ( null );
|
this.setLocationRelativeTo ( null );
|
||||||
this.setResizable ( true );
|
this.setResizable ( true );
|
||||||
|
@ -19,7 +19,6 @@ import org.multimc.*;
|
|||||||
|
|
||||||
import java.applet.Applet;
|
import java.applet.Applet;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.awt.*;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
@ -43,7 +42,8 @@ public class OneSixLauncher implements Launcher
|
|||||||
private String windowParams;
|
private String windowParams;
|
||||||
|
|
||||||
// secondary parameters
|
// secondary parameters
|
||||||
private Dimension winSize;
|
private int winSizeW;
|
||||||
|
private int winSizeH;
|
||||||
private boolean maximize;
|
private boolean maximize;
|
||||||
private String cwd;
|
private String cwd;
|
||||||
|
|
||||||
@ -65,7 +65,9 @@ public class OneSixLauncher implements Launcher
|
|||||||
windowParams = params.firstSafe("windowParams", "854x480");
|
windowParams = params.firstSafe("windowParams", "854x480");
|
||||||
|
|
||||||
cwd = System.getProperty("user.dir");
|
cwd = System.getProperty("user.dir");
|
||||||
winSize = new Dimension(854, 480);
|
|
||||||
|
winSizeW = 854;
|
||||||
|
winSizeH = 480;
|
||||||
maximize = false;
|
maximize = false;
|
||||||
|
|
||||||
String[] dimStrings = windowParams.split("x");
|
String[] dimStrings = windowParams.split("x");
|
||||||
@ -78,7 +80,8 @@ public class OneSixLauncher implements Launcher
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
winSize = new Dimension(Integer.parseInt(dimStrings[0]), Integer.parseInt(dimStrings[1]));
|
winSizeW = Integer.parseInt(dimStrings[0]);
|
||||||
|
winSizeH = Integer.parseInt(dimStrings[1]);
|
||||||
} catch (NumberFormatException ignored) {}
|
} catch (NumberFormatException ignored) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -119,7 +122,7 @@ public class OneSixLauncher implements Launcher
|
|||||||
Class<?> MCAppletClass = cl.loadClass(appletClass);
|
Class<?> MCAppletClass = cl.loadClass(appletClass);
|
||||||
Applet mcappl = (Applet) MCAppletClass.newInstance();
|
Applet mcappl = (Applet) MCAppletClass.newInstance();
|
||||||
LegacyFrame mcWindow = new LegacyFrame(windowTitle);
|
LegacyFrame mcWindow = new LegacyFrame(windowTitle);
|
||||||
mcWindow.start(mcappl, userName, sessionId, winSize, maximize);
|
mcWindow.start(mcappl, userName, sessionId, winSizeW, winSizeH, maximize);
|
||||||
return 0;
|
return 0;
|
||||||
} catch (Exception e)
|
} catch (Exception e)
|
||||||
{
|
{
|
||||||
@ -156,9 +159,9 @@ public class OneSixLauncher implements Launcher
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
mcparams.add("--width");
|
mcparams.add("--width");
|
||||||
mcparams.add(Integer.toString(winSize.width));
|
mcparams.add(Integer.toString(winSizeW));
|
||||||
mcparams.add("--height");
|
mcparams.add("--height");
|
||||||
mcparams.add(Integer.toString(winSize.height));
|
mcparams.add(Integer.toString(winSizeH));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the Minecraft Class.
|
// Get the Minecraft Class.
|
||||||
|
Loading…
Reference in New Issue
Block a user