# HG changeset patch # User prr # Date 1560983082 25200 # Node ID 2ede50a0f67d60943364fb6e4d0f9c5f7ee4e9a8 # Parent 874e94940351beff937d0da3cc90777acd0d722b 8225286: Better rendering of native glyphs Reviewed-by: serb, psadhukhan, mschoene, rhalade diff -r 874e94940351 -r 2ede50a0f67d src/java.desktop/share/native/libfontmanager/freetypeScaler.c --- a/src/java.desktop/share/native/libfontmanager/freetypeScaler.c Wed Jun 19 15:23:53 2019 -0700 +++ b/src/java.desktop/share/native/libfontmanager/freetypeScaler.c Wed Jun 19 15:24:42 2019 -0700 @@ -783,6 +783,13 @@ } +/* JDK does not use glyph images for fonts with a + * pixel size > 100 (see THRESHOLD in OutlineTextRenderer.java) + * so if the glyph bitmap image dimension is > 1024 pixels, + * something is up. + */ +#define MAX_GLYPH_DIM 1024 + /* * Class: sun_font_FreetypeFontScaler * Method: getGlyphImageNative @@ -856,6 +863,14 @@ /* generate bitmap if it is not done yet e.g. if algorithmic styling is performed and style was added to outline */ if (ftglyph->format == FT_GLYPH_FORMAT_OUTLINE) { + FT_BBox bbox; + FT_Outline_Get_CBox(&(ftglyph->outline), &bbox); + int w = (int)((bbox.xMax>>6)-(bbox.xMin>>6)); + int h = (int)((bbox.yMax>>6)-(bbox.yMin>>6)); + if (w > MAX_GLYPH_DIM || h > MAX_GLYPH_DIM) { + glyphInfo = getNullGlyphImage(); + return ptr_to_jlong(glyphInfo); + } error = FT_Render_Glyph(ftglyph, FT_LOAD_TARGET_MODE(target)); if (error != 0) { return ptr_to_jlong(getNullGlyphImage()); @@ -864,6 +879,11 @@ width = (UInt16) ftglyph->bitmap.width; height = (UInt16) ftglyph->bitmap.rows; + if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) { + glyphInfo = getNullGlyphImage(); + return ptr_to_jlong(glyphInfo); + } + imageSize = width*height; glyphInfo = (GlyphInfo*) malloc(sizeof(GlyphInfo) + imageSize);