attempting to use multi-resolution image loading for splash

This commit is contained in:
Ben Fry
2022-01-19 19:46:27 -05:00
parent 6abf5f5aaf
commit b576d36824
2 changed files with 52 additions and 28 deletions
+44 -27
View File
@@ -1,30 +1,33 @@
package processing.app.ui;
import processing.app.Platform;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.JComponent;
import javax.swing.JFrame;
import java.awt.image.BaseMultiResolutionImage;
import java.io.File;
import java.io.FileOutputStream;
import javax.swing.JComponent;
import javax.swing.JFrame;
import processing.app.Platform;
/**
* Show a splash screen window. Loosely based on SplashWindow.java from
* Werner Randelshofer, but rewritten to use Swing because the java.awt
* version doesn't render properly on Windows.
* Show a splash screen window. Loosely based on SplashWindow.java
* from Werner Randelshofer, but rewritten to use Swing because the
* java.awt version doesn't render properly on Windows.
*/
public class Splash extends JFrame {
static private Splash instance;
private final Image image;
private Splash(File imageFile, boolean hidpi) {
// private Splash(File imageFile, boolean hidpi) {
private Splash(File image1xFile, File image2xFile) {
// Putting this inside try/catch because it's not essential,
// and it's definitely not essential enough to prevent startup.
try {
@@ -34,16 +37,21 @@ public class Splash extends JFrame {
// ignored
}
this.image =
Toolkit.getDefaultToolkit().createImage(imageFile.getAbsolutePath());
Image image1x =
Toolkit.getDefaultToolkit().createImage(image1xFile.getAbsolutePath());
Image image2x =
Toolkit.getDefaultToolkit().createImage(image2xFile.getAbsolutePath());
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(image,0);
tracker.addImage(image1x, 0);
tracker.addImage(image2x, 1);
try {
tracker.waitForID(0);
//tracker.waitForID(0);
tracker.waitForAll();
} catch (InterruptedException ignored) { }
if (tracker.isErrorID(0)) {
//if (tracker.isErrorID(0)) {
if (tracker.isErrorAny()) {
// Abort on failure
setSize(0,0);
System.err.println("Warning: SplashWindow couldn't load splash image.");
@@ -51,13 +59,16 @@ public class Splash extends JFrame {
notifyAll();
}
} else {
final int imgWidth = image.getWidth(this);
final int imgHeight = image.getHeight(this);
final int imgScale = hidpi ? 2 : 1;
final int wide = image1x.getWidth(this);
final int high = image1x.getHeight(this);
// final int imgScale = hidpi ? 2 : 1;
final BaseMultiResolutionImage image =
new BaseMultiResolutionImage(image1x, image2x);
JComponent comp = new JComponent() {
final int wide = imgWidth / imgScale;
final int high = imgHeight / imgScale;
// final int wide = imgWidth / imgScale;
// final int high = imgHeight / imgScale;
public void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, wide, high, this);
@@ -67,7 +78,7 @@ public class Splash extends JFrame {
return new Dimension(wide, high);
}
};
comp.setSize(imgWidth, imgHeight);
comp.setSize(wide, high);
setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
getContentPane().add(comp);
setUndecorated(true); // before pack()
@@ -78,9 +89,11 @@ public class Splash extends JFrame {
/** Open a splash window using the specified image. */
static void showSplash(File imageFile, boolean hidpi) {
// static void showSplash(File imageFile, boolean hidpi) {
static void showSplash(File image1xFile, File image2xFile) {
if (instance == null) {
instance = new Splash(imageFile, hidpi);
//instance = new Splash(imageFile, hidpi);
instance = new Splash(image1xFile, image2xFile);
instance.setVisible(true);
}
}
@@ -134,10 +147,7 @@ public class Splash extends JFrame {
static public boolean getDisableHiDPI() {
File propsFile = Platform.getContentFile("disable_hidpi");
if (propsFile != null && propsFile.exists()) {
return true;
}
return false;
return propsFile != null && propsFile.exists();
}
@@ -149,7 +159,9 @@ public class Splash extends JFrame {
File propsFile = Platform.getContentFile("disable_hidpi");
if (propsFile != null) {
if (disabled) {
new FileOutputStream(propsFile).close();
if (!propsFile.exists()) { // don't recreate if exists
new FileOutputStream(propsFile).close();
}
} else if (propsFile.exists()) {
boolean success = propsFile.delete();
if (!success) {
@@ -166,14 +178,19 @@ public class Splash extends JFrame {
static public void main(String[] args) {
// Has to be done before AWT is initialized, so the hack lives here
// instead of Base or anywhere else that might make more sense.
if (getDisableHiDPI()) {
System.setProperty("sun.java2d.uiScale.enabled", "false");
}
try {
/*
final boolean hidpi = processing.app.ui.Toolkit.highResImages();
final String filename = "lib/about-" + (hidpi ? 2 : 1) + "x.png";
File splashFile = Platform.getContentFile(filename);
showSplash(splashFile, hidpi);
*/
showSplash(Platform.getContentFile("lib/about-1x.png"),
Platform.getContentFile("lib/about-2x.png"));
invokeMain("processing.app.Base", args);
disposeSplash();
+8 -1
View File
@@ -17,8 +17,15 @@ X bump ant from 1.10.10 to 1.10.12
X bump JNA from 5.8.0 to 5.10.0
X remove "Illegal reflective access" warning on Linux
X https://github.com/processing/processing4/issues/207
X "Could not delete disable_hidpi" message on macOS/Linux after closing prefs
windows scaling
X Fix "Could not delete disable_hidpi" message on macOS/Linux after closing prefs
X remove old-school offscreen buffering from our custom components
_ fix weird character offsets in text area
_ scale of opening screen
X attempting to use multi-resolution image loading
_ make smaller at 125%
_ is Toolkit.setIcon() in splash slowing down the startup screen?
contribs
X select entire line when doing Edit > Copy on an empty selection