changeset 50515:98bdd2203d85

(Vface_font_rescale_alist): New variable. (struct font_name): New member rescale_ratio. (font_rescale_ratio): New function. (split_font_name): If NUMERIC_P is nonzero, set font->rescale_ratio. (better_font_p): On comparing point sized, pay attention to recale_ratio member of fonts. (build_scalable_font_name): Reflect font->rescale_ratio in the font name. (syms_of_xfaces): Declare Vface_font_rescale_alist as a Lisp variable.
author Kenichi Handa <handa@m17n.org>
date Wed, 09 Apr 2003 07:26:59 +0000
parents 1a72ba81bfa0
children 125da3e3e9af
files src/xfaces.c
diffstat 1 files changed, 66 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfaces.c	Wed Apr 09 07:26:42 2003 +0000
+++ b/src/xfaces.c	Wed Apr 09 07:26:59 2003 +0000
@@ -368,6 +368,10 @@
 
 Lisp_Object Vface_ignored_fonts;
 
+/* Alist of font name patterns vs the rescaling factor.  */
+
+Lisp_Object Vface_font_rescale_alist;
+
 /* Maximum number of fonts to consider in font_list.  If not an
    integer > 0, DEFAULT_FONT_LIST_LIMIT is used instead.  */
 
@@ -1935,6 +1939,11 @@
      split_font_name for which these are.  */
   int numeric[XLFD_LAST];
 
+  /* If the original name matches one of Vface_font_rescale_alist,
+     the value is the corresponding rescale ratio.  Otherwise, the
+     value is 1.0.  */
+  double rescale_ratio;
+
   /* Lower value mean higher priority.  */
   int registry_priority;
 };
@@ -2265,6 +2274,24 @@
 }
 
 
+/* Return a rescaling ratio of a font of NAME.  */
+
+static double
+font_rescale_ratio (char *name)
+{
+  Lisp_Object tail, elt;  
+
+  for (tail = Vface_font_rescale_alist; CONSP (tail); tail = XCDR (tail))
+    {
+      elt = XCAR (tail);
+      if (STRINGP (XCAR (elt)) && FLOATP (XCDR (elt))
+	  && fast_c_string_match_ignore_case (XCAR (elt), name) >= 0)
+	return XFLOAT_DATA (XCDR (elt));
+    }
+  return 1.0;
+}
+
+
 /* Split XLFD font name FONT->name destructively into NUL-terminated,
    lower-case fields in FONT->fields.  NUMERIC_P non-zero means
    compute numeric values for fields XLFD_POINT_SIZE, XLFD_SWIDTH,
@@ -2281,6 +2308,11 @@
 {
   int i = 0;
   int success_p;
+  double rescale_ratio;
+
+  if (numeric_p)
+    /* This must be done before splitting the font name.  */
+    rescale_ratio = font_rescale_ratio (font->name);
 
   if (*font->name == '-')
     {
@@ -2340,6 +2372,7 @@
       font->numeric[XLFD_WEIGHT] = xlfd_numeric_weight (font);
       font->numeric[XLFD_SWIDTH] = xlfd_numeric_swidth (font);
       font->numeric[XLFD_AVGWIDTH] = atoi (font->fields[XLFD_AVGWIDTH]);
+      font->rescale_ratio = rescale_ratio;
     }
 
   /* Initialize it to zero.  It will be overridden by font_list while
@@ -5987,12 +6020,23 @@
 
       if (compare_pt_p || xlfd_idx != XLFD_POINT_SIZE)
 	{
-	  int delta1 = abs (values[i] - font1->numeric[xlfd_idx]);
-	  int delta2 = abs (values[i] - font2->numeric[xlfd_idx]);
-
-	  if (xlfd_idx == XLFD_POINT_SIZE
-	      && abs (delta1 - delta2) < FONT_POINT_SIZE_QUANTUM)
-	    continue;
+	  int delta1, delta2;
+
+	  if (xlfd_idx == XLFD_POINT_SIZE)
+	    {
+	      delta1 = abs (values[i] - (font1->numeric[xlfd_idx]
+					 / font1->rescale_ratio));
+	      delta2 = abs (values[i] - (font2->numeric[xlfd_idx]
+					 / font2->rescale_ratio));
+	      if (abs (delta1 - delta2) < FONT_POINT_SIZE_QUANTUM)
+		continue;
+	    }
+	  else
+	    {
+	      delta1 = abs (values[i] - font1->numeric[xlfd_idx]);
+	      delta2 = abs (values[i] - font2->numeric[xlfd_idx]);
+	    }
+
 	  if (delta1 > delta2)
 	    return 0;
 	  else if (delta1 < delta2)
@@ -6075,11 +6119,17 @@
       pt = specified_pt;
       pixel_value = resy / (PT_PER_INCH * 10.0) * pt;
     }
-
+  /* We may need a font of the different size.  */
+  pixel_value *= font->rescale_ratio;
+
+  /* We should keep POINT_SIZE 0.  Otherwise, X server can't open a
+     font of the specified PIXEL_SIZE.  */
+#if 0
   /* Set point size of the font.  */
   sprintf (point_size, "%d", (int) pt);
   font->fields[XLFD_POINT_SIZE] = point_size;
   font->numeric[XLFD_POINT_SIZE] = pt;
+#endif
 
   /* Set pixel size.  */
   sprintf (pixel_size, "%d", pixel_value);
@@ -7674,6 +7724,15 @@
 ignore.  */);
   Vface_ignored_fonts = Qnil;
 
+  DEFVAR_LISP ("face-font-rescale-alist", &Vface_font_rescale_alist,
+	       doc: /* Alist of fonts vs the rescaling factors.
+Each element is a cons (FONT-NAME-PATTERN . RESCALE-RATIO), where
+FONT-NAME-PATTERN is a regular expression matching a font name, and
+RESCALE-RATIO is a floating point number to specify how much larger
+\(or smaller) font we should use.  For instance, if a face requests
+a font of 10 point, we actually use a font of 10 * RESCALE-RATIO point.  */);
+  Vface_font_rescale_alist = Qnil;
+
 #ifdef HAVE_WINDOW_SYSTEM
   defsubr (&Sbitmap_spec_p);
   defsubr (&Sx_list_fonts);