annotate src/xftfont.c @ 112119:48f5ac42611a

Reconcile with changes in line movement behavior for long text lines that cross more than a single physical window line, ie when truncate-lines is nil. (allout-next-visible-heading): Provide for change in line-move behavior on long lines when truncate-lines is nil. In that case, line-move can wind up on the same textual line when it moves to the next window line, and moving to the bullet position after the move yields zero advancement. Add logic to detect and compensate for the lack of progress. (allout-current-topic-collapsed-p): move-end-of-line respect for field boundaries is different when operating with body lines shorter than window width versus ones greater than window width, which can yield false negatives in this function. Avoid difference by applying move-end-of-line while field-text-motion is inhibited.
author Ken Manheimer <ken.manheimer@gmail.com>
date Tue, 04 Jan 2011 14:44:10 -0500
parents 1e7d8f405703
children 417b1e4d63cd
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 /* xftfont.c -- XFT font driver.
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 106755
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: 106755
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: 94941
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: 94941
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: 94941
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: 94941
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>
105669
68dd71358159 * alloc.c: Do not define struct catchtag.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 103838
diff changeset
24 #include <setjmp.h>
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
25 #include <X11/Xlib.h>
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
26 #include <X11/Xft/Xft.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"
111038
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
35 #include "composite.h"
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
36 #include "fontset.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
37 #include "font.h"
91143
06de618f78e7 Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents: 91110
diff changeset
38 #include "ftfont.h"
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
39
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
40 /* Xft font driver. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
41
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
42 static Lisp_Object Qxft;
106558
3d091f151696 xftfont.c: Parse symbolic names for constants also.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106538
diff changeset
43 static Lisp_Object QChinting, QCautohint, QChintstyle, QCrgba, QCembolden,
3d091f151696 xftfont.c: Parse symbolic names for constants also.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106538
diff changeset
44 QClcdfilter;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
45
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
46 /* The actual structure for Xft font that can be casted to struct
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
47 font. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
48
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
49 struct xftfont_info
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
50 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
51 struct font font;
106538
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
52 /* The following five members must be here in this order to be
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
53 compatible with struct ftfont_info (in ftfont.c). */
91143
06de618f78e7 Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents: 91110
diff changeset
54 #ifdef HAVE_LIBOTF
06de618f78e7 Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents: 91110
diff changeset
55 int maybe_otf; /* Flag to tell if this may be OTF or not. */
06de618f78e7 Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents: 91110
diff changeset
56 OTF *otf;
91163
a12e3e58ec94 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 91143
diff changeset
57 #endif /* HAVE_LIBOTF */
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
58 FT_Size ft_size;
101555
a8e049b0d2c2 (struct xftfont_info): New member `index'.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
59 int index;
106538
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
60 FT_Matrix matrix;
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
61 Display *display;
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
62 int screen;
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
63 XftFont *xftfont;
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
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
66 /* Structure pointed by (struct face *)->extra */
90559
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
67
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
68 struct xftface_info
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
69 {
90559
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
70 XftColor xft_fg; /* color for face->foreground */
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
71 XftColor xft_bg; /* color for face->background */
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
72 };
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
73
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 109081
diff changeset
74 static void xftfont_get_colors (FRAME_PTR, struct face *, GC gc,
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 109081
diff changeset
75 struct xftface_info *,
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 109081
diff changeset
76 XftColor *fg, XftColor *bg);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
77
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
78
90559
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
79 /* Setup foreground and background colors of GC into FG and BG. If
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
80 XFTFACE_INFO is not NULL, reuse the colors in it if possible. BG
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
81 may be NULL. */
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
82
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
83 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
84 xftfont_get_colors (FRAME_PTR f, struct face *face, GC gc, struct xftface_info *xftface_info, XftColor *fg, XftColor *bg)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
85 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
86 if (xftface_info && face->gc == gc)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
87 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
88 *fg = xftface_info->xft_fg;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
89 if (bg)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
90 *bg = xftface_info->xft_bg;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
91 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
92 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
93 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
94 XGCValues xgcv;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
95 int fg_done = 0, bg_done = 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
96
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
97 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
98 XGetGCValues (FRAME_X_DISPLAY (f), gc,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
99 GCForeground | GCBackground, &xgcv);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
100 if (xftface_info)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
101 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
102 if (xgcv.foreground == face->foreground)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
103 *fg = xftface_info->xft_fg, fg_done = 1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
104 else if (xgcv.foreground == face->background)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
105 *fg = xftface_info->xft_bg, fg_done = 1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
106 if (! bg)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
107 bg_done = 1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
108 else if (xgcv.background == face->background)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
109 *bg = xftface_info->xft_bg, bg_done = 1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
110 else if (xgcv.background == face->foreground)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
111 *bg = xftface_info->xft_fg, bg_done = 1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
112 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
113
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
114 if (fg_done + bg_done < 2)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
115 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
116 XColor colors[2];
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
117
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
118 colors[0].pixel = fg->pixel = xgcv.foreground;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
119 if (bg)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
120 colors[1].pixel = bg->pixel = xgcv.background;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
121 XQueryColors (FRAME_X_DISPLAY (f), FRAME_X_COLORMAP (f), colors,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
122 bg ? 2 : 1);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
123 fg->color.alpha = 0xFFFF;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
124 fg->color.red = colors[0].red;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
125 fg->color.green = colors[0].green;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
126 fg->color.blue = colors[0].blue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
127 if (bg)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
128 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
129 bg->color.alpha = 0xFFFF;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
130 bg->color.red = colors[1].red;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
131 bg->color.green = colors[1].green;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
132 bg->color.blue = colors[1].blue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
133 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
134 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
135 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
136 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
137 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
138
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
139
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 109081
diff changeset
140 static Lisp_Object xftfont_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: 109081
diff changeset
141 static Lisp_Object xftfont_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: 109081
diff changeset
142 static Lisp_Object xftfont_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: 109081
diff changeset
143 static void xftfont_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: 109081
diff changeset
144 static int xftfont_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: 109081
diff changeset
145 static void xftfont_done_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: 109081
diff changeset
146 static int xftfont_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: 109081
diff changeset
147 static unsigned xftfont_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: 109081
diff changeset
148 static int xftfont_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: 109081
diff changeset
149 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: 109081
diff changeset
150 static int xftfont_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: 109081
diff changeset
151 static int xftfont_end_for_frame (FRAME_PTR f);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
152
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
153 struct font_driver xftfont_driver;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
154
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
155 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
156 xftfont_list (Lisp_Object frame, Lisp_Object spec)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
157 {
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
158 Lisp_Object list = ftfont_driver.list (frame, spec), tail;
101943
97c9e9322753 Remove spurious semicolons.
Juanma Barranquero <lekktu@gmail.com>
parents: 101640
diff changeset
159
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
160 for (tail = list; CONSP (tail); tail = XCDR (tail))
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
161 ASET (XCAR (tail), FONT_TYPE_INDEX, Qxft);
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
162 return list;
90559
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
163 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
164
90559
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
165 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
166 xftfont_match (Lisp_Object frame, Lisp_Object spec)
90559
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
167 {
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
168 Lisp_Object entity = ftfont_driver.match (frame, spec);
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
169
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
170 if (! NILP (entity))
90559
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
171 ASET (entity, FONT_TYPE_INDEX, Qxft);
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
172 return entity;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
173 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
174
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
175 static FcChar8 ascii_printable[95];
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
176
106085
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
177 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
178 xftfont_fix_match (FcPattern *pat, FcPattern *match)
106085
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
179 {
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
180 /* These values are not used for matching (except antialias), but for
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
181 rendering, so make sure they are carried over to the match.
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
182 We also put antialias here because most fonts are antialiased, so
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
183 the match will have antialias true. */
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
184
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
185 FcBool b = FcTrue;
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
186 int i;
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
187 double dpi;
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
188
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
189 FcPatternGetBool (pat, FC_ANTIALIAS, 0, &b);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
190 if (! b)
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
191 {
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
192 FcPatternDel (match, FC_ANTIALIAS);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
193 FcPatternAddBool (match, FC_ANTIALIAS, FcFalse);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
194 }
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
195 FcPatternGetBool (pat, FC_HINTING, 0, &b);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
196 if (! b)
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
197 {
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
198 FcPatternDel (match, FC_HINTING);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
199 FcPatternAddBool (match, FC_HINTING, FcFalse);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
200 }
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
201 if (FcResultMatch == FcPatternGetInteger (pat, FC_HINT_STYLE, 0, &i))
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
202 {
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
203 FcPatternDel (match, FC_HINT_STYLE);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
204 FcPatternAddInteger (match, FC_HINT_STYLE, i);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
205 }
106092
6804c4648fee * xftfont.c (xftfont_fix_match): Older versions of fontconfig does
Jan Djärv <jan.h.d@swipnet.se>
parents: 106089
diff changeset
206 #ifndef FC_LCD_FILTER
106089
b40edfe3e412 #ifdef on FC_LCD_FILTER.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106085
diff changeset
207 /* Older fontconfig versions don't have FC_LCD_FILTER. */
106092
6804c4648fee * xftfont.c (xftfont_fix_match): Older versions of fontconfig does
Jan Djärv <jan.h.d@swipnet.se>
parents: 106089
diff changeset
208 #define FC_LCD_FILTER "lcdfilter"
6804c4648fee * xftfont.c (xftfont_fix_match): Older versions of fontconfig does
Jan Djärv <jan.h.d@swipnet.se>
parents: 106089
diff changeset
209 #endif
106085
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
210 if (FcResultMatch == FcPatternGetInteger (pat, FC_LCD_FILTER, 0, &i))
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
211 {
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
212 FcPatternDel (match, FC_LCD_FILTER);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
213 FcPatternAddInteger (match, FC_LCD_FILTER, i);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
214 }
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
215 if (FcResultMatch == FcPatternGetInteger (pat, FC_RGBA, 0, &i))
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
216 {
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
217 FcPatternDel (match, FC_RGBA);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
218 FcPatternAddInteger (match, FC_RGBA, i);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
219 }
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
220 if (FcResultMatch == FcPatternGetDouble (pat, FC_DPI, 0, &dpi))
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
221 {
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
222 FcPatternDel (match, FC_DPI);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
223 FcPatternAddDouble (match, FC_DPI, dpi);
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
224 }
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
225 }
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
226
106755
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
227 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
228 xftfont_add_rendering_parameters (FcPattern *pat, Lisp_Object entity)
106755
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
229 {
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
230 Lisp_Object tail;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
231 int ival;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
232
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
233 for (tail = AREF (entity, FONT_EXTRA_INDEX); CONSP (tail); tail = XCDR (tail))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
234 {
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
235 Lisp_Object key = XCAR (XCAR (tail));
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
236 Lisp_Object val = XCDR (XCAR (tail));
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
237
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
238 if (EQ (key, QCantialias))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
239 FcPatternAddBool (pat, FC_ANTIALIAS, NILP (val) ? FcFalse : FcTrue);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
240 else if (EQ (key, QChinting))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
241 FcPatternAddBool (pat, FC_HINTING, NILP (val) ? FcFalse : FcTrue);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
242 else if (EQ (key, QCautohint))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
243 FcPatternAddBool (pat, FC_AUTOHINT, NILP (val) ? FcFalse : FcTrue);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
244 else if (EQ (key, QChintstyle))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
245 {
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
246 if (INTEGERP (val))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
247 FcPatternAddInteger (pat, FC_HINT_STYLE, XINT (val));
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
248 else if (SYMBOLP (val)
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
249 && FcNameConstant (SDATA (SYMBOL_NAME (val)), &ival))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
250 FcPatternAddInteger (pat, FC_HINT_STYLE, ival);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
251 }
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
252 else if (EQ (key, QCrgba))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
253 {
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
254 if (INTEGERP (val))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
255 FcPatternAddInteger (pat, FC_RGBA, XINT (val));
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
256 else if (SYMBOLP (val)
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
257 && FcNameConstant (SDATA (SYMBOL_NAME (val)), &ival))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
258 FcPatternAddInteger (pat, FC_RGBA, ival);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
259 }
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
260 else if (EQ (key, QClcdfilter))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
261 {
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
262 if (INTEGERP (val))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
263 FcPatternAddInteger (pat, FC_LCD_FILTER, ival = XINT (val));
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
264 else if (SYMBOLP (val)
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
265 && FcNameConstant (SDATA (SYMBOL_NAME (val)), &ival))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
266 FcPatternAddInteger (pat, FC_LCD_FILTER, ival);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
267 }
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
268 #ifdef FC_EMBOLDEN
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
269 else if (EQ (key, QCembolden))
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
270 FcPatternAddBool (pat, FC_EMBOLDEN, NILP (val) ? FcFalse : FcTrue);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
271 #endif
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
272 }
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
273 }
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
274
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
275 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
276 xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
277 {
96075
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
278 FcResult result;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
279 Display *display = FRAME_X_DISPLAY (f);
106755
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
280 Lisp_Object val, filename, index, font_object;
96075
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
281 FcPattern *pat = NULL, *match;
90460
86449661f321 (xftfont_open): Change coding style of error
Kenichi Handa <handa@m17n.org>
parents: 90442
diff changeset
282 struct xftfont_info *xftfont_info = NULL;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
283 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
284 double size = 0;
90460
86449661f321 (xftfont_open): Change coding style of error
Kenichi Handa <handa@m17n.org>
parents: 90442
diff changeset
285 XftFont *xftfont = NULL;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
286 int spacing;
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
287 char name[256];
106755
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
288 int len, i;
90959
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
289 XGlyphInfo extents;
91226
040f2e332dc3 (struct xftfont_info): Delete the member ft_face.
Kenichi Handa <handa@m17n.org>
parents: 91163
diff changeset
290 FT_Face ft_face;
106538
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
291 FcMatrix *matrix;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
292
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
293 val = assq_no_quit (QCfont_entity, AREF (entity, FONT_EXTRA_INDEX));
95102
a3868b9c34f4 (xftfont_open): Ajusted for the change of extra info
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
294 if (! CONSP (val))
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
295 return Qnil;
95102
a3868b9c34f4 (xftfont_open): Ajusted for the change of extra info
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
296 val = XCDR (val);
a3868b9c34f4 (xftfont_open): Ajusted for the change of extra info
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
297 filename = XCAR (val);
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
298 index = XCDR (val);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
299 size = XINT (AREF (entity, FONT_SIZE_INDEX));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
300 if (size == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
301 size = pixel_size;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
302 pat = FcPatternCreate ();
96075
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
303 FcPatternAddInteger (pat, FC_WEIGHT, FONT_WEIGHT_NUMERIC (entity));
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
304 i = FONT_SLANT_NUMERIC (entity) - 100;
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
305 if (i < 0) i = 0;
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
306 FcPatternAddInteger (pat, FC_SLANT, i);
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
307 FcPatternAddInteger (pat, FC_WIDTH, FONT_WIDTH_NUMERIC (entity));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
308 FcPatternAddDouble (pat, FC_PIXEL_SIZE, pixel_size);
90714
698001835583 (xftfont_open): Call FcConfigSubstitute.
Kenichi Handa <handa@m17n.org>
parents: 90712
diff changeset
309 val = AREF (entity, FONT_FAMILY_INDEX);
698001835583 (xftfont_open): Call FcConfigSubstitute.
Kenichi Handa <handa@m17n.org>
parents: 90712
diff changeset
310 if (! NILP (val))
698001835583 (xftfont_open): Call FcConfigSubstitute.
Kenichi Handa <handa@m17n.org>
parents: 90712
diff changeset
311 FcPatternAddString (pat, FC_FAMILY, (FcChar8 *) SDATA (SYMBOL_NAME (val)));
96094
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
312 val = AREF (entity, FONT_FOUNDRY_INDEX);
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
313 if (! NILP (val))
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
314 FcPatternAddString (pat, FC_FOUNDRY, (FcChar8 *) SDATA (SYMBOL_NAME (val)));
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
315 val = AREF (entity, FONT_SPACING_INDEX);
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
316 if (! NILP (val))
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
317 FcPatternAddInteger (pat, FC_SPACING, XINT (val));
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
318 val = AREF (entity, FONT_DPI_INDEX);
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
319 if (! NILP (val))
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
320 {
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
321 double dbl = XINT (val);
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
322
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
323 FcPatternAddDouble (pat, FC_DPI, dbl);
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
324 }
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
325 val = AREF (entity, FONT_AVGWIDTH_INDEX);
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
326 if (INTEGERP (val) && XINT (val) == 0)
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
327 FcPatternAddBool (pat, FC_SCALABLE, FcTrue);
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
328 /* This is necessary to identify the exact font (e.g. 10x20.pcf.gz
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
329 over 10x20-ISO8859-1.pcf.gz). */
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
330 FcPatternAddCharSet (pat, FC_CHARSET, ftfont_get_fc_charset (entity));
96094
0304b3142c84 (xftfont_open): Add FOUNDRY, SPACING, DPI, SCALABLE to the pattern.
Kenichi Handa <handa@m17n.org>
parents: 96075
diff changeset
331
106755
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
332 xftfont_add_rendering_parameters (pat, entity);
90442
d6abf2344438 (xftfont_open): Make the font name fontconfig's
Kenichi Handa <handa@m17n.org>
parents: 90427
diff changeset
333
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
334 FcPatternAddString (pat, FC_FILE, (FcChar8 *) SDATA (filename));
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
335 FcPatternAddInteger (pat, FC_INDEX, XINT (index));
101943
97c9e9322753 Remove spurious semicolons.
Juanma Barranquero <lekktu@gmail.com>
parents: 101640
diff changeset
336
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
337
90442
d6abf2344438 (xftfont_open): Make the font name fontconfig's
Kenichi Handa <handa@m17n.org>
parents: 90427
diff changeset
338 BLOCK_INPUT;
103199
3b14cedd241f (xftfont_open): Make sure that Xrender extension is added
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 102992
diff changeset
339 /* Make sure that the Xrender extension is added before the Xft one.
3b14cedd241f (xftfont_open): Make sure that Xrender extension is added
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 102992
diff changeset
340 Otherwise, the close-display hook set by Xft is called after the
3b14cedd241f (xftfont_open): Make sure that Xrender extension is added
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 102992
diff changeset
341 one for Xrender, and the former tries to re-add the latter. This
3b14cedd241f (xftfont_open): Make sure that Xrender extension is added
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 102992
diff changeset
342 results in inconsistency of internal states and leads to X
3b14cedd241f (xftfont_open): Make sure that Xrender extension is added
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 102992
diff changeset
343 protocol error when one reconnects to the same X server.
3b14cedd241f (xftfont_open): Make sure that Xrender extension is added
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 102992
diff changeset
344 (Bug#1696) */
3b14cedd241f (xftfont_open): Make sure that Xrender extension is added
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 102992
diff changeset
345 {
3b14cedd241f (xftfont_open): Make sure that Xrender extension is added
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 102992
diff changeset
346 int event_base, error_base;
3b14cedd241f (xftfont_open): Make sure that Xrender extension is added
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 102992
diff changeset
347 XRenderQueryExtension (display, &event_base, &error_base);
3b14cedd241f (xftfont_open): Make sure that Xrender extension is added
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents: 102992
diff changeset
348 }
106085
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
349
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
350 /* Substitute in values from X resources and XftDefaultSet. */
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
351 XftDefaultSubstitute (display, FRAME_X_SCREEN_NUMBER (f), pat);
96075
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
352 match = XftFontMatch (display, FRAME_X_SCREEN_NUMBER (f), pat, &result);
106085
cd4cbab8bb21 Handle system default font and changing font parameters.
Jan Djärv <jan.h.d@swipnet.se>
parents: 105669
diff changeset
353 xftfont_fix_match (pat, match);
106558
3d091f151696 xftfont.c: Parse symbolic names for constants also.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106538
diff changeset
354
96075
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
355 FcPatternDestroy (pat);
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
356 xftfont = XftFontOpenPattern (display, match);
103650
e561e9f73ad4 * xftfont.c (xftfont_open): Avoid passing NULL argument to
Chong Yidong <cyd@stupidchicken.com>
parents: 103199
diff changeset
357 if (!xftfont)
e561e9f73ad4 * xftfont.c (xftfont_open): Avoid passing NULL argument to
Chong Yidong <cyd@stupidchicken.com>
parents: 103199
diff changeset
358 {
e561e9f73ad4 * xftfont.c (xftfont_open): Avoid passing NULL argument to
Chong Yidong <cyd@stupidchicken.com>
parents: 103199
diff changeset
359 UNBLOCK_INPUT;
e561e9f73ad4 * xftfont.c (xftfont_open): Avoid passing NULL argument to
Chong Yidong <cyd@stupidchicken.com>
parents: 103199
diff changeset
360 XftPatternDestroy (match);
e561e9f73ad4 * xftfont.c (xftfont_open): Avoid passing NULL argument to
Chong Yidong <cyd@stupidchicken.com>
parents: 103199
diff changeset
361 return Qnil;
e561e9f73ad4 * xftfont.c (xftfont_open): Avoid passing NULL argument to
Chong Yidong <cyd@stupidchicken.com>
parents: 103199
diff changeset
362 }
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
363 ft_face = XftLockFace (xftfont);
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
364 UNBLOCK_INPUT;
96075
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
365
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
366 /* We should not destroy PAT here because it is kept in XFTFONT and
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
367 destroyed automatically when XFTFONT is closed. */
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
368 font_object = font_make_object (VECSIZE (struct xftfont_info), entity, size);
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
369 ASET (font_object, FONT_TYPE_INDEX, Qxft);
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
370 len = font_unparse_xlfd (entity, size, name, 256);
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
371 if (len > 0)
100551
42e9e426d886 (xftfont_open): Genarate a multibyte string if give names are utf-8.
Kenichi Handa <handa@m17n.org>
parents: 100427
diff changeset
372 ASET (font_object, FONT_NAME_INDEX, make_string (name, len));
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
373 len = font_unparse_fcname (entity, size, name, 256);
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
374 if (len > 0)
100551
42e9e426d886 (xftfont_open): Genarate a multibyte string if give names are utf-8.
Kenichi Handa <handa@m17n.org>
parents: 100427
diff changeset
375 ASET (font_object, FONT_FULLNAME_INDEX, make_string (name, len));
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
376 else
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
377 ASET (font_object, FONT_FULLNAME_INDEX,
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
378 AREF (font_object, FONT_NAME_INDEX));
95102
a3868b9c34f4 (xftfont_open): Ajusted for the change of extra info
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
379 ASET (font_object, FONT_FILE_INDEX, filename);
a3868b9c34f4 (xftfont_open): Ajusted for the change of extra info
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
380 ASET (font_object, FONT_FORMAT_INDEX,
96431
abddf0a4cec0 (xftfont_open): Don't call FcConfigSubstitute and
Kenichi Handa <handa@m17n.org>
parents: 96146
diff changeset
381 ftfont_font_format (xftfont->pattern, filename));
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
382 font = XFONT_OBJECT (font_object);
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
383 font->pixel_size = pixel_size;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
384 font->driver = &xftfont_driver;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
385 font->encoding_charset = font->repertory_charset = -1;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
386
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
387 xftfont_info = (struct xftfont_info *) font;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
388 xftfont_info->display = display;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
389 xftfont_info->screen = FRAME_X_SCREEN_NUMBER (f);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
390 xftfont_info->xftfont = xftfont;
106538
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
391 /* This means that there's no need of transformation. */
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
392 xftfont_info->matrix.xx = 0;
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
393 if (FcPatternGetMatrix (xftfont->pattern, FC_MATRIX, 0, &matrix)
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
394 == FcResultMatch)
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
395 {
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
396 xftfont_info->matrix.xx = 0x10000L * matrix->xx;
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
397 xftfont_info->matrix.yy = 0x10000L * matrix->yy;
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
398 xftfont_info->matrix.xy = 0x10000L * matrix->xy;
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
399 xftfont_info->matrix.yx = 0x10000L * matrix->yx;
500878bee91d (struct xftfont_info): New member matrix.
Kenichi Handa <handa@m17n.org>
parents: 106290
diff changeset
400 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
401 font->pixel_size = size;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
402 font->driver = &xftfont_driver;
95102
a3868b9c34f4 (xftfont_open): Ajusted for the change of extra info
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
403 if (INTEGERP (AREF (entity, FONT_SPACING_INDEX)))
a3868b9c34f4 (xftfont_open): Ajusted for the change of extra info
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
404 spacing = XINT (AREF (entity, FONT_SPACING_INDEX));
a3868b9c34f4 (xftfont_open): Ajusted for the change of extra info
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
405 else
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
406 spacing = FC_PROPORTIONAL;
90959
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
407 if (! ascii_printable[0])
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
408 {
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
409 int i;
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
410 for (i = 0; i < 95; i++)
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
411 ascii_printable[i] = ' ' + i;
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
412 }
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
413 BLOCK_INPUT;
109081
bcae1f83a33e Check FC_DUAL too. For such fonts, check width one by one.
Kenichi Handa <handa@etlken>
parents: 106815
diff changeset
414 if (spacing != FC_PROPORTIONAL && spacing != FC_DUAL)
90959
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
415 {
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
416 font->min_width = font->average_width = font->space_width
90959
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
417 = xftfont->max_advance_width;
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
418 XftTextExtents8 (display, xftfont, ascii_printable + 1, 94, &extents);
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
419 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
420 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
421 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
422 XftTextExtents8 (display, xftfont, ascii_printable, 1, &extents);
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
423 font->space_width = extents.xOff;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
424 if (font->space_width <= 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
425 /* dirty workaround */
101943
97c9e9322753 Remove spurious semicolons.
Juanma Barranquero <lekktu@gmail.com>
parents: 101640
diff changeset
426 font->space_width = pixel_size;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
427 XftTextExtents8 (display, xftfont, ascii_printable + 1, 94, &extents);
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
428 font->average_width = (font->space_width + extents.xOff) / 95;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
429 }
90442
d6abf2344438 (xftfont_open): Make the font name fontconfig's
Kenichi Handa <handa@m17n.org>
parents: 90427
diff changeset
430 UNBLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
431
90959
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
432 font->ascent = xftfont->ascent;
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
433 font->descent = xftfont->descent;
96075
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
434 if (pixel_size >= 5)
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
435 {
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
436 /* The above condition is a dirty workaround because
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
437 XftTextExtents8 behaves strangely for some fonts
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
438 (e.g. "Dejavu Sans Mono") when pixel_size is less than 5. */
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
439 if (font->ascent < extents.y)
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
440 font->ascent = extents.y;
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
441 if (font->descent < extents.height - extents.y)
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
442 font->descent = extents.height - extents.y;
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
443 }
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
444 font->height = font->ascent + font->descent;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
445
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
446 if (XINT (AREF (entity, FONT_SIZE_INDEX)) == 0)
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
447 {
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
448 int upEM = ft_face->units_per_EM;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
449
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
450 font->underline_position = -ft_face->underline_position * size / upEM;
102861
0ea82e792866 (xftfont_open): Fix setting font->underline_thickness.
Kenichi Handa <handa@m17n.org>
parents: 101943
diff changeset
451 font->underline_thickness = ft_face->underline_thickness * size / upEM;
95293
089ad7a58f94 (xftfont_open): Delete unused variable. If
Kenichi Handa <handa@m17n.org>
parents: 95102
diff changeset
452 if (font->underline_thickness > 2)
089ad7a58f94 (xftfont_open): Delete unused variable. If
Kenichi Handa <handa@m17n.org>
parents: 95102
diff changeset
453 font->underline_position -= font->underline_thickness / 2;
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
454 }
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
455 else
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
456 {
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
457 font->underline_position = -1;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
458 font->underline_thickness = 0;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
459 }
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
460 #ifdef HAVE_LIBOTF
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
461 xftfont_info->maybe_otf = ft_face->face_flags & FT_FACE_FLAG_SFNT;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
462 xftfont_info->otf = NULL;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
463 #endif /* HAVE_LIBOTF */
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
464 xftfont_info->ft_size = ft_face->size;
90959
3f83c9d3f96c (xftfont_open): If one of font's ASCII glyph has
Kenichi Handa <handa@m17n.org>
parents: 90714
diff changeset
465
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
466 /* Unfortunately Xft doesn't provide a way to get minimum char
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
467 width. So, we use space_width instead. */
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
468 font->min_width = font->space_width;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
469
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
470 font->baseline_offset = 0;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
471 font->relative_compose = 0;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
472 font->default_ascent = 0;
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
473 font->vertical_centering = 0;
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
474 #ifdef FT_BDF_H
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
475 if (! (ft_face->face_flags & FT_FACE_FLAG_SFNT))
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
476 {
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
477 BDF_PropertyRec rec;
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
478
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
479 if (FT_Get_BDF_Property (ft_face, "_MULE_BASELINE_OFFSET", &rec) == 0
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
480 && rec.type == BDF_PROPERTY_TYPE_INTEGER)
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
481 font->baseline_offset = rec.u.integer;
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
482 if (FT_Get_BDF_Property (ft_face, "_MULE_RELATIVE_COMPOSE", &rec) == 0
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
483 && rec.type == BDF_PROPERTY_TYPE_INTEGER)
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
484 font->relative_compose = rec.u.integer;
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
485 if (FT_Get_BDF_Property (ft_face, "_MULE_DEFAULT_ASCENT", &rec) == 0
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
486 && rec.type == BDF_PROPERTY_TYPE_INTEGER)
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
487 font->default_ascent = rec.u.integer;
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
488 }
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
489 #endif
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
490
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
491 return font_object;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
492 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
493
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
494 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
495 xftfont_close (FRAME_PTR f, struct font *font)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
496 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
497 struct xftfont_info *xftfont_info = (struct xftfont_info *) font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
498
91143
06de618f78e7 Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents: 91110
diff changeset
499 #ifdef HAVE_LIBOTF
06de618f78e7 Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents: 91110
diff changeset
500 if (xftfont_info->otf)
06de618f78e7 Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents: 91110
diff changeset
501 OTF_close (xftfont_info->otf);
06de618f78e7 Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents: 91110
diff changeset
502 #endif
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
503 BLOCK_INPUT;
96562
ea11c7e02573 (struct xftfont_info): New member ft_size. Make the
Kenichi Handa <handa@m17n.org>
parents: 96431
diff changeset
504 XftUnlockFace (xftfont_info->xftfont);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
505 XftFontClose (xftfont_info->display, xftfont_info->xftfont);
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
506 UNBLOCK_INPUT;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
507 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
508
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
509 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
510 xftfont_prepare_face (FRAME_PTR f, struct face *face)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
511 {
90489
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
512 struct xftface_info *xftface_info;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
513
90499
32b8f672da38 (xftfont_prepare_face): Cancel previous change.
Kenichi Handa <handa@m17n.org>
parents: 90489
diff changeset
514 #if 0
32b8f672da38 (xftfont_prepare_face): Cancel previous change.
Kenichi Handa <handa@m17n.org>
parents: 90489
diff changeset
515 /* This doesn't work if face->ascii_face doesn't use an Xft font. */
90489
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
516 if (face != face->ascii_face)
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
517 {
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
518 face->extra = face->ascii_face->extra;
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
519 return 0;
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
520 }
90499
32b8f672da38 (xftfont_prepare_face): Cancel previous change.
Kenichi Handa <handa@m17n.org>
parents: 90489
diff changeset
521 #endif
90489
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
522
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
523 xftface_info = malloc (sizeof (struct xftface_info));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
524 if (! xftface_info)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
525 return -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
526 xftfont_get_colors (f, face, face->gc, NULL,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
527 &xftface_info->xft_fg, &xftface_info->xft_bg);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
528 face->extra = xftface_info;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
529 return 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
530 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
531
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
532 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
533 xftfont_done_face (FRAME_PTR f, struct face *face)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
534 {
90489
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
535 struct xftface_info *xftface_info;
101943
97c9e9322753 Remove spurious semicolons.
Juanma Barranquero <lekktu@gmail.com>
parents: 101640
diff changeset
536
90499
32b8f672da38 (xftfont_prepare_face): Cancel previous change.
Kenichi Handa <handa@m17n.org>
parents: 90489
diff changeset
537 #if 0
32b8f672da38 (xftfont_prepare_face): Cancel previous change.
Kenichi Handa <handa@m17n.org>
parents: 90489
diff changeset
538 /* This doesn't work if face->ascii_face doesn't use an Xft font. */
90489
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
539 if (face != face->ascii_face
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
540 || ! face->extra)
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
541 return;
90499
32b8f672da38 (xftfont_prepare_face): Cancel previous change.
Kenichi Handa <handa@m17n.org>
parents: 90489
diff changeset
542 #endif
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
543
90489
78a820ef12db (xftfont_prepare_face): Make non-ascii face share
Kenichi Handa <handa@m17n.org>
parents: 90473
diff changeset
544 xftface_info = (struct xftface_info *) face->extra;
90527
63b888896eba * xftfont.c (xftfont_done_face): Call XftDrawDestroy only if xftface_info
Jan Djärv <jan.h.d@swipnet.se>
parents: 90511
diff changeset
545 if (xftface_info)
63b888896eba * xftfont.c (xftfont_done_face): Call XftDrawDestroy only if xftface_info
Jan Djärv <jan.h.d@swipnet.se>
parents: 90511
diff changeset
546 {
63b888896eba * xftfont.c (xftfont_done_face): Call XftDrawDestroy only if xftface_info
Jan Djärv <jan.h.d@swipnet.se>
parents: 90511
diff changeset
547 free (xftface_info);
91110
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
548 face->extra = NULL;
90527
63b888896eba * xftfont.c (xftfont_done_face): Call XftDrawDestroy only if xftface_info
Jan Djärv <jan.h.d@swipnet.se>
parents: 90511
diff changeset
549 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
550 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
551
101640
6a674ba1901f (xftfont_has_char): New function.
Kenichi Handa <handa@m17n.org>
parents: 101555
diff changeset
552 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
553 xftfont_has_char (Lisp_Object font, int c)
101640
6a674ba1901f (xftfont_has_char): New function.
Kenichi Handa <handa@m17n.org>
parents: 101555
diff changeset
554 {
6a674ba1901f (xftfont_has_char): New function.
Kenichi Handa <handa@m17n.org>
parents: 101555
diff changeset
555 struct xftfont_info *xftfont_info;
102992
64cdf8a83bdd (xftfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102861
diff changeset
556 struct charset *cs = NULL;
101640
6a674ba1901f (xftfont_has_char): New function.
Kenichi Handa <handa@m17n.org>
parents: 101555
diff changeset
557
102992
64cdf8a83bdd (xftfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102861
diff changeset
558 if (EQ (AREF (font, FONT_ADSTYLE_INDEX), Qja)
64cdf8a83bdd (xftfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102861
diff changeset
559 && charset_jisx0208 >= 0)
64cdf8a83bdd (xftfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102861
diff changeset
560 cs = CHARSET_FROM_ID (charset_jisx0208);
64cdf8a83bdd (xftfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102861
diff changeset
561 else if (EQ (AREF (font, FONT_ADSTYLE_INDEX), Qko)
64cdf8a83bdd (xftfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102861
diff changeset
562 && charset_ksc5601 >= 0)
64cdf8a83bdd (xftfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102861
diff changeset
563 cs = CHARSET_FROM_ID (charset_ksc5601);
64cdf8a83bdd (xftfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102861
diff changeset
564 if (cs)
64cdf8a83bdd (xftfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102861
diff changeset
565 return (ENCODE_CHAR (cs, c) != CHARSET_INVALID_CODE (cs));
64cdf8a83bdd (xftfont_has_char): Special handling of `ja' and `ko' adstyle.
Kenichi Handa <handa@m17n.org>
parents: 102861
diff changeset
566
103838
a7805f91abdd (xftfont_open): Fix typo: FC_RGBA->FC_HINT_STYLE.
Kenichi Handa <handa@m17n.org>
parents: 103650
diff changeset
567 if (FONT_ENTITY_P (font))
a7805f91abdd (xftfont_open): Fix typo: FC_RGBA->FC_HINT_STYLE.
Kenichi Handa <handa@m17n.org>
parents: 103650
diff changeset
568 return ftfont_driver.has_char (font, c);
101640
6a674ba1901f (xftfont_has_char): New function.
Kenichi Handa <handa@m17n.org>
parents: 101555
diff changeset
569 xftfont_info = (struct xftfont_info *) XFONT_OBJECT (font);
6a674ba1901f (xftfont_has_char): New function.
Kenichi Handa <handa@m17n.org>
parents: 101555
diff changeset
570 return (XftCharExists (xftfont_info->display, xftfont_info->xftfont,
6a674ba1901f (xftfont_has_char): New function.
Kenichi Handa <handa@m17n.org>
parents: 101555
diff changeset
571 (FcChar32) c) == FcTrue);
6a674ba1901f (xftfont_has_char): New function.
Kenichi Handa <handa@m17n.org>
parents: 101555
diff changeset
572 }
6a674ba1901f (xftfont_has_char): New function.
Kenichi Handa <handa@m17n.org>
parents: 101555
diff changeset
573
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
574 static unsigned
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
575 xftfont_encode_char (struct font *font, int c)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
576 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
577 struct xftfont_info *xftfont_info = (struct xftfont_info *) font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
578 unsigned code = XftCharIndex (xftfont_info->display, xftfont_info->xftfont,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
579 (FcChar32) c);
101943
97c9e9322753 Remove spurious semicolons.
Juanma Barranquero <lekktu@gmail.com>
parents: 101640
diff changeset
580
91269
421d7c7d296a (xftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents: 91243
diff changeset
581 return (code ? code : FONT_INVALID_CODE);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
582 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
583
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
584 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
585 xftfont_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
586 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
587 struct xftfont_info *xftfont_info = (struct xftfont_info *) font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
588 XGlyphInfo extents;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
589
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
590 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
591 XftGlyphExtents (xftfont_info->display, xftfont_info->xftfont, code, nglyphs,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
592 &extents);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
593 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
594 if (metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
595 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
596 metrics->lbearing = - extents.x;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
597 metrics->rbearing = - extents.x + extents.width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
598 metrics->width = extents.xOff;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
599 metrics->ascent = extents.y;
90616
68d59ef20174 (xftfont_text_extents): Fix calculation of descent
Kenichi Handa <handa@m17n.org>
parents: 90589
diff changeset
600 metrics->descent = extents.height - extents.y;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
601 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
602 return extents.xOff;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
603 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
604
91110
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
605 static XftDraw *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
606 xftfont_get_xft_draw (FRAME_PTR f)
91110
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
607 {
101943
97c9e9322753 Remove spurious semicolons.
Juanma Barranquero <lekktu@gmail.com>
parents: 101640
diff changeset
608 XftDraw *xft_draw = font_get_frame_data (f, &xftfont_driver);
91110
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
609
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
610 if (! xft_draw)
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
611 {
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
612 BLOCK_INPUT;
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
613 xft_draw= XftDrawCreate (FRAME_X_DISPLAY (f),
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
614 FRAME_X_WINDOW (f),
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
615 FRAME_X_VISUAL (f),
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
616 FRAME_X_COLORMAP (f));
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
617 UNBLOCK_INPUT;
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
618 if (! xft_draw)
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
619 abort ();
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
620 font_put_frame_data (f, &xftfont_driver, xft_draw);
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
621 }
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
622 return xft_draw;
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
623 }
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
624
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
625 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
626 xftfont_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
627 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
628 FRAME_PTR f = s->f;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
629 struct face *face = s->face;
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
630 struct xftfont_info *xftfont_info = (struct xftfont_info *) s->font;
91011
7239c19e55e9 (xftfont_draw): If s->font_info != s->face->font_info,
Kenichi Handa <handa@m17n.org>
parents: 90959
diff changeset
631 struct xftface_info *xftface_info = NULL;
91110
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
632 XftDraw *xft_draw = xftfont_get_xft_draw (f);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
633 FT_UInt *code;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
634 XftColor fg, bg;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
635 int len = to - from;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
636 int i;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
637
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
638 if (s->font == face->font)
91110
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
639 xftface_info = (struct xftface_info *) face->extra;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
640 xftfont_get_colors (f, face, s->gc, xftface_info,
90426
e9ed7d437c21 (xftfont_default_fid): Set fid_known to 1.
Kenichi Handa <handa@m17n.org>
parents: 90400
diff changeset
641 &fg, with_background ? &bg : NULL);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
642 BLOCK_INPUT;
91027
04b81a720da9 (xftfont_draw): Adjusted for the change of struct
Kenichi Handa <handa@m17n.org>
parents: 91011
diff changeset
643 if (s->num_clips > 0)
04b81a720da9 (xftfont_draw): Adjusted for the change of struct
Kenichi Handa <handa@m17n.org>
parents: 91011
diff changeset
644 XftDrawSetClipRectangles (xft_draw, 0, 0, s->clip, s->num_clips);
04b81a720da9 (xftfont_draw): Adjusted for the change of struct
Kenichi Handa <handa@m17n.org>
parents: 91011
diff changeset
645 else
04b81a720da9 (xftfont_draw): Adjusted for the change of struct
Kenichi Handa <handa@m17n.org>
parents: 91011
diff changeset
646 XftDrawSetClip (xft_draw, NULL);
04b81a720da9 (xftfont_draw): Adjusted for the change of struct
Kenichi Handa <handa@m17n.org>
parents: 91011
diff changeset
647
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
648 if (with_background)
94941
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
649 XftDrawRect (xft_draw, &bg,
8cbdb26068b4 (xftfont_list): Adjusted for the change of `list'
Kenichi Handa <handa@m17n.org>
parents: 92184
diff changeset
650 x, y - face->font->ascent, s->width, face->font->height);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
651 code = alloca (sizeof (FT_UInt) * len);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
652 for (i = 0; i < len; i++)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
653 code[i] = ((XCHAR2B_BYTE1 (s->char2b + from + i) << 8)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
654 | XCHAR2B_BYTE2 (s->char2b + from + i));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
655
92184
6218afb021ac (xftfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91907
diff changeset
656 if (s->padding_p)
6218afb021ac (xftfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91907
diff changeset
657 for (i = 0; i < len; i++)
6218afb021ac (xftfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91907
diff changeset
658 XftDrawGlyphs (xft_draw, &fg, xftfont_info->xftfont,
6218afb021ac (xftfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91907
diff changeset
659 x + i, y, code + i, 1);
6218afb021ac (xftfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91907
diff changeset
660 else
6218afb021ac (xftfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91907
diff changeset
661 XftDrawGlyphs (xft_draw, &fg, xftfont_info->xftfont,
6218afb021ac (xftfont_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 91907
diff changeset
662 x, y, code, len);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
663 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
664
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
665 return len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
666 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
667
111038
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
668 Lisp_Object
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
669 xftfont_shape (Lisp_Object lgstring)
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
670 {
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
671 struct font *font;
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
672 struct xftfont_info *xftfont_info;
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
673 FT_Face ft_face;
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
674 Lisp_Object val;
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
675
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
676 CHECK_FONT_GET_OBJECT (LGSTRING_FONT (lgstring), font);
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
677 xftfont_info = (struct xftfont_info *) font;
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
678 ft_face = XftLockFace (xftfont_info->xftfont);
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
679 xftfont_info->ft_size = ft_face->size;
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
680 val = ftfont_driver.shape (lgstring);
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
681 XftUnlockFace (xftfont_info->xftfont);
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
682 return val;
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
683 }
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
684
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
685 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
686 xftfont_end_for_frame (FRAME_PTR f)
91110
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
687 {
106290
8671036bedc4 Don't crash if an X terminal is deleted with force == t.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106092
diff changeset
688 XftDraw *xft_draw;
8671036bedc4 Don't crash if an X terminal is deleted with force == t.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106092
diff changeset
689
8671036bedc4 Don't crash if an X terminal is deleted with force == t.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106092
diff changeset
690 /* Don't do anything if display is dead */
8671036bedc4 Don't crash if an X terminal is deleted with force == t.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106092
diff changeset
691 if (FRAME_X_DISPLAY (f) == NULL) return 0;
8671036bedc4 Don't crash if an X terminal is deleted with force == t.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106092
diff changeset
692
8671036bedc4 Don't crash if an X terminal is deleted with force == t.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106092
diff changeset
693 xft_draw = font_get_frame_data (f, &xftfont_driver);
91110
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
694
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
695 if (xft_draw)
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
696 {
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
697 BLOCK_INPUT;
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
698 XftDrawDestroy (xft_draw);
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
699 UNBLOCK_INPUT;
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
700 font_put_frame_data (f, &xftfont_driver, NULL);
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
701 }
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
702 return 0;
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
703 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
704
106755
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
705 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
706 xftfont_cached_font_ok (struct frame *f, Lisp_Object font_object, Lisp_Object entity)
106755
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
707 {
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
708 struct xftfont_info *info = (struct xftfont_info *) XFONT_OBJECT (font_object);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
709 FcPattern *oldpat = info->xftfont->pattern;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
710 Display *display = FRAME_X_DISPLAY (f);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
711 FcPattern *pat = FcPatternCreate ();
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
712 FcBool b1, b2;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
713 int ok = 0, i1, i2, r1, r2;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
714
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
715 xftfont_add_rendering_parameters (pat, entity);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
716 XftDefaultSubstitute (display, FRAME_X_SCREEN_NUMBER (f), pat);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
717
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
718 r1 = FcPatternGetBool (pat, FC_ANTIALIAS, 0, &b1);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
719 r2 = FcPatternGetBool (oldpat, FC_ANTIALIAS, 0, &b2);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
720 if (r1 != r2 || b1 != b2) goto out;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
721 r1 = FcPatternGetBool (pat, FC_HINTING, 0, &b1);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
722 r2 = FcPatternGetBool (oldpat, FC_HINTING, 0, &b2);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
723 if (r1 != r2 || b1 != b2) goto out;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
724 r1 = FcPatternGetBool (pat, FC_AUTOHINT, 0, &b1);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
725 r2 = FcPatternGetBool (oldpat, FC_AUTOHINT, 0, &b2);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
726 if (r1 != r2 || b1 != b2) goto out;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
727 #ifdef FC_EMBOLDEN
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
728 r1 = FcPatternGetBool (pat, FC_EMBOLDEN, 0, &b1);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
729 r2 = FcPatternGetBool (oldpat, FC_EMBOLDEN, 0, &b2);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
730 if (r1 != r2 || b1 != b2) goto out;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
731 #endif
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
732 r1 = FcPatternGetInteger (pat, FC_HINT_STYLE, 0, &i1);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
733 r2 = FcPatternGetInteger (oldpat, FC_HINT_STYLE, 0, &i2);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
734 if (r1 != r2 || i1 != i2) goto out;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
735 r1 = FcPatternGetInteger (pat, FC_LCD_FILTER, 0, &i1);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
736 r2 = FcPatternGetInteger (oldpat, FC_LCD_FILTER, 0, &i2);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
737 if (r1 != r2 || i1 != i2) goto out;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
738 r1 = FcPatternGetInteger (pat, FC_RGBA, 0, &i1);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
739 r2 = FcPatternGetInteger (oldpat, FC_RGBA, 0, &i2);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
740 if (r1 != r2 || i1 != i2) goto out;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
741
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
742 ok = 1;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
743 out:
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
744 FcPatternDestroy (pat);
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
745 return ok;
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
746 }
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
747
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
748 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
749 syms_of_xftfont (void)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
750 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
751 DEFSYM (Qxft, "xft");
96075
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
752 DEFSYM (QChinting, ":hinting");
100301
5c8b389c391a (syms_of_xftfont): Fix typo.
Chong Yidong <cyd@stupidchicken.com>
parents: 96562
diff changeset
753 DEFSYM (QCautohint, ":autohint");
96075
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
754 DEFSYM (QChintstyle, ":hintstyle");
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
755 DEFSYM (QCrgba, ":rgba");
3376493a3ad4 (QChinting , QCautohint, QChintstyle, QCrgba)
Kenichi Handa <handa@m17n.org>
parents: 95293
diff changeset
756 DEFSYM (QCembolden, ":embolden");
106558
3d091f151696 xftfont.c: Parse symbolic names for constants also.
Jan Djärv <jan.h.d@swipnet.se>
parents: 106538
diff changeset
757 DEFSYM (QClcdfilter, ":lcdfilter");
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
758
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
759 xftfont_driver = ftfont_driver;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
760 xftfont_driver.type = Qxft;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
761 xftfont_driver.get_cache = xfont_driver.get_cache;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
762 xftfont_driver.list = xftfont_list;
90559
fb5d3ac2d786 (xftfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90527
diff changeset
763 xftfont_driver.match = xftfont_match;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
764 xftfont_driver.open = xftfont_open;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
765 xftfont_driver.close = xftfont_close;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
766 xftfont_driver.prepare_face = xftfont_prepare_face;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
767 xftfont_driver.done_face = xftfont_done_face;
101640
6a674ba1901f (xftfont_has_char): New function.
Kenichi Handa <handa@m17n.org>
parents: 101555
diff changeset
768 xftfont_driver.has_char = xftfont_has_char;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
769 xftfont_driver.encode_char = xftfont_encode_char;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
770 xftfont_driver.text_extents = xftfont_text_extents;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
771 xftfont_driver.draw = xftfont_draw;
91110
82a42637237c (struct xftface_info): Delete the member xft_draw.
Kenichi Handa <handa@m17n.org>
parents: 91027
diff changeset
772 xftfont_driver.end_for_frame = xftfont_end_for_frame;
106755
574dd89b7759 Fix slowdown and wrong font choosed by XSETTINGS changes. bug #5157.
Jan D. <jan.h.d@swipnet.se>
parents: 106558
diff changeset
773 xftfont_driver.cached_font_ok = xftfont_cached_font_ok;
111038
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
774 #if defined (HAVE_M17N_FLT) && defined (HAVE_LIBOTF)
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
775 xftfont_driver.shape = xftfont_shape;
8d403fa5e77d Fix incorrect font metrics when the same font is opened with different pixelsizes.
Kenichi Handa <handa@m17n.org>
parents: 109081
diff changeset
776 #endif
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
777
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
778 register_font_driver (&xftfont_driver, NULL);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
779 }
90427
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90426
diff changeset
780
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90426
diff changeset
781 /* arch-tag: 64ec61bf-7c8e-4fe6-b953-c6a85d5e1605
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90426
diff changeset
782 (do not change this comment) */