emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/xfaces.c


From: Kenichi Handa
Subject: [Emacs-diffs] Changes to emacs/src/xfaces.c
Date: Wed, 09 Apr 2003 04:34:54 -0400

Index: emacs/src/xfaces.c
diff -c emacs/src/xfaces.c:1.273 emacs/src/xfaces.c:1.274
*** emacs/src/xfaces.c:1.273    Wed Apr  2 20:40:19 2003
--- emacs/src/xfaces.c  Wed Apr  9 03:26:59 2003
***************
*** 368,373 ****
--- 368,377 ----
  
  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,1940 ****
--- 1939,1949 ----
       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,2270 ****
--- 2274,2297 ----
  }
  
  
+ /* 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,2286 ****
--- 2308,2318 ----
  {
    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,2345 ****
--- 2372,2378 ----
        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,5998 ****
  
        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;
          if (delta1 > delta2)
            return 0;
          else if (delta1 < delta2)
--- 6020,6042 ----
  
        if (compare_pt_p || xlfd_idx != XLFD_POINT_SIZE)
        {
!         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,6085 ****
--- 6119,6135 ----
        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);
***************
*** 7673,7678 ****
--- 7723,7737 ----
  Each element is a regular expression that matches names of fonts to
  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);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]