annotate src/xfont.c @ 100141:7512f1d3a1cb

(pmail-summary-goto-msg): Use pmail-show-message-maybe.
author Chong Yidong <cyd@stupidchicken.com>
date Wed, 03 Dec 2008 02:40:46 +0000
parents 53bcf54737b2
children e42552b2edda
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;
97327
53bcf54737b2 (xfont_list_family): Return a list of symbols, not
Kenichi Handa <handa@m17n.org>
parents: 96657
diff changeset
476 family = font_intern_prop (p0, last_len, 1);
53bcf54737b2 (xfont_list_family): Return a list of symbols, not
Kenichi Handa <handa@m17n.org>
parents: 96657
diff changeset
477 if (NILP (assq_no_quit (family, list)))
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 }
96657
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
543 else if (! xfont)
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
544 {
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
545 /* Some version of X lists:
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
546 -misc-fixed-medium-r-normal--20-*-75-75-c-100-iso8859-1
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
547 -misc-fixed-medium-r-normal--20-*-100-100-c-100-iso8859-1
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
548 but can open only:
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
549 -misc-fixed-medium-r-normal--20-*-100-100-c-100-iso8859-1
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
550 and
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
551 -misc-fixed-medium-r-normal--20-*-*-*-c-100-iso8859-1
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
552 So, we try again with wildcards in RESX and RESY. */
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
553 Lisp_Object temp;
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
554
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
555 temp = Fcopy_font_spec (entity);
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
556 ASET (temp, FONT_DPI_INDEX, Qnil);
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
557 len = font_unparse_xlfd (temp, pixel_size, name, 256);
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
558 if (len <= 0)
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
559 {
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
560 font_add_log (" x:unparse failed", temp, Qnil);
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
561 return Qnil;
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
562 }
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
563 xfont = XLoadQueryFont (display, name);
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
564 if (x_had_errors_p (display))
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
565 {
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
566 /* This error is perhaps due to insufficient memory on X server.
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
567 Let's just ignore it. */
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
568 x_clear_errors (display);
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
569 xfont = NULL;
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
570 }
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
571 }
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
572 fullname = Qnil;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
573 /* Try to get the full name of FONT. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
574 if (xfont && XGetFontProperty (xfont, XA_FONT, &value))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
575 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
576 char *p0, *p;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
577 int dashes = 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
578
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
579 p0 = p = (char *) XGetAtomName (FRAME_X_DISPLAY (f), (Atom) value);;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
580 /* Count the number of dashes in the "full name".
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
581 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
582 so don't use it.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
583 In X11R4, the fonts did not come with their canonical names
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
584 stored in them. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
585 while (*p)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
586 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
587 if (*p == '-')
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
588 dashes++;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
589 p++;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
590 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
591
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
592 if (dashes >= 13)
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
593 fullname = Fdowncase (make_unibyte_string (p0, p - p0));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
594 XFree (p0);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
595 }
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
596 x_uncatch_errors ();
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
597 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
598
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
599 if (! xfont)
96575
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
600 {
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
601 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
602 return Qnil;
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
603 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
604
96560
d87a9f1b9378 (xfont_open): Adjust it for the change of
Kenichi Handa <handa@m17n.org>
parents: 95568
diff changeset
605 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
606 entity, pixel_size);
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
607 ASET (font_object, FONT_TYPE_INDEX, Qx);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
608 if (STRINGP (fullname))
95180
1520d3ef2a48 (xfont_get_pcm): Change xassert to font_assert.
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
609 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
610 if (STRINGP (fullname))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
611 ASET (font_object, FONT_NAME_INDEX, fullname);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
612 else
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
613 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
614 ASET (font_object, FONT_FULLNAME_INDEX, fullname);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
615 ASET (font_object, FONT_FILE_INDEX, Qnil);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
616 ASET (font_object, FONT_FORMAT_INDEX, Qx);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
617 font = XFONT_OBJECT (font_object);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
618 ((struct xfont_info *) font)->xfont = xfont;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
619 ((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
620 font->pixel_size = pixel_size;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
621 font->driver = &xfont_driver;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
622 font->encoding_charset = encoding->id;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
623 font->repertory_charset = repertory ? repertory->id : -1;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
624 font->ascent = xfont->ascent;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
625 font->descent = xfont->descent;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
626 font->height = font->ascent + font->descent;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
627 font->min_width = xfont->min_bounds.width;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
628 if (xfont->min_bounds.width == xfont->max_bounds.width)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
629 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
630 /* Fixed width font. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
631 font->average_width = font->space_width = xfont->min_bounds.width;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
632 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
633 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
634 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
635 XCharStruct *pcm;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
636 XChar2b char2b;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
637 Lisp_Object val;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
638
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
639 char2b.byte1 = 0x00, char2b.byte2 = 0x20;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
640 pcm = xfont_get_pcm (xfont, &char2b);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
641 if (pcm)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
642 font->space_width = pcm->width;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
643 else
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
644 font->space_width = 0;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
645
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
646 val = Ffont_get (font_object, QCavgwidth);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
647 if (INTEGERP (val))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
648 font->average_width = XINT (val);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
649 if (font->average_width < 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
650 font->average_width = - font->average_width;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
651 if (font->average_width == 0
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
652 && encoding->ascii_compatible_p)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
653 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
654 int width = font->space_width, n = pcm != NULL;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
655
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
656 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
657 if ((pcm = xfont_get_pcm (xfont, &char2b)) != NULL)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
658 width += pcm->width, n++;
95330
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
659 if (n > 0)
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
660 font->average_width = width / n;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
661 }
95330
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
662 if (font->average_width == 0)
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
663 /* 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
664 average_width. */
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
665 font->average_width
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
666 = (xfont->min_bounds.width + xfont->max_bounds.width) / 2;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
667 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
668
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
669 BLOCK_INPUT;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
670 font->underline_thickness
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
671 = (XGetFontProperty (xfont, XA_UNDERLINE_THICKNESS, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
672 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
673 font->underline_position
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
674 = (XGetFontProperty (xfont, XA_UNDERLINE_POSITION, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
675 ? (long) value : -1);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
676 font->baseline_offset
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
677 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_BASELINE_OFFSET, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
678 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
679 font->relative_compose
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
680 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_RELATIVE_COMPOSE, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
681 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
682 font->default_ascent
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
683 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_DEFAULT_ASCENT, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
684 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
685 UNBLOCK_INPUT;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
686
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
687 if (NILP (fullname))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
688 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
689 font->vertical_centering
dec3815c40d7 (xfont_open): Cancel the previous about font->vertical_centering.
Kenichi Handa <handa@m17n.org>
parents: 96560
diff changeset
690 = (STRINGP (Vvertical_centering_font_regexp)
dec3815c40d7 (xfont_open): Cancel the previous about font->vertical_centering.
Kenichi Handa <handa@m17n.org>
parents: 96560
diff changeset
691 && (fast_string_match_ignore_case
dec3815c40d7 (xfont_open): Cancel the previous about font->vertical_centering.
Kenichi Handa <handa@m17n.org>
parents: 96560
diff changeset
692 (Vvertical_centering_font_regexp, fullname) >= 0));
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
693
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
694 return font_object;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
695 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
696
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
697 static void
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
698 xfont_close (f, font)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
699 FRAME_PTR f;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
700 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
701 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
702 BLOCK_INPUT;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
703 XFreeFont (FRAME_X_DISPLAY (f), ((struct xfont_info *) font)->xfont);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
704 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
705 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
706
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
707 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
708 xfont_prepare_face (f, face)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
709 FRAME_PTR f;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
710 struct face *face;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
711 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
712 BLOCK_INPUT;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
713 XSetFont (FRAME_X_DISPLAY (f), face->gc,
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
714 ((struct xfont_info *) face->font)->xfont->fid);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
715 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
716
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
717 return 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
718 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
719
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
720 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
721 xfont_has_char (entity, c)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
722 Lisp_Object entity;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
723 int c;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
724 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
725 Lisp_Object registry = AREF (entity, FONT_REGISTRY_INDEX);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
726 struct charset *repertory;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
727
91142
4bcf0716ddf4 * xfont.c (x_font_charset_alist): Moved to font.c and renamed.
Kenichi Handa <handa@m17n.org>
parents: 90698
diff changeset
728 if (font_registry_charsets (registry, NULL, &repertory) < 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
729 return -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
730 if (! repertory)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
731 return -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
732 return (ENCODE_CHAR (repertory, c) != CHARSET_INVALID_CODE (repertory));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
733 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
734
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
735 static unsigned
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
736 xfont_encode_char (font, c)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
737 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
738 int c;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
739 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
740 XFontStruct *xfont = ((struct xfont_info *) font)->xfont;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
741 struct charset *charset;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
742 unsigned code;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
743 XChar2b char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
744
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
745 charset = CHARSET_FROM_ID (font->encoding_charset);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
746 code = ENCODE_CHAR (charset, c);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
747 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
748 return FONT_INVALID_CODE;
90454
a8b745412821 (xfont_open, xfont_encode_char): Fix typo.
Kenichi Handa <handa@m17n.org>
parents: 90443
diff changeset
749 if (font->repertory_charset >= 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
750 {
90454
a8b745412821 (xfont_open, xfont_encode_char): Fix typo.
Kenichi Handa <handa@m17n.org>
parents: 90443
diff changeset
751 charset = CHARSET_FROM_ID (font->repertory_charset);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
752 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
753 ? code : FONT_INVALID_CODE);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
754 }
90425
5976e428d68e (xfont_encode_char): Fix calculation of char2b.
Kenichi Handa <handa@m17n.org>
parents: 90400
diff changeset
755 char2b.byte1 = code >> 8;
5976e428d68e (xfont_encode_char): Fix calculation of char2b.
Kenichi Handa <handa@m17n.org>
parents: 90400
diff changeset
756 char2b.byte2 = code & 0xFF;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
757 return (xfont_get_pcm (xfont, &char2b) ? code : FONT_INVALID_CODE);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
758 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
759
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
760 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
761 xfont_text_extents (font, code, nglyphs, metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
762 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
763 unsigned *code;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
764 int nglyphs;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
765 struct font_metrics *metrics;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
766 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
767 XFontStruct *xfont = ((struct xfont_info *) font)->xfont;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
768 int width = 0;
96570
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
769 int i, first, x;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
770
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
771 if (metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
772 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
773 for (i = 0, x = 0, first = 1; i < nglyphs; i++)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
774 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
775 XChar2b char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
776 static XCharStruct *pcm;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
777
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
778 if (code[i] >= 0x10000)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
779 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
780 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
781 pcm = xfont_get_pcm (xfont, &char2b);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
782 if (! pcm)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
783 continue;
96570
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
784 if (first)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
785 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
786 if (metrics)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
787 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
788 metrics->lbearing = pcm->lbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
789 metrics->rbearing = pcm->rbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
790 metrics->ascent = pcm->ascent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
791 metrics->descent = pcm->descent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
792 }
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
793 first = 0;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
794 }
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
795 else
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
796 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
797 if (metrics)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
798 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
799 if (metrics->lbearing > width + pcm->lbearing)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
800 metrics->lbearing = width + pcm->lbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
801 if (metrics->rbearing < width + pcm->rbearing)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
802 metrics->rbearing = width + pcm->rbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
803 if (metrics->ascent < pcm->ascent)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
804 metrics->ascent = pcm->ascent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
805 if (metrics->descent < pcm->descent)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
806 metrics->descent = pcm->descent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
807 }
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
808 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
809 width += pcm->width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
810 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
811 if (metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
812 metrics->width = width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
813 return width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
814 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
815
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
816 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
817 xfont_draw (s, from, to, x, y, with_background)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
818 struct glyph_string *s;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
819 int from, to, x, y, with_background;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
820 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
821 XFontStruct *xfont = ((struct xfont_info *) s->font)->xfont;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
822 int len = to - from;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
823 GC gc = s->gc;
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
824 int i;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
825
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
826 if (s->gc != s->face->gc)
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
827 {
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
828 BLOCK_INPUT;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
829 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
830 UNBLOCK_INPUT;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
831 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
832
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
833 if (xfont->min_byte1 == 0 && xfont->max_byte1 == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
834 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
835 char *str;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
836 USE_SAFE_ALLOCA;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
837
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
838 SAFE_ALLOCA (str, char *, len);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
839 for (i = 0; i < len ; i++)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
840 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
841 BLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
842 if (with_background > 0)
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
843 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
844 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
845 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
846 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
847 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
848 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
849 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
850 gc, x, y, str, len);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
851 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
852 else
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
853 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
854 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
855 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
856 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
857 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
858 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
859 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
860 gc, x, y, str, len);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
861 }
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
862 UNBLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
863 SAFE_FREE ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
864 return s->nchars;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
865 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
866
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
867 BLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
868 if (with_background > 0)
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
869 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
870 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
871 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
872 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
873 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
874 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
875 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
876 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
877 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
878 else
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
879 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
880 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
881 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
882 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
883 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
884 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
885 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
886 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
887 }
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
888 UNBLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
889
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
890 return len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
891 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
892
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
893 static int
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
894 xfont_check (f, font)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
895 FRAME_PTR f;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
896 struct font *font;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
897 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
898 struct xfont_info *xfont = (struct xfont_info *) font;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
899
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
900 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
901 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
902
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
903
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
904 void
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
905 syms_of_xfont ()
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
906 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
907 xfont_driver.type = Qx;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
908 register_font_driver (&xfont_driver, NULL);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
909 }
90427
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
910
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
911 /* arch-tag: 23c5f366-a5ee-44b7-a3b7-90d6da7fd749
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
912 (do not change this comment) */