changeset 13699:2c10a7ea0c40

8225286: Better rendering of native glyphs Reviewed-by: serb, psadhukhan, mschoene, rhalade
author prr
date Wed, 19 Jun 2019 15:24:42 -0700
parents 5c1c0eda1459
children c20af8b7844d
files src/share/native/sun/font/freetypeScaler.c
diffstat 1 files changed, 21 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/native/sun/font/freetypeScaler.c	Fri Jun 14 20:33:17 2019 -0700
+++ b/src/share/native/sun/font/freetypeScaler.c	Wed Jun 19 15:24:42 2019 -0700
@@ -770,6 +770,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
@@ -846,6 +853,15 @@
     /* 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;
+        int w, h;
+        FT_Outline_Get_CBox(&(ftglyph->outline), &bbox);
+        w = (int)((bbox.xMax>>6)-(bbox.xMin>>6));
+        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());
@@ -854,6 +870,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);