[Top][All Lists]
[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);