diff options
| author | Kenichi Handa | 2000-03-21 00:43:10 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2000-03-21 00:43:10 +0000 |
| commit | 395063480234fcc29845e0fd0ca2310c6a3eee3e (patch) | |
| tree | fe7972aacd78a390b27b1c4e14217d65be7a5eec /src | |
| parent | 6ecb43cedfcce4bb9c60cec33abd2dae6986f052 (diff) | |
| download | emacs-395063480234fcc29845e0fd0ca2310c6a3eee3e.tar.gz emacs-395063480234fcc29845e0fd0ca2310c6a3eee3e.zip | |
(Qx_charset_registry, Vface_default_registry):
Variables removed.
(clear_font_table, frame_update_line_height, load_face_font):
Adjusted for the change of fontset implementation.
(load_face_fontset_font): Function removed.
(pixel_point_size): New function.
(font_list): Argument type changed. Caller changed.
(LFACE_FONT): New macro.
(check_lface_attrs): Check attr[LFACE_FONT_INDEX].
(set_lface_from_font_name): Type of arg FONTNAME is changed to
Lisp_Object. Determine the font name by actually loading a font
by the specified pattern. Set LFACE_FONT (lface) to the specified
pattern. Even if a font is not found, don't try alternatives.
(Finternal_set_lisp_face_attribute): Handle `font' slot in lface.
(set_font_frame_param): If `font' is specified in lface, use it.
(Finternal_get_lisp_face_attribute): Handle `font' slot in lface.
(lface_same_font_attributes_p): Likewise.
(make_realized_face): Arguent changed. Caller changed. Set
face->ascii_face to face itself.
(free_realized_face): Free face->fontset if face is for ASCII.
(face_suitable_for_iso8859_1_p, face_suitable_for_charset_p,
deduce_unibyte_registry, x_charset_registry): Functions removed.
(free_realized_multibyte_face): New function.
(lookup_face, lookup_named_face, lookup_derived_face): Argument
changed. Caller changed.
(try_font_list): Argument type changed.
(face_fontset): Check `font' slot of ATTRS, not `family' slot.
(choose_face_font): Argument changed. Handle fontset properly.
(choose_face_fontset_font): Function removed.
(realize_default_face, realize_named_face): Don't remove the
former face here.
(realize_face): Argument changed. Caller changed. Remove face
with the arg former_face_id in advance. Load font for the new
face.
(realize_x_face): Argument changed. Caller changed. For a
multibyte character, share fontset with base_face. For a single
byte character, make a new realized fontset. Don't load a font
here.
(realize_tty_face): Argument changed. Caller changed.
(compute_char_face): Call FACE_FOR_CHAR, not FACE_FOR_CHARSET.
(face_at_buffer_position): Don't check multibyte_p for returning
DEFAULT_FACE_ID.
(face_at_string_position): Call FACE_SUITABLE_FOR_CHAR_P, not
FACE_SUITABLE_FOR_CHARSET_P.
(syms_of_xfaces): Remove code for Qx_charset_registry and
Vface_default_registry.
Diffstat (limited to 'src')
| -rw-r--r-- | src/xfaces.c | 1283 |
1 files changed, 506 insertions, 777 deletions
diff --git a/src/xfaces.c b/src/xfaces.c index 89b8e4c7b5f..c3c4360f3b0 100644 --- a/src/xfaces.c +++ b/src/xfaces.c | |||
| @@ -26,12 +26,12 @@ Boston, MA 02111-1307, USA. */ | |||
| 26 | changed by defining `faces'. Each face can specify the following | 26 | changed by defining `faces'. Each face can specify the following |
| 27 | display attributes: | 27 | display attributes: |
| 28 | 28 | ||
| 29 | 1. Font family or fontset alias name. | 29 | 1. Font family name. |
| 30 | 30 | ||
| 31 | 2. Relative proportionate width, aka character set width or set | 31 | 2. Relative proportionate width, aka character set width or set |
| 32 | width (swidth), e.g. `semi-compressed'. | 32 | width (swidth), e.g. `semi-compressed'. |
| 33 | 33 | ||
| 34 | 3. Font height in 1/10pt | 34 | 3. Font height in 1/10pt. |
| 35 | 35 | ||
| 36 | 4. Font weight, e.g. `bold'. | 36 | 4. Font weight, e.g. `bold'. |
| 37 | 37 | ||
| @@ -55,20 +55,30 @@ Boston, MA 02111-1307, USA. */ | |||
| 55 | 13. Whether or not a box should be drawn around characters, the box | 55 | 13. Whether or not a box should be drawn around characters, the box |
| 56 | type, and, for simple boxes, in what color. | 56 | type, and, for simple boxes, in what color. |
| 57 | 57 | ||
| 58 | 14. Font or fontset pattern, or nil. This is a special attribute. | ||
| 59 | When this attribyte is specified, the face uses a font opened by | ||
| 60 | that pattern as is. In addition, all the other font-related | ||
| 61 | attributes (1st thru 5th) are generated from the opened font name. | ||
| 62 | On the other hand, if one of the other font-related attributes are | ||
| 63 | specified, this attribute is set to nil. In that case, the face | ||
| 64 | doesn't inherit this attribute from the `default' face, and uses a | ||
| 65 | font determined by the other attributes (those may be inherited | ||
| 66 | from the `default' face). | ||
| 67 | |||
| 58 | Faces are frame-local by nature because Emacs allows to define the | 68 | Faces are frame-local by nature because Emacs allows to define the |
| 59 | same named face (face names are symbols) differently for different | 69 | same named face (face names are symbols) differently for different |
| 60 | frames. Each frame has an alist of face definitions for all named | 70 | frames. Each frame has an alist of face definitions for all named |
| 61 | faces. The value of a named face in such an alist is a Lisp vector | 71 | faces. The value of a named face in such an alist is a Lisp vector |
| 62 | with the symbol `face' in slot 0, and a slot for each each of the | 72 | with the symbol `face' in slot 0, and a slot for each of the face |
| 63 | face attributes mentioned above. | 73 | attributes mentioned above. |
| 64 | 74 | ||
| 65 | There is also a global face alist `Vface_new_frame_defaults'. Face | 75 | There is also a global face alist `Vface_new_frame_defaults'. Face |
| 66 | definitions from this list are used to initialize faces of newly | 76 | definitions from this list are used to initialize faces of newly |
| 67 | created frames. | 77 | created frames. |
| 68 | 78 | ||
| 69 | A face doesn't have to specify all attributes. Those not specified | 79 | A face doesn't have to specify all attributes. Those not specified |
| 70 | have a value of `unspecified'. Faces specifying all attributes are | 80 | have a value of `unspecified'. Faces specifying all attributes but |
| 71 | called `fully-specified'. | 81 | the 14th are called `fully-specified'. |
| 72 | 82 | ||
| 73 | 83 | ||
| 74 | Face merging. | 84 | Face merging. |
| @@ -90,46 +100,44 @@ Boston, MA 02111-1307, USA. */ | |||
| 90 | `realized face' in form of a struct face which is stored in the | 100 | `realized face' in form of a struct face which is stored in the |
| 91 | face cache of the frame on which it was realized. | 101 | face cache of the frame on which it was realized. |
| 92 | 102 | ||
| 93 | Face realization is done in the context of the charset of the | 103 | Face realization is done in the context of the character to display |
| 94 | character to display because different fonts and encodings are used | 104 | because different fonts may be used for different characters. In |
| 95 | for different charsets. In other words, for characters of | 105 | other words, for characters that have different font |
| 96 | different charsets, different realized faces are needed to display | 106 | specifications, different realized faces are needed to display |
| 97 | them. | 107 | them. |
| 98 | 108 | ||
| 99 | Faces are always realized for a specific character set and contain | 109 | Font specification is done by fontsets. See the comment in |
| 100 | a specific font, even if the face being realized specifies a | 110 | fontset.c for the details. In the current implementation, all ASCII |
| 101 | fontset (see `font selection' below). The reason is that the | 111 | characters share the same font in a fontset. |
| 102 | result of the new font selection stage is better than what can be | 112 | |
| 103 | done with statically defined font name patterns in fontsets. | 113 | Faces are at first realized for ASCII characters, and, at that |
| 114 | time, assigned a specific realized fontset. Hereafter, we call | ||
| 115 | such a face as `ASCII face'. When a face for a multibyte character | ||
| 116 | is realized, it inherits (thus shares) a fontset of an ASCII face | ||
| 117 | that has the same attributes other than font-related ones. | ||
| 118 | |||
| 119 | Thus, all realzied face have a realized fontset. | ||
| 104 | 120 | ||
| 105 | 121 | ||
| 106 | Unibyte text. | 122 | Unibyte text. |
| 107 | 123 | ||
| 108 | In unibyte text, Emacs' charsets aren't applicable; function | 124 | Unibyte text (i.e. raw 8-bit characters) is displayed with the same |
| 109 | `char-charset' reports CHARSET_ASCII for all characters, including | 125 | font as ASCII characters. That is because it is expected that |
| 110 | those > 0x7f. The X registry and encoding of fonts to use is | 126 | unibyte text users specify a font that is suitable both for ASCII |
| 111 | determined from the variable `x-unibyte-registry-and-encoding' in | 127 | and raw 8-bit characters. |
| 112 | this case. The variable is initialized at Emacs startup time from | 128 | |
| 113 | the font the user specified for Emacs. | ||
| 114 | |||
| 115 | Currently all unibyte text, i.e. all buffers with | ||
| 116 | enable_multibyte_characters nil are displayed with fonts of the | ||
| 117 | same registry and encoding `x-unibyte-registry-and-encoding'. This | ||
| 118 | is consistent with the fact that languages can also be set | ||
| 119 | globally, only. | ||
| 120 | |||
| 121 | 129 | ||
| 122 | Font selection. | 130 | Font selection. |
| 123 | 131 | ||
| 124 | Font selection tries to find the best available matching font for a | 132 | Font selection tries to find the best available matching font for a |
| 125 | given (charset, face) combination. This is done slightly | 133 | given (character, face) combination. |
| 126 | differently for faces specifying a fontset, or a font family name. | ||
| 127 | 134 | ||
| 128 | If the face specifies a fontset alias name, that fontset determines | 135 | If the face specifies a fontset name, that fontset determines a |
| 129 | a pattern for fonts of the given charset. If the face specifies a | 136 | pattern for fonts of the given character. If the face specifies a |
| 130 | font family, a font pattern is constructed. Charset symbols have a | 137 | font name or the other font-related attributes, a fontset is |
| 131 | property `x-charset-registry' for that purpose that maps a charset | 138 | realized from the default fontset. In that case, that |
| 132 | to an XLFD registry and encoding in the font pattern constructed. | 139 | specification determines a pattern for ASCII characters and the |
| 140 | default fontset determines a pattern for multibyte characters. | ||
| 133 | 141 | ||
| 134 | Available fonts on the system on which Emacs runs are then matched | 142 | Available fonts on the system on which Emacs runs are then matched |
| 135 | against the font pattern. The result of font selection is the best | 143 | against the font pattern. The result of font selection is the best |
| @@ -151,13 +159,15 @@ Boston, MA 02111-1307, USA. */ | |||
| 151 | face doesn't exist. | 159 | face doesn't exist. |
| 152 | 160 | ||
| 153 | 161 | ||
| 154 | Composite characters. | 162 | Character compositition. |
| 155 | 163 | ||
| 156 | Realized faces for composite characters are the only ones having a | 164 | Usually, the realization process is already finished when Emacs |
| 157 | fontset id >= 0. When a composite character is encoded into a | 165 | actually reflects the desired glyph matrix on the screen. However, |
| 158 | sequence of non-composite characters (in xterm.c), a suitable font | 166 | on displaying a composition (sequence of characters to be composed |
| 159 | for the non-composite characters is then selected and realized, | 167 | on the screen), a suitable font for the components of the |
| 160 | i.e. the realization process is delayed but in principle the same. | 168 | composition is selected and realized while drawing them on the |
| 169 | screen, i.e. the realization process is delayed but in principle | ||
| 170 | the same. | ||
| 161 | 171 | ||
| 162 | 172 | ||
| 163 | Initialization of basic faces. | 173 | Initialization of basic faces. |
| @@ -302,12 +312,6 @@ Lisp_Object Qunspecified; | |||
| 302 | 312 | ||
| 303 | char unspecified_fg[] = "unspecified-fg", unspecified_bg[] = "unspecified-bg"; | 313 | char unspecified_fg[] = "unspecified-fg", unspecified_bg[] = "unspecified-bg"; |
| 304 | 314 | ||
| 305 | /* The symbol `x-charset-registry'. This property of charsets defines | ||
| 306 | the X registry and encoding that fonts should have that are used to | ||
| 307 | display characters of that charset. */ | ||
| 308 | |||
| 309 | Lisp_Object Qx_charset_registry; | ||
| 310 | |||
| 311 | /* The name of the function to call when the background of the frame | 315 | /* The name of the function to call when the background of the frame |
| 312 | has changed, frame_update_face_colors. */ | 316 | has changed, frame_update_face_colors. */ |
| 313 | 317 | ||
| @@ -337,11 +341,6 @@ extern Lisp_Object Qborder_color, Qcursor_color, Qmouse_color; | |||
| 337 | 341 | ||
| 338 | Lisp_Object Vface_default_stipple; | 342 | Lisp_Object Vface_default_stipple; |
| 339 | 343 | ||
| 340 | /* Default registry and encoding to use for charsets whose charset | ||
| 341 | symbols don't specify one. */ | ||
| 342 | |||
| 343 | Lisp_Object Vface_default_registry; | ||
| 344 | |||
| 345 | /* Alist of alternative font families. Each element is of the form | 344 | /* Alist of alternative font families. Each element is of the form |
| 346 | (FAMILY FAMILY1 FAMILY2 ...). If fonts of FAMILY can't be loaded, | 345 | (FAMILY FAMILY1 FAMILY2 ...). If fonts of FAMILY can't be loaded, |
| 347 | try FAMILY1, then FAMILY2, ... */ | 346 | try FAMILY1, then FAMILY2, ... */ |
| @@ -436,14 +435,13 @@ static int first_font_matching P_ ((struct frame *f, char *, | |||
| 436 | static int x_face_list_fonts P_ ((struct frame *, char *, | 435 | static int x_face_list_fonts P_ ((struct frame *, char *, |
| 437 | struct font_name *, int, int, int)); | 436 | struct font_name *, int, int, int)); |
| 438 | static int font_scalable_p P_ ((struct font_name *)); | 437 | static int font_scalable_p P_ ((struct font_name *)); |
| 439 | static Lisp_Object deduce_unibyte_registry P_ ((struct frame *, char *)); | ||
| 440 | static int get_lface_attributes P_ ((struct frame *, Lisp_Object, Lisp_Object *, int)); | 438 | static int get_lface_attributes P_ ((struct frame *, Lisp_Object, Lisp_Object *, int)); |
| 441 | static int load_pixmap P_ ((struct frame *, Lisp_Object, unsigned *, unsigned *)); | 439 | static int load_pixmap P_ ((struct frame *, Lisp_Object, unsigned *, unsigned *)); |
| 442 | static char *xstrdup P_ ((char *)); | 440 | static char *xstrdup P_ ((char *)); |
| 443 | static unsigned char *xstrlwr P_ ((unsigned char *)); | 441 | static unsigned char *xstrlwr P_ ((unsigned char *)); |
| 444 | static void signal_error P_ ((char *, Lisp_Object)); | 442 | static void signal_error P_ ((char *, Lisp_Object)); |
| 445 | static struct frame *frame_or_selected_frame P_ ((Lisp_Object, int)); | 443 | static struct frame *frame_or_selected_frame P_ ((Lisp_Object, int)); |
| 446 | static void load_face_font_or_fontset P_ ((struct frame *, struct face *, char *, int)); | 444 | static void load_face_font P_ ((struct frame *, struct face *, int)); |
| 447 | static void load_face_colors P_ ((struct frame *, struct face *, Lisp_Object *)); | 445 | static void load_face_colors P_ ((struct frame *, struct face *, Lisp_Object *)); |
| 448 | static void free_face_colors P_ ((struct frame *, struct face *)); | 446 | static void free_face_colors P_ ((struct frame *, struct face *)); |
| 449 | static int face_color_gray_p P_ ((struct frame *, char *)); | 447 | static int face_color_gray_p P_ ((struct frame *, char *)); |
| @@ -452,14 +450,15 @@ static void free_font_names P_ ((struct font_name *, int)); | |||
| 452 | static int sorted_font_list P_ ((struct frame *, char *, | 450 | static int sorted_font_list P_ ((struct frame *, char *, |
| 453 | int (*cmpfn) P_ ((const void *, const void *)), | 451 | int (*cmpfn) P_ ((const void *, const void *)), |
| 454 | struct font_name **)); | 452 | struct font_name **)); |
| 455 | static int font_list P_ ((struct frame *, char *, char *, char *, struct font_name **)); | 453 | static int font_list P_ ((struct frame *, Lisp_Object, Lisp_Object, |
| 456 | static int try_font_list P_ ((struct frame *, Lisp_Object *, char *, char *, char *, | 454 | Lisp_Object, struct font_name **)); |
| 457 | struct font_name **)); | 455 | static int try_font_list P_ ((struct frame *, Lisp_Object *, Lisp_Object, |
| 456 | Lisp_Object, Lisp_Object, struct font_name **)); | ||
| 458 | static int cmp_font_names P_ ((const void *, const void *)); | 457 | static int cmp_font_names P_ ((const void *, const void *)); |
| 459 | static struct face *realize_face P_ ((struct face_cache *, | 458 | static struct face *realize_face P_ ((struct face_cache *, Lisp_Object *, int, |
| 460 | Lisp_Object *, int)); | 459 | struct face *, int)); |
| 461 | static struct face *realize_x_face P_ ((struct face_cache *, | 460 | static struct face *realize_x_face P_ ((struct face_cache *, |
| 462 | Lisp_Object *, int)); | 461 | Lisp_Object *, int, struct face *)); |
| 463 | static struct face *realize_tty_face P_ ((struct face_cache *, | 462 | static struct face *realize_tty_face P_ ((struct face_cache *, |
| 464 | Lisp_Object *, int)); | 463 | Lisp_Object *, int)); |
| 465 | static int realize_basic_faces P_ ((struct frame *)); | 464 | static int realize_basic_faces P_ ((struct frame *)); |
| @@ -477,18 +476,15 @@ static void free_face_cache P_ ((struct face_cache *)); | |||
| 477 | static int face_numeric_weight P_ ((Lisp_Object)); | 476 | static int face_numeric_weight P_ ((Lisp_Object)); |
| 478 | static int face_numeric_slant P_ ((Lisp_Object)); | 477 | static int face_numeric_slant P_ ((Lisp_Object)); |
| 479 | static int face_numeric_swidth P_ ((Lisp_Object)); | 478 | static int face_numeric_swidth P_ ((Lisp_Object)); |
| 480 | static int face_fontset P_ ((struct frame *, Lisp_Object *)); | 479 | static int face_fontset P_ ((Lisp_Object *)); |
| 481 | static char *choose_face_font P_ ((struct frame *, Lisp_Object *, int, | 480 | static char *choose_face_font P_ ((struct frame *, Lisp_Object *, int, int)); |
| 482 | Lisp_Object)); | ||
| 483 | static char *choose_face_fontset_font P_ ((struct frame *, Lisp_Object *, | ||
| 484 | int, int)); | ||
| 485 | static void merge_face_vectors P_ ((Lisp_Object *from, Lisp_Object *)); | 481 | static void merge_face_vectors P_ ((Lisp_Object *from, Lisp_Object *)); |
| 486 | static void merge_face_vector_with_property P_ ((struct frame *, Lisp_Object *, | 482 | static void merge_face_vector_with_property P_ ((struct frame *, Lisp_Object *, |
| 487 | Lisp_Object)); | 483 | Lisp_Object)); |
| 488 | static int set_lface_from_font_name P_ ((struct frame *, Lisp_Object, char *, | 484 | static int set_lface_from_font_name P_ ((struct frame *, Lisp_Object, |
| 489 | int, int)); | 485 | Lisp_Object, int, int)); |
| 490 | static Lisp_Object lface_from_face_name P_ ((struct frame *, Lisp_Object, int)); | 486 | static Lisp_Object lface_from_face_name P_ ((struct frame *, Lisp_Object, int)); |
| 491 | static struct face *make_realized_face P_ ((Lisp_Object *, int, Lisp_Object)); | 487 | static struct face *make_realized_face P_ ((Lisp_Object *)); |
| 492 | static void free_realized_faces P_ ((struct face_cache *)); | 488 | static void free_realized_faces P_ ((struct face_cache *)); |
| 493 | static char *best_matching_font P_ ((struct frame *, Lisp_Object *, | 489 | static char *best_matching_font P_ ((struct frame *, Lisp_Object *, |
| 494 | struct font_name *, int)); | 490 | struct font_name *, int)); |
| @@ -867,79 +863,50 @@ Optional THOROUGHLY non-nil means try to free unused fonts, too.") | |||
| 867 | #ifdef HAVE_WINDOW_SYSTEM | 863 | #ifdef HAVE_WINDOW_SYSTEM |
| 868 | 864 | ||
| 869 | 865 | ||
| 870 | /* Remove those fonts from the font table of frame F that are not used | 866 | /* Remove those fonts from the font table of frame F exept for the |
| 871 | by fontsets. Called from clear_face_cache from time to time. */ | 867 | default ASCII font for the frame. Called from clear_face_cache |
| 868 | from time to time. */ | ||
| 872 | 869 | ||
| 873 | static void | 870 | static void |
| 874 | clear_font_table (f) | 871 | clear_font_table (f) |
| 875 | struct frame *f; | 872 | struct frame *f; |
| 876 | { | 873 | { |
| 877 | struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); | 874 | struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); |
| 878 | char *used; | ||
| 879 | Lisp_Object rest, frame; | 875 | Lisp_Object rest, frame; |
| 880 | int i; | 876 | int i; |
| 881 | 877 | ||
| 882 | xassert (FRAME_WINDOW_P (f)); | 878 | xassert (FRAME_WINDOW_P (f)); |
| 883 | 879 | ||
| 884 | used = (char *) alloca (dpyinfo->n_fonts * sizeof *used); | 880 | /* Free those fonts that are not used by the frame F as the default. */ |
| 885 | bzero (used, dpyinfo->n_fonts * sizeof *used); | 881 | for (i = 0; i < dpyinfo->n_fonts; ++i) |
| 882 | { | ||
| 883 | struct font_info *font_info = dpyinfo->font_table + i; | ||
| 886 | 884 | ||
| 887 | /* For all frames with the same x_display_info as F, record | 885 | if (!font_info->name |
| 888 | in `used' those fonts that are in use by fontsets. */ | 886 | || font_info->font == FRAME_FONT (f)) |
| 889 | FOR_EACH_FRAME (rest, frame) | 887 | continue; |
| 890 | if (FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo) | ||
| 891 | { | ||
| 892 | struct frame *f = XFRAME (frame); | ||
| 893 | struct fontset_data *fontset_data = FRAME_FONTSET_DATA (f); | ||
| 894 | 888 | ||
| 895 | for (i = 0; i < fontset_data->n_fontsets; ++i) | 889 | /* Free names. */ |
| 896 | { | 890 | if (font_info->full_name != font_info->name) |
| 897 | struct fontset_info *info = fontset_data->fontset_table[i]; | 891 | xfree (font_info->full_name); |
| 898 | int j; | 892 | xfree (font_info->name); |
| 899 | |||
| 900 | for (j = 0; j <= MAX_CHARSET; ++j) | ||
| 901 | { | ||
| 902 | int idx = info->font_indexes[j]; | ||
| 903 | if (idx >= 0) | ||
| 904 | used[idx] = 1; | ||
| 905 | } | ||
| 906 | } | ||
| 907 | } | ||
| 908 | 893 | ||
| 909 | /* Free those fonts that are not used by fontsets. */ | 894 | /* Free the font. */ |
| 910 | for (i = 0; i < dpyinfo->n_fonts; ++i) | 895 | BLOCK_INPUT; |
| 911 | if (used[i] == 0 && dpyinfo->font_table[i].name) | ||
| 912 | { | ||
| 913 | struct font_info *font_info = dpyinfo->font_table + i; | ||
| 914 | |||
| 915 | /* Free names. In xfns.c there is a comment that full_name | ||
| 916 | should never be freed because it is always shared with | ||
| 917 | something else. I don't think this is true anymore---see | ||
| 918 | x_load_font. It's either equal to font_info->name or | ||
| 919 | allocated via xmalloc, and there seems to be no place in | ||
| 920 | the source files where full_name is transferred to another | ||
| 921 | data structure. */ | ||
| 922 | if (font_info->full_name != font_info->name) | ||
| 923 | xfree (font_info->full_name); | ||
| 924 | xfree (font_info->name); | ||
| 925 | |||
| 926 | /* Free the font. */ | ||
| 927 | BLOCK_INPUT; | ||
| 928 | #ifdef HAVE_X_WINDOWS | 896 | #ifdef HAVE_X_WINDOWS |
| 929 | XFreeFont (dpyinfo->display, font_info->font); | 897 | XFreeFont (dpyinfo->display, font_info->font); |
| 930 | #endif | 898 | #endif |
| 931 | #ifdef WINDOWSNT | 899 | #ifdef WINDOWSNT |
| 932 | w32_unload_font (dpyinfo, font_info->font); | 900 | w32_unload_font (dpyinfo, font_info->font); |
| 933 | #endif | 901 | #endif |
| 934 | UNBLOCK_INPUT; | 902 | UNBLOCK_INPUT; |
| 935 | 903 | ||
| 936 | /* Mark font table slot free. */ | 904 | /* Mark font table slot free. */ |
| 937 | font_info->font = NULL; | 905 | font_info->font = NULL; |
| 938 | font_info->name = font_info->full_name = NULL; | 906 | font_info->name = font_info->full_name = NULL; |
| 939 | } | 907 | } |
| 940 | } | 908 | } |
| 941 | 909 | ||
| 942 | |||
| 943 | #endif /* HAVE_WINDOW_SYSTEM */ | 910 | #endif /* HAVE_WINDOW_SYSTEM */ |
| 944 | 911 | ||
| 945 | 912 | ||
| @@ -1087,14 +1054,9 @@ int | |||
| 1087 | frame_update_line_height (f) | 1054 | frame_update_line_height (f) |
| 1088 | struct frame *f; | 1055 | struct frame *f; |
| 1089 | { | 1056 | { |
| 1090 | int fontset, line_height, changed_p; | 1057 | int line_height, changed_p; |
| 1091 | |||
| 1092 | fontset = FRAME_FONTSET (f); | ||
| 1093 | if (fontset > 0) | ||
| 1094 | line_height = FRAME_FONTSET_DATA (f)->fontset_table[fontset]->height; | ||
| 1095 | else | ||
| 1096 | line_height = FONT_HEIGHT (FRAME_FONT (f)); | ||
| 1097 | 1058 | ||
| 1059 | line_height = FONT_HEIGHT (FRAME_FONT (f)); | ||
| 1098 | changed_p = line_height != FRAME_LINE_HEIGHT (f); | 1060 | changed_p = line_height != FRAME_LINE_HEIGHT (f); |
| 1099 | FRAME_LINE_HEIGHT (f) = line_height; | 1061 | FRAME_LINE_HEIGHT (f) = line_height; |
| 1100 | return changed_p; | 1062 | return changed_p; |
| @@ -1109,67 +1071,45 @@ frame_update_line_height (f) | |||
| 1109 | 1071 | ||
| 1110 | #ifdef HAVE_WINDOW_SYSTEM | 1072 | #ifdef HAVE_WINDOW_SYSTEM |
| 1111 | 1073 | ||
| 1112 | /* Load font or fontset of face FACE which is used on frame F. | 1074 | /* Load font of face FACE which is used on frame F to display |
| 1113 | FONTSET is the fontset FACE should use or -1, if FACE doesn't use a | 1075 | character C. The name of the font to load is determined by lface |
| 1114 | fontset. FONT_NAME is the name of the font to load, if no fontset | 1076 | and fontset of FACE. */ |
| 1115 | is used. It is null if no suitable font name could be determined | ||
| 1116 | for the face. */ | ||
| 1117 | 1077 | ||
| 1118 | static void | 1078 | static void |
| 1119 | load_face_font_or_fontset (f, face, font_name, fontset) | 1079 | load_face_font (f, face, c) |
| 1120 | struct frame *f; | 1080 | struct frame *f; |
| 1121 | struct face *face; | 1081 | struct face *face; |
| 1122 | char *font_name; | 1082 | int c; |
| 1123 | int fontset; | ||
| 1124 | { | 1083 | { |
| 1125 | struct font_info *font_info = NULL; | 1084 | struct font_info *font_info = NULL; |
| 1126 | 1085 | char *font_name; | |
| 1086 | |||
| 1127 | face->font_info_id = -1; | 1087 | face->font_info_id = -1; |
| 1128 | face->fontset = fontset; | ||
| 1129 | face->font = NULL; | 1088 | face->font = NULL; |
| 1130 | 1089 | ||
| 1090 | font_name = choose_face_font (f, face->lface, face->fontset, c); | ||
| 1091 | if (!font_name) | ||
| 1092 | return; | ||
| 1093 | |||
| 1131 | BLOCK_INPUT; | 1094 | BLOCK_INPUT; |
| 1132 | if (fontset >= 0) | 1095 | font_info = FS_LOAD_FACE_FONT (f, c, font_name, face); |
| 1133 | font_info = FS_LOAD_FONT (f, FRAME_X_FONT_TABLE (f), CHARSET_ASCII, | ||
| 1134 | NULL, fontset); | ||
| 1135 | else if (font_name) | ||
| 1136 | font_info = FS_LOAD_FONT (f, FRAME_X_FONT_TABLE (f), face->charset, | ||
| 1137 | font_name, -1); | ||
| 1138 | UNBLOCK_INPUT; | 1096 | UNBLOCK_INPUT; |
| 1139 | 1097 | ||
| 1140 | if (font_info) | 1098 | if (font_info) |
| 1141 | { | 1099 | { |
| 1142 | char *s; | 1100 | face->font_info_id = font_info->font_idx; |
| 1143 | int i; | ||
| 1144 | |||
| 1145 | face->font_info_id = FONT_INFO_ID (f, font_info); | ||
| 1146 | face->font = font_info->font; | 1101 | face->font = font_info->font; |
| 1147 | face->font_name = font_info->full_name; | 1102 | face->font_name = font_info->full_name; |
| 1148 | 1103 | if (face->gc) | |
| 1149 | /* Make the registry part of the font name readily accessible. | ||
| 1150 | The registry is used to find suitable faces for unibyte text. */ | ||
| 1151 | s = font_info->full_name + strlen (font_info->full_name); | ||
| 1152 | i = 0; | ||
| 1153 | while (i < 2 && --s >= font_info->full_name) | ||
| 1154 | if (*s == '-') | ||
| 1155 | ++i; | ||
| 1156 | |||
| 1157 | if (!STRINGP (face->registry) | ||
| 1158 | || xstricmp (XSTRING (face->registry)->data, s + 1) != 0) | ||
| 1159 | { | 1104 | { |
| 1160 | if (STRINGP (Vface_default_registry) | 1105 | x_free_gc (f, face->gc); |
| 1161 | && !xstricmp (XSTRING (Vface_default_registry)->data, s + 1)) | 1106 | face->gc = 0; |
| 1162 | face->registry = Vface_default_registry; | ||
| 1163 | else | ||
| 1164 | face->registry = build_string (s + 1); | ||
| 1165 | } | 1107 | } |
| 1166 | } | 1108 | } |
| 1167 | else if (fontset >= 0) | 1109 | else |
| 1168 | add_to_log ("Unable to load ASCII font of fontset %d", | ||
| 1169 | make_number (fontset), Qnil); | ||
| 1170 | else if (font_name) | ||
| 1171 | add_to_log ("Unable to load font %s", | 1110 | add_to_log ("Unable to load font %s", |
| 1172 | build_string (font_name), Qnil); | 1111 | build_string (font_name), Qnil); |
| 1112 | xfree (font_name); | ||
| 1173 | } | 1113 | } |
| 1174 | 1114 | ||
| 1175 | #endif /* HAVE_WINDOW_SYSTEM */ | 1115 | #endif /* HAVE_WINDOW_SYSTEM */ |
| @@ -2024,6 +1964,27 @@ xlfd_point_size (f, font) | |||
| 2024 | } | 1964 | } |
| 2025 | 1965 | ||
| 2026 | 1966 | ||
| 1967 | /* Return point size of PIXEL dots while considering Y-resultion (DPI) | ||
| 1968 | of frame F. This function is used to guess a point size of font | ||
| 1969 | when only the pixel height of the font is available. */ | ||
| 1970 | |||
| 1971 | static INLINE int | ||
| 1972 | pixel_point_size (f, pixel) | ||
| 1973 | struct frame *f; | ||
| 1974 | int pixel; | ||
| 1975 | { | ||
| 1976 | double resy = FRAME_X_DISPLAY_INFO (f)->resy; | ||
| 1977 | double real_pt; | ||
| 1978 | int int_pt; | ||
| 1979 | |||
| 1980 | /* As one inch is 72 points, 72/RESY gives the point size of one dot. */ | ||
| 1981 | real_pt = pixel * 72 / resy; | ||
| 1982 | int_pt = real_pt + 0.5; | ||
| 1983 | |||
| 1984 | return int_pt; | ||
| 1985 | } | ||
| 1986 | |||
| 1987 | |||
| 2027 | /* Split XLFD font name FONT->name destructively into NUL-terminated, | 1988 | /* Split XLFD font name FONT->name destructively into NUL-terminated, |
| 2028 | lower-case fields in FONT->fields. NUMERIC_P non-zero means | 1989 | lower-case fields in FONT->fields. NUMERIC_P non-zero means |
| 2029 | compute numeric values for fields XLFD_POINT_SIZE, XLFD_SWIDTH, | 1990 | compute numeric values for fields XLFD_POINT_SIZE, XLFD_SWIDTH, |
| @@ -2410,39 +2371,37 @@ cmp_font_names (a, b) | |||
| 2410 | 2371 | ||
| 2411 | 2372 | ||
| 2412 | /* Get a sorted list of fonts of family FAMILY on frame F. If PATTERN | 2373 | /* Get a sorted list of fonts of family FAMILY on frame F. If PATTERN |
| 2413 | is non-null list fonts matching that pattern. Otherwise, if | 2374 | is non-nil list fonts matching that pattern. Otherwise, if |
| 2414 | REGISTRY_AND_ENCODING is non-null return only fonts with that | 2375 | REGISTRY is non-nil return only fonts with that registry, otherwise |
| 2415 | registry and encoding, otherwise return fonts of any registry and | 2376 | return fonts of any registry. Set *FONTS to a vector of font_name |
| 2416 | encoding. Set *FONTS to a vector of font_name structures allocated | 2377 | structures allocated from the heap containing the fonts found. |
| 2417 | from the heap containing the fonts found. Value is the number of | 2378 | Value is the number of fonts found. */ |
| 2418 | fonts found. */ | ||
| 2419 | 2379 | ||
| 2420 | static int | 2380 | static int |
| 2421 | font_list (f, pattern, family, registry_and_encoding, fonts) | 2381 | font_list (f, pattern, family, registry, fonts) |
| 2422 | struct frame *f; | 2382 | struct frame *f; |
| 2423 | char *pattern; | 2383 | Lisp_Object pattern, family, registry; |
| 2424 | char *family; | ||
| 2425 | char *registry_and_encoding; | ||
| 2426 | struct font_name **fonts; | 2384 | struct font_name **fonts; |
| 2427 | { | 2385 | { |
| 2428 | if (pattern == NULL) | 2386 | char *pattern_str, *family_str, *registry_str; |
| 2387 | |||
| 2388 | if (NILP (pattern)) | ||
| 2429 | { | 2389 | { |
| 2430 | if (family == NULL) | 2390 | family_str = (NILP (family) ? "*" : (char *) XSTRING (family)->data); |
| 2431 | family = "*"; | 2391 | registry_str = (NILP (registry) ? "*" : (char *) XSTRING (registry)->data); |
| 2432 | |||
| 2433 | if (registry_and_encoding == NULL) | ||
| 2434 | registry_and_encoding = "*"; | ||
| 2435 | 2392 | ||
| 2436 | pattern = (char *) alloca (strlen (family) | 2393 | pattern_str = (char *) alloca (strlen (family_str) |
| 2437 | + strlen (registry_and_encoding) | 2394 | + strlen (registry_str) |
| 2438 | + 10); | 2395 | + 10); |
| 2439 | if (index (family, '-')) | 2396 | if (index (family_str, '-')) |
| 2440 | sprintf (pattern, "-%s-*-%s", family, registry_and_encoding); | 2397 | sprintf (pattern_str, "-%s-*-%s", family_str, registry_str); |
| 2441 | else | 2398 | else |
| 2442 | sprintf (pattern, "-*-%s-*-%s", family, registry_and_encoding); | 2399 | sprintf (pattern_str, "-*-%s-*-%s", family_str, registry_str); |
| 2443 | } | 2400 | } |
| 2401 | else | ||
| 2402 | pattern_str = (char *) XSTRING (pattern)->data; | ||
| 2444 | 2403 | ||
| 2445 | return sorted_font_list (f, pattern, cmp_font_names, fonts); | 2404 | return sorted_font_list (f, pattern_str, cmp_font_names, fonts); |
| 2446 | } | 2405 | } |
| 2447 | 2406 | ||
| 2448 | 2407 | ||
| @@ -2491,19 +2450,13 @@ the face font sort order.") | |||
| 2491 | int i, nfonts; | 2450 | int i, nfonts; |
| 2492 | Lisp_Object result; | 2451 | Lisp_Object result; |
| 2493 | struct gcpro gcpro1; | 2452 | struct gcpro gcpro1; |
| 2494 | char *family_pattern; | ||
| 2495 | 2453 | ||
| 2496 | if (NILP (family)) | 2454 | if (!NILP (family)) |
| 2497 | family_pattern = "*"; | 2455 | CHECK_STRING (family, 1); |
| 2498 | else | ||
| 2499 | { | ||
| 2500 | CHECK_STRING (family, 1); | ||
| 2501 | family_pattern = LSTRDUPA (family); | ||
| 2502 | } | ||
| 2503 | 2456 | ||
| 2504 | result = Qnil; | 2457 | result = Qnil; |
| 2505 | GCPRO1 (result); | 2458 | GCPRO1 (result); |
| 2506 | nfonts = font_list (f, NULL, family_pattern, NULL, &fonts); | 2459 | nfonts = font_list (f, Qnil, family, Qnil, &fonts); |
| 2507 | for (i = nfonts - 1; i >= 0; --i) | 2460 | for (i = nfonts - 1; i >= 0; --i) |
| 2508 | { | 2461 | { |
| 2509 | Lisp_Object v = Fmake_vector (make_number (8), Qnil); | 2462 | Lisp_Object v = Fmake_vector (make_number (8), Qnil); |
| @@ -2559,7 +2512,7 @@ are fixed-pitch.") | |||
| 2559 | for (limit = 500;;) | 2512 | for (limit = 500;;) |
| 2560 | { | 2513 | { |
| 2561 | specbind (intern ("font-list-limit"), make_number (limit)); | 2514 | specbind (intern ("font-list-limit"), make_number (limit)); |
| 2562 | nfonts = font_list (f, NULL, "*", NULL, &fonts); | 2515 | nfonts = font_list (f, Qnil, Qnil, Qnil, &fonts); |
| 2563 | 2516 | ||
| 2564 | if (nfonts == limit) | 2517 | if (nfonts == limit) |
| 2565 | { | 2518 | { |
| @@ -2643,7 +2596,7 @@ the WIDTH times as wide as FACE on FRAME.") | |||
| 2643 | { | 2596 | { |
| 2644 | /* This is of limited utility since it works with character | 2597 | /* This is of limited utility since it works with character |
| 2645 | widths. Keep it for compatibility. --gerd. */ | 2598 | widths. Keep it for compatibility. --gerd. */ |
| 2646 | int face_id = lookup_named_face (f, face, CHARSET_ASCII); | 2599 | int face_id = lookup_named_face (f, face, 0); |
| 2647 | struct face *face = FACE_FROM_ID (f, face_id); | 2600 | struct face *face = FACE_FROM_ID (f, face_id); |
| 2648 | 2601 | ||
| 2649 | if (face->font) | 2602 | if (face->font) |
| @@ -2703,6 +2656,8 @@ the WIDTH times as wide as FACE on FRAME.") | |||
| 2703 | XVECTOR (LFACE)->contents[LFACE_STRIKE_THROUGH_INDEX] | 2656 | XVECTOR (LFACE)->contents[LFACE_STRIKE_THROUGH_INDEX] |
| 2704 | #define LFACE_BOX(LFACE) \ | 2657 | #define LFACE_BOX(LFACE) \ |
| 2705 | XVECTOR (LFACE)->contents[LFACE_BOX_INDEX] | 2658 | XVECTOR (LFACE)->contents[LFACE_BOX_INDEX] |
| 2659 | #define LFACE_FONT(LFACE) \ | ||
| 2660 | XVECTOR (LFACE)->contents[LFACE_FONT_INDEX] | ||
| 2706 | 2661 | ||
| 2707 | /* Non-zero if LFACE is a Lisp face. A Lisp face is a vector of size | 2662 | /* Non-zero if LFACE is a Lisp face. A Lisp face is a vector of size |
| 2708 | LFACE_VECTOR_SIZE which has the symbol `face' in slot 0. */ | 2663 | LFACE_VECTOR_SIZE which has the symbol `face' in slot 0. */ |
| @@ -2755,6 +2710,9 @@ check_lface_attrs (attrs) | |||
| 2755 | xassert (UNSPECIFIEDP (attrs[LFACE_STIPPLE_INDEX]) | 2710 | xassert (UNSPECIFIEDP (attrs[LFACE_STIPPLE_INDEX]) |
| 2756 | || SYMBOLP (attrs[LFACE_STIPPLE_INDEX]) | 2711 | || SYMBOLP (attrs[LFACE_STIPPLE_INDEX]) |
| 2757 | || !NILP (Fbitmap_spec_p (attrs[LFACE_STIPPLE_INDEX]))); | 2712 | || !NILP (Fbitmap_spec_p (attrs[LFACE_STIPPLE_INDEX]))); |
| 2713 | xassert (UNSPECIFIEDP (attrs[LFACE_FONT_INDEX]) | ||
| 2714 | || NILP (attr[LFACE_FONT_INDEX])); | ||
| 2715 | || STRINGP (attr[LFACE_FONT_INDEX])); | ||
| 2758 | #endif | 2716 | #endif |
| 2759 | } | 2717 | } |
| 2760 | 2718 | ||
| @@ -2780,7 +2738,7 @@ check_lface (lface) | |||
| 2780 | #endif /* GLYPH_DEBUG == 0 */ | 2738 | #endif /* GLYPH_DEBUG == 0 */ |
| 2781 | 2739 | ||
| 2782 | 2740 | ||
| 2783 | /* Resolve face name FACE_NAME. If FACE_NAME Is a string, intern it | 2741 | /* Resolve face name FACE_NAME. If FACE_NAME is a string, intern it |
| 2784 | to make it a symvol. If FACE_NAME is an alias for another face, | 2742 | to make it a symvol. If FACE_NAME is an alias for another face, |
| 2785 | return that face's name. */ | 2743 | return that face's name. */ |
| 2786 | 2744 | ||
| @@ -2888,128 +2846,101 @@ lface_fully_specified_p (attrs) | |||
| 2888 | 2846 | ||
| 2889 | #ifdef HAVE_WINDOW_SYSTEM | 2847 | #ifdef HAVE_WINDOW_SYSTEM |
| 2890 | 2848 | ||
| 2891 | /* Set font-related attributes of Lisp face LFACE from XLFD font name | 2849 | /* Set font-related attributes of Lisp face LFACE from the fullname of |
| 2892 | FONT_NAME. If FORCE_P is zero, set only unspecified attributes of | 2850 | the font opened by FONTNAME. If FORCE_P is zero, set only |
| 2893 | LFACE. MAY_FAIL_P non-zero means return 0 if FONT_NAME isn't a | 2851 | unspecified attributes of LFACE. The exception is `font' |
| 2894 | valid font name; otherwise this function tries to use a reasonable | 2852 | attribute. It is set to FONTNAME as is regardless of FORCE_P. |
| 2895 | default font. | 2853 | |
| 2896 | 2854 | If FONTNAME is not available on frame F, | |
| 2897 | Ignore fields of FONT_NAME containing wildcards. Value is zero if | 2855 | return 0 if MAY_FAIL_P is non-zero, otherwise abort. |
| 2898 | not successful because FONT_NAME was not in a valid format and | 2856 | If the fullname is not in a valid XLFD format, |
| 2899 | MAY_FAIL_P was non-zero. A valid format is one that is suitable | 2857 | return 0 if MAY_FAIL_P is non-zero, otherwise set normal values |
| 2900 | for split_font_name, see the comment there. */ | 2858 | in LFACE and return 1. |
| 2859 | Otherwise, return 1. */ | ||
| 2901 | 2860 | ||
| 2902 | static int | 2861 | static int |
| 2903 | set_lface_from_font_name (f, lface, font_name, force_p, may_fail_p) | 2862 | set_lface_from_font_name (f, lface, fontname, force_p, may_fail_p) |
| 2904 | struct frame *f; | 2863 | struct frame *f; |
| 2905 | Lisp_Object lface; | 2864 | Lisp_Object lface; |
| 2906 | char *font_name; | 2865 | Lisp_Object fontname; |
| 2907 | int force_p, may_fail_p; | 2866 | int force_p, may_fail_p; |
| 2908 | { | 2867 | { |
| 2909 | struct font_name font; | 2868 | struct font_name font; |
| 2910 | char *buffer; | 2869 | char *buffer; |
| 2911 | int pt; | 2870 | int pt; |
| 2912 | int free_font_name_p = 0; | 2871 | int have_xlfd_p; |
| 2913 | int have_font_p = 0; | 2872 | int fontset; |
| 2873 | char *font_name = XSTRING (fontname)->data; | ||
| 2874 | struct font_info *font_info; | ||
| 2914 | 2875 | ||
| 2915 | /* If FONT_NAME contains wildcards, use the first matching font. */ | 2876 | /* If FONTNAME is actually a fontset name, get ASCII font name of it. */ |
| 2916 | if (index (font_name, '*') || index (font_name, '?')) | 2877 | fontset = fs_query_fontset (fontname, 0); |
| 2917 | { | 2878 | if (fontset >= 0) |
| 2918 | if (first_font_matching (f, font_name, &font)) | 2879 | font_name = XSTRING (fontset_ascii (fontset))->data; |
| 2919 | free_font_name_p = have_font_p = 1; | 2880 | |
| 2920 | } | 2881 | /* Check if FONT_NAME is surely available on the system. Usually |
| 2921 | else | 2882 | FONT_NAME is already cached for the frame F and FS_LOAD_FONT |
| 2922 | { | 2883 | returns quickly. But, even if FONT_NAME is not yet cached, |
| 2923 | font.name = STRDUPA (font_name); | 2884 | caching it now is not futail because we anyway load the font |
| 2924 | if (split_font_name (f, &font, 1)) | 2885 | later. */ |
| 2925 | have_font_p = 1; | 2886 | BLOCK_INPUT; |
| 2926 | else | 2887 | font_info = FS_LOAD_FONT (f, 0, font_name, -1); |
| 2927 | { | 2888 | UNBLOCK_INPUT; |
| 2928 | /* The font name may be something like `6x13'. Make | ||
| 2929 | sure we use the full name. */ | ||
| 2930 | struct font_info *font_info; | ||
| 2931 | |||
| 2932 | BLOCK_INPUT; | ||
| 2933 | font_info = fs_load_font (f, FRAME_X_FONT_TABLE (f), | ||
| 2934 | CHARSET_ASCII, font_name, -1); | ||
| 2935 | if (font_info) | ||
| 2936 | { | ||
| 2937 | font.name = STRDUPA (font_info->full_name); | ||
| 2938 | split_font_name (f, &font, 1); | ||
| 2939 | have_font_p = 1; | ||
| 2940 | } | ||
| 2941 | UNBLOCK_INPUT; | ||
| 2942 | } | ||
| 2943 | } | ||
| 2944 | 2889 | ||
| 2945 | /* If FONT_NAME is completely bogus try to use something reasonable | 2890 | if (!font_info) |
| 2946 | if this function must succeed. Otherwise, give up. */ | ||
| 2947 | if (!have_font_p) | ||
| 2948 | { | 2891 | { |
| 2949 | if (may_fail_p) | 2892 | if (may_fail_p) |
| 2950 | return 0; | 2893 | return 0; |
| 2951 | #ifdef HAVE_X_WINDOWS | 2894 | abort (); |
| 2952 | else if (first_font_matching (f, "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1", | ||
| 2953 | &font) | ||
| 2954 | || first_font_matching (f, "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1", | ||
| 2955 | &font) | ||
| 2956 | || first_font_matching (f, "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1", | ||
| 2957 | &font) | ||
| 2958 | || first_font_matching (f, "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1", | ||
| 2959 | &font) | ||
| 2960 | || first_font_matching (f, "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1", | ||
| 2961 | &font) | ||
| 2962 | || first_font_matching (f, "fixed", &font)) | ||
| 2963 | #endif | ||
| 2964 | #ifdef WINDOWSNT | ||
| 2965 | else if (first_font_matching (f, "-*-Courier New-normal-r-*-*-13-*-*-*-c-*-iso8859-1", | ||
| 2966 | &font) | ||
| 2967 | || first_font_matching (f, "-*-Courier-normal-r-*-*-13-*-*-*-c-*-iso8859-1", | ||
| 2968 | &font) | ||
| 2969 | || first_font_matching (f, "-*-FixedSys-normal-r-*-*-12-*-*-*-c-*-iso8859-1", | ||
| 2970 | &font) | ||
| 2971 | || first_font_matching (f, "-*-*-normal-r-*-*-*-*-*-*-c-*-iso8859-1", | ||
| 2972 | &font) | ||
| 2973 | || first_font_matching (f, "FixedSys", | ||
| 2974 | &font)) | ||
| 2975 | #endif | ||
| 2976 | free_font_name_p = 1; | ||
| 2977 | else | ||
| 2978 | abort (); | ||
| 2979 | } | 2895 | } |
| 2980 | 2896 | ||
| 2897 | font.name = STRDUPA (font_info->full_name); | ||
| 2898 | have_xlfd_p = split_font_name (f, &font, 1); | ||
| 2981 | 2899 | ||
| 2982 | /* Set attributes only if unspecified, otherwise face defaults for | 2900 | /* Set attributes only if unspecified, otherwise face defaults for |
| 2983 | new frames would never take effect. */ | 2901 | new frames would never take effect. If we couldn't get a font |
| 2902 | name conforming to XLFD, set normal values. */ | ||
| 2984 | 2903 | ||
| 2985 | if (force_p || UNSPECIFIEDP (LFACE_FAMILY (lface))) | 2904 | if (force_p || UNSPECIFIEDP (LFACE_FAMILY (lface))) |
| 2986 | { | 2905 | { |
| 2987 | buffer = (char *) alloca (strlen (font.fields[XLFD_FAMILY]) | 2906 | Lisp_Object val; |
| 2988 | + strlen (font.fields[XLFD_FOUNDRY]) | 2907 | if (have_xlfd_p) |
| 2989 | + 2); | 2908 | { |
| 2990 | sprintf (buffer, "%s-%s", font.fields[XLFD_FOUNDRY], | 2909 | buffer = (char *) alloca (strlen (font.fields[XLFD_FAMILY]) |
| 2991 | font.fields[XLFD_FAMILY]); | 2910 | + strlen (font.fields[XLFD_FOUNDRY]) |
| 2992 | LFACE_FAMILY (lface) = build_string (buffer); | 2911 | + 2); |
| 2912 | sprintf (buffer, "%s-%s", font.fields[XLFD_FOUNDRY], | ||
| 2913 | font.fields[XLFD_FAMILY]); | ||
| 2914 | val = build_string (buffer); | ||
| 2915 | } | ||
| 2916 | else | ||
| 2917 | val = build_string ("*"); | ||
| 2918 | LFACE_FAMILY (lface) = val; | ||
| 2993 | } | 2919 | } |
| 2994 | 2920 | ||
| 2995 | if (force_p || UNSPECIFIEDP (LFACE_HEIGHT (lface))) | 2921 | if (force_p || UNSPECIFIEDP (LFACE_HEIGHT (lface))) |
| 2996 | { | 2922 | { |
| 2997 | pt = xlfd_point_size (f, &font); | 2923 | if (have_xlfd_p) |
| 2924 | pt = xlfd_point_size (f, &font); | ||
| 2925 | else | ||
| 2926 | pt = pixel_point_size (f, font_info->height * 10); | ||
| 2998 | xassert (pt > 0); | 2927 | xassert (pt > 0); |
| 2999 | LFACE_HEIGHT (lface) = make_number (pt); | 2928 | LFACE_HEIGHT (lface) = make_number (pt); |
| 3000 | } | 2929 | } |
| 3001 | 2930 | ||
| 3002 | if (force_p || UNSPECIFIEDP (LFACE_SWIDTH (lface))) | 2931 | if (force_p || UNSPECIFIEDP (LFACE_SWIDTH (lface))) |
| 3003 | LFACE_SWIDTH (lface) = xlfd_symbolic_swidth (&font); | 2932 | LFACE_SWIDTH (lface) |
| 2933 | = have_xlfd_p ? xlfd_symbolic_swidth (&font) : Qnormal; | ||
| 3004 | 2934 | ||
| 3005 | if (force_p || UNSPECIFIEDP (LFACE_WEIGHT (lface))) | 2935 | if (force_p || UNSPECIFIEDP (LFACE_WEIGHT (lface))) |
| 3006 | LFACE_WEIGHT (lface) = xlfd_symbolic_weight (&font); | 2936 | LFACE_WEIGHT (lface) |
| 2937 | = have_xlfd_p ? xlfd_symbolic_weight (&font) : Qnormal; | ||
| 3007 | 2938 | ||
| 3008 | if (force_p || UNSPECIFIEDP (LFACE_SLANT (lface))) | 2939 | if (force_p || UNSPECIFIEDP (LFACE_SLANT (lface))) |
| 3009 | LFACE_SLANT (lface) = xlfd_symbolic_slant (&font); | 2940 | LFACE_SLANT (lface) |
| 2941 | = have_xlfd_p ? xlfd_symbolic_slant (&font) : Qnormal; | ||
| 3010 | 2942 | ||
| 3011 | if (free_font_name_p) | 2943 | LFACE_FONT (lface) = fontname; |
| 3012 | xfree (font.name); | ||
| 3013 | 2944 | ||
| 3014 | return 1; | 2945 | return 1; |
| 3015 | } | 2946 | } |
| @@ -3382,6 +3313,9 @@ frame.") | |||
| 3382 | { | 3313 | { |
| 3383 | Lisp_Object lface; | 3314 | Lisp_Object lface; |
| 3384 | Lisp_Object old_value = Qnil; | 3315 | Lisp_Object old_value = Qnil; |
| 3316 | /* Set 1 if ATTR is QCfont. */ | ||
| 3317 | int font_attr_p = 0; | ||
| 3318 | /* Set 1 if ATTR is one of font-related attributes other than QCfont. */ | ||
| 3385 | int font_related_attr_p = 0; | 3319 | int font_related_attr_p = 0; |
| 3386 | 3320 | ||
| 3387 | CHECK_SYMBOL (face, 0); | 3321 | CHECK_SYMBOL (face, 0); |
| @@ -3627,6 +3561,7 @@ frame.") | |||
| 3627 | /* Set font-related attributes of the Lisp face from an | 3561 | /* Set font-related attributes of the Lisp face from an |
| 3628 | XLFD font name. */ | 3562 | XLFD font name. */ |
| 3629 | struct frame *f; | 3563 | struct frame *f; |
| 3564 | Lisp_Object tmp; | ||
| 3630 | 3565 | ||
| 3631 | CHECK_STRING (value, 3); | 3566 | CHECK_STRING (value, 3); |
| 3632 | if (EQ (frame, Qt)) | 3567 | if (EQ (frame, Qt)) |
| @@ -3634,10 +3569,16 @@ frame.") | |||
| 3634 | else | 3569 | else |
| 3635 | f = check_x_frame (frame); | 3570 | f = check_x_frame (frame); |
| 3636 | 3571 | ||
| 3637 | if (!set_lface_from_font_name (f, lface, XSTRING (value)->data, 1, 1)) | 3572 | /* VALUE may be a fontset name or an alias of fontset. In such |
| 3638 | signal_error ("Invalid font name", value); | 3573 | a case, use the base fontset name. */ |
| 3639 | 3574 | tmp = Fquery_fontset (value, Qnil); | |
| 3640 | font_related_attr_p = 1; | 3575 | if (!NILP (tmp)) |
| 3576 | value = tmp; | ||
| 3577 | |||
| 3578 | if (!set_lface_from_font_name (f, lface, value, 1, 1)) | ||
| 3579 | signal_error ("Invalid font or fontset name", value); | ||
| 3580 | |||
| 3581 | font_attr_p = 1; | ||
| 3641 | #endif /* HAVE_WINDOW_SYSTEM */ | 3582 | #endif /* HAVE_WINDOW_SYSTEM */ |
| 3642 | } | 3583 | } |
| 3643 | else if (EQ (attr, QCbold)) | 3584 | else if (EQ (attr, QCbold)) |
| @@ -3655,6 +3596,14 @@ frame.") | |||
| 3655 | else | 3596 | else |
| 3656 | signal_error ("Invalid face attribute name", attr); | 3597 | signal_error ("Invalid face attribute name", attr); |
| 3657 | 3598 | ||
| 3599 | if (font_related_attr_p | ||
| 3600 | && !UNSPECIFIEDP (value)) | ||
| 3601 | /* If a font-related attribute other than QCfont is specified, the | ||
| 3602 | original `font' attribute nor that of default face is useless | ||
| 3603 | to determine a new font. Thus, we set it to nil so that font | ||
| 3604 | selection mechanism doesn't use it. */ | ||
| 3605 | LFACE_FONT (lface) = Qnil; | ||
| 3606 | |||
| 3658 | /* Changing a named face means that all realized faces depending on | 3607 | /* Changing a named face means that all realized faces depending on |
| 3659 | that face are invalid. Since we cannot tell which realized faces | 3608 | that face are invalid. Since we cannot tell which realized faces |
| 3660 | depend on the face, make sure they are all removed. This is done | 3609 | depend on the face, make sure they are all removed. This is done |
| @@ -3682,7 +3631,7 @@ frame.") | |||
| 3682 | { | 3631 | { |
| 3683 | /* Changed font-related attributes of the `default' face are | 3632 | /* Changed font-related attributes of the `default' face are |
| 3684 | reflected in changed `font' frame parameters. */ | 3633 | reflected in changed `font' frame parameters. */ |
| 3685 | if (font_related_attr_p | 3634 | if ((font_related_attr_p || font_attr_p) |
| 3686 | && lface_fully_specified_p (XVECTOR (lface)->contents)) | 3635 | && lface_fully_specified_p (XVECTOR (lface)->contents)) |
| 3687 | set_font_frame_param (frame, lface); | 3636 | set_font_frame_param (frame, lface); |
| 3688 | else if (EQ (attr, QCforeground)) | 3637 | else if (EQ (attr, QCforeground)) |
| @@ -3723,7 +3672,7 @@ frame.") | |||
| 3723 | param = Qmouse_color; | 3672 | param = Qmouse_color; |
| 3724 | } | 3673 | } |
| 3725 | 3674 | ||
| 3726 | if (SYMBOLP (param)) | 3675 | if (!NILP (param)) |
| 3727 | Fmodify_frame_parameters (frame, Fcons (Fcons (param, value), Qnil)); | 3676 | Fmodify_frame_parameters (frame, Fcons (Fcons (param, value), Qnil)); |
| 3728 | } | 3677 | } |
| 3729 | 3678 | ||
| @@ -3735,55 +3684,34 @@ frame.") | |||
| 3735 | 3684 | ||
| 3736 | #ifdef HAVE_WINDOW_SYSTEM | 3685 | #ifdef HAVE_WINDOW_SYSTEM |
| 3737 | 3686 | ||
| 3738 | /* Set the `font' frame parameter of FRAME according to `default' face | 3687 | /* Set the `font' frame parameter of FRAME determined from `default' |
| 3739 | attributes LFACE. */ | 3688 | face attributes LFACE. If a face or fontset name is explicitely |
| 3689 | specfied in LFACE, use it as is. Otherwise, determine a font name | ||
| 3690 | from the other font-related atrributes of LFACE. In that case, if | ||
| 3691 | there's no matching font, signals an error. */ | ||
| 3740 | 3692 | ||
| 3741 | static void | 3693 | static void |
| 3742 | set_font_frame_param (frame, lface) | 3694 | set_font_frame_param (frame, lface) |
| 3743 | Lisp_Object frame, lface; | 3695 | Lisp_Object frame, lface; |
| 3744 | { | 3696 | { |
| 3745 | struct frame *f = XFRAME (frame); | 3697 | struct frame *f = XFRAME (frame); |
| 3746 | Lisp_Object frame_font; | 3698 | Lisp_Object font_name; |
| 3747 | int fontset; | ||
| 3748 | char *font; | 3699 | char *font; |
| 3749 | 3700 | ||
| 3750 | /* Get FRAME's font parameter. */ | 3701 | if (STRINGP (LFACE_FONT (lface))) |
| 3751 | frame_font = Fassq (Qfont, f->param_alist); | 3702 | font_name = LFACE_FONT (lface); |
| 3752 | xassert (CONSP (frame_font) && STRINGP (XCDR (frame_font))); | ||
| 3753 | frame_font = XCDR (frame_font); | ||
| 3754 | |||
| 3755 | fontset = fs_query_fontset (f, XSTRING (frame_font)->data); | ||
| 3756 | if (fontset >= 0) | ||
| 3757 | { | ||
| 3758 | /* Frame parameter is a fontset name. Modify the fontset so | ||
| 3759 | that all its fonts reflect face attributes LFACE. */ | ||
| 3760 | int charset; | ||
| 3761 | struct fontset_info *fontset_info; | ||
| 3762 | |||
| 3763 | fontset_info = FRAME_FONTSET_DATA (f)->fontset_table[fontset]; | ||
| 3764 | |||
| 3765 | for (charset = 0; charset < MAX_CHARSET; ++charset) | ||
| 3766 | if (fontset_info->fontname[charset]) | ||
| 3767 | { | ||
| 3768 | font = choose_face_fontset_font (f, XVECTOR (lface)->contents, | ||
| 3769 | fontset, charset); | ||
| 3770 | Fset_fontset_font (frame_font, CHARSET_SYMBOL (charset), | ||
| 3771 | build_string (font), frame); | ||
| 3772 | xfree (font); | ||
| 3773 | } | ||
| 3774 | } | ||
| 3775 | else | 3703 | else |
| 3776 | { | 3704 | { |
| 3777 | /* Frame parameter is an X font name. I believe this can | 3705 | /* Choose a font name that reflects LFACE's attributes and has |
| 3778 | only happen in unibyte mode. */ | 3706 | the registry and encoding pattern specified in the default |
| 3779 | font = choose_face_font (f, XVECTOR (lface)->contents, | 3707 | fontset (3rd arg: -1) for ASCII characters (4th arg: 0). */ |
| 3780 | -1, Vface_default_registry); | 3708 | font = choose_face_font (f, XVECTOR (lface)->contents, -1, 0); |
| 3781 | if (font) | 3709 | if (!font) |
| 3782 | { | 3710 | error ("No font matches the specified attribute"); |
| 3783 | store_frame_param (f, Qfont, build_string (font)); | 3711 | font_name = build_string (font); |
| 3784 | xfree (font); | 3712 | xfree (font); |
| 3785 | } | ||
| 3786 | } | 3713 | } |
| 3714 | store_frame_param (f, Qfont, font_name); | ||
| 3787 | } | 3715 | } |
| 3788 | 3716 | ||
| 3789 | 3717 | ||
| @@ -4212,6 +4140,8 @@ frames). If FRAME is omitted or nil, use the selected frame.") | |||
| 4212 | value = LFACE_STIPPLE (lface); | 4140 | value = LFACE_STIPPLE (lface); |
| 4213 | else if (EQ (keyword, QCwidth)) | 4141 | else if (EQ (keyword, QCwidth)) |
| 4214 | value = LFACE_SWIDTH (lface); | 4142 | value = LFACE_SWIDTH (lface); |
| 4143 | else if (EQ (keyword, QCfont)) | ||
| 4144 | value = LFACE_FONT (lface); | ||
| 4215 | else | 4145 | else |
| 4216 | signal_error ("Invalid face attribute name", keyword); | 4146 | signal_error ("Invalid face attribute name", keyword); |
| 4217 | 4147 | ||
| @@ -4323,7 +4253,7 @@ If FRAME is omitted or nil, use the selected frame.") | |||
| 4323 | else | 4253 | else |
| 4324 | { | 4254 | { |
| 4325 | struct frame *f = frame_or_selected_frame (frame, 1); | 4255 | struct frame *f = frame_or_selected_frame (frame, 1); |
| 4326 | int face_id = lookup_named_face (f, face, CHARSET_ASCII); | 4256 | int face_id = lookup_named_face (f, face, 0); |
| 4327 | struct face *face = FACE_FROM_ID (f, face_id); | 4257 | struct face *face = FACE_FROM_ID (f, face_id); |
| 4328 | return build_string (face->font_name); | 4258 | return build_string (face->font_name); |
| 4329 | } | 4259 | } |
| @@ -4484,8 +4414,8 @@ lface_hash (v) | |||
| 4484 | 4414 | ||
| 4485 | /* Return non-zero if LFACE1 and LFACE2 specify the same font (without | 4415 | /* Return non-zero if LFACE1 and LFACE2 specify the same font (without |
| 4486 | considering charsets/registries). They do if they specify the same | 4416 | considering charsets/registries). They do if they specify the same |
| 4487 | family, point size, weight, width and slant. Both LFACE1 and | 4417 | family, point size, weight, width, slant, and fontset. Both LFACE1 |
| 4488 | LFACE2 must be fully-specified. */ | 4418 | and LFACE2 must be fully-specified. */ |
| 4489 | 4419 | ||
| 4490 | static INLINE int | 4420 | static INLINE int |
| 4491 | lface_same_font_attributes_p (lface1, lface2) | 4421 | lface_same_font_attributes_p (lface1, lface2) |
| @@ -4499,7 +4429,11 @@ lface_same_font_attributes_p (lface1, lface2) | |||
| 4499 | == XFASTINT (lface2[LFACE_HEIGHT_INDEX])) | 4429 | == XFASTINT (lface2[LFACE_HEIGHT_INDEX])) |
| 4500 | && EQ (lface1[LFACE_SWIDTH_INDEX], lface2[LFACE_SWIDTH_INDEX]) | 4430 | && EQ (lface1[LFACE_SWIDTH_INDEX], lface2[LFACE_SWIDTH_INDEX]) |
| 4501 | && EQ (lface1[LFACE_WEIGHT_INDEX], lface2[LFACE_WEIGHT_INDEX]) | 4431 | && EQ (lface1[LFACE_WEIGHT_INDEX], lface2[LFACE_WEIGHT_INDEX]) |
| 4502 | && EQ (lface1[LFACE_SLANT_INDEX], lface2[LFACE_SLANT_INDEX])); | 4432 | && EQ (lface1[LFACE_SLANT_INDEX], lface2[LFACE_SLANT_INDEX]) |
| 4433 | && (EQ (lface1[LFACE_FONT_INDEX], lface2[LFACE_FONT_INDEX]) | ||
| 4434 | || (STRINGP (lface1[LFACE_FONT_INDEX]) | ||
| 4435 | && xstricmp (XSTRING (lface1[LFACE_FONT_INDEX])->data, | ||
| 4436 | XSTRING (lface2[LFACE_FONT_INDEX])->data)))); | ||
| 4503 | } | 4437 | } |
| 4504 | 4438 | ||
| 4505 | 4439 | ||
| @@ -4509,18 +4443,15 @@ lface_same_font_attributes_p (lface1, lface2) | |||
| 4509 | ***********************************************************************/ | 4443 | ***********************************************************************/ |
| 4510 | 4444 | ||
| 4511 | /* Allocate and return a new realized face for Lisp face attribute | 4445 | /* Allocate and return a new realized face for Lisp face attribute |
| 4512 | vector ATTR, charset CHARSET, and registry REGISTRY. */ | 4446 | vector ATTR. */ |
| 4513 | 4447 | ||
| 4514 | static struct face * | 4448 | static struct face * |
| 4515 | make_realized_face (attr, charset, registry) | 4449 | make_realized_face (attr) |
| 4516 | Lisp_Object *attr; | 4450 | Lisp_Object *attr; |
| 4517 | int charset; | ||
| 4518 | Lisp_Object registry; | ||
| 4519 | { | 4451 | { |
| 4520 | struct face *face = (struct face *) xmalloc (sizeof *face); | 4452 | struct face *face = (struct face *) xmalloc (sizeof *face); |
| 4521 | bzero (face, sizeof *face); | 4453 | bzero (face, sizeof *face); |
| 4522 | face->charset = charset; | 4454 | face->ascii_face = face; |
| 4523 | face->registry = registry; | ||
| 4524 | bcopy (attr, face->lface, sizeof face->lface); | 4455 | bcopy (attr, face->lface, sizeof face->lface); |
| 4525 | return face; | 4456 | return face; |
| 4526 | } | 4457 | } |
| @@ -4539,6 +4470,9 @@ free_realized_face (f, face) | |||
| 4539 | #ifdef HAVE_WINDOW_SYSTEM | 4470 | #ifdef HAVE_WINDOW_SYSTEM |
| 4540 | if (FRAME_WINDOW_P (f)) | 4471 | if (FRAME_WINDOW_P (f)) |
| 4541 | { | 4472 | { |
| 4473 | /* Free fontset of FACE if it is ASCII face. */ | ||
| 4474 | if (face->fontset >= 0 && face == face->ascii_face) | ||
| 4475 | free_face_fontset (f, face); | ||
| 4542 | if (face->gc) | 4476 | if (face->gc) |
| 4543 | { | 4477 | { |
| 4544 | x_free_gc (f, face->gc); | 4478 | x_free_gc (f, face->gc); |
| @@ -4604,49 +4538,6 @@ prepare_face_for_display (f, face) | |||
| 4604 | #endif /* HAVE_WINDOW_SYSTEM */ | 4538 | #endif /* HAVE_WINDOW_SYSTEM */ |
| 4605 | } | 4539 | } |
| 4606 | 4540 | ||
| 4607 | |||
| 4608 | /* Non-zero if FACE is suitable for displaying ISO8859-1. Used in | ||
| 4609 | macro FACE_SUITABLE_FOR_CHARSET_P to avoid realizing a new face for | ||
| 4610 | ISO8859-1 if the ASCII face suffices. */ | ||
| 4611 | |||
| 4612 | int | ||
| 4613 | face_suitable_for_iso8859_1_p (face) | ||
| 4614 | struct face *face; | ||
| 4615 | { | ||
| 4616 | int len = strlen (face->font_name); | ||
| 4617 | return len >= 9 && xstricmp (face->font_name + len - 9, "iso8859-1") == 0; | ||
| 4618 | } | ||
| 4619 | |||
| 4620 | |||
| 4621 | /* Value is non-zero if FACE is suitable for displaying characters | ||
| 4622 | of CHARSET. CHARSET < 0 means unibyte text. */ | ||
| 4623 | |||
| 4624 | INLINE int | ||
| 4625 | face_suitable_for_charset_p (face, charset) | ||
| 4626 | struct face *face; | ||
| 4627 | int charset; | ||
| 4628 | { | ||
| 4629 | int suitable_p = 0; | ||
| 4630 | |||
| 4631 | if (charset < 0) | ||
| 4632 | { | ||
| 4633 | if (EQ (face->registry, Vface_default_registry) | ||
| 4634 | || !NILP (Fequal (face->registry, Vface_default_registry))) | ||
| 4635 | suitable_p = 1; | ||
| 4636 | } | ||
| 4637 | else if (face->charset == charset) | ||
| 4638 | suitable_p = 1; | ||
| 4639 | else if (face->charset == CHARSET_ASCII | ||
| 4640 | && charset == charset_latin_iso8859_1) | ||
| 4641 | suitable_p = face_suitable_for_iso8859_1_p (face); | ||
| 4642 | else if (face->charset == charset_latin_iso8859_1 | ||
| 4643 | && charset == CHARSET_ASCII) | ||
| 4644 | suitable_p = 1; | ||
| 4645 | |||
| 4646 | return suitable_p; | ||
| 4647 | } | ||
| 4648 | |||
| 4649 | |||
| 4650 | 4541 | ||
| 4651 | /*********************************************************************** | 4542 | /*********************************************************************** |
| 4652 | Face Cache | 4543 | Face Cache |
| @@ -4736,6 +4627,37 @@ free_realized_faces (c) | |||
| 4736 | } | 4627 | } |
| 4737 | 4628 | ||
| 4738 | 4629 | ||
| 4630 | /* Free all faces realized for multibyte characters on frame F that | ||
| 4631 | has FONTSET. */ | ||
| 4632 | |||
| 4633 | void | ||
| 4634 | free_realized_multibyte_face (f, fontset) | ||
| 4635 | struct frame *f; | ||
| 4636 | int fontset; | ||
| 4637 | { | ||
| 4638 | struct face_cache *cache = FRAME_FACE_CACHE (f); | ||
| 4639 | struct face *face; | ||
| 4640 | int i; | ||
| 4641 | |||
| 4642 | for (i = 0; i < cache->used; i++) | ||
| 4643 | { | ||
| 4644 | face = cache->faces_by_id[i]; | ||
| 4645 | if (face | ||
| 4646 | && face != face->ascii_face | ||
| 4647 | && face->fontset == fontset) | ||
| 4648 | { | ||
| 4649 | uncache_face (cache, face); | ||
| 4650 | free_realized_face (f, face); | ||
| 4651 | } | ||
| 4652 | } | ||
| 4653 | if (WINDOWP (f->root_window)) | ||
| 4654 | { | ||
| 4655 | clear_current_matrices (f); | ||
| 4656 | ++windows_or_buffers_changed; | ||
| 4657 | } | ||
| 4658 | } | ||
| 4659 | |||
| 4660 | |||
| 4739 | /* Free all realized faces on FRAME or on all frames if FRAME is nil. | 4661 | /* Free all realized faces on FRAME or on all frames if FRAME is nil. |
| 4740 | This is done after attributes of a named face have been changed, | 4662 | This is done after attributes of a named face have been changed, |
| 4741 | because we can't tell which realized faces depend on that face. */ | 4663 | because we can't tell which realized faces depend on that face. */ |
| @@ -4774,8 +4696,8 @@ free_face_cache (c) | |||
| 4774 | /* Cache realized face FACE in face cache C. HASH is the hash value | 4696 | /* Cache realized face FACE in face cache C. HASH is the hash value |
| 4775 | of FACE. If FACE->fontset >= 0, add the new face to the end of the | 4697 | of FACE. If FACE->fontset >= 0, add the new face to the end of the |
| 4776 | collision list of the face hash table of C. This is done because | 4698 | collision list of the face hash table of C. This is done because |
| 4777 | otherwise lookup_face would find FACE for every charset, even if | 4699 | otherwise lookup_face would find FACE for every character, even if |
| 4778 | faces with the same attributes but for specific charsets exist. */ | 4700 | faces with the same attributes but for specific characters exist. */ |
| 4779 | 4701 | ||
| 4780 | static void | 4702 | static void |
| 4781 | cache_face (c, face, hash) | 4703 | cache_face (c, face, hash) |
| @@ -4874,48 +4796,45 @@ uncache_face (c, face) | |||
| 4874 | 4796 | ||
| 4875 | 4797 | ||
| 4876 | /* Look up a realized face with face attributes ATTR in the face cache | 4798 | /* Look up a realized face with face attributes ATTR in the face cache |
| 4877 | of frame F. The face will be used to display characters of | 4799 | of frame F. The face will be used to display character C. Value |
| 4878 | CHARSET. CHARSET < 0 means the face will be used to display | 4800 | is the ID of the face found. If no suitable face is found, realize |
| 4879 | unibyte text. The value of face-default-registry is used to choose | 4801 | a new one. In that case, if C is a multibyte character, BASE_FACE |
| 4880 | a font for the face in that case. Value is the ID of the face | 4802 | is a face for ASCII characters that has the same attributes. */ |
| 4881 | found. If no suitable face is found, realize a new one. */ | ||
| 4882 | 4803 | ||
| 4883 | INLINE int | 4804 | INLINE int |
| 4884 | lookup_face (f, attr, charset) | 4805 | lookup_face (f, attr, c, base_face) |
| 4885 | struct frame *f; | 4806 | struct frame *f; |
| 4886 | Lisp_Object *attr; | 4807 | Lisp_Object *attr; |
| 4887 | int charset; | 4808 | int c; |
| 4809 | struct face *base_face; | ||
| 4888 | { | 4810 | { |
| 4889 | struct face_cache *c = FRAME_FACE_CACHE (f); | 4811 | struct face_cache *cache = FRAME_FACE_CACHE (f); |
| 4890 | unsigned hash; | 4812 | unsigned hash; |
| 4891 | int i; | 4813 | int i; |
| 4892 | struct face *face; | 4814 | struct face *face; |
| 4893 | 4815 | ||
| 4894 | xassert (c != NULL); | 4816 | xassert (cache != NULL); |
| 4895 | check_lface_attrs (attr); | 4817 | check_lface_attrs (attr); |
| 4896 | 4818 | ||
| 4897 | /* Look up ATTR in the face cache. */ | 4819 | /* Look up ATTR in the face cache. */ |
| 4898 | hash = lface_hash (attr); | 4820 | hash = lface_hash (attr); |
| 4899 | i = hash % FACE_CACHE_BUCKETS_SIZE; | 4821 | i = hash % FACE_CACHE_BUCKETS_SIZE; |
| 4900 | 4822 | ||
| 4901 | for (face = c->buckets[i]; face; face = face->next) | 4823 | for (face = cache->buckets[i]; face; face = face->next) |
| 4902 | if (face->hash == hash | 4824 | if (face->hash == hash |
| 4903 | && (!FRAME_WINDOW_P (f) | 4825 | && (!FRAME_WINDOW_P (f) |
| 4904 | || FACE_SUITABLE_FOR_CHARSET_P (face, charset)) | 4826 | || FACE_SUITABLE_FOR_CHAR_P (face, c)) |
| 4905 | && lface_equal_p (face->lface, attr)) | 4827 | && lface_equal_p (face->lface, attr)) |
| 4906 | break; | 4828 | break; |
| 4907 | 4829 | ||
| 4908 | /* If not found, realize a new face. */ | 4830 | /* If not found, realize a new face. */ |
| 4909 | if (face == NULL) | 4831 | if (face == NULL) |
| 4910 | { | 4832 | face = realize_face (cache, attr, c, base_face, -1); |
| 4911 | face = realize_face (c, attr, charset); | ||
| 4912 | cache_face (c, face, hash); | ||
| 4913 | } | ||
| 4914 | 4833 | ||
| 4915 | #if GLYPH_DEBUG | 4834 | #if GLYPH_DEBUG |
| 4916 | xassert (face == FACE_FROM_ID (f, face->id)); | 4835 | xassert (face == FACE_FROM_ID (f, face->id)); |
| 4917 | if (FRAME_WINDOW_P (f)) | 4836 | if (FRAME_WINDOW_P (f)) |
| 4918 | xassert (charset < 0 || FACE_SUITABLE_FOR_CHARSET_P (face, charset)); | 4837 | xassert (FACE_SUITABLE_FOR_CHAR_P (face, c)); |
| 4919 | #endif /* GLYPH_DEBUG */ | 4838 | #endif /* GLYPH_DEBUG */ |
| 4920 | 4839 | ||
| 4921 | return face->id; | 4840 | return face->id; |
| @@ -4923,14 +4842,13 @@ lookup_face (f, attr, charset) | |||
| 4923 | 4842 | ||
| 4924 | 4843 | ||
| 4925 | /* Return the face id of the realized face for named face SYMBOL on | 4844 | /* Return the face id of the realized face for named face SYMBOL on |
| 4926 | frame F suitable for displaying characters from CHARSET. CHARSET < | 4845 | frame F suitable for displaying character C. */ |
| 4927 | 0 means unibyte text. */ | ||
| 4928 | 4846 | ||
| 4929 | int | 4847 | int |
| 4930 | lookup_named_face (f, symbol, charset) | 4848 | lookup_named_face (f, symbol, c) |
| 4931 | struct frame *f; | 4849 | struct frame *f; |
| 4932 | Lisp_Object symbol; | 4850 | Lisp_Object symbol; |
| 4933 | int charset; | 4851 | int c; |
| 4934 | { | 4852 | { |
| 4935 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; | 4853 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; |
| 4936 | Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE]; | 4854 | Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE]; |
| @@ -4939,7 +4857,7 @@ lookup_named_face (f, symbol, charset) | |||
| 4939 | get_lface_attributes (f, symbol, symbol_attrs, 1); | 4857 | get_lface_attributes (f, symbol, symbol_attrs, 1); |
| 4940 | bcopy (default_face->lface, attrs, sizeof attrs); | 4858 | bcopy (default_face->lface, attrs, sizeof attrs); |
| 4941 | merge_face_vectors (symbol_attrs, attrs); | 4859 | merge_face_vectors (symbol_attrs, attrs); |
| 4942 | return lookup_face (f, attrs, charset); | 4860 | return lookup_face (f, attrs, c, NULL); |
| 4943 | } | 4861 | } |
| 4944 | 4862 | ||
| 4945 | 4863 | ||
| @@ -4956,7 +4874,7 @@ ascii_face_of_lisp_face (f, lface_id) | |||
| 4956 | if (lface_id >= 0 && lface_id < lface_id_to_name_size) | 4874 | if (lface_id >= 0 && lface_id < lface_id_to_name_size) |
| 4957 | { | 4875 | { |
| 4958 | Lisp_Object face_name = lface_id_to_name[lface_id]; | 4876 | Lisp_Object face_name = lface_id_to_name[lface_id]; |
| 4959 | face_id = lookup_named_face (f, face_name, CHARSET_ASCII); | 4877 | face_id = lookup_named_face (f, face_name, 0); |
| 4960 | } | 4878 | } |
| 4961 | else | 4879 | else |
| 4962 | face_id = -1; | 4880 | face_id = -1; |
| @@ -4973,7 +4891,7 @@ int | |||
| 4973 | smaller_face (f, face_id, steps) | 4891 | smaller_face (f, face_id, steps) |
| 4974 | struct frame *f; | 4892 | struct frame *f; |
| 4975 | int face_id, steps; | 4893 | int face_id, steps; |
| 4976 | { | 4894 | { |
| 4977 | #ifdef HAVE_WINDOW_SYSTEM | 4895 | #ifdef HAVE_WINDOW_SYSTEM |
| 4978 | struct face *face; | 4896 | struct face *face; |
| 4979 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; | 4897 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; |
| @@ -5004,7 +4922,7 @@ smaller_face (f, face_id, steps) | |||
| 5004 | /* Look up a face for a slightly smaller/larger font. */ | 4922 | /* Look up a face for a slightly smaller/larger font. */ |
| 5005 | pt += delta; | 4923 | pt += delta; |
| 5006 | attrs[LFACE_HEIGHT_INDEX] = make_number (pt); | 4924 | attrs[LFACE_HEIGHT_INDEX] = make_number (pt); |
| 5007 | new_face_id = lookup_face (f, attrs, CHARSET_ASCII); | 4925 | new_face_id = lookup_face (f, attrs, 0, NULL); |
| 5008 | new_face = FACE_FROM_ID (f, new_face_id); | 4926 | new_face = FACE_FROM_ID (f, new_face_id); |
| 5009 | 4927 | ||
| 5010 | /* If height changes, count that as one step. */ | 4928 | /* If height changes, count that as one step. */ |
| @@ -5046,25 +4964,24 @@ face_with_height (f, face_id, height) | |||
| 5046 | face = FACE_FROM_ID (f, face_id); | 4964 | face = FACE_FROM_ID (f, face_id); |
| 5047 | bcopy (face->lface, attrs, sizeof attrs); | 4965 | bcopy (face->lface, attrs, sizeof attrs); |
| 5048 | attrs[LFACE_HEIGHT_INDEX] = make_number (height); | 4966 | attrs[LFACE_HEIGHT_INDEX] = make_number (height); |
| 5049 | face_id = lookup_face (f, attrs, CHARSET_ASCII); | 4967 | face_id = lookup_face (f, attrs, 0, NULL); |
| 5050 | #endif /* HAVE_WINDOW_SYSTEM */ | 4968 | #endif /* HAVE_WINDOW_SYSTEM */ |
| 5051 | 4969 | ||
| 5052 | return face_id; | 4970 | return face_id; |
| 5053 | } | 4971 | } |
| 5054 | 4972 | ||
| 5055 | /* Return the face id of the realized face for named face SYMBOL on | 4973 | /* Return the face id of the realized face for named face SYMBOL on |
| 5056 | frame F suitable for displaying characters from CHARSET (CHARSET < | 4974 | frame F suitable for displaying character C, and use attributes of |
| 5057 | 0 means unibyte text), and use attributes of the face FACE_ID for | 4975 | the face FACE_ID for attributes that aren't completely specified by |
| 5058 | attributes that aren't completely specified by SYMBOL. This is | 4976 | SYMBOL. This is like lookup_named_face, except that the default |
| 5059 | like lookup_named_face, except that the default attributes come | 4977 | attributes come from FACE_ID, not from the default face. FACE_ID |
| 5060 | from FACE_ID, not from the default face. FACE_ID is assumed to | 4978 | is assumed to be already realized. */ |
| 5061 | be already realized. */ | ||
| 5062 | 4979 | ||
| 5063 | int | 4980 | int |
| 5064 | lookup_derived_face (f, symbol, charset, face_id) | 4981 | lookup_derived_face (f, symbol, c, face_id) |
| 5065 | struct frame *f; | 4982 | struct frame *f; |
| 5066 | Lisp_Object symbol; | 4983 | Lisp_Object symbol; |
| 5067 | int charset; | 4984 | int c; |
| 5068 | int face_id; | 4985 | int face_id; |
| 5069 | { | 4986 | { |
| 5070 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; | 4987 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; |
| @@ -5077,7 +4994,7 @@ lookup_derived_face (f, symbol, charset, face_id) | |||
| 5077 | get_lface_attributes (f, symbol, symbol_attrs, 1); | 4994 | get_lface_attributes (f, symbol, symbol_attrs, 1); |
| 5078 | bcopy (default_face->lface, attrs, sizeof attrs); | 4995 | bcopy (default_face->lface, attrs, sizeof attrs); |
| 5079 | merge_face_vectors (symbol_attrs, attrs); | 4996 | merge_face_vectors (symbol_attrs, attrs); |
| 5080 | return lookup_face (f, attrs, charset); | 4997 | return lookup_face (f, attrs, c, default_face); |
| 5081 | } | 4998 | } |
| 5082 | 4999 | ||
| 5083 | 5000 | ||
| @@ -5167,36 +5084,6 @@ be found. Value is ALIST.") | |||
| 5167 | 5084 | ||
| 5168 | #ifdef HAVE_WINDOW_SYSTEM | 5085 | #ifdef HAVE_WINDOW_SYSTEM |
| 5169 | 5086 | ||
| 5170 | /* Return the X registry and encoding of font name FONT_NAME on frame F. | ||
| 5171 | Value is nil if not successful. */ | ||
| 5172 | |||
| 5173 | static Lisp_Object | ||
| 5174 | deduce_unibyte_registry (f, font_name) | ||
| 5175 | struct frame *f; | ||
| 5176 | char *font_name; | ||
| 5177 | { | ||
| 5178 | struct font_name font; | ||
| 5179 | Lisp_Object registry = Qnil; | ||
| 5180 | |||
| 5181 | font.name = STRDUPA (font_name); | ||
| 5182 | if (split_font_name (f, &font, 0)) | ||
| 5183 | { | ||
| 5184 | char *buffer; | ||
| 5185 | |||
| 5186 | /* Extract registry and encoding. */ | ||
| 5187 | buffer = (char *) alloca (strlen (font.fields[XLFD_REGISTRY]) | ||
| 5188 | + strlen (font.fields[XLFD_ENCODING]) | ||
| 5189 | + 10); | ||
| 5190 | strcpy (buffer, font.fields[XLFD_REGISTRY]); | ||
| 5191 | strcat (buffer, "-"); | ||
| 5192 | strcat (buffer, font.fields[XLFD_ENCODING]); | ||
| 5193 | registry = build_string (buffer); | ||
| 5194 | } | ||
| 5195 | |||
| 5196 | return registry; | ||
| 5197 | } | ||
| 5198 | |||
| 5199 | |||
| 5200 | /* Value is non-zero if FONT is the name of a scalable font. The | 5087 | /* Value is non-zero if FONT is the name of a scalable font. The |
| 5201 | X11R6 XLFD spec says that point size, pixel size, and average width | 5088 | X11R6 XLFD spec says that point size, pixel size, and average width |
| 5202 | are zero for scalable fonts. Intlfonts contain at least one | 5089 | are zero for scalable fonts. Intlfonts contain at least one |
| @@ -5511,34 +5398,30 @@ static int | |||
| 5511 | try_font_list (f, attrs, pattern, family, registry, fonts) | 5398 | try_font_list (f, attrs, pattern, family, registry, fonts) |
| 5512 | struct frame *f; | 5399 | struct frame *f; |
| 5513 | Lisp_Object *attrs; | 5400 | Lisp_Object *attrs; |
| 5514 | char *pattern, *family, *registry; | 5401 | Lisp_Object pattern, family, registry; |
| 5515 | struct font_name **fonts; | 5402 | struct font_name **fonts; |
| 5516 | { | 5403 | { |
| 5517 | int nfonts; | 5404 | int nfonts; |
| 5518 | 5405 | ||
| 5519 | if (family == NULL) | 5406 | if (NILP (family) && STRINGP (attrs[LFACE_FAMILY_INDEX])) |
| 5520 | family = LSTRDUPA (attrs[LFACE_FAMILY_INDEX]); | 5407 | family = attrs[LFACE_FAMILY_INDEX]; |
| 5521 | 5408 | ||
| 5522 | nfonts = font_list (f, pattern, family, registry, fonts); | 5409 | nfonts = font_list (f, pattern, family, registry, fonts); |
| 5523 | 5410 | ||
| 5524 | if (nfonts == 0) | 5411 | if (nfonts == 0 && !NILP (family)) |
| 5525 | { | 5412 | { |
| 5526 | Lisp_Object alter; | 5413 | Lisp_Object alter; |
| 5527 | 5414 | ||
| 5528 | /* Try alternative font families from | 5415 | /* Try alternative font families from |
| 5529 | Vface_alternative_font_family_alist. */ | 5416 | Vface_alternative_font_family_alist. */ |
| 5530 | alter = Fassoc (build_string (family), | 5417 | alter = Fassoc (family, Vface_alternative_font_family_alist); |
| 5531 | Vface_alternative_font_family_alist); | ||
| 5532 | if (CONSP (alter)) | 5418 | if (CONSP (alter)) |
| 5533 | for (alter = XCDR (alter); | 5419 | for (alter = XCDR (alter); |
| 5534 | CONSP (alter) && nfonts == 0; | 5420 | CONSP (alter) && nfonts == 0; |
| 5535 | alter = XCDR (alter)) | 5421 | alter = XCDR (alter)) |
| 5536 | { | 5422 | { |
| 5537 | if (STRINGP (XCAR (alter))) | 5423 | if (STRINGP (XCAR (alter))) |
| 5538 | { | 5424 | nfonts = font_list (f, Qnil, XCAR (alter), registry, fonts); |
| 5539 | family = LSTRDUPA (XCAR (alter)); | ||
| 5540 | nfonts = font_list (f, NULL, family, registry, fonts); | ||
| 5541 | } | ||
| 5542 | } | 5425 | } |
| 5543 | 5426 | ||
| 5544 | /* Try font family of the default face or "fixed". */ | 5427 | /* Try font family of the default face or "fixed". */ |
| @@ -5546,146 +5429,82 @@ try_font_list (f, attrs, pattern, family, registry, fonts) | |||
| 5546 | { | 5429 | { |
| 5547 | struct face *dflt = FACE_FROM_ID (f, DEFAULT_FACE_ID); | 5430 | struct face *dflt = FACE_FROM_ID (f, DEFAULT_FACE_ID); |
| 5548 | if (dflt) | 5431 | if (dflt) |
| 5549 | family = LSTRDUPA (dflt->lface[LFACE_FAMILY_INDEX]); | 5432 | family = dflt->lface[LFACE_FAMILY_INDEX]; |
| 5550 | else | 5433 | else |
| 5551 | family = "fixed"; | 5434 | family = build_string ("fixed"); |
| 5552 | nfonts = font_list (f, NULL, family, registry, fonts); | 5435 | nfonts = font_list (f, Qnil, family, registry, fonts); |
| 5553 | } | 5436 | } |
| 5554 | 5437 | ||
| 5555 | /* Try any family with the given registry. */ | 5438 | /* Try any family with the given registry. */ |
| 5556 | if (nfonts == 0) | 5439 | if (nfonts == 0) |
| 5557 | nfonts = font_list (f, NULL, "*", registry, fonts); | 5440 | nfonts = font_list (f, Qnil, Qnil, registry, fonts); |
| 5558 | } | 5441 | } |
| 5559 | 5442 | ||
| 5560 | return nfonts; | 5443 | return nfonts; |
| 5561 | } | 5444 | } |
| 5562 | 5445 | ||
| 5563 | |||
| 5564 | /* Return the registry and encoding pattern that fonts for CHARSET | ||
| 5565 | should match. Value is allocated from the heap. */ | ||
| 5566 | |||
| 5567 | char * | ||
| 5568 | x_charset_registry (charset) | ||
| 5569 | int charset; | ||
| 5570 | { | ||
| 5571 | Lisp_Object prop, charset_plist; | ||
| 5572 | char *registry; | ||
| 5573 | |||
| 5574 | /* Get registry and encoding from the charset's plist. */ | ||
| 5575 | charset_plist = CHARSET_TABLE_INFO (charset, CHARSET_PLIST_IDX); | ||
| 5576 | prop = Fplist_get (charset_plist, Qx_charset_registry); | ||
| 5577 | |||
| 5578 | if (STRINGP (prop)) | ||
| 5579 | { | ||
| 5580 | if (index (XSTRING (prop)->data, '-')) | ||
| 5581 | registry = xstrdup (XSTRING (prop)->data); | ||
| 5582 | else | ||
| 5583 | { | ||
| 5584 | /* If registry doesn't contain a `-', make it a pattern. */ | ||
| 5585 | registry = (char *) xmalloc (STRING_BYTES (XSTRING (prop)) + 5); | ||
| 5586 | strcpy (registry, XSTRING (prop)->data); | ||
| 5587 | strcat (registry, "*-*"); | ||
| 5588 | } | ||
| 5589 | } | ||
| 5590 | else if (STRINGP (Vface_default_registry)) | ||
| 5591 | registry = xstrdup (XSTRING (Vface_default_registry)->data); | ||
| 5592 | else | ||
| 5593 | registry = xstrdup ("iso8859-1"); | ||
| 5594 | |||
| 5595 | return registry; | ||
| 5596 | } | ||
| 5597 | |||
| 5598 | 5446 | ||
| 5599 | /* Return the fontset id of the fontset name or alias name given by | 5447 | /* Return the fontset id of the base fontset name or alias name given |
| 5600 | the family attribute of ATTRS on frame F. Value is -1 if the | 5448 | by the fontset attribute of ATTRS. Value is -1 if the fontset |
| 5601 | family attribute of ATTRS doesn't name a fontset. */ | 5449 | attribute of ATTRS doesn't name a fontset. */ |
| 5602 | 5450 | ||
| 5603 | static int | 5451 | static int |
| 5604 | face_fontset (f, attrs) | 5452 | face_fontset (attrs) |
| 5605 | struct frame *f; | ||
| 5606 | Lisp_Object *attrs; | 5453 | Lisp_Object *attrs; |
| 5607 | { | 5454 | { |
| 5608 | Lisp_Object name = attrs[LFACE_FAMILY_INDEX]; | 5455 | Lisp_Object name; |
| 5609 | int fontset; | 5456 | int fontset; |
| 5610 | 5457 | ||
| 5611 | name = Fquery_fontset (name, Qnil); | 5458 | name = attrs[LFACE_FONT_INDEX]; |
| 5612 | if (NILP (name)) | 5459 | if (!STRINGP (name)) |
| 5613 | fontset = -1; | 5460 | return -1; |
| 5614 | else | 5461 | return fs_query_fontset (name, 0); |
| 5615 | fontset = fs_query_fontset (f, XSTRING (name)->data); | ||
| 5616 | |||
| 5617 | return fontset; | ||
| 5618 | } | ||
| 5619 | |||
| 5620 | |||
| 5621 | /* Get the font to use for the face realizing the fully-specified Lisp | ||
| 5622 | face ATTRS for charset CHARSET on frame F. CHARSET < 0 means | ||
| 5623 | unibyte text; UNIBYTE_REGISTRY is the registry and encoding to use | ||
| 5624 | in this case. Value is the font name which is allocated from the | ||
| 5625 | heap (which means that it must be freed eventually). */ | ||
| 5626 | |||
| 5627 | static char * | ||
| 5628 | choose_face_font (f, attrs, charset, unibyte_registry) | ||
| 5629 | struct frame *f; | ||
| 5630 | Lisp_Object *attrs; | ||
| 5631 | int charset; | ||
| 5632 | Lisp_Object unibyte_registry; | ||
| 5633 | { | ||
| 5634 | struct font_name *fonts; | ||
| 5635 | int nfonts; | ||
| 5636 | char *registry; | ||
| 5637 | |||
| 5638 | /* ATTRS must be fully-specified. */ | ||
| 5639 | xassert (lface_fully_specified_p (attrs)); | ||
| 5640 | |||
| 5641 | if (STRINGP (unibyte_registry)) | ||
| 5642 | registry = xstrdup (XSTRING (unibyte_registry)->data); | ||
| 5643 | else | ||
| 5644 | registry = x_charset_registry (charset); | ||
| 5645 | |||
| 5646 | nfonts = try_font_list (f, attrs, NULL, NULL, registry, &fonts); | ||
| 5647 | xfree (registry); | ||
| 5648 | return best_matching_font (f, attrs, fonts, nfonts); | ||
| 5649 | } | 5462 | } |
| 5650 | 5463 | ||
| 5651 | 5464 | ||
| 5652 | /* Choose a font to use on frame F to display CHARSET using FONTSET | 5465 | /* Choose a name of font to use on frame F to display character C with |
| 5653 | with Lisp face attributes specified by ATTRS. CHARSET may be any | 5466 | Lisp face attributes specified by ATTRS. The font name is |
| 5654 | valid charset. CHARSET < 0 means unibyte text. If the fontset | 5467 | determined by the font-related attributes in ATTRS and the name |
| 5655 | doesn't contain a font pattern for charset, use the pattern for | 5468 | pattern for C in FONTSET. Value is the font name which is |
| 5656 | CHARSET_ASCII. Value is the font name which is allocated from the | 5469 | allocated from the heap and must be freed by the caller, or NULL if |
| 5657 | heap and must be freed by the caller. */ | 5470 | we can get no information about the font name of C. It is assured |
| 5471 | that we always get some information for a single byte | ||
| 5472 | character. */ | ||
| 5658 | 5473 | ||
| 5659 | static char * | 5474 | static char * |
| 5660 | choose_face_fontset_font (f, attrs, fontset, charset) | 5475 | choose_face_font (f, attrs, fontset, c) |
| 5661 | struct frame *f; | 5476 | struct frame *f; |
| 5662 | Lisp_Object *attrs; | 5477 | Lisp_Object *attrs; |
| 5663 | int fontset, charset; | 5478 | int fontset, c; |
| 5664 | { | 5479 | { |
| 5665 | char *pattern; | 5480 | Lisp_Object pattern; |
| 5666 | char *font_name = NULL; | 5481 | char *font_name = NULL; |
| 5667 | struct fontset_info *fontset_info; | ||
| 5668 | struct font_name *fonts; | 5482 | struct font_name *fonts; |
| 5669 | int nfonts; | 5483 | int nfonts; |
| 5670 | 5484 | ||
| 5671 | xassert (fontset >= 0 && fontset < FRAME_FONTSET_DATA (f)->n_fontsets); | 5485 | /* Get (foundry and) family name and registry (and encoding) name of |
| 5672 | 5486 | a font for C. */ | |
| 5673 | /* For unibyte text, use the ASCII font of the fontset. Using the | 5487 | pattern = fontset_font_pattern (f, fontset, c); |
| 5674 | ASCII font seems to be the most reasonable thing we can do in | 5488 | if (NILP (pattern)) |
| 5675 | this case. */ | 5489 | { |
| 5676 | if (charset < 0) | 5490 | xassert (!SINGLE_BYTE_CHAR_P (c)); |
| 5677 | charset = CHARSET_ASCII; | 5491 | return NULL; |
| 5492 | } | ||
| 5493 | /* If what we got is a name pattern, return it. */ | ||
| 5494 | if (STRINGP (pattern)) | ||
| 5495 | return xstrdup (XSTRING (pattern)->data); | ||
| 5678 | 5496 | ||
| 5679 | /* Get the font name pattern to use for CHARSET from the fontset. */ | 5497 | /* Family name may be specified both in ATTRS and car part of |
| 5680 | fontset_info = FRAME_FONTSET_DATA (f)->fontset_table[fontset]; | 5498 | PATTERN. The former has higher priority if C is a single byte |
| 5681 | pattern = fontset_info->fontname[charset]; | 5499 | character. */ |
| 5682 | if (!pattern) | 5500 | if (STRINGP (attrs[LFACE_FAMILY_INDEX]) |
| 5683 | pattern = fontset_info->fontname[CHARSET_ASCII]; | 5501 | && SINGLE_BYTE_CHAR_P (c)) |
| 5684 | xassert (pattern); | 5502 | XCAR (pattern) = Qnil; |
| 5685 | 5503 | ||
| 5686 | /* Get a list of fonts matching that pattern and choose the | 5504 | /* Get a list of fonts matching that pattern and choose the |
| 5687 | best match for the specified face attributes from it. */ | 5505 | best match for the specified face attributes from it. */ |
| 5688 | nfonts = try_font_list (f, attrs, pattern, NULL, NULL, &fonts); | 5506 | nfonts = try_font_list (f, attrs, Qnil, XCAR (pattern), XCDR (pattern), |
| 5507 | &fonts); | ||
| 5689 | font_name = best_matching_font (f, attrs, fonts, nfonts); | 5508 | font_name = best_matching_font (f, attrs, fonts, nfonts); |
| 5690 | return font_name; | 5509 | return font_name; |
| 5691 | } | 5510 | } |
| @@ -5737,7 +5556,6 @@ realize_default_face (f) | |||
| 5737 | struct face_cache *c = FRAME_FACE_CACHE (f); | 5556 | struct face_cache *c = FRAME_FACE_CACHE (f); |
| 5738 | Lisp_Object lface; | 5557 | Lisp_Object lface; |
| 5739 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; | 5558 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; |
| 5740 | Lisp_Object unibyte_registry; | ||
| 5741 | Lisp_Object frame_font; | 5559 | Lisp_Object frame_font; |
| 5742 | struct face *face; | 5560 | struct face *face; |
| 5743 | int fontset; | 5561 | int fontset; |
| @@ -5758,62 +5576,7 @@ realize_default_face (f) | |||
| 5758 | frame_font = Fassq (Qfont, f->param_alist); | 5576 | frame_font = Fassq (Qfont, f->param_alist); |
| 5759 | xassert (CONSP (frame_font) && STRINGP (XCDR (frame_font))); | 5577 | xassert (CONSP (frame_font) && STRINGP (XCDR (frame_font))); |
| 5760 | frame_font = XCDR (frame_font); | 5578 | frame_font = XCDR (frame_font); |
| 5761 | 5579 | set_lface_from_font_name (f, lface, frame_font, 0, 1); | |
| 5762 | fontset = fs_query_fontset (f, XSTRING (frame_font)->data); | ||
| 5763 | if (fontset >= 0) | ||
| 5764 | { | ||
| 5765 | /* If frame_font is a fontset name, don't use that for | ||
| 5766 | determining font-related attributes of the default face | ||
| 5767 | because it is just an artificial name. Use the ASCII font of | ||
| 5768 | the fontset, instead. */ | ||
| 5769 | struct font_info *font_info; | ||
| 5770 | struct font_name font; | ||
| 5771 | |||
| 5772 | BLOCK_INPUT; | ||
| 5773 | font_info = FS_LOAD_FONT (f, FRAME_X_FONT_TABLE (f), CHARSET_ASCII, | ||
| 5774 | NULL, fontset); | ||
| 5775 | UNBLOCK_INPUT; | ||
| 5776 | |||
| 5777 | /* Set weight etc. from the ASCII font. */ | ||
| 5778 | if (!set_lface_from_font_name (f, lface, font_info->full_name, 0, 0)) | ||
| 5779 | return 0; | ||
| 5780 | |||
| 5781 | /* Remember registry and encoding of the frame font. */ | ||
| 5782 | unibyte_registry = deduce_unibyte_registry (f, font_info->full_name); | ||
| 5783 | if (STRINGP (unibyte_registry)) | ||
| 5784 | Vface_default_registry = unibyte_registry; | ||
| 5785 | else | ||
| 5786 | Vface_default_registry = build_string ("iso8859-1"); | ||
| 5787 | |||
| 5788 | /* But set the family to the fontset alias name. Implementation | ||
| 5789 | note: When a font is passed to Emacs via `-fn FONT', a | ||
| 5790 | fontset is created in `x-win.el' whose name ends in | ||
| 5791 | `fontset-startup'. This fontset has an alias name that is | ||
| 5792 | equal to frame_font. */ | ||
| 5793 | xassert (STRINGP (frame_font)); | ||
| 5794 | font.name = LSTRDUPA (frame_font); | ||
| 5795 | |||
| 5796 | if (!split_font_name (f, &font, 1) | ||
| 5797 | || xstricmp (font.fields[XLFD_REGISTRY], "fontset") != 0 | ||
| 5798 | || xstricmp (font.fields[XLFD_ENCODING], "startup") != 0) | ||
| 5799 | LFACE_FAMILY (lface) = frame_font; | ||
| 5800 | } | ||
| 5801 | else | ||
| 5802 | { | ||
| 5803 | /* Frame parameters contain a real font. Fill default face | ||
| 5804 | attributes from that font. */ | ||
| 5805 | if (!set_lface_from_font_name (f, lface, | ||
| 5806 | XSTRING (frame_font)->data, 0, 0)) | ||
| 5807 | return 0; | ||
| 5808 | |||
| 5809 | /* Remember registry and encoding of the frame font. */ | ||
| 5810 | unibyte_registry | ||
| 5811 | = deduce_unibyte_registry (f, XSTRING (frame_font)->data); | ||
| 5812 | if (STRINGP (unibyte_registry)) | ||
| 5813 | Vface_default_registry = unibyte_registry; | ||
| 5814 | else | ||
| 5815 | Vface_default_registry = build_string ("iso8859-1"); | ||
| 5816 | } | ||
| 5817 | } | 5580 | } |
| 5818 | #endif /* HAVE_WINDOW_SYSTEM */ | 5581 | #endif /* HAVE_WINDOW_SYSTEM */ |
| 5819 | 5582 | ||
| @@ -5879,19 +5642,7 @@ realize_default_face (f) | |||
| 5879 | xassert (lface_fully_specified_p (XVECTOR (lface)->contents)); | 5642 | xassert (lface_fully_specified_p (XVECTOR (lface)->contents)); |
| 5880 | check_lface (lface); | 5643 | check_lface (lface); |
| 5881 | bcopy (XVECTOR (lface)->contents, attrs, sizeof attrs); | 5644 | bcopy (XVECTOR (lface)->contents, attrs, sizeof attrs); |
| 5882 | face = realize_face (c, attrs, CHARSET_ASCII); | 5645 | face = realize_face (c, attrs, 0, NULL, DEFAULT_FACE_ID); |
| 5883 | |||
| 5884 | /* Remove the former default face. */ | ||
| 5885 | if (c->used > DEFAULT_FACE_ID) | ||
| 5886 | { | ||
| 5887 | struct face *default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID); | ||
| 5888 | uncache_face (c, default_face); | ||
| 5889 | free_realized_face (f, default_face); | ||
| 5890 | } | ||
| 5891 | |||
| 5892 | /* Insert the new default face. */ | ||
| 5893 | cache_face (c, face, lface_hash (attrs)); | ||
| 5894 | xassert (face->id == DEFAULT_FACE_ID); | ||
| 5895 | return 1; | 5646 | return 1; |
| 5896 | } | 5647 | } |
| 5897 | 5648 | ||
| @@ -5930,138 +5681,129 @@ realize_named_face (f, symbol, id) | |||
| 5930 | merge_face_vectors (symbol_attrs, attrs); | 5681 | merge_face_vectors (symbol_attrs, attrs); |
| 5931 | 5682 | ||
| 5932 | /* Realize the face. */ | 5683 | /* Realize the face. */ |
| 5933 | new_face = realize_face (c, attrs, CHARSET_ASCII); | 5684 | new_face = realize_face (c, attrs, 0, NULL, id); |
| 5934 | |||
| 5935 | /* Remove the former face. */ | ||
| 5936 | if (c->used > id) | ||
| 5937 | { | ||
| 5938 | struct face *old_face = c->faces_by_id[id]; | ||
| 5939 | uncache_face (c, old_face); | ||
| 5940 | free_realized_face (f, old_face); | ||
| 5941 | } | ||
| 5942 | |||
| 5943 | /* Insert the new face. */ | ||
| 5944 | cache_face (c, new_face, lface_hash (attrs)); | ||
| 5945 | xassert (new_face->id == id); | ||
| 5946 | } | 5685 | } |
| 5947 | 5686 | ||
| 5948 | 5687 | ||
| 5949 | /* Realize the fully-specified face with attributes ATTRS in face | 5688 | /* Realize the fully-specified face with attributes ATTRS in face |
| 5950 | cache C for character set CHARSET or for unibyte text if CHARSET < | 5689 | cache CACHE for character C. If C is a multibyte character, |
| 5951 | 0. Value is a pointer to the newly created realized face. */ | 5690 | BASE_FACE is a face for ASCII characters that has the same |
| 5691 | attributes. Otherwise, BASE_FACE is ignored. If FORMER_FACE_ID is | ||
| 5692 | non-negative, it is an ID of face to remove before caching the new | ||
| 5693 | face. Value is a pointer to the newly created realized face. */ | ||
| 5952 | 5694 | ||
| 5953 | static struct face * | 5695 | static struct face * |
| 5954 | realize_face (c, attrs, charset) | 5696 | realize_face (cache, attrs, c, base_face, former_face_id) |
| 5955 | struct face_cache *c; | 5697 | struct face_cache *cache; |
| 5956 | Lisp_Object *attrs; | 5698 | Lisp_Object *attrs; |
| 5957 | int charset; | 5699 | int c; |
| 5700 | struct face *base_face; | ||
| 5701 | int former_face_id; | ||
| 5958 | { | 5702 | { |
| 5959 | struct face *face; | 5703 | struct face *face; |
| 5960 | 5704 | ||
| 5961 | /* LFACE must be fully specified. */ | 5705 | /* LFACE must be fully specified. */ |
| 5962 | xassert (c != NULL); | 5706 | xassert (cache != NULL); |
| 5963 | check_lface_attrs (attrs); | 5707 | check_lface_attrs (attrs); |
| 5964 | 5708 | ||
| 5965 | if (FRAME_WINDOW_P (c->f)) | 5709 | if (former_face_id >= 0 && cache->used > former_face_id) |
| 5966 | face = realize_x_face (c, attrs, charset); | 5710 | { |
| 5967 | else if (FRAME_TERMCAP_P (c->f) || FRAME_MSDOS_P (c->f)) | 5711 | /* Remove the former face. */ |
| 5968 | face = realize_tty_face (c, attrs, charset); | 5712 | struct face *former_face = cache->faces_by_id[former_face_id]; |
| 5713 | uncache_face (cache, former_face); | ||
| 5714 | free_realized_face (cache->f, former_face); | ||
| 5715 | } | ||
| 5716 | |||
| 5717 | if (FRAME_WINDOW_P (cache->f)) | ||
| 5718 | face = realize_x_face (cache, attrs, c, base_face); | ||
| 5719 | else if (FRAME_TERMCAP_P (cache->f) || FRAME_MSDOS_P (cache->f)) | ||
| 5720 | face = realize_tty_face (cache, attrs, c); | ||
| 5969 | else | 5721 | else |
| 5970 | abort (); | 5722 | abort (); |
| 5971 | 5723 | ||
| 5724 | /* Insert the new face. */ | ||
| 5725 | cache_face (cache, face, lface_hash (attrs)); | ||
| 5726 | #ifdef HAVE_WINDOW_SYSTEM | ||
| 5727 | if (FRAME_X_P (cache->f) && face->font == NULL) | ||
| 5728 | load_face_font (cache->f, face, c); | ||
| 5729 | #endif /* HAVE_WINDOW_SYSTEM */ | ||
| 5972 | return face; | 5730 | return face; |
| 5973 | } | 5731 | } |
| 5974 | 5732 | ||
| 5975 | 5733 | ||
| 5976 | /* Realize the fully-specified face with attributes ATTRS in face | 5734 | /* Realize the fully-specified face with attributes ATTRS in face |
| 5977 | cache C for character set CHARSET or for unibyte text if CHARSET < | 5735 | cache CACHE for character C. Do it for X frame CACHE->f. If C is |
| 5978 | 0. Do it for X frame C->f. Value is a pointer to the newly | 5736 | a multibyte character, BASE_FACE is a face for ASCII characters |
| 5737 | that has the same attributes. Otherwise, BASE_FACE is ignored. If | ||
| 5738 | the new face doesn't share font with the default face, a fontname | ||
| 5739 | is allocated from the heap and set in `font_name' of the new face, | ||
| 5740 | but it is not yet loaded here. Value is a pointer to the newly | ||
| 5979 | created realized face. */ | 5741 | created realized face. */ |
| 5980 | 5742 | ||
| 5981 | static struct face * | 5743 | static struct face * |
| 5982 | realize_x_face (c, attrs, charset) | 5744 | realize_x_face (cache, attrs, c, base_face) |
| 5983 | struct face_cache *c; | 5745 | struct face_cache *cache; |
| 5984 | Lisp_Object *attrs; | 5746 | Lisp_Object *attrs; |
| 5985 | int charset; | 5747 | int c; |
| 5748 | struct face *base_face; | ||
| 5986 | { | 5749 | { |
| 5987 | #ifdef HAVE_WINDOW_SYSTEM | 5750 | #ifdef HAVE_WINDOW_SYSTEM |
| 5988 | struct face *face, *default_face; | 5751 | struct face *face, *default_face; |
| 5989 | struct frame *f; | 5752 | struct frame *f; |
| 5990 | Lisp_Object stipple, overline, strike_through, box; | 5753 | Lisp_Object stipple, overline, strike_through, box; |
| 5991 | Lisp_Object unibyte_registry; | ||
| 5992 | struct gcpro gcpro1; | ||
| 5993 | |||
| 5994 | xassert (FRAME_WINDOW_P (c->f)); | ||
| 5995 | 5754 | ||
| 5996 | /* If realizing a face for use in unibyte text, get the X registry | 5755 | xassert (FRAME_WINDOW_P (cache->f)); |
| 5997 | and encoding to use from Vface_default_registry. */ | 5756 | xassert (SINGLE_BYTE_CHAR_P (c) |
| 5998 | if (charset < 0) | 5757 | || (base_face && base_face->ascii_face == base_face)); |
| 5999 | unibyte_registry = (STRINGP (Vface_default_registry) | ||
| 6000 | ? Vface_default_registry | ||
| 6001 | : build_string ("iso8859-1")); | ||
| 6002 | else | ||
| 6003 | unibyte_registry = Qnil; | ||
| 6004 | GCPRO1 (unibyte_registry); | ||
| 6005 | 5758 | ||
| 6006 | /* Allocate a new realized face. */ | 5759 | /* Allocate a new realized face. */ |
| 6007 | face = make_realized_face (attrs, charset, unibyte_registry); | 5760 | face = make_realized_face (attrs); |
| 5761 | |||
| 5762 | f = cache->f; | ||
| 5763 | |||
| 5764 | /* If C is a multibyte character, we share all face attirbutes with | ||
| 5765 | BASE_FACE including the realized fontset. But, we must load a | ||
| 5766 | different font. */ | ||
| 5767 | if (!SINGLE_BYTE_CHAR_P (c)) | ||
| 5768 | { | ||
| 5769 | bcopy (base_face, face, sizeof *face); | ||
| 5770 | face->gc = 0; | ||
| 5771 | face->font = NULL; /* to force realize_face to load font */ | ||
| 5772 | return face; | ||
| 5773 | } | ||
| 5774 | |||
| 5775 | /* Now we are realizing a face for ASCII (and unibyte) characters. */ | ||
| 6008 | 5776 | ||
| 6009 | f = c->f; | ||
| 6010 | /* Determine the font to use. Most of the time, the font will be | 5777 | /* Determine the font to use. Most of the time, the font will be |
| 6011 | the same as the font of the default face, so try that first. */ | 5778 | the same as the font of the default face, so try that first. */ |
| 6012 | default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID); | 5779 | default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID); |
| 6013 | if (default_face | 5780 | if (default_face |
| 6014 | && FACE_SUITABLE_FOR_CHARSET_P (default_face, charset) | 5781 | && FACE_SUITABLE_FOR_CHAR_P (default_face, c) |
| 6015 | && lface_same_font_attributes_p (default_face->lface, attrs)) | 5782 | && lface_same_font_attributes_p (default_face->lface, attrs)) |
| 6016 | { | 5783 | { |
| 6017 | face->font = default_face->font; | 5784 | face->font = default_face->font; |
| 6018 | face->fontset = default_face->fontset; | 5785 | face->fontset = default_face->fontset; |
| 6019 | face->font_info_id = default_face->font_info_id; | 5786 | face->font_info_id = default_face->font_info_id; |
| 6020 | face->font_name = default_face->font_name; | 5787 | face->font_name = default_face->font_name; |
| 6021 | face->registry = default_face->registry; | 5788 | face->ascii_face = face; |
| 6022 | } | ||
| 6023 | else if (charset >= 0) | ||
| 6024 | { | ||
| 6025 | /* For all charsets, we use our own font selection functions to | ||
| 6026 | choose a best matching font for the specified face | ||
| 6027 | attributes. If the face specifies a fontset alias name, the | ||
| 6028 | fontset determines the font name pattern, otherwise we | ||
| 6029 | construct a font pattern from face attributes and charset. */ | ||
| 6030 | |||
| 6031 | char *font_name = NULL; | ||
| 6032 | int fontset = face_fontset (f, attrs); | ||
| 6033 | 5789 | ||
| 6034 | if (fontset < 0) | 5790 | /* But, as we can't share the fontset, make a new realized |
| 6035 | font_name = choose_face_font (f, attrs, charset, Qnil); | 5791 | fontset that has the same base fontset as of the default |
| 6036 | else | 5792 | face. */ |
| 6037 | { | 5793 | face->fontset |
| 6038 | font_name = choose_face_fontset_font (f, attrs, fontset, charset); | 5794 | = make_fontset_for_ascii_face (f, default_face->fontset); |
| 6039 | fontset = -1; | ||
| 6040 | } | ||
| 6041 | |||
| 6042 | load_face_font_or_fontset (f, face, font_name, fontset); | ||
| 6043 | xfree (font_name); | ||
| 6044 | } | 5795 | } |
| 6045 | else | 5796 | else |
| 6046 | { | 5797 | { |
| 6047 | /* Unibyte case, and font is not equal to that of the default | 5798 | /* If the face attribute ATTRS specifies a fontset, use it as |
| 6048 | face. UNIBYTE_REGISTRY is the X registry and encoding the | 5799 | the base of a new realized fontset. Otherwise, use the |
| 6049 | font should have. What is a reasonable thing to do if the | 5800 | default fontset as the base. The base determines registry |
| 6050 | user specified a fontset alias name for the face in this | 5801 | and encoding of a font. It may also determine foundry and |
| 6051 | case? We choose a font by taking the ASCII font of the | 5802 | family. The other fields of font name pattern are |
| 6052 | fontset, but using UNIBYTE_REGISTRY for its registry and | 5803 | constructed from ATTRS. */ |
| 6053 | encoding. */ | 5804 | face->fontset |
| 6054 | 5805 | = make_fontset_for_ascii_face (f, face_fontset (attrs)); | |
| 6055 | char *font_name = NULL; | 5806 | face->font = NULL; /* to force realize_face to load font */ |
| 6056 | int fontset = face_fontset (f, attrs); | ||
| 6057 | |||
| 6058 | if (fontset < 0) | ||
| 6059 | font_name = choose_face_font (f, attrs, charset, unibyte_registry); | ||
| 6060 | else | ||
| 6061 | font_name = choose_face_fontset_font (f, attrs, fontset, charset); | ||
| 6062 | |||
| 6063 | load_face_font_or_fontset (f, face, font_name, -1); | ||
| 6064 | xfree (font_name); | ||
| 6065 | } | 5807 | } |
| 6066 | 5808 | ||
| 6067 | /* Load colors, and set remaining attributes. */ | 5809 | /* Load colors, and set remaining attributes. */ |
| @@ -6193,24 +5935,22 @@ realize_x_face (c, attrs, charset) | |||
| 6193 | if (!NILP (stipple)) | 5935 | if (!NILP (stipple)) |
| 6194 | face->stipple = load_pixmap (f, stipple, &face->pixmap_w, &face->pixmap_h); | 5936 | face->stipple = load_pixmap (f, stipple, &face->pixmap_w, &face->pixmap_h); |
| 6195 | 5937 | ||
| 6196 | UNGCPRO; | ||
| 6197 | xassert (face->fontset < 0); | 5938 | xassert (face->fontset < 0); |
| 6198 | xassert (FACE_SUITABLE_FOR_CHARSET_P (face, charset)); | 5939 | xassert (FACE_SUITABLE_FOR_CHAR_P (face, c)); |
| 6199 | return face; | 5940 | return face; |
| 6200 | #endif /* HAVE_WINDOW_SYSTEM */ | 5941 | #endif /* HAVE_WINDOW_SYSTEM */ |
| 6201 | } | 5942 | } |
| 6202 | 5943 | ||
| 6203 | 5944 | ||
| 6204 | /* Realize the fully-specified face with attributes ATTRS in face | 5945 | /* Realize the fully-specified face with attributes ATTRS in face |
| 6205 | cache C for character set CHARSET or for unibyte text if CHARSET < | 5946 | cache CACHE for character C. Do it for TTY frame CACHE->f. Value is a |
| 6206 | 0. Do it for TTY frame C->f. Value is a pointer to the newly | 5947 | pointer to the newly created realized face. */ |
| 6207 | created realized face. */ | ||
| 6208 | 5948 | ||
| 6209 | static struct face * | 5949 | static struct face * |
| 6210 | realize_tty_face (c, attrs, charset) | 5950 | realize_tty_face (cache, attrs, c) |
| 6211 | struct face_cache *c; | 5951 | struct face_cache *cache; |
| 6212 | Lisp_Object *attrs; | 5952 | Lisp_Object *attrs; |
| 6213 | int charset; | 5953 | int c; |
| 6214 | { | 5954 | { |
| 6215 | struct face *face; | 5955 | struct face *face; |
| 6216 | int weight, slant; | 5956 | int weight, slant; |
| @@ -6222,11 +5962,11 @@ realize_tty_face (c, attrs, charset) | |||
| 6222 | int face_colors_defaulted = 0; | 5962 | int face_colors_defaulted = 0; |
| 6223 | 5963 | ||
| 6224 | /* Frame must be a termcap frame. */ | 5964 | /* Frame must be a termcap frame. */ |
| 6225 | xassert (FRAME_TERMCAP_P (c->f) || FRAME_MSDOS_P (c->f)); | 5965 | xassert (FRAME_TERMCAP_P (cache->f) || FRAME_MSDOS_P (cache->f)); |
| 6226 | 5966 | ||
| 6227 | /* Allocate a new realized face. */ | 5967 | /* Allocate a new realized face. */ |
| 6228 | face = make_realized_face (attrs, charset, Qnil); | 5968 | face = make_realized_face (attrs); |
| 6229 | face->font_name = FRAME_MSDOS_P (c->f) ? "ms-dos" : "tty"; | 5969 | face->font_name = FRAME_MSDOS_P (cache->f) ? "ms-dos" : "tty"; |
| 6230 | 5970 | ||
| 6231 | /* Map face attributes to TTY appearances. We map slant to | 5971 | /* Map face attributes to TTY appearances. We map slant to |
| 6232 | dimmed text because we want italic text to appear differently | 5972 | dimmed text because we want italic text to appear differently |
| @@ -6247,7 +5987,7 @@ realize_tty_face (c, attrs, charset) | |||
| 6247 | face->foreground = FACE_TTY_DEFAULT_FG_COLOR; | 5987 | face->foreground = FACE_TTY_DEFAULT_FG_COLOR; |
| 6248 | face->background = FACE_TTY_DEFAULT_BG_COLOR; | 5988 | face->background = FACE_TTY_DEFAULT_BG_COLOR; |
| 6249 | 5989 | ||
| 6250 | XSETFRAME (frame, c->f); | 5990 | XSETFRAME (frame, cache->f); |
| 6251 | color = attrs[LFACE_FOREGROUND_INDEX]; | 5991 | color = attrs[LFACE_FOREGROUND_INDEX]; |
| 6252 | if (STRINGP (color) | 5992 | if (STRINGP (color) |
| 6253 | && XSTRING (color)->size | 5993 | && XSTRING (color)->size |
| @@ -6261,7 +6001,7 @@ realize_tty_face (c, attrs, charset) | |||
| 6261 | if (face->foreground == FACE_TTY_DEFAULT_FG_COLOR | 6001 | if (face->foreground == FACE_TTY_DEFAULT_FG_COLOR |
| 6262 | && STRINGP (attrs[LFACE_FOREGROUND_INDEX])) | 6002 | && STRINGP (attrs[LFACE_FOREGROUND_INDEX])) |
| 6263 | { | 6003 | { |
| 6264 | face->foreground = load_color (c->f, face, | 6004 | face->foreground = load_color (cache->f, face, |
| 6265 | attrs[LFACE_FOREGROUND_INDEX], | 6005 | attrs[LFACE_FOREGROUND_INDEX], |
| 6266 | LFACE_FOREGROUND_INDEX); | 6006 | LFACE_FOREGROUND_INDEX); |
| 6267 | 6007 | ||
| @@ -6269,23 +6009,23 @@ realize_tty_face (c, attrs, charset) | |||
| 6269 | /* If the foreground of the default face is the default color, | 6009 | /* If the foreground of the default face is the default color, |
| 6270 | use the foreground color defined by the frame. */ | 6010 | use the foreground color defined by the frame. */ |
| 6271 | #ifdef MSDOS | 6011 | #ifdef MSDOS |
| 6272 | if (FRAME_MSDOS_P (c->f)) | 6012 | if (FRAME_MSDOS_P (cache->f)) |
| 6273 | { | 6013 | { |
| 6274 | #endif /* MSDOS */ | 6014 | #endif /* MSDOS */ |
| 6275 | 6015 | ||
| 6276 | if (face->foreground == FACE_TTY_DEFAULT_FG_COLOR | 6016 | if (face->foreground == FACE_TTY_DEFAULT_FG_COLOR |
| 6277 | || face->foreground == FACE_TTY_DEFAULT_COLOR) | 6017 | || face->foreground == FACE_TTY_DEFAULT_COLOR) |
| 6278 | { | 6018 | { |
| 6279 | face->foreground = FRAME_FOREGROUND_PIXEL (c->f); | 6019 | face->foreground = FRAME_FOREGROUND_PIXEL (cache->f); |
| 6280 | attrs[LFACE_FOREGROUND_INDEX] = | 6020 | attrs[LFACE_FOREGROUND_INDEX] = |
| 6281 | tty_color_name (c->f, face->foreground); | 6021 | tty_color_name (cache->f, face->foreground); |
| 6282 | face_colors_defaulted = 1; | 6022 | face_colors_defaulted = 1; |
| 6283 | } | 6023 | } |
| 6284 | else if (face->foreground == FACE_TTY_DEFAULT_BG_COLOR) | 6024 | else if (face->foreground == FACE_TTY_DEFAULT_BG_COLOR) |
| 6285 | { | 6025 | { |
| 6286 | face->foreground = FRAME_BACKGROUND_PIXEL (c->f); | 6026 | face->foreground = FRAME_BACKGROUND_PIXEL (cache->f); |
| 6287 | attrs[LFACE_FOREGROUND_INDEX] = | 6027 | attrs[LFACE_FOREGROUND_INDEX] = |
| 6288 | tty_color_name (c->f, face->foreground); | 6028 | tty_color_name (cache->f, face->foreground); |
| 6289 | face_colors_defaulted = 1; | 6029 | face_colors_defaulted = 1; |
| 6290 | } | 6030 | } |
| 6291 | #ifdef MSDOS | 6031 | #ifdef MSDOS |
| @@ -6307,30 +6047,30 @@ realize_tty_face (c, attrs, charset) | |||
| 6307 | if (face->background == FACE_TTY_DEFAULT_BG_COLOR | 6047 | if (face->background == FACE_TTY_DEFAULT_BG_COLOR |
| 6308 | && STRINGP (attrs[LFACE_BACKGROUND_INDEX])) | 6048 | && STRINGP (attrs[LFACE_BACKGROUND_INDEX])) |
| 6309 | { | 6049 | { |
| 6310 | face->background = load_color (c->f, face, | 6050 | face->background = load_color (cache->f, face, |
| 6311 | attrs[LFACE_BACKGROUND_INDEX], | 6051 | attrs[LFACE_BACKGROUND_INDEX], |
| 6312 | LFACE_BACKGROUND_INDEX); | 6052 | LFACE_BACKGROUND_INDEX); |
| 6313 | #if defined (MSDOS) || defined (WINDOWSNT) | 6053 | #if defined (MSDOS) || defined (WINDOWSNT) |
| 6314 | /* If the background of the default face is the default color, | 6054 | /* If the background of the default face is the default color, |
| 6315 | use the background color defined by the frame. */ | 6055 | use the background color defined by the frame. */ |
| 6316 | #ifdef MSDOS | 6056 | #ifdef MSDOS |
| 6317 | if (FRAME_MSDOS_P (c->f)) | 6057 | if (FRAME_MSDOS_P (cache->f)) |
| 6318 | { | 6058 | { |
| 6319 | #endif /* MSDOS */ | 6059 | #endif /* MSDOS */ |
| 6320 | 6060 | ||
| 6321 | if (face->background == FACE_TTY_DEFAULT_BG_COLOR | 6061 | if (face->background == FACE_TTY_DEFAULT_BG_COLOR |
| 6322 | || face->background == FACE_TTY_DEFAULT_COLOR) | 6062 | || face->background == FACE_TTY_DEFAULT_COLOR) |
| 6323 | { | 6063 | { |
| 6324 | face->background = FRAME_BACKGROUND_PIXEL (c->f); | 6064 | face->background = FRAME_BACKGROUND_PIXEL (cache->f); |
| 6325 | attrs[LFACE_BACKGROUND_INDEX] = | 6065 | attrs[LFACE_BACKGROUND_INDEX] = |
| 6326 | tty_color_name (c->f, face->background); | 6066 | tty_color_name (cache->f, face->background); |
| 6327 | face_colors_defaulted = 1; | 6067 | face_colors_defaulted = 1; |
| 6328 | } | 6068 | } |
| 6329 | else if (face->background == FACE_TTY_DEFAULT_FG_COLOR) | 6069 | else if (face->background == FACE_TTY_DEFAULT_FG_COLOR) |
| 6330 | { | 6070 | { |
| 6331 | face->background = FRAME_FOREGROUND_PIXEL (c->f); | 6071 | face->background = FRAME_FOREGROUND_PIXEL (cache->f); |
| 6332 | attrs[LFACE_BACKGROUND_INDEX] = | 6072 | attrs[LFACE_BACKGROUND_INDEX] = |
| 6333 | tty_color_name (c->f, face->background); | 6073 | tty_color_name (cache->f, face->background); |
| 6334 | face_colors_defaulted = 1; | 6074 | face_colors_defaulted = 1; |
| 6335 | } | 6075 | } |
| 6336 | #ifdef MSDOS | 6076 | #ifdef MSDOS |
| @@ -6369,19 +6109,22 @@ compute_char_face (f, ch, prop) | |||
| 6369 | Lisp_Object prop; | 6109 | Lisp_Object prop; |
| 6370 | { | 6110 | { |
| 6371 | int face_id; | 6111 | int face_id; |
| 6372 | int charset = (NILP (current_buffer->enable_multibyte_characters) | 6112 | |
| 6373 | ? -1 | 6113 | if (NILP (current_buffer->enable_multibyte_characters)) |
| 6374 | : CHAR_CHARSET (ch)); | 6114 | ch = -1; |
| 6375 | 6115 | ||
| 6376 | if (NILP (prop)) | 6116 | if (NILP (prop)) |
| 6377 | face_id = FACE_FOR_CHARSET (f, DEFAULT_FACE_ID, charset); | 6117 | { |
| 6118 | struct face *face = FACE_FROM_ID (f, DEFAULT_FACE_ID); | ||
| 6119 | face_id = FACE_FOR_CHAR (f, face, ch); | ||
| 6120 | } | ||
| 6378 | else | 6121 | else |
| 6379 | { | 6122 | { |
| 6380 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; | 6123 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; |
| 6381 | struct face *default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID); | 6124 | struct face *default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID); |
| 6382 | bcopy (default_face->lface, attrs, sizeof attrs); | 6125 | bcopy (default_face->lface, attrs, sizeof attrs); |
| 6383 | merge_face_vector_with_property (f, attrs, prop); | 6126 | merge_face_vector_with_property (f, attrs, prop); |
| 6384 | face_id = lookup_face (f, attrs, charset); | 6127 | face_id = lookup_face (f, attrs, ch, NULL); |
| 6385 | } | 6128 | } |
| 6386 | 6129 | ||
| 6387 | return face_id; | 6130 | return face_id; |
| @@ -6401,9 +6144,7 @@ compute_char_face (f, ch, prop) | |||
| 6401 | 6144 | ||
| 6402 | If MOUSE is non-zero, use the character's mouse-face, not its face. | 6145 | If MOUSE is non-zero, use the character's mouse-face, not its face. |
| 6403 | 6146 | ||
| 6404 | The face returned is suitable for displaying CHARSET_ASCII if | 6147 | The face returned is suitable for displaying ASCII characters. */ |
| 6405 | current_buffer->enable_multibyte_characters is non-nil. Otherwise, | ||
| 6406 | the face is suitable for displaying unibyte text. */ | ||
| 6407 | 6148 | ||
| 6408 | int | 6149 | int |
| 6409 | face_at_buffer_position (w, pos, region_beg, region_end, | 6150 | face_at_buffer_position (w, pos, region_beg, region_end, |
| @@ -6478,10 +6219,7 @@ face_at_buffer_position (w, pos, region_beg, region_end, | |||
| 6478 | /* Optimize common cases where we can use the default face. */ | 6219 | /* Optimize common cases where we can use the default face. */ |
| 6479 | if (noverlays == 0 | 6220 | if (noverlays == 0 |
| 6480 | && NILP (prop) | 6221 | && NILP (prop) |
| 6481 | && !(pos >= region_beg && pos < region_end) | 6222 | && !(pos >= region_beg && pos < region_end)) |
| 6482 | && (multibyte_p | ||
| 6483 | || !FRAME_WINDOW_P (f) | ||
| 6484 | || FACE_SUITABLE_FOR_CHARSET_P (default_face, -1))) | ||
| 6485 | return DEFAULT_FACE_ID; | 6223 | return DEFAULT_FACE_ID; |
| 6486 | 6224 | ||
| 6487 | /* Begin with attributes from the default face. */ | 6225 | /* Begin with attributes from the default face. */ |
| @@ -6521,13 +6259,13 @@ face_at_buffer_position (w, pos, region_beg, region_end, | |||
| 6521 | *endptr = endpos; | 6259 | *endptr = endpos; |
| 6522 | 6260 | ||
| 6523 | /* Look up a realized face with the given face attributes, | 6261 | /* Look up a realized face with the given face attributes, |
| 6524 | or realize a new one. Charset is ignored for tty frames. */ | 6262 | or realize a new one for ASCII characters. */ |
| 6525 | return lookup_face (f, attrs, multibyte_p ? CHARSET_ASCII : -1); | 6263 | return lookup_face (f, attrs, 0, NULL); |
| 6526 | } | 6264 | } |
| 6527 | 6265 | ||
| 6528 | 6266 | ||
| 6529 | /* Compute the face at character position POS in Lisp string STRING on | 6267 | /* Compute the face at character position POS in Lisp string STRING on |
| 6530 | window W, for charset CHARSET_ASCII. | 6268 | window W, for ASCII characters. |
| 6531 | 6269 | ||
| 6532 | If STRING is an overlay string, it comes from position BUFPOS in | 6270 | If STRING is an overlay string, it comes from position BUFPOS in |
| 6533 | current_buffer, otherwise BUFPOS is zero to indicate that STRING is | 6271 | current_buffer, otherwise BUFPOS is zero to indicate that STRING is |
| @@ -6543,8 +6281,7 @@ face_at_buffer_position (w, pos, region_beg, region_end, | |||
| 6543 | string. | 6281 | string. |
| 6544 | 6282 | ||
| 6545 | Value is the id of the face to use. The face returned is suitable | 6283 | Value is the id of the face to use. The face returned is suitable |
| 6546 | for displaying CHARSET_ASCII if STRING is multibyte. Otherwise, | 6284 | for displaying ASCII characters. */ |
| 6547 | the face is suitable for displaying unibyte text. */ | ||
| 6548 | 6285 | ||
| 6549 | int | 6286 | int |
| 6550 | face_at_string_position (w, string, pos, bufpos, region_beg, | 6287 | face_at_string_position (w, string, pos, bufpos, region_beg, |
| @@ -6597,7 +6334,7 @@ face_at_string_position (w, string, pos, bufpos, region_beg, | |||
| 6597 | if we don't have fonts, so we can stop here if not working | 6334 | if we don't have fonts, so we can stop here if not working |
| 6598 | on a window-system frame. */ | 6335 | on a window-system frame. */ |
| 6599 | || !FRAME_WINDOW_P (f) | 6336 | || !FRAME_WINDOW_P (f) |
| 6600 | || FACE_SUITABLE_FOR_CHARSET_P (base_face, -1))) | 6337 | || FACE_SUITABLE_FOR_CHAR_P (base_face, 0))) |
| 6601 | return base_face->id; | 6338 | return base_face->id; |
| 6602 | 6339 | ||
| 6603 | /* Begin with attributes from the base face. */ | 6340 | /* Begin with attributes from the base face. */ |
| @@ -6617,8 +6354,8 @@ face_at_string_position (w, string, pos, bufpos, region_beg, | |||
| 6617 | } | 6354 | } |
| 6618 | 6355 | ||
| 6619 | /* Look up a realized face with the given face attributes, | 6356 | /* Look up a realized face with the given face attributes, |
| 6620 | or realize a new one. */ | 6357 | or realize a new one for ASCII characters. */ |
| 6621 | return lookup_face (f, attrs, multibyte_p ? CHARSET_ASCII : -1); | 6358 | return lookup_face (f, attrs, 0, NULL); |
| 6622 | } | 6359 | } |
| 6623 | 6360 | ||
| 6624 | 6361 | ||
| @@ -6819,8 +6556,6 @@ syms_of_xfaces () | |||
| 6819 | Qunspecified = intern ("unspecified"); | 6556 | Qunspecified = intern ("unspecified"); |
| 6820 | staticpro (&Qunspecified); | 6557 | staticpro (&Qunspecified); |
| 6821 | 6558 | ||
| 6822 | Qx_charset_registry = intern ("x-charset-registry"); | ||
| 6823 | staticpro (&Qx_charset_registry); | ||
| 6824 | Qface_alias = intern ("face-alias"); | 6559 | Qface_alias = intern ("face-alias"); |
| 6825 | staticpro (&Qface_alias); | 6560 | staticpro (&Qface_alias); |
| 6826 | Qdefault = intern ("default"); | 6561 | Qdefault = intern ("default"); |
| @@ -6889,12 +6624,6 @@ instead of shades of gray for a face background color.\n\ | |||
| 6889 | See `set-face-stipple' for possible values for this variable."); | 6624 | See `set-face-stipple' for possible values for this variable."); |
| 6890 | Vface_default_stipple = build_string ("gray3"); | 6625 | Vface_default_stipple = build_string ("gray3"); |
| 6891 | 6626 | ||
| 6892 | DEFVAR_LISP ("face-default-registry", &Vface_default_registry, | ||
| 6893 | "Default registry and encoding to use.\n\ | ||
| 6894 | This registry and encoding is used for unibyte text. It is set up\n\ | ||
| 6895 | from the specified frame font when Emacs starts. (For internal use only.)"); | ||
| 6896 | Vface_default_registry = Qnil; | ||
| 6897 | |||
| 6898 | DEFVAR_LISP ("face-alternative-font-family-alist", | 6627 | DEFVAR_LISP ("face-alternative-font-family-alist", |
| 6899 | &Vface_alternative_font_family_alist, ""); | 6628 | &Vface_alternative_font_family_alist, ""); |
| 6900 | Vface_alternative_font_family_alist = Qnil; | 6629 | Vface_alternative_font_family_alist = Qnil; |