changeset 100385:4504aa7cb434

(font_rescale_ratio): Moved from xfaces.c. Argument type changed. Handle a font-spec too. (font_score): Check Vface_font_rescale_alist. (font_open_entity): Likewise.
author Kenichi Handa <handa@m17n.org>
date Sat, 13 Dec 2008 03:29:47 +0000
parents 4757ef3107ec
children fae812e295b4
files src/font.c
diffstat 1 files changed, 42 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/font.c	Sat Dec 13 03:29:30 2008 +0000
+++ b/src/font.c	Sat Dec 13 03:29:47 2008 +0000
@@ -2165,6 +2165,38 @@
 static Lisp_Object font_sort_entites P_ ((Lisp_Object, Lisp_Object,
 					  Lisp_Object, int));
 
+/* Return a rescaling ratio of FONT_ENTITY.  */
+extern Lisp_Object Vface_font_rescale_alist;
+
+static double
+font_rescale_ratio (font_entity)
+     Lisp_Object font_entity;
+{
+  Lisp_Object tail, elt;
+  Lisp_Object name = Qnil;
+
+  for (tail = Vface_font_rescale_alist; CONSP (tail); tail = XCDR (tail))
+    {
+      elt = XCAR (tail);
+      if (FLOATP (XCDR (elt)))
+	{
+	  if (STRINGP (XCAR (elt)))
+	    {
+	      if (NILP (name))
+		name = Ffont_xlfd_name (font_entity, Qnil);
+	      if (fast_string_match_ignore_case (XCAR (elt), name) >= 0)
+		return XFLOAT_DATA (XCDR (elt));
+	    }
+	  else if (FONT_SPEC_P (XCAR (elt)))
+	    {
+	      if (font_match_p (XCAR (elt), font_entity))
+		return XFLOAT_DATA (XCDR (elt));
+	    }
+	}
+    }
+  return 1.0;
+}
+
 /* We sort fonts by scoring each of them against a specified
    font-spec.  The score value is 32 bit (`unsigned'), and the smaller
    the value is, the closer the font is to the font-spec.
@@ -2205,12 +2237,17 @@
 
   /* Score the size.  Maximum difference is 127.  */
   i = FONT_SIZE_INDEX;
-  if (! NILP (spec_prop[i]) && XINT (AREF (entity, i)) > 0)
+  if (! NILP (spec_prop[FONT_SIZE_INDEX])
+      && XINT (AREF (entity, FONT_SIZE_INDEX)) > 0)
     {
       /* We use the higher 6-bit for the actual size difference.  The
 	 lowest bit is set if the DPI is different.  */
-      int diff = XINT (spec_prop[i]) - XINT (AREF (entity, i));
-
+      int diff;
+      int pixel_size = XINT (spec_prop[FONT_SIZE_INDEX]);
+
+      if (CONSP (Vface_font_rescale_alist))
+	pixel_size *= font_rescale_ratio (entity);
+      diff = pixel_size - XINT (AREF (entity, FONT_SIZE_INDEX));
       if (diff < 0)
 	diff = - diff;
       diff <<= 1;
@@ -2845,6 +2882,8 @@
   size = AREF (entity, FONT_SIZE_INDEX);
   if (XINT (size) != 0)
     pixel_size = XINT (size);
+  else if (CONSP (Vface_font_rescale_alist))
+    pixel_size *= font_rescale_ratio (entity);
 
   for (objlist = AREF (entity, FONT_OBJLIST_INDEX); CONSP (objlist);
        objlist = XCDR (objlist))