提交 7c2773e9 编写于 作者: L leonidr

7150089: [macosx] Default for a custom cursor created from non-existent image is not transparent

Reviewed-by: anthony, kizune
上级 e3f79369
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
package sun.lwawt.macosx; package sun.lwawt.macosx;
import java.awt.*; import java.awt.*;
import java.awt.image.BufferedImage;
public class CCustomCursor extends Cursor { public class CCustomCursor extends Cursor {
static Dimension sMaxCursorSize; static Dimension sMaxCursorSize;
...@@ -36,7 +37,6 @@ public class CCustomCursor extends Cursor { ...@@ -36,7 +37,6 @@ public class CCustomCursor extends Cursor {
} }
Image fImage; Image fImage;
private boolean isImageOk = false;
Point fHotspot; Point fHotspot;
public CCustomCursor(final Image cursor, final Point hotSpot, final String name) throws IndexOutOfBoundsException, HeadlessException { public CCustomCursor(final Image cursor, final Point hotSpot, final String name) throws IndexOutOfBoundsException, HeadlessException {
...@@ -61,21 +61,19 @@ public class CCustomCursor extends Cursor { ...@@ -61,21 +61,19 @@ public class CCustomCursor extends Cursor {
// Fix for bug 4212593 The Toolkit.createCustomCursor does not // Fix for bug 4212593 The Toolkit.createCustomCursor does not
// check absence of the image of cursor // check absence of the image of cursor
// If the image is invalid, the cursor will be hidden (made completely // If the image is invalid, the cursor will be hidden (made completely
// transparent). In this case, getBestCursorSize() will adjust negative w and h, // transparent).
// but we need to set the hotspot inside the image here.
if (tracker.isErrorAny() || width < 0 || height < 0) { if (tracker.isErrorAny() || width < 0 || height < 0) {
fHotspot.x = fHotspot.y = 0; fHotspot.x = fHotspot.y = 0;
isImageOk = false; width = height = 1;
fImage = createTransparentImage(width, height);
} else { } else {
isImageOk = true; // Scale image to nearest supported size
} final Dimension nativeSize = toolkit.getBestCursorSize(width, height);
if (nativeSize.width != width || nativeSize.height != height) {
// Scale image to nearest supported size fImage = fImage.getScaledInstance(nativeSize.width, nativeSize.height, Image.SCALE_DEFAULT);
final Dimension nativeSize = toolkit.getBestCursorSize(width, height); width = nativeSize.width;
if (nativeSize.width != width || nativeSize.height != height) { height = nativeSize.height;
fImage = fImage.getScaledInstance(nativeSize.width, nativeSize.height, Image.SCALE_DEFAULT); }
width = nativeSize.width;
height = nativeSize.height;
} }
// NOTE: this was removed for 3169146, but in 1.5 the JCK tests for an exception and fails if one isn't thrown. // NOTE: this was removed for 3169146, but in 1.5 the JCK tests for an exception and fails if one isn't thrown.
...@@ -98,6 +96,21 @@ public class CCustomCursor extends Cursor { ...@@ -98,6 +96,21 @@ public class CCustomCursor extends Cursor {
} }
} }
private static BufferedImage createTransparentImage(int w, int h) {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
BufferedImage img = gc.createCompatibleImage(w, h, Transparency.BITMASK);
Graphics2D g = (Graphics2D)img.getGraphics();
g.setBackground(new Color(0, 0, 0, 0));
g.clearRect(0, 0, w, h);
g.dispose();
return img;
}
public static Dimension getBestCursorSize(final int preferredWidth, final int preferredHeight) { public static Dimension getBestCursorSize(final int preferredWidth, final int preferredHeight) {
// With Panther, cursors have no limit on their size. So give the client their // With Panther, cursors have no limit on their size. So give the client their
// preferred size, but no larger than half the dimensions of the main screen // preferred size, but no larger than half the dimensions of the main screen
...@@ -111,31 +124,26 @@ public class CCustomCursor extends Cursor { ...@@ -111,31 +124,26 @@ public class CCustomCursor extends Cursor {
} }
// Called from native when the cursor is set // Called from native when the cursor is set
// Returns long array of [NSImage ptr, x hotspot, y hotspot]
CImage fCImage; CImage fCImage;
long getImageData() { long getImageData() {
if (fCImage != null) { if (fCImage != null) {
return fCImage.ptr; return fCImage.ptr;
} }
if (isImageOk) { try {
try { fCImage = CImage.getCreator().createFromImage(fImage);
fCImage = CImage.getCreator().createFromImage(fImage); if (fCImage == null) {
// Something unexpected happened: CCustomCursor constructor
if (fCImage == null) { // takes care of invalid cursor images, yet createFromImage()
isImageOk = false; // failed to do its job. Return null to keep the cursor unchanged.
return 0L;
} else {
return fCImage.ptr;
}
} catch (IllegalArgumentException iae) {
// Silently return null - we want to hide cursor by providing an empty
// ByteArray or just null
return 0L; return 0L;
} else {
return fCImage.ptr;
} }
} catch (IllegalArgumentException iae) {
// see comment above
return 0L;
} }
return 0L;
} }
Point getHotSpot() { Point getHotSpot() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册