annotate src/xfont.c @ 109637:c4c8e4a16194

Remove extern declarations in .c files, .h files have them. * src/data.c: * src/dired.c: * src/editfns.c: * src/filelock.c: * src/fns.c: * src/font.c: * src/fontset.c: * src/frame.c: * src/fringe.c: * src/ftfont.c: * src/gtkutil.c: * src/indent.c: * src/keyboard.c: * src/keymap.c: * src/lread.c: * src/menu.c: * src/print.c: * src/search.c: * src/sound.c: * src/window.c: * src/xdisp.c: * src/xfaces.c: * src/xfns.c: * src/xfont.c: * src/xftfont.c: * src/xmenu.c: * src/xterm.c: Remove declarations.
author Dan Nicolaescu <dann@ics.uci.edu>
date Thu, 05 Aug 2010 16:34:12 -0700
parents 750db9f3e6d8
children 8949aad5e992
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.
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 106085
diff changeset
2 Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 106085
diff changeset
3 Copyright (C) 2006, 2007, 2008, 2009, 2010
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>
105669
68dd71358159 * alloc.c: Do not define struct catchtag.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104090
diff changeset
25 #include <setjmp.h>
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
26 #include <X11/Xlib.h>
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
27
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
28 #include "lisp.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
29 #include "dispextern.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
30 #include "xterm.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
31 #include "frame.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
32 #include "blockinput.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
33 #include "character.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
34 #include "charset.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
35 #include "fontset.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
36 #include "font.h"
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
37 #include "ccl.h"
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
38
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
39
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
40 /* X core font driver. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
41
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
42 struct xfont_info
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
43 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
44 struct font font;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
45 Display *display;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
46 XFontStruct *xfont;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
47 };
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
48
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
49 /* Prototypes of support functions. */
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
50 extern void x_clear_errors (Display *);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
51
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
52 static XCharStruct *xfont_get_pcm (XFontStruct *, XChar2b *);
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 *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
58 xfont_get_pcm (XFontStruct *xfont, XChar2b *char2b)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
59 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
60 /* The result metric information. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
61 XCharStruct *pcm = NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
62
95180
1520d3ef2a48 (xfont_get_pcm): Change xassert to font_assert.
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
63 font_assert (xfont && char2b);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
64
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
65 if (xfont->per_char != NULL)
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->min_byte1 == 0 && xfont->max_byte1 == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
68 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
69 /* min_char_or_byte2 specifies the linear character index
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
70 corresponding to the first element of the per_char array,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
71 max_char_or_byte2 is the index of the last character. A
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
72 character with non-zero CHAR2B->byte1 is not in the font.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
73 A character with byte2 less than min_char_or_byte2 or
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
74 greater max_char_or_byte2 is not in the font. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
75 if (char2b->byte1 == 0
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
76 && char2b->byte2 >= xfont->min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
77 && char2b->byte2 <= xfont->max_char_or_byte2)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
78 pcm = xfont->per_char + char2b->byte2 - xfont->min_char_or_byte2;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
79 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
80 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
81 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
82 /* If either min_byte1 or max_byte1 are nonzero, both
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
83 min_char_or_byte2 and max_char_or_byte2 are less than
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
84 256, and the 2-byte character index values corresponding
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
85 to the per_char array element N (counting from 0) are:
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
86
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
87 byte1 = N/D + min_byte1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
88 byte2 = N\D + min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
89
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
90 where:
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
91
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
92 D = max_char_or_byte2 - min_char_or_byte2 + 1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
93 / = integer division
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
94 \ = integer modulus */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
95 if (char2b->byte1 >= xfont->min_byte1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
96 && char2b->byte1 <= xfont->max_byte1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
97 && char2b->byte2 >= xfont->min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
98 && char2b->byte2 <= xfont->max_char_or_byte2)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
99 pcm = (xfont->per_char
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
100 + ((xfont->max_char_or_byte2 - xfont->min_char_or_byte2 + 1)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
101 * (char2b->byte1 - xfont->min_byte1))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
102 + (char2b->byte2 - xfont->min_char_or_byte2));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
103 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
104 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
105 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
106 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
107 /* If the per_char pointer is null, all glyphs between the first
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
108 and last character indexes inclusive have the same
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
109 information, as given by both min_bounds and max_bounds. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
110 if (char2b->byte2 >= xfont->min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
111 && char2b->byte2 <= xfont->max_char_or_byte2)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
112 pcm = &xfont->max_bounds;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
113 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
114
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
115 return ((pcm == NULL
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
116 || (pcm->width == 0 && (pcm->rbearing - pcm->lbearing) == 0))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
117 ? NULL : pcm);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
118 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
119
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
120 static Lisp_Object xfont_get_cache (FRAME_PTR);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
121 static Lisp_Object xfont_list (Lisp_Object, Lisp_Object);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
122 static Lisp_Object xfont_match (Lisp_Object, Lisp_Object);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
123 static Lisp_Object xfont_list_family (Lisp_Object);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
124 static Lisp_Object xfont_open (FRAME_PTR, Lisp_Object, int);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
125 static void xfont_close (FRAME_PTR, struct font *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
126 static int xfont_prepare_face (FRAME_PTR, struct face *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
127 static int xfont_has_char (Lisp_Object, int);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
128 static unsigned xfont_encode_char (struct font *, int);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
129 static int xfont_text_extents (struct font *, unsigned *, int,
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
130 struct font_metrics *);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
131 static int xfont_draw (struct glyph_string *, int, int, int, int, int);
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 106815
diff changeset
132 static int xfont_check (FRAME_PTR, struct font *);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
133
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
134 struct font_driver xfont_driver =
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
135 {
90698
a31984e21969 (xfont_driver): Initialize ftfont_driver.type by 0.
Kenichi Handa <handa@m17n.org>
parents: 90679
diff changeset
136 0, /* Qx */
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
137 0, /* case insensitive */
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
138 xfont_get_cache,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
139 xfont_list,
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
140 xfont_match,
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
141 xfont_list_family,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
142 NULL,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
143 xfont_open,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
144 xfont_close,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
145 xfont_prepare_face,
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
146 NULL,
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
147 xfont_has_char,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
148 xfont_encode_char,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
149 xfont_text_extents,
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
150 xfont_draw,
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
151 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
106085
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
152 xfont_check,
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
153 NULL, /* get_variation_glyphs */
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
154 NULL, /* filter_properties */
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
155 };
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
156
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
157 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
158 xfont_get_cache (FRAME_PTR f)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
159 {
91245
26541bdcecd0 (xfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents: 91177
diff changeset
160 Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
161
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
162 return (dpyinfo->name_list_element);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
163 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
164
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
165 static int
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
166 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
167 {
95568
4fec6e274c04 (xfont_list): Don't set registry to iso8859-1 even if it
Kenichi Handa <handa@m17n.org>
parents: 95503
diff changeset
168 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
169 *(const unsigned char **) name2);
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
170 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
171
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
172 /* Decode XLFD as iso-8859-1 into OUTPUT, and return the byte length
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
173 of the decoding result. LEN is the byte length of XLFD, or -1 if
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
174 XLFD is NULL terminated. The caller must assure that OUTPUT is at
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
175 least twice (plus 1) as large as XLFD. */
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
176
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
177 static int
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
178 xfont_decode_coding_xlfd (char *xlfd, int len, char *output)
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
179 {
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
180 char *p0 = xlfd, *p1 = output;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
181 int c;
101943
97c9e9322753 Remove spurious semicolons.
Juanma Barranquero <lekktu@gmail.com>
parents: 100951
diff changeset
182
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
183 while (*p0)
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
184 {
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
185 c = *(unsigned char *) p0++;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
186 p1 += CHAR_STRING (c, p1);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
187 if (--len == 0)
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
188 break;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
189 }
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
190 *p1 = 0;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
191 return (p1 - output);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
192 }
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
193
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
194 /* Encode XLFD from UTF-8 to iso-8859-1 destructively, and return the
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
195 resulting byte length. If XLFD contains unencodable character,
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
196 return -1. */
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
197
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
198 static int
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
199 xfont_encode_coding_xlfd (char *xlfd)
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
200 {
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
201 const unsigned char *p0 = (unsigned char *) xlfd;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
202 unsigned char *p1 = (unsigned char *) xlfd;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
203 int len = 0;
101943
97c9e9322753 Remove spurious semicolons.
Juanma Barranquero <lekktu@gmail.com>
parents: 100951
diff changeset
204
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
205 while (*p0)
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
206 {
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
207 int c = STRING_CHAR_ADVANCE (p0);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
208
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
209 if (c >= 0x100)
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
210 return -1;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
211 *p1++ = c;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
212 len++;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
213 }
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
214 *p1 = 0;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
215 return len;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
216 }
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
217
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
218 /* Check if CHARS (cons or vector) is supported by XFONT whose
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
219 encoding charset is ENCODING (XFONT is NULL) or by a font whose
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
220 registry corresponds to ENCODING and REPERTORY.
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
221 Return 1 if supported, return 0 otherwise. */
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
222
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
223 static int
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
224 xfont_chars_supported (Lisp_Object chars, XFontStruct *xfont,
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
225 struct charset *encoding, struct charset *repertory)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
226 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
227 struct charset *charset = repertory ? repertory : encoding;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
228
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
229 if (CONSP (chars))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
230 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
231 for (; CONSP (chars); chars = XCDR (chars))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
232 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
233 int c = XINT (XCAR (chars));
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
234 unsigned code = ENCODE_CHAR (charset, c);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
235 XChar2b char2b;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
236
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
237 if (code == CHARSET_INVALID_CODE (charset))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
238 break;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
239 if (! xfont)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
240 continue;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
241 if (code >= 0x10000)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
242 break;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
243 char2b.byte1 = code >> 8;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
244 char2b.byte2 = code & 0xFF;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
245 if (! xfont_get_pcm (xfont, &char2b))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
246 break;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
247 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
248 return (NILP (chars));
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
249 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
250 else if (VECTORP (chars))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
251 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
252 int i;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
253
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
254 for (i = ASIZE (chars) - 1; i >= 0; i--)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
255 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
256 int c = XINT (AREF (chars, i));
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
257 unsigned code = ENCODE_CHAR (charset, c);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
258 XChar2b char2b;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
259
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
260 if (code == CHARSET_INVALID_CODE (charset))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
261 continue;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
262 if (! xfont)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
263 break;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
264 if (code >= 0x10000)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
265 continue;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
266 char2b.byte1 = code >> 8;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
267 char2b.byte2 = code & 0xFF;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
268 if (xfont_get_pcm (xfont, &char2b))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
269 break;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
270 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
271 return (i >= 0);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
272 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
273 return 0;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
274 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
275
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
276 /* A hash table recoding which font supports which scritps. Each key
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
277 is a vector of characteristic font propertis FOUNDRY to WIDTH and
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
278 ADDSTYLE, and each value is a list of script symbols.
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
279
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
280 We assume that fonts that have the same value in the above
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
281 properties supports the same set of characters on all displays. */
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
282
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
283 static Lisp_Object xfont_scripts_cache;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
284
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
285 /* Re-usable vector to store characteristic font properites. */
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
286 static Lisp_Object xfont_scratch_props;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
287
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
288 /* Return a list of scripts supported by the font of FONTNAME whose
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
289 characteristic properties are in PROPS and whose encoding charset
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
290 is ENCODING. A caller must call BLOCK_INPUT in advance. */
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
291
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
292 static Lisp_Object
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
293 xfont_supported_scripts (Display *display, char *fontname, Lisp_Object props,
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
294 struct charset *encoding)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
295 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
296 Lisp_Object scripts;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
297
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
298 /* Two special cases to avoid opening rather big fonts. */
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
299 if (EQ (AREF (props, 2), Qja))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
300 return Fcons (intern ("kana"), Fcons (intern ("han"), Qnil));
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
301 if (EQ (AREF (props, 2), Qko))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
302 return Fcons (intern ("hangul"), Qnil);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
303 scripts = Fgethash (props, xfont_scripts_cache, Qt);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
304 if (EQ (scripts, Qt))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
305 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
306 XFontStruct *xfont;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
307 Lisp_Object val;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
308
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
309 scripts = Qnil;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
310 xfont = XLoadQueryFont (display, fontname);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
311 if (xfont)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
312 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
313 if (xfont->per_char)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
314 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
315 for (val = Vscript_representative_chars; CONSP (val);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
316 val = XCDR (val))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
317 if (CONSP (XCAR (val)) && SYMBOLP (XCAR (XCAR (val))))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
318 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
319 Lisp_Object script = XCAR (XCAR (val));
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
320 Lisp_Object chars = XCDR (XCAR (val));
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
321
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
322 if (xfont_chars_supported (chars, xfont, encoding, NULL))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
323 scripts = Fcons (script, scripts);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
324 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
325 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
326 XFreeFont (display, xfont);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
327 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
328 if (EQ (AREF (props, 3), Qiso10646_1)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
329 && NILP (Fmemq (Qlatin, scripts)))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
330 scripts = Fcons (Qlatin, scripts);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
331 Fputhash (Fcopy_sequence (props), scripts, xfont_scripts_cache);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
332 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
333 return scripts;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
334 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
335
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
336 static Lisp_Object
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
337 xfont_list_pattern (Display *display, char *pattern,
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
338 Lisp_Object registry, Lisp_Object script)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
339 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
340 Lisp_Object list = Qnil;
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
341 Lisp_Object chars = Qnil;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
342 struct charset *encoding, *repertory = NULL;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
343 int i, limit, num_fonts;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
344 char **names;
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
345 /* Large enough to decode the longest XLFD (255 bytes). */
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
346 char buf[512];
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
347
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
348 if (! NILP (registry)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
349 && font_registry_charsets (registry, &encoding, &repertory) < 0)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
350 /* Unknown REGISTRY, not supported. */
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
351 return Qnil;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
352 if (! NILP (script))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
353 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
354 chars = assq_no_quit (script, Vscript_representative_chars);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
355 if (NILP (chars))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
356 /* We can't tell whether or not a font supports SCRIPT. */
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
357 return Qnil;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
358 chars = XCDR (chars);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
359 if (repertory)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
360 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
361 if (! xfont_chars_supported (chars, NULL, encoding, repertory))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
362 return Qnil;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
363 script = Qnil;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
364 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
365 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
366
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
367 BLOCK_INPUT;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
368 x_catch_errors (display);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
369
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
370 for (limit = 512; ; limit *= 2)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
371 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
372 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
373 if (x_had_errors_p (display))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
374 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
375 /* This error is perhaps due to insufficient memory on X
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
376 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
377 x_clear_errors (display);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
378 num_fonts = 0;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
379 break;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
380 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
381 if (num_fonts < limit)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
382 break;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
383 XFreeFontNames (names);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
384 }
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
385
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
386 if (num_fonts > 0)
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
387 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
388 char **indices = alloca (sizeof (char *) * num_fonts);
103274
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
389 Lisp_Object *props = XVECTOR (xfont_scratch_props)->contents;
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
390 Lisp_Object scripts = Qnil;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
391
103274
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
392 for (i = 0; i < ASIZE (xfont_scratch_props); i++)
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
393 props[i] = Qnil;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
394 for (i = 0; i < num_fonts; i++)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
395 indices[i] = names[i];
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
396 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
397
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
398 for (i = 0; i < num_fonts; i++)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
399 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
400 Lisp_Object entity;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
401
95222
005a1655f51e * dispextern.h, xfaces.c (xstrcasecmp): Renamed from xstricmp.
Jason Rumney <jasonr@gnu.org>
parents: 95202
diff changeset
402 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
403 continue;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
404 entity = font_make_entity ();
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
405 xfont_decode_coding_xlfd (indices[i], -1, buf);
104090
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
406 if (font_parse_xlfd (buf, entity) < 0)
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
407 continue;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
408 ASET (entity, FONT_TYPE_INDEX, Qx);
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
409 /* Avoid auto-scaled fonts. */
104090
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
410 if (INTEGERP (AREF (entity, FONT_DPI_INDEX))
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
411 && INTEGERP (AREF (entity, FONT_AVGWIDTH_INDEX))
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
412 && XINT (AREF (entity, FONT_DPI_INDEX)) != 0
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
413 && XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) == 0)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
414 continue;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
415 /* Avoid not-allowed scalable fonts. */
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
416 if (NILP (Vscalable_fonts_allowed))
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
417 {
104090
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
418 int size = 0;
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
419
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
420 if (INTEGERP (AREF (entity, FONT_SIZE_INDEX)))
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
421 size = XINT (AREF (entity, FONT_SIZE_INDEX));
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
422 else if (FLOATP (AREF (entity, FONT_SIZE_INDEX)))
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
423 size = XFLOAT_DATA (AREF (entity, FONT_SIZE_INDEX));
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
424 if (size == 0)
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
425 continue;
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
426 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
427 else if (CONSP (Vscalable_fonts_allowed))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
428 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
429 Lisp_Object tail, elt;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
430
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
431 for (tail = Vscalable_fonts_allowed; CONSP (tail);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
432 tail = XCDR (tail))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
433 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
434 elt = XCAR (tail);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
435 if (STRINGP (elt)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
436 && fast_c_string_match_ignore_case (elt, indices[i]) >= 0)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
437 break;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
438 }
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
439 if (! CONSP (tail))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
440 continue;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
441 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
442
104090
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
443 /* Avoid fonts of invalid registry. */
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
444 if (NILP (AREF (entity, FONT_REGISTRY_INDEX)))
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
445 continue;
1d6a73f0d113 (xfont_list_pattern): Don't ignore the return value of
Kenichi Handa <handa@m17n.org>
parents: 103543
diff changeset
446
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
447 /* Update encoding and repertory if necessary. */
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
448 if (! EQ (registry, AREF (entity, FONT_REGISTRY_INDEX)))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
449 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
450 registry = AREF (entity, FONT_REGISTRY_INDEX);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
451 if (font_registry_charsets (registry, &encoding, &repertory) < 0)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
452 encoding = NULL;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
453 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
454 if (! encoding)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
455 /* Unknown REGISTRY, not supported. */
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
456 continue;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
457 if (repertory)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
458 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
459 if (NILP (script)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
460 || xfont_chars_supported (chars, NULL, encoding, repertory))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
461 list = Fcons (entity, list);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
462 continue;
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
463 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
464 if (memcmp (props, &(AREF (entity, FONT_FOUNDRY_INDEX)),
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
465 sizeof (Lisp_Object) * 7)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
466 || ! EQ (AREF (entity, FONT_SPACING_INDEX), props[7]))
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
467 {
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
468 memcpy (props, &(AREF (entity, FONT_FOUNDRY_INDEX)),
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
469 sizeof (Lisp_Object) * 7);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
470 props[7] = AREF (entity, FONT_SPACING_INDEX);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
471 scripts = xfont_supported_scripts (display, indices[i],
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
472 xfont_scratch_props, encoding);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
473 }
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
474 if (NILP (script)
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
475 || ! NILP (Fmemq (script, scripts)))
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
476 list = Fcons (entity, list);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
477 }
95227
6df485632f28 (xfont_list_pattern): Free names returned from XListFonts.
Kenichi Handa <handa@m17n.org>
parents: 95222
diff changeset
478 XFreeFontNames (names);
90400
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 x_uncatch_errors ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
482 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
483
103543
11b57e1bdb96 Change font_add_log to FONT_ADD_LOG.
Kenichi Handa <handa@m17n.org>
parents: 103274
diff changeset
484 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
485 return list;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
486 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
487
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
488 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
489 xfont_list (Lisp_Object frame, Lisp_Object spec)
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
490 {
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
491 FRAME_PTR f = XFRAME (frame);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
492 Display *display = FRAME_X_DISPLAY_INFO (f)->display;
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
493 Lisp_Object registry, list, val, extra, script;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
494 int len;
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
495 /* Large enough to contain the longest XLFD (255 bytes) in UTF-8. */
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
496 char name[512];
101943
97c9e9322753 Remove spurious semicolons.
Juanma Barranquero <lekktu@gmail.com>
parents: 100951
diff changeset
497
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
498 extra = AREF (spec, FONT_EXTRA_INDEX);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
499 if (CONSP (extra))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
500 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
501 val = assq_no_quit (QCotf, extra);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
502 if (! NILP (val))
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
503 return Qnil;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
504 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
505 if (! NILP (val))
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
506 return Qnil;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
507 }
103184
9d9dd35fa21d Cancel previous changes.
Kenichi Handa <handa@m17n.org>
parents: 103181
diff changeset
508
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
509 registry = AREF (spec, FONT_REGISTRY_INDEX);
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
510 len = font_unparse_xlfd (spec, 0, name, 512);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
511 if (len < 0 || (len = xfont_encode_coding_xlfd (name)) < 0)
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
512 return Qnil;
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
513
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
514 val = assq_no_quit (QCscript, extra);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
515 script = CDR (val);
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
516 list = xfont_list_pattern (display, name, registry, script);
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
517 if (NILP (list) && NILP (registry))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
518 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
519 /* Try iso10646-1 */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
520 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
521
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
522 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
523 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
524 strcpy (r, "iso10646-1");
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
525 list = xfont_list_pattern (display, name, Qiso10646_1, script);
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
526 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
527 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
528 if (NILP (list) && ! NILP (registry))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
529 {
95503
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
530 /* Try alternate registries. */
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
531 Lisp_Object alter;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
532
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
533 if ((alter = Fassoc (SYMBOL_NAME (registry),
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
534 Vface_alternative_font_registry_alist),
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
535 CONSP (alter)))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
536 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
537 /* Pointer to REGISTRY-ENCODING field. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
538 char *r = name + len - SBYTES (SYMBOL_NAME (registry));
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
539
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
540 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
541 if (STRINGP (XCAR (alter))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
542 && ((r - name) + SBYTES (XCAR (alter))) < 256)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
543 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
544 strcpy (r, (char *) SDATA (XCAR (alter)));
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
545 list = xfont_list_pattern (display, name, registry, script);
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
546 if (! NILP (list))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
547 break;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
548 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
549 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
550 }
95503
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
551 if (NILP (list))
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
552 {
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
553 /* Try alias. */
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
554 val = assq_no_quit (QCname, AREF (spec, FONT_EXTRA_INDEX));
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
555 if (CONSP (val) && STRINGP (XCDR (val)) && SBYTES (XCDR (val)) < 512)
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
556 {
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109126
diff changeset
557 memcpy (name, SDATA (XCDR (val)), SBYTES (XCDR (val)) + 1);
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
558 if (xfont_encode_coding_xlfd (name) < 0)
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
559 return Qnil;
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
560 list = xfont_list_pattern (display, name, registry, script);
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
561 }
95503
1699a530f6a3 (xfont_list): Try an alias.
Kenichi Handa <handa@m17n.org>
parents: 95330
diff changeset
562 }
103184
9d9dd35fa21d Cancel previous changes.
Kenichi Handa <handa@m17n.org>
parents: 103181
diff changeset
563
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
564 return list;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
565 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
566
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
567 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
568 xfont_match (Lisp_Object frame, Lisp_Object spec)
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
569 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
570 FRAME_PTR f = XFRAME (frame);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
571 Display *display = FRAME_X_DISPLAY_INFO (f)->display;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
572 Lisp_Object extra, val, entity;
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
573 char name[512];
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
574 XFontStruct *xfont;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
575 unsigned long value;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
576
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
577 extra = AREF (spec, FONT_EXTRA_INDEX);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
578 val = assq_no_quit (QCname, extra);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
579 if (! CONSP (val) || ! STRINGP (XCDR (val)))
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
580 {
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
581 if (font_unparse_xlfd (spec, 0, name, 512) < 0)
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
582 return Qnil;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
583 }
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
584 else if (SBYTES (XCDR (val)) < 512)
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109126
diff changeset
585 memcpy (name, SDATA (XCDR (val)), SBYTES (XCDR (val)) + 1);
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
586 else
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
587 return Qnil;
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
588 if (xfont_encode_coding_xlfd (name) < 0)
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
589 return Qnil;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
590
90569
0af2dbdeaeb3 (xfont_match): Block and unblock input while callin Xlib.
Kenichi Handa <handa@m17n.org>
parents: 90561
diff changeset
591 BLOCK_INPUT;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
592 entity = Qnil;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
593 xfont = XLoadQueryFont (display, name);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
594 if (xfont)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
595 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
596 if (XGetFontProperty (xfont, XA_FONT, &value))
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
597 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
598 int len;
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
599 char *s;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
600
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
601 s = (char *) XGetAtomName (display, (Atom) value);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
602 len = strlen (s);
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
603
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
604 /* If DXPC (a Differential X Protocol Compressor)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
605 Ver.3.7 is running, XGetAtomName will return null
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
606 string. We must avoid such a name. */
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
607 if (len > 0)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
608 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
609 entity = font_make_entity ();
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
610 ASET (entity, FONT_TYPE_INDEX, Qx);
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
611 xfont_decode_coding_xlfd (s, -1, name);
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
612 if (font_parse_xlfd (name, entity) < 0)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
613 entity = Qnil;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
614 }
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
615 XFree (s);
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
616 }
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
617 XFreeFont (display, xfont);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
618 }
90569
0af2dbdeaeb3 (xfont_match): Block and unblock input while callin Xlib.
Kenichi Handa <handa@m17n.org>
parents: 90561
diff changeset
619 UNBLOCK_INPUT;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
620
103543
11b57e1bdb96 Change font_add_log to FONT_ADD_LOG.
Kenichi Handa <handa@m17n.org>
parents: 103274
diff changeset
621 FONT_ADD_LOG ("xfont-match", spec, entity);
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
622 return entity;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
623 }
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
624
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
625 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
626 xfont_list_family (Lisp_Object frame)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
627 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
628 FRAME_PTR f = XFRAME (frame);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
629 Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
630 char **names;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
631 int num_fonts, i;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
632 Lisp_Object list;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
633 char *last_family;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
634 int last_len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
635
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
636 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
637 x_catch_errors (dpyinfo->display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
638 names = XListFonts (dpyinfo->display, "-*-*-*-*-*-*-*-*-*-*-*-*-*-*",
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
639 0x8000, &num_fonts);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
640 if (x_had_errors_p (dpyinfo->display))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
641 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
642 /* This error is perhaps due to insufficient memory on X server.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
643 Let's just ignore it. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
644 x_clear_errors (dpyinfo->display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
645 num_fonts = 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
646 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
647
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
648 list = Qnil;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
649 for (i = 0, last_len = 0; i < num_fonts; i++)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
650 {
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
651 char *p0 = names[i], *p1, buf[512];
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
652 Lisp_Object family;
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
653 int decoded_len;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
654
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
655 p0++; /* skip the leading '-' */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
656 while (*p0 && *p0 != '-') p0++; /* skip foundry */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
657 if (! *p0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
658 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
659 p1 = ++p0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
660 while (*p1 && *p1 != '-') p1++; /* find the end of family */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
661 if (! *p1 || p1 == p0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
662 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
663 if (last_len == p1 - p0
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109126
diff changeset
664 && memcmp (last_family, p0, last_len) == 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
665 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
666 last_len = p1 - p0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
667 last_family = p0;
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
668
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
669 decoded_len = xfont_decode_coding_xlfd (p0, last_len, buf);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
670 family = font_intern_prop (p0, decoded_len, 1);
97327
53bcf54737b2 (xfont_list_family): Return a list of symbols, not
Kenichi Handa <handa@m17n.org>
parents: 96657
diff changeset
671 if (NILP (assq_no_quit (family, list)))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
672 list = Fcons (family, list);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
673 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
674
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
675 XFreeFontNames (names);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
676 x_uncatch_errors ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
677 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
678
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
679 return list;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
680 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
681
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
682 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
683 xfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
684 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
685 Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
686 Display *display = dpyinfo->display;
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
687 char name[512];
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
688 int len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
689 unsigned long value;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
690 Lisp_Object registry;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
691 struct charset *encoding, *repertory;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
692 Lisp_Object font_object, fullname;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
693 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
694 XFontStruct *xfont;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
695
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
696 /* At first, check if we know how to encode characters for this
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
697 font. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
698 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
699 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
700 {
103543
11b57e1bdb96 Change font_add_log to FONT_ADD_LOG.
Kenichi Handa <handa@m17n.org>
parents: 103274
diff changeset
701 FONT_ADD_LOG (" x:unknown registry", registry, Qnil);
96575
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
702 return Qnil;
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
703 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
704
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
705 if (XINT (AREF (entity, FONT_SIZE_INDEX)) != 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
706 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
707 else if (pixel_size == 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
708 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
709 if (FRAME_FONT (f))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
710 pixel_size = FRAME_FONT (f)->pixel_size;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
711 else
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
712 pixel_size = 14;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
713 }
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
714 len = font_unparse_xlfd (entity, pixel_size, name, 512);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
715 if (len <= 0 || (len = xfont_encode_coding_xlfd (name)) < 0)
96575
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
716 {
103543
11b57e1bdb96 Change font_add_log to FONT_ADD_LOG.
Kenichi Handa <handa@m17n.org>
parents: 103274
diff changeset
717 FONT_ADD_LOG (" x:unparse failed", entity, Qnil);
96575
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
718 return Qnil;
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
719 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
720
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
721 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
722 x_catch_errors (display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
723 xfont = XLoadQueryFont (display, name);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
724 if (x_had_errors_p (display))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
725 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
726 /* This error is perhaps due to insufficient memory on X server.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
727 Let's just ignore it. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
728 x_clear_errors (display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
729 xfont = NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
730 }
96657
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
731 else if (! xfont)
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
732 {
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
733 /* Some version of X lists:
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
734 -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
735 -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
736 but can open only:
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
737 -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
738 and
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
739 -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
740 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
741 Lisp_Object temp;
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
742
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
743 temp = Fcopy_font_spec (entity);
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
744 ASET (temp, FONT_DPI_INDEX, Qnil);
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
745 len = font_unparse_xlfd (temp, pixel_size, name, 512);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
746 if (len <= 0 || (len = xfont_encode_coding_xlfd (name)) < 0)
96657
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
747 {
103543
11b57e1bdb96 Change font_add_log to FONT_ADD_LOG.
Kenichi Handa <handa@m17n.org>
parents: 103274
diff changeset
748 FONT_ADD_LOG (" x:unparse failed", temp, Qnil);
96657
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
749 return Qnil;
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
750 }
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
751 xfont = XLoadQueryFont (display, name);
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
752 if (x_had_errors_p (display))
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
753 {
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
754 /* 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
755 Let's just ignore it. */
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
756 x_clear_errors (display);
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
757 xfont = NULL;
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
758 }
fb9629443416 (xfont_open): Add workaround for X's bug.
Kenichi Handa <handa@m17n.org>
parents: 96575
diff changeset
759 }
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
760 fullname = Qnil;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
761 /* Try to get the full name of FONT. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
762 if (xfont && XGetFontProperty (xfont, XA_FONT, &value))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
763 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
764 char *p0, *p;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
765 int dashes = 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
766
101943
97c9e9322753 Remove spurious semicolons.
Juanma Barranquero <lekktu@gmail.com>
parents: 100951
diff changeset
767 p0 = p = (char *) XGetAtomName (FRAME_X_DISPLAY (f), (Atom) value);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
768 /* Count the number of dashes in the "full name".
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
769 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
770 so don't use it.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
771 In X11R4, the fonts did not come with their canonical names
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
772 stored in them. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
773 while (*p)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
774 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
775 if (*p == '-')
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
776 dashes++;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
777 p++;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
778 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
779
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
780 if (dashes >= 13)
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
781 {
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
782 len = xfont_decode_coding_xlfd (p0, -1, name);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
783 fullname = Fdowncase (make_string (name, len));
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
784 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
785 XFree (p0);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
786 }
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
787 x_uncatch_errors ();
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
788 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
789
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
790 if (! xfont)
96575
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
791 {
103543
11b57e1bdb96 Change font_add_log to FONT_ADD_LOG.
Kenichi Handa <handa@m17n.org>
parents: 103274
diff changeset
792 FONT_ADD_LOG (" x:open failed", build_string (name), Qnil);
96575
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
793 return Qnil;
2c94c05f0d89 (xfont_open): Log the reason of failure.
Kenichi Handa <handa@m17n.org>
parents: 96570
diff changeset
794 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
795
96560
d87a9f1b9378 (xfont_open): Adjust it for the change of
Kenichi Handa <handa@m17n.org>
parents: 95568
diff changeset
796 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
797 entity, pixel_size);
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
798 ASET (font_object, FONT_TYPE_INDEX, Qx);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
799 if (STRINGP (fullname))
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
800 {
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
801 font_parse_xlfd ((char *) SDATA (fullname), font_object);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
802 ASET (font_object, FONT_NAME_INDEX, fullname);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
803 }
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
804 else
100553
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
805 {
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
806 char buf[512];
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
807
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
808 len = xfont_decode_coding_xlfd (name, -1, buf);
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
809 ASET (font_object, FONT_NAME_INDEX, make_string (buf, len));
e42552b2edda (xfont_decode_coding_xlfd): New function.
Kenichi Handa <handa@m17n.org>
parents: 97327
diff changeset
810 }
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
811 ASET (font_object, FONT_FULLNAME_INDEX, fullname);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
812 ASET (font_object, FONT_FILE_INDEX, Qnil);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
813 ASET (font_object, FONT_FORMAT_INDEX, Qx);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
814 font = XFONT_OBJECT (font_object);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
815 ((struct xfont_info *) font)->xfont = xfont;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
816 ((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
817 font->pixel_size = pixel_size;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
818 font->driver = &xfont_driver;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
819 font->encoding_charset = encoding->id;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
820 font->repertory_charset = repertory ? repertory->id : -1;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
821 font->ascent = xfont->ascent;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
822 font->descent = xfont->descent;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
823 font->height = font->ascent + font->descent;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
824 font->min_width = xfont->min_bounds.width;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
825 if (xfont->min_bounds.width == xfont->max_bounds.width)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
826 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
827 /* Fixed width font. */
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
828 font->average_width = font->space_width = xfont->min_bounds.width;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
829 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
830 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
831 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
832 XCharStruct *pcm;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
833 XChar2b char2b;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
834 Lisp_Object val;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
835
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
836 char2b.byte1 = 0x00, char2b.byte2 = 0x20;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
837 pcm = xfont_get_pcm (xfont, &char2b);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
838 if (pcm)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
839 font->space_width = pcm->width;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
840 else
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
841 font->space_width = 0;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
842
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
843 val = Ffont_get (font_object, QCavgwidth);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
844 if (INTEGERP (val))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
845 font->average_width = XINT (val);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
846 if (font->average_width < 0)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
847 font->average_width = - font->average_width;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
848 if (font->average_width == 0
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
849 && encoding->ascii_compatible_p)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
850 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
851 int width = font->space_width, n = pcm != NULL;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
852
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
853 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
854 if ((pcm = xfont_get_pcm (xfont, &char2b)) != NULL)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
855 width += pcm->width, n++;
95330
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
856 if (n > 0)
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
857 font->average_width = width / n;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
858 }
95330
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
859 if (font->average_width == 0)
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
860 /* 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
861 average_width. */
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
862 font->average_width
fe15ab9a9bc7 (xfont_open): Fix calculation of font->average_width.
Kenichi Handa <handa@m17n.org>
parents: 95227
diff changeset
863 = (xfont->min_bounds.width + xfont->max_bounds.width) / 2;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
864 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
865
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
866 BLOCK_INPUT;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
867 font->underline_thickness
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
868 = (XGetFontProperty (xfont, XA_UNDERLINE_THICKNESS, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
869 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
870 font->underline_position
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
871 = (XGetFontProperty (xfont, XA_UNDERLINE_POSITION, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
872 ? (long) value : -1);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
873 font->baseline_offset
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
874 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_BASELINE_OFFSET, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
875 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
876 font->relative_compose
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
877 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_RELATIVE_COMPOSE, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
878 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
879 font->default_ascent
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
880 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_DEFAULT_ASCENT, &value)
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
881 ? (long) value : 0);
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
882 UNBLOCK_INPUT;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
883
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
884 if (NILP (fullname))
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
885 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
886 font->vertical_centering
dec3815c40d7 (xfont_open): Cancel the previous about font->vertical_centering.
Kenichi Handa <handa@m17n.org>
parents: 96560
diff changeset
887 = (STRINGP (Vvertical_centering_font_regexp)
dec3815c40d7 (xfont_open): Cancel the previous about font->vertical_centering.
Kenichi Handa <handa@m17n.org>
parents: 96560
diff changeset
888 && (fast_string_match_ignore_case
dec3815c40d7 (xfont_open): Cancel the previous about font->vertical_centering.
Kenichi Handa <handa@m17n.org>
parents: 96560
diff changeset
889 (Vvertical_centering_font_regexp, fullname) >= 0));
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
890
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
891 return font_object;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
892 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
893
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
894 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
895 xfont_close (FRAME_PTR f, struct font *font)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
896 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
897 BLOCK_INPUT;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
898 XFreeFont (FRAME_X_DISPLAY (f), ((struct xfont_info *) font)->xfont);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
899 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
900 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
901
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
902 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
903 xfont_prepare_face (FRAME_PTR f, struct face *face)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
904 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
905 BLOCK_INPUT;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
906 XSetFont (FRAME_X_DISPLAY (f), face->gc,
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
907 ((struct xfont_info *) face->font)->xfont->fid);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
908 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
909
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
910 return 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
911 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
912
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
913 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
914 xfont_has_char (Lisp_Object font, int c)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
915 {
102993
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
916 Lisp_Object registry = AREF (font, FONT_REGISTRY_INDEX);
102956
b20a4659fd91 (xfont_has_char): The font has C if C is ASCII and the
Kenichi Handa <handa@m17n.org>
parents: 101943
diff changeset
917 struct charset *encoding;
102993
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
918 struct charset *repertory = NULL;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
919
102993
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
920 if (EQ (registry, Qiso10646_1))
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
921 {
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
922 encoding = CHARSET_FROM_ID (charset_unicode);
102993
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
923 /* We use a font of `ja' and `ko' adstyle only for a character
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
924 in JISX0208 and KSC5601 charsets respectively. */
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
925 if (EQ (AREF (font, FONT_ADSTYLE_INDEX), Qja)
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
926 && charset_jisx0208 >= 0)
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
927 repertory = CHARSET_FROM_ID (charset_jisx0208);
102993
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
928 else if (EQ (AREF (font, FONT_ADSTYLE_INDEX), Qko)
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
929 && charset_ksc5601 >= 0)
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
930 repertory = CHARSET_FROM_ID (charset_ksc5601);
102993
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
931 }
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
932 else if (font_registry_charsets (registry, &encoding, &repertory) < 0)
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
933 /* Unknown REGISTRY, not usable. */
2e2d289b5f6a (xfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102956
diff changeset
934 return 0;
102956
b20a4659fd91 (xfont_has_char): The font has C if C is ASCII and the
Kenichi Handa <handa@m17n.org>
parents: 101943
diff changeset
935 if (ASCII_CHAR_P (c) && encoding->ascii_compatible_p)
b20a4659fd91 (xfont_has_char): The font has C if C is ASCII and the
Kenichi Handa <handa@m17n.org>
parents: 101943
diff changeset
936 return 1;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
937 if (! repertory)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
938 return -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
939 return (ENCODE_CHAR (repertory, c) != CHARSET_INVALID_CODE (repertory));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
940 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
941
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
942 static unsigned
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
943 xfont_encode_char (struct font *font, int c)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
944 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
945 XFontStruct *xfont = ((struct xfont_info *) font)->xfont;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
946 struct charset *charset;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
947 unsigned code;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
948 XChar2b char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
949
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
950 charset = CHARSET_FROM_ID (font->encoding_charset);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
951 code = ENCODE_CHAR (charset, c);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
952 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
953 return FONT_INVALID_CODE;
90454
a8b745412821 (xfont_open, xfont_encode_char): Fix typo.
Kenichi Handa <handa@m17n.org>
parents: 90443
diff changeset
954 if (font->repertory_charset >= 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
955 {
90454
a8b745412821 (xfont_open, xfont_encode_char): Fix typo.
Kenichi Handa <handa@m17n.org>
parents: 90443
diff changeset
956 charset = CHARSET_FROM_ID (font->repertory_charset);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
957 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
958 ? code : FONT_INVALID_CODE);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
959 }
90425
5976e428d68e (xfont_encode_char): Fix calculation of char2b.
Kenichi Handa <handa@m17n.org>
parents: 90400
diff changeset
960 char2b.byte1 = code >> 8;
5976e428d68e (xfont_encode_char): Fix calculation of char2b.
Kenichi Handa <handa@m17n.org>
parents: 90400
diff changeset
961 char2b.byte2 = code & 0xFF;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
962 return (xfont_get_pcm (xfont, &char2b) ? code : FONT_INVALID_CODE);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
963 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
964
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
965 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
966 xfont_text_extents (struct font *font, unsigned int *code, int nglyphs, struct font_metrics *metrics)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
967 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
968 XFontStruct *xfont = ((struct xfont_info *) font)->xfont;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
969 int width = 0;
96570
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
970 int i, first, x;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
971
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
972 if (metrics)
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109126
diff changeset
973 memset (metrics, 0, sizeof (struct font_metrics));
96570
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
974 for (i = 0, x = 0, first = 1; i < nglyphs; i++)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
975 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
976 XChar2b char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
977 static XCharStruct *pcm;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
978
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
979 if (code[i] >= 0x10000)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
980 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
981 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
982 pcm = xfont_get_pcm (xfont, &char2b);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
983 if (! pcm)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
984 continue;
96570
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
985 if (first)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
986 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
987 if (metrics)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
988 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
989 metrics->lbearing = pcm->lbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
990 metrics->rbearing = pcm->rbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
991 metrics->ascent = pcm->ascent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
992 metrics->descent = pcm->descent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
993 }
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
994 first = 0;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
995 }
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
996 else
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
997 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
998 if (metrics)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
999 {
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
1000 if (metrics->lbearing > width + pcm->lbearing)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
1001 metrics->lbearing = width + pcm->lbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
1002 if (metrics->rbearing < width + pcm->rbearing)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
1003 metrics->rbearing = width + pcm->rbearing;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
1004 if (metrics->ascent < pcm->ascent)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
1005 metrics->ascent = pcm->ascent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
1006 if (metrics->descent < pcm->descent)
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
1007 metrics->descent = pcm->descent;
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
1008 }
12587e64cfe3 (xfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents: 96566
diff changeset
1009 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1010 width += pcm->width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1011 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1012 if (metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1013 metrics->width = width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1014 return width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1015 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1016
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1017 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1018 xfont_draw (struct glyph_string *s, int from, int to, int x, int y, int with_background)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1019 {
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
1020 XFontStruct *xfont = ((struct xfont_info *) s->font)->xfont;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1021 int len = to - from;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
1022 GC gc = s->gc;
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1023 int i;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
1024
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
1025 if (s->gc != s->face->gc)
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
1026 {
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
1027 BLOCK_INPUT;
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
1028 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
1029 UNBLOCK_INPUT;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
1030 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1031
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1032 if (xfont->min_byte1 == 0 && xfont->max_byte1 == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1033 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1034 char *str;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1035 USE_SAFE_ALLOCA;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1036
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1037 SAFE_ALLOCA (str, char *, len);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1038 for (i = 0; i < len ; i++)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1039 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
1040 BLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1041 if (with_background > 0)
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1042 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1043 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1044 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1045 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
1046 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
1047 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1048 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
1049 gc, x, y, str, len);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1050 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1051 else
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1052 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1053 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1054 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1055 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
1056 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
1057 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1058 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
1059 gc, x, y, str, len);
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1060 }
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
1061 UNBLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1062 SAFE_FREE ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1063 return s->nchars;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1064 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1065
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
1066 BLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1067 if (with_background > 0)
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1068 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1069 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1070 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1071 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
1072 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
1073 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1074 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
1075 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
1076 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1077 else
92185
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1078 {
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1079 if (s->padding_p)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1080 for (i = 0; i < len; i++)
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1081 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
1082 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
1083 else
1e28008a13e5 (xfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91905
diff changeset
1084 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
1085 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
1086 }
91905
6ae79e72fea7 (xfont_draw): Use BLOCK_INPUT and UNBLOCK_INPUT.
Kenichi Handa <handa@m17n.org>
parents: 91554
diff changeset
1087 UNBLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1088
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1089 return len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1090 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1091
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
1092 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1093 xfont_check (FRAME_PTR f, struct font *font)
94940
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
1094 {
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
1095 struct xfont_info *xfont = (struct xfont_info *) font;
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
1096
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
1097 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
1098 }
061d44df20b7 Include <stdlib.h> and "ccl.h".
Kenichi Handa <handa@m17n.org>
parents: 92185
diff changeset
1099
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1100
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1101 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1102 syms_of_xfont (void)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1103 {
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
1104 staticpro (&xfont_scripts_cache);
103274
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
1105 { /* Here we rely on the fact that syms_of_xfont (via syms_of_font)
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
1106 is called fairly late, when QCtest and Qequal are known to be set. */
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
1107 Lisp_Object args[2];
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
1108 args[0] = QCtest;
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
1109 args[1] = Qequal;
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
1110 xfont_scripts_cache = Fmake_hash_table (2, args);
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
1111 }
103270
c4706100caab (xfont_chars_supported, xfont_supported_scripts): New
Kenichi Handa <handa@m17n.org>
parents: 103184
diff changeset
1112 staticpro (&xfont_scratch_props);
103274
0e85983c95eb (xfont_list_pattern): Don't initialize xfont_scripts_cache
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 103270
diff changeset
1113 xfont_scratch_props = Fmake_vector (make_number (8), Qnil);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1114 xfont_driver.type = Qx;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1115 register_font_driver (&xfont_driver, NULL);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1116 }
90427
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
1117
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
1118 /* arch-tag: 23c5f366-a5ee-44b7-a3b7-90d6da7fd749
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
1119 (do not change this comment) */