8225286: Better rendering of native glyphs
Reviewed-by: serb, psadhukhan, mschoene, rhalade
--- 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);