author | rchamyal |
Fri, 11 Mar 2016 11:00:38 +0530 | |
changeset 36869 | f8ef78f4157d |
parent 35667 | ed476aba94de |
child 41776 | 71e2575dd727 |
permissions | -rw-r--r-- |
2 | 1 |
/* |
28231
b608ffcaed74
8066621: Suppress deprecation warnings in java.desktop module
darcy
parents:
26745
diff
changeset
|
2 |
* Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. |
2 | 3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 |
* |
|
5 |
* This code is free software; you can redistribute it and/or modify it |
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
|
5506 | 7 |
* published by the Free Software Foundation. Oracle designates this |
2 | 8 |
* particular file as subject to the "Classpath" exception as provided |
5506 | 9 |
* by Oracle in the LICENSE file that accompanied this code. |
2 | 10 |
* |
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
15 |
* accompanied this code). |
|
16 |
* |
|
17 |
* You should have received a copy of the GNU General Public License version |
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 |
* |
|
5506 | 21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
2 | 24 |
*/ |
25 |
package java.awt; |
|
26 |
||
27 |
import java.io.IOException; |
|
28 |
import java.awt.image.*; |
|
29 |
import java.net.URL; |
|
30 |
import java.net.URLConnection; |
|
31 |
import java.io.File; |
|
3938
ef327bd847c0
6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents:
2
diff
changeset
|
32 |
import sun.util.logging.PlatformLogger; |
2 | 33 |
import sun.awt.image.SunWritableRaster; |
34 |
||
35 |
/** |
|
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
36 |
* The splash screen can be displayed at application startup, before the |
2 | 37 |
* Java Virtual Machine (JVM) starts. The splash screen is displayed as an |
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
38 |
* undecorated window containing an image. You can use GIF, JPEG, or PNG files |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
39 |
* for the image. Animation is supported for the GIF format, while transparency |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
40 |
* is supported both for GIF and PNG. The window is positioned at the center |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
41 |
* of the screen. The position on multi-monitor systems is not specified. It is |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
42 |
* platform and implementation dependent. The splash screen window is closed |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
43 |
* automatically as soon as the first window is displayed by Swing/AWT (may be |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
44 |
* also closed manually using the Java API, see below). |
2 | 45 |
* <P> |
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
46 |
* If your application is packaged in a jar file, you can use the |
2 | 47 |
* "SplashScreen-Image" option in a manifest file to show a splash screen. |
48 |
* Place the image in the jar archive and specify the path in the option. |
|
49 |
* The path should not have a leading slash. |
|
50 |
* <BR> |
|
35667 | 51 |
* For example, in the {@code manifest.mf} file: |
2 | 52 |
* <PRE> |
53 |
* Manifest-Version: 1.0 |
|
54 |
* Main-Class: Test |
|
55 |
* SplashScreen-Image: filename.gif |
|
56 |
* </PRE> |
|
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
57 |
* <P> |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
58 |
* If the Java implementation provides the command-line interface and you run |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
59 |
* your application by using the command line or a shortcut, use the Java |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
60 |
* application launcher option to show a splash screen. The Oracle reference |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
61 |
* implementation allows you to specify the splash screen image location with |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
62 |
* the {@code -splash:} option. |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
63 |
* <BR> |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
64 |
* For example: |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
65 |
* <PRE> |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
66 |
* java -splash:filename.gif Test |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
67 |
* </PRE> |
2 | 68 |
* The command line interface has higher precedence over the manifest |
69 |
* setting. |
|
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
70 |
* <p> |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
71 |
* The splash screen will be displayed as faithfully as possible to present the |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
72 |
* whole splash screen image given the limitations of the target platform and |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
73 |
* display. |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
74 |
* <p> |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
75 |
* It is implied that the specified image is presented on the screen "as is", |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
76 |
* i.e. preserving the exact color values as specified in the image file. Under |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
77 |
* certain circumstances, though, the presented image may differ, e.g. when |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
78 |
* applying color dithering to present a 32 bits per pixel (bpp) image on a 16 |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
79 |
* or 8 bpp screen. The native platform display configuration may also affect |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
80 |
* the colors of the displayed image (e.g. color profiles, etc.) |
2 | 81 |
* <p> |
82 |
* The {@code SplashScreen} class provides the API for controlling the splash |
|
83 |
* screen. This class may be used to close the splash screen, change the splash |
|
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
84 |
* screen image, get the splash screen native window position/size, and paint |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
85 |
* in the splash screen. It cannot be used to create the splash screen. You |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
86 |
* should use the options provided by the Java implementation for that. |
2 | 87 |
* <p> |
88 |
* This class cannot be instantiated. Only a single instance of this class |
|
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
89 |
* can exist, and it may be obtained by using the {@link #getSplashScreen()} |
2 | 90 |
* static method. In case the splash screen has not been created at |
91 |
* application startup via the command line or manifest file option, |
|
35667 | 92 |
* the {@code getSplashScreen} method returns {@code null}. |
2 | 93 |
* |
94 |
* @author Oleg Semenov |
|
95 |
* @since 1.6 |
|
96 |
*/ |
|
97 |
public final class SplashScreen { |
|
98 |
||
99 |
SplashScreen(long ptr) { // non-public constructor |
|
100 |
splashPtr = ptr; |
|
101 |
} |
|
102 |
||
103 |
/** |
|
104 |
* Returns the {@code SplashScreen} object used for |
|
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
105 |
* Java startup splash screen control on systems that support display. |
2 | 106 |
* |
107 |
* @throws UnsupportedOperationException if the splash screen feature is not |
|
108 |
* supported by the current toolkit |
|
109 |
* @throws HeadlessException if {@code GraphicsEnvironment.isHeadless()} |
|
110 |
* returns true |
|
35667 | 111 |
* @return the {@link SplashScreen} instance, or {@code null} if there is |
2 | 112 |
* none or it has already been closed |
113 |
*/ |
|
114 |
public static SplashScreen getSplashScreen() { |
|
115 |
synchronized (SplashScreen.class) { |
|
116 |
if (GraphicsEnvironment.isHeadless()) { |
|
117 |
throw new HeadlessException(); |
|
118 |
} |
|
119 |
// SplashScreen class is now a singleton |
|
120 |
if (!wasClosed && theInstance == null) { |
|
121 |
java.security.AccessController.doPrivileged( |
|
12559
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
7775
diff
changeset
|
122 |
new java.security.PrivilegedAction<Void>() { |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
7775
diff
changeset
|
123 |
public Void run() { |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
7775
diff
changeset
|
124 |
System.loadLibrary("splashscreen"); |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
7775
diff
changeset
|
125 |
return null; |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
7775
diff
changeset
|
126 |
} |
9456ceada8b1
7164376: Replace use of sun.security.action.LoadLibraryAction with System.loadLibrary
mchung
parents:
7775
diff
changeset
|
127 |
}); |
2 | 128 |
long ptr = _getInstance(); |
129 |
if (ptr != 0 && _isVisible(ptr)) { |
|
130 |
theInstance = new SplashScreen(ptr); |
|
131 |
} |
|
132 |
} |
|
133 |
return theInstance; |
|
134 |
} |
|
135 |
} |
|
136 |
||
137 |
/** |
|
138 |
* Changes the splash screen image. The new image is loaded from the |
|
139 |
* specified URL; GIF, JPEG and PNG image formats are supported. |
|
140 |
* The method returns after the image has finished loading and the window |
|
141 |
* has been updated. |
|
142 |
* The splash screen window is resized according to the size of |
|
143 |
* the image and is centered on the screen. |
|
144 |
* |
|
35667 | 145 |
* @param imageURL the non-{@code null} URL for the new |
2 | 146 |
* splash screen image |
35667 | 147 |
* @throws NullPointerException if {@code imageURL} is {@code null} |
2 | 148 |
* @throws IOException if there was an error while loading the image |
149 |
* @throws IllegalStateException if the splash screen has already been |
|
150 |
* closed |
|
151 |
*/ |
|
152 |
public void setImageURL(URL imageURL) throws NullPointerException, IOException, IllegalStateException { |
|
153 |
checkVisible(); |
|
154 |
URLConnection connection = imageURL.openConnection(); |
|
155 |
connection.connect(); |
|
156 |
int length = connection.getContentLength(); |
|
157 |
java.io.InputStream stream = connection.getInputStream(); |
|
158 |
byte[] buf = new byte[length]; |
|
159 |
int off = 0; |
|
160 |
while(true) { |
|
161 |
// check for available data |
|
162 |
int available = stream.available(); |
|
163 |
if (available <= 0) { |
|
164 |
// no data available... well, let's try reading one byte |
|
165 |
// we'll see what happens then |
|
166 |
available = 1; |
|
167 |
} |
|
168 |
// check for enough room in buffer, realloc if needed |
|
169 |
// the buffer always grows in size 2x minimum |
|
170 |
if (off + available > length) { |
|
171 |
length = off*2; |
|
172 |
if (off + available > length) { |
|
173 |
length = available+off; |
|
174 |
} |
|
175 |
byte[] oldBuf = buf; |
|
176 |
buf = new byte[length]; |
|
177 |
System.arraycopy(oldBuf, 0, buf, 0, off); |
|
178 |
} |
|
179 |
// now read the data |
|
180 |
int result = stream.read(buf, off, available); |
|
181 |
if (result < 0) { |
|
182 |
break; |
|
183 |
} |
|
184 |
off += result; |
|
185 |
} |
|
186 |
synchronized(SplashScreen.class) { |
|
187 |
checkVisible(); |
|
188 |
if (!_setImageData(splashPtr, buf)) { |
|
189 |
throw new IOException("Bad image format or i/o error when loading image"); |
|
190 |
} |
|
191 |
this.imageURL = imageURL; |
|
192 |
} |
|
193 |
} |
|
194 |
||
195 |
private void checkVisible() { |
|
196 |
if (!isVisible()) { |
|
197 |
throw new IllegalStateException("no splash screen available"); |
|
198 |
} |
|
199 |
} |
|
200 |
/** |
|
201 |
* Returns the current splash screen image. |
|
202 |
* |
|
203 |
* @return URL for the current splash screen image file |
|
204 |
* @throws IllegalStateException if the splash screen has already been closed |
|
205 |
*/ |
|
28231
b608ffcaed74
8066621: Suppress deprecation warnings in java.desktop module
darcy
parents:
26745
diff
changeset
|
206 |
@SuppressWarnings("deprecation") |
2 | 207 |
public URL getImageURL() throws IllegalStateException { |
208 |
synchronized (SplashScreen.class) { |
|
209 |
checkVisible(); |
|
210 |
if (imageURL == null) { |
|
211 |
try { |
|
212 |
String fileName = _getImageFileName(splashPtr); |
|
213 |
String jarName = _getImageJarName(splashPtr); |
|
214 |
if (fileName != null) { |
|
215 |
if (jarName != null) { |
|
216 |
imageURL = new URL("jar:"+(new File(jarName).toURL().toString())+"!/"+fileName); |
|
217 |
} else { |
|
218 |
imageURL = new File(fileName).toURL(); |
|
219 |
} |
|
220 |
} |
|
221 |
} |
|
222 |
catch(java.net.MalformedURLException e) { |
|
18178
ee71c923891d
8016747: Replace deprecated PlatformLogger isLoggable(int) with isLoggable(Level)
chegar
parents:
12559
diff
changeset
|
223 |
if (log.isLoggable(PlatformLogger.Level.FINE)) { |
3938
ef327bd847c0
6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents:
2
diff
changeset
|
224 |
log.fine("MalformedURLException caught in the getImageURL() method", e); |
2 | 225 |
} |
226 |
} |
|
227 |
} |
|
228 |
return imageURL; |
|
229 |
} |
|
230 |
} |
|
231 |
||
232 |
/** |
|
233 |
* Returns the bounds of the splash screen window as a {@link Rectangle}. |
|
234 |
* This may be useful if, for example, you want to replace the splash |
|
235 |
* screen with your window at the same location. |
|
236 |
* <p> |
|
237 |
* You cannot control the size or position of the splash screen. |
|
238 |
* The splash screen size is adjusted automatically when the image changes. |
|
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
239 |
* <p> |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
240 |
* The image may contain transparent areas, and thus the reported bounds may |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
241 |
* be larger than the visible splash screen image on the screen. |
2 | 242 |
* |
243 |
* @return a {@code Rectangle} containing the splash screen bounds |
|
244 |
* @throws IllegalStateException if the splash screen has already been closed |
|
245 |
*/ |
|
246 |
public Rectangle getBounds() throws IllegalStateException { |
|
247 |
synchronized (SplashScreen.class) { |
|
248 |
checkVisible(); |
|
25552
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
249 |
float scale = _getScaleFactor(splashPtr); |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
250 |
Rectangle bounds = _getBounds(splashPtr); |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
251 |
assert scale > 0; |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
252 |
if (scale > 0 && scale != 1) { |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
253 |
bounds.setSize((int) (bounds.getWidth() / scale), |
36869 | 254 |
(int) (bounds.getHeight() / scale)); |
25552
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
255 |
} |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
256 |
return bounds; |
2 | 257 |
} |
258 |
} |
|
259 |
||
260 |
/** |
|
261 |
* Returns the size of the splash screen window as a {@link Dimension}. |
|
262 |
* This may be useful if, for example, |
|
263 |
* you want to draw on the splash screen overlay surface. |
|
264 |
* <p> |
|
265 |
* You cannot control the size or position of the splash screen. |
|
266 |
* The splash screen size is adjusted automatically when the image changes. |
|
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
267 |
* <p> |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
268 |
* The image may contain transparent areas, and thus the reported size may |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
269 |
* be larger than the visible splash screen image on the screen. |
2 | 270 |
* |
271 |
* @return a {@link Dimension} object indicating the splash screen size |
|
272 |
* @throws IllegalStateException if the splash screen has already been closed |
|
273 |
*/ |
|
274 |
public Dimension getSize() throws IllegalStateException { |
|
275 |
return getBounds().getSize(); |
|
276 |
} |
|
277 |
||
278 |
/** |
|
279 |
* Creates a graphics context (as a {@link Graphics2D} object) for the splash |
|
280 |
* screen overlay image, which allows you to draw over the splash screen. |
|
281 |
* Note that you do not draw on the main image but on the image that is |
|
282 |
* displayed over the main image using alpha blending. Also note that drawing |
|
283 |
* on the overlay image does not necessarily update the contents of splash |
|
284 |
* screen window. You should call {@code update()} on the |
|
35667 | 285 |
* {@code SplashScreen} when you want the splash screen to be |
2 | 286 |
* updated immediately. |
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
287 |
* <p> |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
288 |
* The pixel (0, 0) in the coordinate space of the graphics context |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
289 |
* corresponds to the origin of the splash screen native window bounds (see |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
290 |
* {@link #getBounds()}). |
2 | 291 |
* |
292 |
* @return graphics context for the splash screen overlay surface |
|
293 |
* @throws IllegalStateException if the splash screen has already been closed |
|
294 |
*/ |
|
295 |
public Graphics2D createGraphics() throws IllegalStateException { |
|
296 |
synchronized (SplashScreen.class) { |
|
26745
91ffd43ffc17
8058136: Test api/java_awt/SplashScreen/index.html\#ClosedSplashScreenTests fails because of java.lang.IllegalStateException was not thrown
serb
parents:
25859
diff
changeset
|
297 |
checkVisible(); |
2 | 298 |
if (image==null) { |
25552
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
299 |
// get unscaled splash image size |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
300 |
Dimension dim = _getBounds(splashPtr).getSize(); |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
301 |
image = new BufferedImage(dim.width, dim.height, |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
302 |
BufferedImage.TYPE_INT_ARGB); |
2 | 303 |
} |
25552
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
304 |
float scale = _getScaleFactor(splashPtr); |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
305 |
Graphics2D g = image.createGraphics(); |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
306 |
assert (scale > 0); |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
307 |
if (scale <= 0) { |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
308 |
scale = 1; |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
309 |
} |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
310 |
g.scale(scale, scale); |
96abb01815f6
8043869: [macosx] java -splash does not honor @2x hi dpi notation for retina support
alexsch
parents:
23010
diff
changeset
|
311 |
return g; |
2 | 312 |
} |
313 |
} |
|
314 |
||
315 |
/** |
|
316 |
* Updates the splash window with current contents of the overlay image. |
|
317 |
* |
|
318 |
* @throws IllegalStateException if the overlay image does not exist; |
|
319 |
* for example, if {@code createGraphics} has never been called, |
|
320 |
* or if the splash screen has already been closed |
|
321 |
*/ |
|
322 |
public void update() throws IllegalStateException { |
|
323 |
BufferedImage image; |
|
324 |
synchronized (SplashScreen.class) { |
|
325 |
checkVisible(); |
|
326 |
image = this.image; |
|
327 |
} |
|
328 |
if (image == null) { |
|
329 |
throw new IllegalStateException("no overlay image available"); |
|
330 |
} |
|
331 |
DataBuffer buf = image.getRaster().getDataBuffer(); |
|
332 |
if (!(buf instanceof DataBufferInt)) { |
|
333 |
throw new AssertionError("Overlay image DataBuffer is of invalid type == "+buf.getClass().getName()); |
|
334 |
} |
|
335 |
int numBanks = buf.getNumBanks(); |
|
336 |
if (numBanks!=1) { |
|
337 |
throw new AssertionError("Invalid number of banks =="+numBanks+" in overlay image DataBuffer"); |
|
338 |
} |
|
339 |
if (!(image.getSampleModel() instanceof SinglePixelPackedSampleModel)) { |
|
340 |
throw new AssertionError("Overlay image has invalid sample model == "+image.getSampleModel().getClass().getName()); |
|
341 |
} |
|
342 |
SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)image.getSampleModel(); |
|
343 |
int scanlineStride = sm.getScanlineStride(); |
|
344 |
Rectangle rect = image.getRaster().getBounds(); |
|
345 |
// Note that we steal the data array here, but just for reading |
|
346 |
// so we do not need to mark the DataBuffer dirty... |
|
347 |
int[] data = SunWritableRaster.stealData((DataBufferInt)buf, 0); |
|
348 |
synchronized(SplashScreen.class) { |
|
349 |
checkVisible(); |
|
350 |
_update(splashPtr, data, rect.x, rect.y, rect.width, rect.height, scanlineStride); |
|
351 |
} |
|
352 |
} |
|
353 |
||
354 |
/** |
|
355 |
* Hides the splash screen, closes the window, and releases all associated |
|
356 |
* resources. |
|
357 |
* |
|
358 |
* @throws IllegalStateException if the splash screen has already been closed |
|
359 |
*/ |
|
360 |
public void close() throws IllegalStateException { |
|
361 |
synchronized (SplashScreen.class) { |
|
362 |
checkVisible(); |
|
363 |
_close(splashPtr); |
|
364 |
image = null; |
|
6823
cff6c85026c4
6990352: SplashScreen.getSplashScreen() does not return null for implicitly closed splash screen
anthony
parents:
5506
diff
changeset
|
365 |
SplashScreen.markClosed(); |
cff6c85026c4
6990352: SplashScreen.getSplashScreen() does not return null for implicitly closed splash screen
anthony
parents:
5506
diff
changeset
|
366 |
} |
cff6c85026c4
6990352: SplashScreen.getSplashScreen() does not return null for implicitly closed splash screen
anthony
parents:
5506
diff
changeset
|
367 |
} |
cff6c85026c4
6990352: SplashScreen.getSplashScreen() does not return null for implicitly closed splash screen
anthony
parents:
5506
diff
changeset
|
368 |
|
cff6c85026c4
6990352: SplashScreen.getSplashScreen() does not return null for implicitly closed splash screen
anthony
parents:
5506
diff
changeset
|
369 |
static void markClosed() { |
cff6c85026c4
6990352: SplashScreen.getSplashScreen() does not return null for implicitly closed splash screen
anthony
parents:
5506
diff
changeset
|
370 |
synchronized (SplashScreen.class) { |
2 | 371 |
wasClosed = true; |
372 |
theInstance = null; |
|
373 |
} |
|
374 |
} |
|
375 |
||
376 |
||
377 |
/** |
|
378 |
* Determines whether the splash screen is visible. The splash screen may |
|
379 |
* be hidden using {@link #close()}, it is also hidden automatically when |
|
380 |
* the first AWT/Swing window is made visible. |
|
7765
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
381 |
* <p> |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
382 |
* Note that the native platform may delay presenting the splash screen |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
383 |
* native window on the screen. The return value of {@code true} for this |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
384 |
* method only guarantees that the conditions to hide the splash screen |
a9e4a2c0600e
6993803: Request to update SplashScreen specification
anthony
parents:
6823
diff
changeset
|
385 |
* window have not occurred yet. |
2 | 386 |
* |
387 |
* @return true if the splash screen is visible (has not been closed yet), |
|
388 |
* false otherwise |
|
389 |
*/ |
|
390 |
public boolean isVisible() { |
|
391 |
synchronized (SplashScreen.class) { |
|
392 |
return !wasClosed && _isVisible(splashPtr); |
|
393 |
} |
|
394 |
} |
|
395 |
||
396 |
private BufferedImage image; // overlay image |
|
397 |
||
398 |
private final long splashPtr; // pointer to native Splash structure |
|
399 |
private static boolean wasClosed = false; |
|
400 |
||
401 |
private URL imageURL; |
|
402 |
||
403 |
/** |
|
404 |
* The instance reference for the singleton. |
|
35667 | 405 |
* ({@code null} if no instance exists yet.) |
2 | 406 |
* |
407 |
* @see #getSplashScreen |
|
408 |
* @see #close |
|
409 |
*/ |
|
410 |
private static SplashScreen theInstance = null; |
|
411 |
||
3938
ef327bd847c0
6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents:
2
diff
changeset
|
412 |
private static final PlatformLogger log = PlatformLogger.getLogger("java.awt.SplashScreen"); |
2 | 413 |
|
32865
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
28231
diff
changeset
|
414 |
private static native void _update(long splashPtr, int[] data, int x, int y, int width, int height, int scanlineStride); |
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
28231
diff
changeset
|
415 |
private static native boolean _isVisible(long splashPtr); |
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
28231
diff
changeset
|
416 |
private static native Rectangle _getBounds(long splashPtr); |
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
28231
diff
changeset
|
417 |
private static native long _getInstance(); |
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
28231
diff
changeset
|
418 |
private static native void _close(long splashPtr); |
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
28231
diff
changeset
|
419 |
private static native String _getImageFileName(long splashPtr); |
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
28231
diff
changeset
|
420 |
private static native String _getImageJarName(long SplashPtr); |
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
28231
diff
changeset
|
421 |
private static native boolean _setImageData(long SplashPtr, byte[] data); |
f9cb6e427f9e
8136783: Run blessed-modifier-order script on java.desktop
prr
parents:
28231
diff
changeset
|
422 |
private static native float _getScaleFactor(long SplashPtr); |
2 | 423 |
|
26745
91ffd43ffc17
8058136: Test api/java_awt/SplashScreen/index.html\#ClosedSplashScreenTests fails because of java.lang.IllegalStateException was not thrown
serb
parents:
25859
diff
changeset
|
424 |
} |