7191872: Xrender: No text displayed using 64 bit JDK on solaris11-sparc
Reviewed-by: prr, ceisserer
--- a/jdk/src/share/classes/sun/font/FileFontStrike.java Tue Apr 30 22:43:02 2013 -0700
+++ b/jdk/src/share/classes/sun/font/FileFontStrike.java Mon May 06 12:57:42 2013 -0700
@@ -747,14 +747,9 @@
return origMinX;
}
- long pixelData;
- if (StrikeCache.nativeAddressSize == 4) {
- pixelData = 0xffffffff &
- StrikeCache.unsafe.getInt(ptr + StrikeCache.pixelDataOffset);
- } else {
- pixelData =
- StrikeCache.unsafe.getLong(ptr + StrikeCache.pixelDataOffset);
- }
+ long pixelData =
+ StrikeCache.unsafe.getAddress(ptr + StrikeCache.pixelDataOffset);
+
if (pixelData == 0L) {
return origMinX;
}
--- a/jdk/src/share/classes/sun/font/GlyphList.java Tue Apr 30 22:43:02 2013 -0700
+++ b/jdk/src/share/classes/sun/font/GlyphList.java Mon May 06 12:57:42 2013 -0700
@@ -361,16 +361,10 @@
graybits = new byte[len];
}
}
- long pixelDataAddress;
- if (StrikeCache.nativeAddressSize == 4) {
- pixelDataAddress = 0xffffffff &
- StrikeCache.unsafe.getInt(images[glyphindex] +
+ long pixelDataAddress =
+ StrikeCache.unsafe.getAddress(images[glyphindex] +
StrikeCache.pixelDataOffset);
- } else {
- pixelDataAddress =
- StrikeCache.unsafe.getLong(images[glyphindex] +
- StrikeCache.pixelDataOffset);
- }
+
if (pixelDataAddress == 0L) {
return graybits;
}
--- a/jdk/src/solaris/classes/sun/font/XRGlyphCacheEntry.java Tue Apr 30 22:43:02 2013 -0700
+++ b/jdk/src/solaris/classes/sun/font/XRGlyphCacheEntry.java Mon May 06 12:57:42 2013 -0700
@@ -69,11 +69,28 @@
}
public static int getGlyphID(long glyphInfoPtr) {
- return (int) StrikeCache.unsafe.getInt(glyphInfoPtr + StrikeCache.cacheCellOffset);
+ // We need to access the GlyphID with Unsafe.getAddress() because the
+ // corresponding field in the underlying C data-structure is of type
+ // 'void*' (see field 'cellInfo' of struct 'GlyphInfo'
+ // in src/share/native/sun/font/fontscalerdefs.h).
+ // On 64-bit Big-endian architectures it would be wrong to access this
+ // field with Unsafe.getInt().
+ return (int) StrikeCache.unsafe.getAddress(glyphInfoPtr +
+ StrikeCache.cacheCellOffset);
}
public static void setGlyphID(long glyphInfoPtr, int id) {
- StrikeCache.unsafe.putInt(glyphInfoPtr + StrikeCache.cacheCellOffset, id);
+ // We need to access the GlyphID with Unsafe.putAddress() because the
+ // corresponding field in the underlying C data-structure is of type
+ // 'void*' (see field 'cellInfo' of struct 'GlyphInfo' in
+ // src/share/native/sun/font/fontscalerdefs.h).
+ // On 64-bit Big-endian architectures it would be wrong to write this
+ // field with Unsafe.putInt() because it is also accessed from native
+ // code as a 'long'.
+ // See Java_sun_java2d_xr_XRBackendNative_XRAddGlyphsNative()
+ // in src/solaris/native/sun/java2d/x11/XRBackendNative.c
+ StrikeCache.unsafe.putAddress(glyphInfoPtr +
+ StrikeCache.cacheCellOffset, (long)id);
}
public int getGlyphID() {
@@ -105,12 +122,9 @@
}
public void writePixelData(ByteArrayOutputStream os, boolean uploadAsLCD) {
- long pixelDataAddress;
- if (StrikeCache.nativeAddressSize == 4) {
- pixelDataAddress = 0xffffffff & StrikeCache.unsafe.getInt(glyphInfoPtr + StrikeCache.pixelDataOffset);
- } else {
- pixelDataAddress = StrikeCache.unsafe.getLong(glyphInfoPtr + StrikeCache.pixelDataOffset);
- }
+ long pixelDataAddress =
+ StrikeCache.unsafe.getAddress(glyphInfoPtr +
+ StrikeCache.pixelDataOffset);
if (pixelDataAddress == 0L) {
return;
}
--- a/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c Tue Apr 30 22:43:02 2013 -0700
+++ b/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c Mon May 06 12:57:42 2013 -0700
@@ -742,7 +742,12 @@
for (i=0; i < glyphCnt; i++) {
GlyphInfo *jginfo = (GlyphInfo *) jlong_to_ptr(glyphInfoPtrs[i]);
- gid[i] = (Glyph) (0x0ffffffffL & ((unsigned long)(jginfo->cellInfo)));
+ // 'jginfo->cellInfo' is of type 'void*'
+ // (see definition of 'GlyphInfo' in fontscalerdefs.h)
+ // 'Glyph' is typedefed to 'unsigned long'
+ // (see http://www.x.org/releases/X11R7.7/doc/libXrender/libXrender.txt)
+ // Maybe we should assert that (sizeof(void*) == sizeof(Glyph)) ?
+ gid[i] = (Glyph) (jginfo->cellInfo);
xginfo[i].x = (-jginfo->topLeftX);
xginfo[i].y = (-jginfo->topLeftY);
xginfo[i].width = jginfo->width;