# HG changeset patch # User Kenichi Handa # Date 1049873219 0 # Node ID 98bdd2203d85dfd02a545cf59849808c17c79c5a # Parent 1a72ba81bfa09dafddedf1d7378a7b2ea467b71f (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. diff -r 1a72ba81bfa0 -r 98bdd2203d85 src/xfaces.c --- 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);