# HG changeset patch # User prr # Date 1557949471 25200 # Node ID d5ea3bde1ebe13a817e378d86d0d82715208346c # Parent 29624901d8bcfb1edbc4e47033d0f6ff473c6d7e 8222690: Better Glyph Images Reviewed-by: serb, psadhukhan, mschoene, rhalade diff -r 29624901d8bc -r d5ea3bde1ebe src/java.desktop/share/classes/sun/font/GlyphList.java --- a/src/java.desktop/share/classes/sun/font/GlyphList.java Fri May 03 19:42:28 2019 +0100 +++ b/src/java.desktop/share/classes/sun/font/GlyphList.java Wed May 15 12:44:31 2019 -0700 @@ -303,6 +303,14 @@ */ public void setGlyphIndex(int i) { glyphindex = i; + if (images[i] == 0L) { + metrics[0] = (int)gposx; + metrics[1] = (int)gposy; + metrics[2] = 0; + metrics[3] = 0; + metrics[4] = 0; + return; + } float gx = StrikeCache.unsafe.getFloat(images[i]+StrikeCache.topLeftXOffset); float gy = @@ -341,6 +349,9 @@ graybits = new byte[len]; } } + if (images[glyphindex] == 0L) { + return graybits; + } long pixelDataAddress = StrikeCache.unsafe.getAddress(images[glyphindex] + StrikeCache.pixelDataOffset); @@ -448,6 +459,9 @@ char gw, gh; float gx, gy, gx0, gy0, gx1, gy1; for (int i=0; i 0) { ginfo = (GlyphInfo*)imagePtrs[0]; + if (ginfo == NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, glyphImages, + imagePtrs, JNI_ABORT); + free(gbv); + return (GlyphBlitVector*)NULL; + } /* rowBytes==width tests if its a B&W or LCD glyph */ if (ginfo->width == ginfo->rowBytes) { subPixPos = JNI_FALSE; @@ -561,6 +567,12 @@ jfloat px, py; ginfo = (GlyphInfo*)imagePtrs[g]; + if (ginfo == NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, glyphImages, + imagePtrs, JNI_ABORT); + free(gbv); + return (GlyphBlitVector*)NULL; + } gbv->glyphs[g].glyphInfo = ginfo; gbv->glyphs[g].pixels = ginfo->image; gbv->glyphs[g].width = ginfo->width; @@ -636,6 +648,12 @@ } else { for (g=0; gReleasePrimitiveArrayCritical(env, glyphImages, + imagePtrs, JNI_ABORT); + free(gbv); + return (GlyphBlitVector*)NULL; + } gbv->glyphs[g].glyphInfo = ginfo; gbv->glyphs[g].pixels = ginfo->image; gbv->glyphs[g].width = ginfo->width; diff -r 29624901d8bc -r d5ea3bde1ebe src/java.desktop/share/native/libfontmanager/freetypeScaler.c --- a/src/java.desktop/share/native/libfontmanager/freetypeScaler.c Fri May 03 19:42:28 2019 +0100 +++ b/src/java.desktop/share/native/libfontmanager/freetypeScaler.c Wed May 15 12:44:31 2019 -0700 @@ -635,16 +635,17 @@ to avoid unnecesary work with bitmaps. */ GlyphInfo *info; - jfloat advance; + jfloat advance = 0.0f; jlong image; image = Java_sun_font_FreetypeFontScaler_getGlyphImageNative( env, scaler, font2D, pScalerContext, pScaler, glyphCode); info = (GlyphInfo*) jlong_to_ptr(image); - advance = info->advanceX; - - free(info); + if (info != NULL) { + advance = info->advanceX; + free(info); + } return advance; } diff -r 29624901d8bc -r d5ea3bde1ebe src/java.desktop/unix/classes/sun/font/XRGlyphCache.java --- a/src/java.desktop/unix/classes/sun/font/XRGlyphCache.java Fri May 03 19:42:28 2019 +0100 +++ b/src/java.desktop/unix/classes/sun/font/XRGlyphCache.java Wed May 15 12:44:31 2019 -0700 @@ -114,6 +114,9 @@ for (int i = 0; i < glyphList.getNumGlyphs(); i++) { XRGlyphCacheEntry glyph; + if (imgPtrs[i] == 0L) { + continue; + } // Find uncached glyphs and queue them for upload if ((glyph = getEntryForPointer(imgPtrs[i])) == null) { glyph = new XRGlyphCacheEntry(imgPtrs[i], glyphList); diff -r 29624901d8bc -r d5ea3bde1ebe src/java.desktop/unix/classes/sun/font/XRTextRenderer.java --- a/src/java.desktop/unix/classes/sun/font/XRTextRenderer.java Fri May 03 19:42:28 2019 +0100 +++ b/src/java.desktop/unix/classes/sun/font/XRTextRenderer.java Wed May 15 12:44:31 2019 -0700 @@ -88,6 +88,9 @@ for (int i = 0; i < gl.getNumGlyphs(); i++) { gl.setGlyphIndex(i); XRGlyphCacheEntry cacheEntry = cachedGlyphs[i]; + if (cacheEntry == null) { + continue; + } eltList.getGlyphs().addInt(cacheEntry.getGlyphID()); int glyphSet = cacheEntry.getGlyphSet(); diff -r 29624901d8bc -r d5ea3bde1ebe src/java.desktop/unix/native/common/java2d/x11/X11FontScaler_md.c --- a/src/java.desktop/unix/native/common/java2d/x11/X11FontScaler_md.c Fri May 03 19:42:28 2019 +0100 +++ b/src/java.desktop/unix/native/common/java2d/x11/X11FontScaler_md.c Wed May 15 12:44:31 2019 -0700 @@ -273,6 +273,7 @@ unsigned int imageSize; JNIEnv *env; + FONT_AWT_LOCK(); /* XTextExtents16(xFont, xChar, 1, &direction, &ascent, &descent, &xcs); */ XQueryTextExtents16(awt_display,xFont->fid, xChar, 1, @@ -280,8 +281,11 @@ width = xcs.rbearing - xcs.lbearing; height = xcs.ascent+xcs.descent; imageSize = width*height; - glyphInfo = (GlyphInfo*)malloc(sizeof(GlyphInfo)+imageSize); + if (glyphInfo == NULL) { + AWT_UNLOCK(); + return (jlong)(uintptr_t)NULL; + } glyphInfo->cellInfo = NULL; glyphInfo->width = width; glyphInfo->height = height;