annotate src/xfont.c @ 96627:ae085a544367

Use more correct IPA characters for English pronunciation. Add the combining acute accent after the accented vowel in the Russian example like it is used in dictionaries.
author Juri Linkov <juri@jurta.org>
date Sat, 12 Jul 2008 20:41:45 +0000
parents 2c94c05f0d89
children fb9629443416
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1 /* xfont.c -- X core font driver.
91554
8d25c5588e59 Update copyright years and GPL version.
Glenn Morris <rgm@gnu.org>
parents: 91270
diff changeset
2 Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
8d25c5588e59 Update copyright years and GPL version.
Glenn Morris <rgm@gnu.org>
parents: 91270
diff changeset
3 Copyright (C) 2006, 2007, 2008
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
4 National Institute of Advanced Industrial Science and Technology (AIST)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
5 Registration Number H13PRO009
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
6
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
7 This file is part of GNU Emacs.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
8
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94940
diff changeset
9 GNU Emacs is free software: you can redistribute it and/or modify
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
10 it under the terms of the GNU General Public License as published by
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94940
diff changeset
11 the Free Software Foundation, either version 3 of the License, or
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94940
diff changeset
12 (at your option) any later version.
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
13
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
14 GNU Emacs is distributed in the hope that it will be useful,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
17 GNU General Public License for more details.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
18
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94940
diff changeset
20 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
21
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
22 #include <config.h>
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
23 #include <stdio.h>
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
24 #include <stdlib.h>
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
25 #include <X11/Xlib.h>
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
26
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
27 #include "lisp.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
28 #include "dispextern.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
29 #include "xterm.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
30 #include "frame.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
31 #include "blockinput.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
32 #include "character.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
33 #include "charset.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
34 #include "fontset.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
35 #include "font.h"
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
36 #include "ccl.h"
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
37
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
38
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
39 /* X core font driver. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
40
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
41 struct xfont_info
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
42 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
43 struct font font;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
44 Display *display;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
45 XFontStruct *xfont;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
46 };
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
47
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
48 /* Prototypes of support functions. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
49 extern void x_clear_errors P_ ((Display *));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
50
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
51 static XCharStruct *xfont_get_pcm P_ ((XFontStruct *, XChar2b *));
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
52 static void xfont_find_ccl_program P_ ((struct font *));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
53
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
54 /* Get metrics of character CHAR2B in XFONT. Value is null if CHAR2B
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
55 is not contained in the font. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
56
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
57 static XCharStruct *
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
58 xfont_get_pcm (xfont, char2b)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
59 XFontStruct *xfont;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
60 XChar2b *char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
61 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
62 /* The result metric information. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
63 XCharStruct *pcm = NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
64
95180
1520d3ef2a48 (xfont_get_pcm): Change xassert to font_assert.
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
65 font_assert (xfont && char2b);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
66
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
67 if (xfont->per_char != NULL)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
68 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
69 if (xfont->min_byte1 == 0 && xfont->max_byte1 == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
70 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
71 /* min_char_or_byte2 specifies the linear character index
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
72 corresponding to the first element of the per_char array,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
73 max_char_or_byte2 is the index of the last character. A
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
74 character with non-zero CHAR2B->byte1 is not in the font.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
75 A character with byte2 less than min_char_or_byte2 or
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
76 greater max_char_or_byte2 is not in the font. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
77 if (char2b->byte1 == 0
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
78 && char2b->byte2 >= xfont->min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
79 && char2b->byte2 <= xfont->max_char_or_byte2)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
80 pcm = xfont->per_char + char2b->byte2 - xfont->min_char_or_byte2;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
81 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
82 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
83 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
84 /* If either min_byte1 or max_byte1 are nonzero, both
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
85 min_char_or_byte2 and max_char_or_byte2 are less than
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
86 256, and the 2-byte character index values corresponding
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
87 to the per_char array element N (counting from 0) are:
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
88
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
89 byte1 = N/D + min_byte1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
90 byte2 = N\D + min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
91
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
92 where:
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
93
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
94 D = max_char_or_byte2 - min_char_or_byte2 + 1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
95 / = integer division
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
96 \ = integer modulus */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
97 if (char2b->byte1 >= xfont->min_byte1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
98 && char2b->byte1 <= xfont->max_byte1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
99 && char2b->byte2 >= xfont->min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
100 && char2b->byte2 <= xfont->max_char_or_byte2)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
101 pcm = (xfont->per_char
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
102 + ((xfont->max_char_or_byte2 - xfont->min_char_or_byte2 + 1)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
103 * (char2b->byte1 - xfont->min_byte1))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
104 + (char2b->byte2 - xfont->min_char_or_byte2));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
105 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
106 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
107 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
108 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
109 /* If the per_char pointer is null, all glyphs between the first
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
110 and last character indexes inclusive have the same
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
111 information, as given by both min_bounds and max_bounds. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
112 if (char2b->byte2 >= xfont->min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
113 && char2b->byte2 <= xfont->max_char_or_byte2)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
114 pcm = &xfont->max_bounds;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
115 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
116
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
117 return ((pcm == NULL
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
118 || (pcm->width == 0 && (pcm->rbearing - pcm->lbearing) == 0))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
119 ? NULL : pcm);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
120 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
121
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
122 /* Find a CCL program for a font specified by FONTP, and set the member
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
123 `encoder' of the structure. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
124
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
125 static void
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
126 xfont_find_ccl_program (font)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
127 struct font *font;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
128 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
129 Lisp_Object list, elt;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
130
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
131 elt = Qnil;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
132 for (list = Vfont_ccl_encoder_alist; CONSP (list); list = XCDR (list))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
133 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
134 elt = XCAR (list);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
135 if (CONSP (elt)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
136 && STRINGP (XCAR (elt))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
137 && ((fast_string_match_ignore_case (XCAR (elt),
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
138 font->props[FONT_NAME_INDEX])
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
139 >= 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
140 || (fast_string_match_ignore_case (XCAR (elt),
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
141 font->props[FONT_FULLNAME_INDEX])
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
142 >= 0)))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
143 break;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
144 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
145
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
146 if (! NILP (list))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
147 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
148 struct ccl_program *ccl
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
149 = (struct ccl_program *) xmalloc (sizeof (struct ccl_program));
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
150
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
151 if (setup_ccl_program (ccl, XCDR (elt)) < 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
152 xfree (ccl);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
153 else
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
154 font->font_encoder = ccl;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
155 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
156 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
157
91245
26541bdcecd0 (xfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents: 91177
diff changeset
158 static Lisp_Object xfont_get_cache P_ ((FRAME_PTR));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
159 static Lisp_Object xfont_list P_ ((Lisp_Object, Lisp_Object));
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
160 static Lisp_Object xfont_match P_ ((Lisp_Object, Lisp_Object));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
161 static Lisp_Object xfont_list_family P_ ((Lisp_Object));
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
162 static Lisp_Object xfont_open P_ ((FRAME_PTR, Lisp_Object, int));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
163 static void xfont_close P_ ((FRAME_PTR, struct font *));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
164 static int xfont_prepare_face P_ ((FRAME_PTR, struct face *));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
165 static int xfont_has_char P_ ((Lisp_Object, int));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
166 static unsigned xfont_encode_char P_ ((struct font *, int));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
167 static int xfont_text_extents P_ ((struct font *, unsigned *, int,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
168 struct font_metrics *));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
169 static int xfont_draw P_ ((struct glyph_string *, int, int, int, int, int));
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
170 static int xfont_check P_ ((FRAME_PTR, struct font *));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
171
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
172 struct font_driver xfont_driver =
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
173 {
90698
a31984e21969 (xfont_driver): Initialize ftfont_driver.type by 0.
Kenichi Handa <handa@m17n.org>
parents: 90679
diff changeset
174 0, /* Qx */
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
175 0, /* case insensitive */
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
176 xfont_get_cache,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
177 xfont_list,
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
178 xfont_match,
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
179 xfont_list_family,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
180 NULL,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
181 xfont_open,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
182 xfont_close,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
183 xfont_prepare_face,
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
184 NULL,
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
185 xfont_has_char,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
186 xfont_encode_char,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
187 xfont_text_extents,
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
188 xfont_draw,
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
189 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
190 xfont_check
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
191 };
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
192
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
193 extern Lisp_Object QCname;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
194
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
195 static Lisp_Object
91245
26541bdcecd0 (xfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents: 91177
diff changeset
196 xfont_get_cache (f)
26541bdcecd0 (xfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents: 91177
diff changeset
197 FRAME_PTR f;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
198 {
91245
26541bdcecd0 (xfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents: 91177
diff changeset
199 Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
200
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
201 return (dpyinfo->name_list_element);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
202 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
203
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
204 extern Lisp_Object Vface_alternative_font_registry_alist;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
205
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
206 static int
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
207 compare_font_names (const void *name1, const void *name2)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
208 {
95568
4fec6e274c04 (xfont_list): Don't set registry to iso8859-1 even if it
Kenichi Handa <handa@m17n.org>
parents: 95503
diff changeset
209 return xstrcasecmp (*(const unsigned char **) name1,
4fec6e274c04 (xfont_list): Don't set registry to iso8859-1 even if it
Kenichi Handa <handa@m17n.org>
parents: 95503
diff changeset
210 *(const unsigned char **) name2);
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
211 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
212
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
213 static Lisp_Object xfont_list_pattern P_ ((Lisp_Object, Display *, char *));
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
214
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
215 static Lisp_Object
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
216 xfont_list_pattern (frame, display, pattern)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
217 Lisp_Object frame;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
218 Display *display;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
219 char *pattern;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
220 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
221 Lisp_Object list = Qnil;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
222 int i, limit, num_fonts;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
223 char **names;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
224
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
225 BLOCK_INPUT;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
226 x_catch_errors (display);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
227
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
228 for (limit = 512; ; limit *= 2)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
229 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
230 names = XListFonts (display, pattern, limit, &num_fonts);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
231 if (x_had_errors_p (display))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
232 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
233 /* This error is perhaps due to insufficient memory on X
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
234 server. Let's just ignore it. */
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
235 x_clear_errors (display);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
236 num_fonts = 0;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
237 break;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
238 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
239 if (num_fonts < limit)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
240 break;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
241 XFreeFontNames (names);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
242 }
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
243
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
244 if (num_fonts > 0)
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
245 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
246 char **indices = alloca (sizeof (char *) * num_fonts);
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
247
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
248 for (i = 0; i < num_fonts; i++)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
249 indices[i] = names[i];
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
250 qsort (indices, num_fonts, sizeof (char *), compare_font_names);
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
251
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
252 for (i = 0; i < num_fonts; i++)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
253 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
254 Lisp_Object entity;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
255 int result;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
256
95222
005a1655f51e * dispextern.h, xfaces.c (xstrcasecmp): Renamed from xstricmp.
Jason Rumney <jasonr@gnu.org>
parents: 95202
diff changeset
257 if (i > 0 && xstrcasecmp (indices[i - 1], indices[i]) == 0)
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
258 continue;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
259
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
260 entity = font_make_entity ();
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
261 ASET (entity, FONT_TYPE_INDEX, Qx);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
262
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
263 result = font_parse_xlfd (indices[i], entity);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
264 if (result < 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
265 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
266 /* This may be an alias name. Try to get the full XLFD name
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
267 from XA_FONT property of the font. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
268 XFontStruct *font = XLoadQueryFont (display, indices[i]);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
269 unsigned long value;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
270
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
271 if (! font)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
272 continue;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
273 if (XGetFontProperty (font, XA_FONT, &value))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
274 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
275 char *name = (char *) XGetAtomName (display, (Atom) value);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
276 int len = strlen (name);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
277
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
278 /* If DXPC (a Differential X Protocol Compressor)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
279 Ver.3.7 is running, XGetAtomName will return null
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
280 string. We must avoid such a name. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
281 if (len > 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
282 result = font_parse_xlfd (name, entity);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
283 XFree (name);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
284 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
285 XFreeFont (display, font);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
286 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
287
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
288 if (result == 0
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
289 /* Avoid auto-scaled fonts. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
290 && (XINT (AREF (entity, FONT_DPI_INDEX)) == 0
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
291 || XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) > 0))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
292 list = Fcons (entity, list);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
293 }
95227
6df485632f28 (xfont_list_pattern): Free names returned from XListFonts.
Kenichi Handa <handa@m17n.org>
parents: 95222
diff changeset
294 XFreeFontNames (names);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
295 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
296
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
297 x_uncatch_errors ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
298 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
299
95180
1520d3ef2a48 (xfont_get_pcm): Change xassert to font_assert.
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
300 font_add_log ("xfont-list", build_string (pattern), list);
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
301 return list;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
302 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
303
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
304 static Lisp_Object
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
305 xfont_list (frame, spec)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
306 Lisp_Object frame, spec;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
307 {
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
308 FRAME_PTR f = XFRAME (frame);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
309 Display *display = FRAME_X_DISPLAY_INFO (f)->display;
95180
1520d3ef2a48 (xfont_get_pcm): Change xassert to font_assert.
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
310 Lisp_Object registry, list, val, extra;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
311 int len;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
312 char name[256];
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
313
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
314 extra = AREF (spec, FONT_EXTRA_INDEX);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
315 if (CONSP (extra))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
316 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
317 val = assq_no_quit (QCotf, extra);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
318 if (! NILP (val))
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
319 return Qnil;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
320 val = assq_no_quit (QCscript, extra);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
321 if (! NILP (val))
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
322 return Qnil;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
323 val = assq_no_quit (QClang, extra);
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
324 if (! NILP (val))
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
325 return Qnil;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
326 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
327
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
328 registry = AREF (spec, FONT_REGISTRY_INDEX);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
329 len = font_unparse_xlfd (spec, 0, name, 256);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
330 ASET (spec, FONT_REGISTRY_INDEX, registry);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
331 if (len < 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
332 return Qnil;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
333 list = xfont_list_pattern (frame, display, name);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
334 if (NILP (list) && NILP (registry))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
335 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
336 /* Try iso10646-1 */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
337 char *r = name + len - 9; /* 9 == strlen (iso8859-1) */
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
338
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
339 if (r - name + 10 < 256) /* 10 == strlen (iso10646-1) */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
340 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
341 strcpy (r, "iso10646-1");
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
342 list = xfont_list_pattern (frame, display, name);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
343 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
344 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
345 if (NILP (list) && ! NILP (registry))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
346 {
95503
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
347 /* Try alternate registries. */
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
348 Lisp_Object alter;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
349
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
350 if ((alter = Fassoc (SYMBOL_NAME (registry),
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
351 Vface_alternative_font_registry_alist),
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
352 CONSP (alter)))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
353 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
354 /* Pointer to REGISTRY-ENCODING field. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
355 char *r = name + len - SBYTES (SYMBOL_NAME (registry));
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
356
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
357 for (alter = XCDR (alter); CONSP (alter); alter = XCDR (alter))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
358 if (STRINGP (XCAR (alter))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
359 && ((r - name) + SBYTES (XCAR (alter))) < 256)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
360 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
361 strcpy (r, (char *) SDATA (XCAR (alter)));
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
362 list = xfont_list_pattern (frame, display, name);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
363 if (! NILP (list))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
364 break;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
365 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
366 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
367 }
95503
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
368 if (NILP (list))
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
369 {
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
370 /* Try alias. */
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
371 val = assq_no_quit (QCname, AREF (spec, FONT_EXTRA_INDEX));
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
372 if (CONSP (val) && STRINGP (XCDR (val)))
95568
4fec6e274c04 (xfont_list): Don't set registry to iso8859-1 even if it
Kenichi Handa <handa@m17n.org>
parents: 95503
diff changeset
373 list = xfont_list_pattern (frame, display, (char *) SDATA (XCDR (val)));
95503
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
374 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
375
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
376 return list;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
377 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
378
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
379 static Lisp_Object
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
380 xfont_match (frame, spec)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
381 Lisp_Object frame, spec;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
382 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
383 FRAME_PTR f = XFRAME (frame);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
384 Display *display = FRAME_X_DISPLAY_INFO (f)->display;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
385 Lisp_Object extra, val, entity;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
386 char buf[256], *name;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
387 XFontStruct *xfont;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
388 unsigned long value;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
389
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
390 extra = AREF (spec, FONT_EXTRA_INDEX);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
391 val = assq_no_quit (QCname, extra);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
392 if (! CONSP (val) || ! STRINGP (XCDR (val)))
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
393 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
394 if (font_unparse_xlfd (spec, 0, buf, 256) < 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
395 return Qnil;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
396 name = buf;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
397 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
398 else
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
399 name = (char *) SDATA (XCDR (val));
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
400
90569
0af2dbdeaeb3 (xfont_match): Block and unblock input while callin Xlib.
Kenichi Handa <handa@m17n.org>
parents: 90561
diff changeset
401 BLOCK_INPUT;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
402 entity = Qnil;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
403 xfont = XLoadQueryFont (display, name);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
404 if (xfont)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
405 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
406 if (XGetFontProperty (xfont, XA_FONT, &value))
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
407 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
408 int len;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
409
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
410 name = (char *) XGetAtomName (display, (Atom) value);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
411 len = strlen (name);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
412
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
413 /* If DXPC (a Differential X Protocol Compressor)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
414 Ver.3.7 is running, XGetAtomName will return null
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
415 string. We must avoid such a name. */
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
416 if (len > 0)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
417 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
418 entity = font_make_entity ();
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
419 ASET (entity, FONT_TYPE_INDEX, Qx);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
420 if (font_parse_xlfd (name, entity) < 0)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
421 entity = Qnil;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
422 }
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
423 XFree (name);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
424 }
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
425 XFreeFont (display, xfont);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
426 }
90569
0af2dbdeaeb3 (xfont_match): Block and unblock input while callin Xlib.
Kenichi Handa <handa@m17n.org>
parents: 90561
diff changeset
427 UNBLOCK_INPUT;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
428
95180
1520d3ef2a48 (xfont_get_pcm): Change xassert to font_assert.
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
429 font_add_log ("xfont-match", spec, entity);
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
430 return entity;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
431 }
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
432
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
433 static Lisp_Object
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
434 xfont_list_family (frame)
90443
57b847825c30 (xfont_list): If script is specified for a font, return
Kenichi Handa <handa@m17n.org>
parents: 90427
diff changeset
435 Lisp_Object frame;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
436 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
437 FRAME_PTR f = XFRAME (frame);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
438 Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
439 char **names;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
440 int num_fonts, i;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
441 Lisp_Object list;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
442 char *last_family;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
443 int last_len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
444
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
445 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
446 x_catch_errors (dpyinfo->display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
447 names = XListFonts (dpyinfo->display, "-*-*-*-*-*-*-*-*-*-*-*-*-*-*",
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
448 0x8000, &num_fonts);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
449 if (x_had_errors_p (dpyinfo->display))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
450 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
451 /* This error is perhaps due to insufficient memory on X server.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
452 Let's just ignore it. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
453 x_clear_errors (dpyinfo->display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
454 num_fonts = 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
455 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
456
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
457 list = Qnil;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
458 for (i = 0, last_len = 0; i < num_fonts; i++)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
459 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
460 char *p0 = names[i], *p1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
461 Lisp_Object family;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
462
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
463 p0++; /* skip the leading '-' */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
464 while (*p0 && *p0 != '-') p0++; /* skip foundry */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
465 if (! *p0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
466 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
467 p1 = ++p0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
468 while (*p1 && *p1 != '-') p1++; /* find the end of family */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
469 if (! *p1 || p1 == p0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
470 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
471 if (last_len == p1 - p0
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
472 && bcmp (last_family, p0, last_len) == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
473 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
474 last_len = p1 - p0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
475 last_family = p0;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
476 family = make_unibyte_string (p0, last_len);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
477 if (NILP (Fassoc_string (family, list, Qt)))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
478 list = Fcons (family, list);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
479 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
480
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
481 XFreeFontNames (names);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
482 x_uncatch_errors ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
483 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
484
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
485 return list;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
486 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
487
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
488 extern Lisp_Object QCavgwidth;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
489
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
490 static Lisp_Object
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
491 xfont_open (f, entity, pixel_size)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
492 FRAME_PTR f;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
493 Lisp_Object entity;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
494 int pixel_size;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
495 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
496 Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
497 Display *display = dpyinfo->display;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
498 char name[256];
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
499 int len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
500 unsigned long value;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
501 Lisp_Object registry;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
502 struct charset *encoding, *repertory;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
503 Lisp_Object font_object, fullname;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
504 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
505 XFontStruct *xfont;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
506 int i;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
507
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
508 /* At first, check if we know how to encode characters for this
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
509 font. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
510 registry = AREF (entity, FONT_REGISTRY_INDEX);
91142
4bcf0716ddf4 * xfont.c (x_font_charset_alist): Moved to font.c and renamed.
Kenichi Handa <handa@m17n.org>
parents: 90698
diff changeset
511 if (font_registry_charsets (registry, &encoding, &repertory) < 0)
96575
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
512 {
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
513 font_add_log (" x:unknown registry", registry, Qnil);
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
514 return Qnil;
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
515 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
516
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
517 if (XINT (AREF (entity, FONT_SIZE_INDEX)) != 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
518 pixel_size = XINT (AREF (entity, FONT_SIZE_INDEX));
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
519 else if (pixel_size == 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
520 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
521 if (FRAME_FONT (f))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
522 pixel_size = FRAME_FONT (f)->pixel_size;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
523 else
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
524 pixel_size = 14;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
525 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
526 len = font_unparse_xlfd (entity, pixel_size, name, 256);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
527 if (len <= 0)
96575
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
528 {
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
529 font_add_log (" x:unparse failed", entity, Qnil);
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
530 return Qnil;
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
531 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
532
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
533 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
534 x_catch_errors (display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
535 xfont = XLoadQueryFont (display, name);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
536 if (x_had_errors_p (display))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
537 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
538 /* This error is perhaps due to insufficient memory on X server.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
539 Let's just ignore it. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
540 x_clear_errors (display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
541 xfont = NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
542 }
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
543 fullname = Qnil;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
544 /* Try to get the full name of FONT. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
545 if (xfont && XGetFontProperty (xfont, XA_FONT, &value))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
546 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
547 char *p0, *p;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
548 int dashes = 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
549
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
550 p0 = p = (char *) XGetAtomName (FRAME_X_DISPLAY (f), (Atom) value);;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
551 /* Count the number of dashes in the "full name".
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
552 If it is too few, this isn't really the font's full name,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
553 so don't use it.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
554 In X11R4, the fonts did not come with their canonical names
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
555 stored in them. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
556 while (*p)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
557 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
558 if (*p == '-')
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
559 dashes++;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
560 p++;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
561 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
562
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
563 if (dashes >= 13)
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
564 fullname = Fdowncase (make_unibyte_string (p0, p - p0));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
565 XFree (p0);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
566 }
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
567 x_uncatch_errors ();
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
568 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
569
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
570 if (! xfont)
96575
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
571 {
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
572 font_add_log (" x:open failed", build_string (name), Qnil);
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
573 return Qnil;
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
574 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
575
96560
d87a9f1b9378 (xfont_open): Adjust it for the change of
Kenichi Handa <handa@m17n.org>
parents: 95568
diff changeset
576 font_object = font_make_object (VECSIZE (struct xfont_info),
d87a9f1b9378 (xfont_open): Adjust it for the change of
Kenichi Handa <handa@m17n.org>
parents: 95568
diff changeset
577 entity, pixel_size);
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
578 ASET (font_object, FONT_TYPE_INDEX, Qx);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
579 if (STRINGP (fullname))
95180
1520d3ef2a48 (xfont_get_pcm): Change xassert to font_assert.
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
580 font_parse_xlfd ((char *) SDATA (fullname), font_object);
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
581 if (STRINGP (fullname))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
582 ASET (font_object, FONT_NAME_INDEX, fullname);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
583 else
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
584 ASET (font_object, FONT_NAME_INDEX, make_unibyte_string (name, len));
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
585 ASET (font_object, FONT_FULLNAME_INDEX, fullname);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
586 ASET (font_object, FONT_FILE_INDEX, Qnil);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
587 ASET (font_object, FONT_FORMAT_INDEX, Qx);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
588 font = XFONT_OBJECT (font_object);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
589 ((struct xfont_info *) font)->xfont = xfont;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
590 ((struct xfont_info *) font)->display = FRAME_X_DISPLAY (f);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
591 font->pixel_size = pixel_size;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
592 font->driver = &xfont_driver;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
593 font->encoding_charset = encoding->id;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
594 font->repertory_charset = repertory ? repertory->id : -1;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
595 font->ascent = xfont->ascent;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
596 font->descent = xfont->descent;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
597 font->height = font->ascent + font->descent;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
598 font->min_width = xfont->min_bounds.width;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
599 if (xfont->min_bounds.width == xfont->max_bounds.width)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
600 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
601 /* Fixed width font. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
602 font->average_width = font->space_width = xfont->min_bounds.width;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
603 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
604 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
605 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
606 XCharStruct *pcm;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
607 XChar2b char2b;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
608 Lisp_Object val;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
609
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
610 char2b.byte1 = 0x00, char2b.byte2 = 0x20;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
611 pcm = xfont_get_pcm (xfont, &char2b);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
612 if (pcm)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
613 font->space_width = pcm->width;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
614 else
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
615 font->space_width = 0;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
616
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
617 val = Ffont_get (font_object, QCavgwidth);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
618 if (INTEGERP (val))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
619 font->average_width = XINT (val);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
620 if (font->average_width < 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
621 font->average_width = - font->average_width;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
622 if (font->average_width == 0
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
623 && encoding->ascii_compatible_p)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
624 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
625 int width = font->space_width, n = pcm != NULL;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
626
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
627 for (char2b.byte2 = 33; char2b.byte2 <= 126; char2b.byte2++)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
628 if ((pcm = xfont_get_pcm (xfont, &char2b)) != NULL)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
629 width += pcm->width, n++;
95330
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
630 if (n > 0)
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
631 font->average_width = width / n;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
632 }
95330
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
633 if (font->average_width == 0)
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
634 /* No easy way other than this to get a reasonable
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
635 average_width. */
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
636 font->average_width
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
637 = (xfont->min_bounds.width + xfont->max_bounds.width) / 2;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
638 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
639
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
640 BLOCK_INPUT;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
641 font->underline_thickness
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
642 = (XGetFontProperty (xfont, XA_UNDERLINE_THICKNESS, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
643 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
644 font->underline_position
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
645 = (XGetFontProperty (xfont, XA_UNDERLINE_POSITION, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
646 ? (long) value : -1);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
647 font->baseline_offset
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
648 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_BASELINE_OFFSET, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
649 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
650 font->relative_compose
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
651 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_RELATIVE_COMPOSE, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
652 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
653 font->default_ascent
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
654 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_DEFAULT_ASCENT, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
655 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
656 UNBLOCK_INPUT;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
657
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
658 if (NILP (fullname))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
659 fullname = AREF (font_object, FONT_NAME_INDEX);
96566
dec3815c40d7 (xfont_open): Cancel the previous about font->vertical_centering.
Kenichi Handa <handa@m17n.org>
parents: 96560
diff changeset
660 font->vertical_centering
dec3815c40d7 (xfont_open): Cancel the previous about font->vertical_centering.
Kenichi Handa <handa@m17n.org>
parents: 96560
diff changeset
661 = (STRINGP (Vvertical_centering_font_regexp)
dec3815c40d7 (xfont_open): Cancel the previous about font->vertical_centering.
Kenichi Handa <handa@m17n.org>
parents: 96560
diff changeset
662 && (fast_string_match_ignore_case
dec3815c40d7 (xfont_open): Cancel the previous about font->vertical_centering.
Kenichi Handa <handa@m17n.org>
parents: 96560
diff changeset
663 (Vvertical_centering_font_regexp, fullname) >= 0));
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
664
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
665 return font_object;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
666 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
667
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
668 static void
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
669 xfont_close (f, font)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
670 FRAME_PTR f;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
671 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
672 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
673 BLOCK_INPUT;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
674 XFreeFont (FRAME_X_DISPLAY (f), ((struct xfont_info *) font)->xfont);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
675 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
676 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
677
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
678 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
679 xfont_prepare_face (f, face)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
680 FRAME_PTR f;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
681 struct face *face;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
682 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
683 BLOCK_INPUT;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
684 XSetFont (FRAME_X_DISPLAY (f), face->gc,
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
685 ((struct xfont_info *) face->font)->xfont->fid);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
686 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
687
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
688 return 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
689 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
690
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
691 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
692 xfont_has_char (entity, c)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
693 Lisp_Object entity;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
694 int c;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
695 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
696 Lisp_Object registry = AREF (entity, FONT_REGISTRY_INDEX);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
697 struct charset *repertory;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
698
91142
4bcf0716ddf4 * xfont.c (x_font_charset_alist): Moved to font.c and renamed.
Kenichi Handa <handa@m17n.org>
parents: 90698
diff changeset
699 if (font_registry_charsets (registry, NULL, &repertory) < 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
700 return -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
701 if (! repertory)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
702 return -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
703 return (ENCODE_CHAR (repertory, c) != CHARSET_INVALID_CODE (repertory));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
704 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
705
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
706 static unsigned
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
707 xfont_encode_char (font, c)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
708 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
709 int c;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
710 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
711 XFontStruct *xfont = ((struct xfont_info *) font)->xfont;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
712 struct charset *charset;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
713 unsigned code;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
714 XChar2b char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
715
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
716 charset = CHARSET_FROM_ID (font->encoding_charset);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
717 code = ENCODE_CHAR (charset, c);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
718 if (code == CHARSET_INVALID_CODE (charset))
91270
0dab56b22dca (xfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents: 91245
diff changeset
719 return FONT_INVALID_CODE;
90454
a8b745412821 (xfont_open, xfont_encode_char): Fix typo.
Kenichi Handa <handa@m17n.org>
parents: 90443
diff changeset
720 if (font->repertory_charset >= 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
721 {
90454
a8b745412821 (xfont_open, xfont_encode_char): Fix typo.
Kenichi Handa <handa@m17n.org>
parents: 90443
diff changeset
722 charset = CHARSET_FROM_ID (font->repertory_charset);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
723 return (ENCODE_CHAR (charset, c) != CHARSET_INVALID_CODE (charset)
91270
0dab56b22dca (xfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents: 91245
diff changeset
724 ? code : FONT_INVALID_CODE);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
725 }
90425
5976e428d68e (xfont_encode_char): Fix calculation of char2b.
Kenichi Handa <handa@m17n.org>
parents: 90400
diff changeset
726 char2b.byte1 = code >> 8;
5976e428d68e (xfont_encode_char): Fix calculation of char2b.
Kenichi Handa <handa@m17n.org>
parents: 90400
diff changeset
727 char2b.byte2 = code & 0xFF;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
728 return (xfont_get_pcm (xfont, &char2b) ? code : FONT_INVALID_CODE);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
729 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
730
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
731 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
732 xfont_text_extents (font, code, nglyphs, metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
733 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
734 unsigned *code;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
735 int nglyphs;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
736 struct font_metrics *metrics;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
737 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
738 XFontStruct *xfont = ((struct xfont_info *) font)->xfont;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
739 int width = 0;
96570
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
740 int i, first, x;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
741
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
742 if (metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
743 bzero (metrics, sizeof (struct font_metrics));
96570
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
744 for (i = 0, x = 0, first = 1; i < nglyphs; i++)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
745 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
746 XChar2b char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
747 static XCharStruct *pcm;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
748
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
749 if (code[i] >= 0x10000)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
750 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
751 char2b.byte1 = code[i] >> 8, char2b.byte2 = code[i] & 0xFF;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
752 pcm = xfont_get_pcm (xfont, &char2b);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
753 if (! pcm)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
754 continue;
96570
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
755 if (first)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
756 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
757 if (metrics)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
758 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
759 metrics->lbearing = pcm->lbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
760 metrics->rbearing = pcm->rbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
761 metrics->ascent = pcm->ascent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
762 metrics->descent = pcm->descent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
763 }
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
764 first = 0;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
765 }
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
766 else
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
767 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
768 if (metrics)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
769 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
770 if (metrics->lbearing > width + pcm->lbearing)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
771 metrics->lbearing = width + pcm->lbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
772 if (metrics->rbearing < width + pcm->rbearing)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
773 metrics->rbearing = width + pcm->rbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
774 if (metrics->ascent < pcm->ascent)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
775 metrics->ascent = pcm->ascent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
776 if (metrics->descent < pcm->descent)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
777 metrics->descent = pcm->descent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
778 }
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
779 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
780 width += pcm->width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
781 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
782 if (metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
783 metrics->width = width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
784 return width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
785 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
786
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
787 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
788 xfont_draw (s, from, to, x, y, with_background)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
789 struct glyph_string *s;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
790 int from, to, x, y, with_background;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
791 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
792 XFontStruct *xfont = ((struct xfont_info *) s->font)->xfont;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
793 int len = to - from;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
794 GC gc = s->gc;
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
795 int i;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
796
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
797 if (s->gc != s->face->gc)
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
798 {
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
799 BLOCK_INPUT;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
800 XSetFont (s->display, gc, xfont->fid);
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
801 UNBLOCK_INPUT;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
802 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
803
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
804 if (xfont->min_byte1 == 0 && xfont->max_byte1 == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
805 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
806 char *str;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
807 USE_SAFE_ALLOCA;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
808
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
809 SAFE_ALLOCA (str, char *, len);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
810 for (i = 0; i < len ; i++)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
811 str[i] = XCHAR2B_BYTE2 (s->char2b + from + i);
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
812 BLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
813 if (with_background > 0)
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
814 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
815 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
816 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
817 XDrawImageString (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
818 gc, x + i, y, str + i, 1);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
819 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
820 XDrawImageString (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
821 gc, x, y, str, len);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
822 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
823 else
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
824 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
825 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
826 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
827 XDrawString (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
828 gc, x + i, y, str + i, 1);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
829 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
830 XDrawString (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
831 gc, x, y, str, len);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
832 }
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
833 UNBLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
834 SAFE_FREE ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
835 return s->nchars;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
836 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
837
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
838 BLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
839 if (with_background > 0)
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
840 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
841 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
842 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
843 XDrawImageString16 (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
844 gc, x + i, y, s->char2b + from + i, 1);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
845 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
846 XDrawImageString16 (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
847 gc, x, y, s->char2b + from, len);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
848 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
849 else
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
850 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
851 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
852 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
853 XDrawString16 (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
854 gc, x + i, y, s->char2b + from + i, 1);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
855 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
856 XDrawString16 (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
857 gc, x, y, s->char2b + from, len);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
858 }
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
859 UNBLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
860
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
861 return len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
862 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
863
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
864 static int
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
865 xfont_check (f, font)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
866 FRAME_PTR f;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
867 struct font *font;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
868 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
869 struct xfont_info *xfont = (struct xfont_info *) font;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
870
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
871 return (FRAME_X_DISPLAY (f) == xfont->display ? 0 : -1);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
872 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
873
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
874
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
875 void
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
876 syms_of_xfont ()
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
877 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
878 xfont_driver.type = Qx;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
879 register_font_driver (&xfont_driver, NULL);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
880 }
90427
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
881
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
882 /* arch-tag: 23c5f366-a5ee-44b7-a3b7-90d6da7fd749
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
883 (do not change this comment) */