From b200db1a3c2092e6090c4ac68ec11f450298479f Mon Sep 17 00:00:00 2001 From: "sgold@sonic.net" <> Date: Wed, 26 Mar 2014 14:32:25 -0700 Subject: [PATCH] fix for GitHub issue #115 (GoogleCode issue #638) as discussed at http://hub.jmonkeyengine.org/forum/topic/proposed-fix-for-issue-638 --- .../jme3/cursors/plugins/CursorLoader.java | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/jme3-desktop/src/main/java/com/jme3/cursors/plugins/CursorLoader.java b/jme3-desktop/src/main/java/com/jme3/cursors/plugins/CursorLoader.java index d3e71fcad..29d196964 100644 --- a/jme3-desktop/src/main/java/com/jme3/cursors/plugins/CursorLoader.java +++ b/jme3-desktop/src/main/java/com/jme3/cursors/plugins/CursorLoader.java @@ -56,9 +56,11 @@ import javax.imageio.ImageIO; * @creation Jun 5, 2012 9:45:58 AM */ public class CursorLoader implements AssetLoader { + final private static int FDE_OFFSET = 6; // first directory entry offset private boolean isIco; private boolean isAni; + private boolean isCur; // .cur format if true /** * Loads and return a cursor file of one of the following format: .ani, .cur and .ico. @@ -70,15 +72,16 @@ public class CursorLoader implements AssetLoader { isIco = false; isAni = false; + isCur = false; isIco = ((AssetKey) info.getKey()).getExtension().equals("ico"); if (!isIco) { - isIco = ((AssetKey) info.getKey()).getExtension().equals("cur"); - if (!isIco) { + isCur = ((AssetKey) info.getKey()).getExtension().equals("cur"); + if (!isCur) { isAni = ((AssetKey) info.getKey()).getExtension().equals("ani"); } } - if (!isAni && !isIco) { + if (!isAni && !isIco && !isCur) { throw new IllegalArgumentException("Cursors supported are .ico, .cur or .ani"); } @@ -98,7 +101,7 @@ public class CursorLoader implements AssetLoader { byte[] icoimages = new byte[0]; // new byte [0] facilitates read() if (isAni) { - CursorImageData ciDat = new CursorImageData(); + CursorLoader.CursorImageData ciDat = new CursorLoader.CursorImageData(); int numIcons = 0; int jiffy = 0; // not using those but keeping references for now. @@ -209,7 +212,7 @@ public class CursorLoader implements AssetLoader { } else { throw new IllegalArgumentException("Unknown format."); } - } else if (isIco) { + } else if (isCur || isIco) { DataInputStream in = new DataInputStream(inStream); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[16384]; @@ -221,13 +224,30 @@ public class CursorLoader implements AssetLoader { } BufferedImage bi[] = parseICOImage(icoimages); - CursorImageData cid = new CursorImageData(bi, 0, 0, 0, 0); + int hotSpotX = 0; + int hotSpotY = 0; + CursorLoader.CursorImageData cid = new CursorLoader.CursorImageData(bi, 0, hotSpotX, hotSpotY, 0); + if (isCur) { + /* + * Per http://msdn.microsoft.com/en-us/library/ms997538.aspx + * every .cur file should provide hotspot coordinates. + */ + hotSpotX = icoimages[FDE_OFFSET + 4] + + icoimages[FDE_OFFSET + 5] * 255; + hotSpotY = icoimages[FDE_OFFSET + 6] + + icoimages[FDE_OFFSET + 7] * 255; + cid.xHotSpot = hotSpotX; + /* + * Flip the Y-coordinate. + */ + cid.yHotSpot = cid.height - 1 - hotSpotY; + } cid.completeCursor(); return setJmeCursor(cid); } - private JmeCursor setJmeCursor(CursorImageData cid) { + private JmeCursor setJmeCursor(CursorLoader.CursorImageData cid) { JmeCursor jmeCursor = new JmeCursor(); // set cursor's params. @@ -255,7 +275,6 @@ public class CursorLoader implements AssetLoader { BufferedImage[] bi; // Check resource type field. - int FDE_OFFSET = 6; // first directory entry offset int DE_LENGTH = 16; // directory entry length int BMIH_LENGTH = 40; // BITMAPINFOHEADER length @@ -653,7 +672,7 @@ public class CursorLoader implements AssetLoader { if (rate == 0) { rate = jiffy; } - CursorImageData cid = new CursorImageData(bi, rate, hotspotx, hotspoty, type); + CursorLoader.CursorImageData cid = new CursorLoader.CursorImageData(bi, rate, hotspotx, hotspoty, type); if (width == 0) { this.width = cid.width; } else { @@ -737,4 +756,4 @@ public class CursorLoader implements AssetLoader { data.rewind(); } } -} +} \ No newline at end of file