changeset 104090:1d6a73f0d113

(xfont_list_pattern): Don't ignore the return value of font_parse_xlfd. Check font properties more rigidly.
author Kenichi Handa <handa@m17n.org>
date Tue, 28 Jul 2009 02:07:05 +0000
parents e48e0579baed
children 5ad8c9beecab
files src/xfont.c
diffstat 1 files changed, 16 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfont.c	Tue Jul 28 01:47:44 2009 +0000
+++ b/src/xfont.c	Tue Jul 28 02:07:05 2009 +0000
@@ -411,16 +411,25 @@
 	    continue;
 	  entity = font_make_entity ();
 	  xfont_decode_coding_xlfd (indices[i], -1, buf);
-	  font_parse_xlfd (buf, entity);
+	  if (font_parse_xlfd (buf, entity) < 0)
+	    continue;
 	  ASET (entity, FONT_TYPE_INDEX, Qx);
 	  /* Avoid auto-scaled fonts.  */
-	  if (XINT (AREF (entity, FONT_DPI_INDEX)) != 0
+	  if (INTEGERP (AREF (entity, FONT_DPI_INDEX))
+	      && INTEGERP (AREF (entity, FONT_AVGWIDTH_INDEX))
+	      && XINT (AREF (entity, FONT_DPI_INDEX)) != 0
 	      && XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) == 0)
 	    continue;
 	  /* Avoid not-allowed scalable fonts.  */
 	  if (NILP (Vscalable_fonts_allowed))
 	    {
-	      if (XINT (AREF (entity, FONT_SIZE_INDEX)) == 0)
+	      int size = 0;
+
+	      if (INTEGERP (AREF (entity, FONT_SIZE_INDEX)))
+		size = XINT (AREF (entity, FONT_SIZE_INDEX));
+	      else if (FLOATP (AREF (entity, FONT_SIZE_INDEX)))
+		size = XFLOAT_DATA (AREF (entity, FONT_SIZE_INDEX));
+	      if (size == 0)
 		continue;
 	    }
 	  else if (CONSP (Vscalable_fonts_allowed))
@@ -439,6 +448,10 @@
 		continue;
 	    }
 
+	  /* Avoid fonts of invalid registry.  */
+	  if (NILP (AREF (entity, FONT_REGISTRY_INDEX)))
+	    continue;
+
 	  /* Update encoding and repertory if necessary.  */
 	  if (! EQ (registry, AREF (entity, FONT_REGISTRY_INDEX)))
 	    {