Mercurial > emacs
annotate src/ftfont.c @ 99492:ee792794d888
(isearch-search-fun): Compare the length of the
current search string with the length of the string from the
previous search state to detect the situation when the user
adds or removes characters in the search string.
Use word-search-forward-lax and word-search-backward-lax in this
case, and otherwise word-search-forward and word-search-backward.
author | Juri Linkov <juri@jurta.org> |
---|---|
date | Tue, 11 Nov 2008 19:43:09 +0000 |
parents | 411ea0d5dade |
children | 9dae5597651b |
rev | line source |
---|---|
90400 | 1 /* ftfont.c -- FreeType font driver. |
91555
21d9f8ca293c
Update copyright years and GPL version.
Glenn Morris <rgm@gnu.org>
parents:
91308
diff
changeset
|
2 Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc. |
21d9f8ca293c
Update copyright years and GPL version.
Glenn Morris <rgm@gnu.org>
parents:
91308
diff
changeset
|
3 Copyright (C) 2006, 2007, 2008 |
90400 | 4 National Institute of Advanced Industrial Science and Technology (AIST) |
5 Registration Number H13PRO009 | |
6 | |
7 This file is part of GNU Emacs. | |
8 | |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94931
diff
changeset
|
9 GNU Emacs is free software: you can redistribute it and/or modify |
90400 | 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:
94931
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:
94931
diff
changeset
|
12 (at your option) any later version. |
90400 | 13 |
14 GNU Emacs is distributed in the hope that it will be useful, | |
15 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 GNU General Public License for more details. | |
18 | |
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:
94931
diff
changeset
|
20 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
90400 | 21 |
22 #include <config.h> | |
23 #include <stdio.h> | |
24 | |
25 #include <fontconfig/fontconfig.h> | |
26 #include <fontconfig/fcfreetype.h> | |
27 | |
28 #include "lisp.h" | |
29 #include "dispextern.h" | |
30 #include "frame.h" | |
31 #include "blockinput.h" | |
32 #include "character.h" | |
33 #include "charset.h" | |
34 #include "coding.h" | |
97826 | 35 #include "composite.h" |
90400 | 36 #include "fontset.h" |
37 #include "font.h" | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
38 #include "ftfont.h" |
90400 | 39 |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
40 /* Symbolic type of this font-driver. */ |
90400 | 41 Lisp_Object Qfreetype; |
42 | |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
43 /* Fontconfig's generic families and their aliases. */ |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
44 static Lisp_Object Qmonospace, Qsans_serif, Qserif, Qmono, Qsans, Qsans__serif; |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
45 |
95464
de4cb7ab40db
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
95433
diff
changeset
|
46 /* Flag to tell if FcInit is already called or not. */ |
90400 | 47 static int fc_initialized; |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
48 |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
49 /* Handle to a FreeType library instance. */ |
90400 | 50 static FT_Library ft_library; |
51 | |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
52 /* Cache for FreeType fonts. */ |
90400 | 53 static Lisp_Object freetype_font_cache; |
54 | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
55 /* Cache for FT_Face and FcCharSet. */ |
95103 | 56 static Lisp_Object ft_face_cache; |
90400 | 57 |
58 /* The actual structure for FreeType font that can be casted to struct | |
59 font. */ | |
60 | |
61 struct ftfont_info | |
62 { | |
63 struct font font; | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
64 #ifdef HAVE_LIBOTF |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
65 /* The following three members must be here in this order to be |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
66 compatible with struct xftfont_info (in xftfont.c). */ |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
67 int maybe_otf; /* Flag to tell if this may be OTF or not. */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
68 OTF *otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
69 #endif /* HAVE_LIBOTF */ |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
70 FT_Size ft_size; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
71 int index; |
90400 | 72 }; |
73 | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
74 static Lisp_Object ftfont_pattern_entity P_ ((FcPattern *, Lisp_Object)); |
95103 | 75 |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
76 static Lisp_Object ftfont_resolve_generic_family P_ ((Lisp_Object, |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
77 FcPattern *)); |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
78 static Lisp_Object ftfont_lookup_cache P_ ((Lisp_Object, int)); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
79 |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
80 Lisp_Object ftfont_font_format P_ ((FcPattern *, Lisp_Object)); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
81 |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
82 #define SYMBOL_FcChar8(SYM) (FcChar8 *) SDATA (SYMBOL_NAME (SYM)) |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
83 |
95103 | 84 static struct |
90400 | 85 { |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
86 /* registry name */ |
95103 | 87 char *name; |
88 /* characters to distinguish the charset from the others */ | |
89 int uniquifier[6]; | |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
90 /* additional constraint by language */ |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
91 char *lang; |
95103 | 92 /* set on demand */ |
93 FcCharSet *fc_charset; | |
94 } fc_charset_table[] = | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
95 { { "iso8859-1", { 0x00A0, 0x00A1, 0x00B4, 0x00BC, 0x00D0 } }, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
96 { "iso8859-2", { 0x00A0, 0x010E }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
97 { "iso8859-3", { 0x00A0, 0x0108 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
98 { "iso8859-4", { 0x00A0, 0x00AF, 0x0128, 0x0156, 0x02C7 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
99 { "iso8859-5", { 0x00A0, 0x0401 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
100 { "iso8859-6", { 0x00A0, 0x060C }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
101 { "iso8859-7", { 0x00A0, 0x0384 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
102 { "iso8859-8", { 0x00A0, 0x05D0 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
103 { "iso8859-9", { 0x00A0, 0x00A1, 0x00BC, 0x011E }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
104 { "iso8859-10", { 0x00A0, 0x00D0, 0x0128, 0x2015 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
105 { "iso8859-11", { 0x00A0, 0x0E01 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
106 { "iso8859-13", { 0x00A0, 0x201C }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
107 { "iso8859-14", { 0x00A0, 0x0174 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
108 { "iso8859-15", { 0x00A0, 0x00A1, 0x00D0, 0x0152 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
109 { "iso8859-16", { 0x00A0, 0x0218}}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
110 { "gb2312.1980-0", { 0x4E13 }, "zh-cn"}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
111 { "big5-0", { 0xF6B1 }, "zh-tw" }, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
112 { "jisx0208.1983-0", { 0x4E55 }, "ja"}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
113 { "ksc5601.1985-0", { 0xAC00 }, "ko"}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
114 { "cns11643.1992-1", { 0xFE32 }, "zh-tw"}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
115 { "cns11643.1992-2", { 0x4E33, 0x7934 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
116 { "cns11643.1992-3", { 0x201A9 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
117 { "cns11643.1992-4", { 0x20057 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
118 { "cns11643.1992-5", { 0x20000 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
119 { "cns11643.1992-6", { 0x20003 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
120 { "cns11643.1992-7", { 0x20055 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
121 { "gbk-0", { 0x4E06 }, "zh-cn"}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
122 { "jisx0212.1990-0", { 0x4E44 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
123 { "jisx0213.2000-1", { 0xFA10 }, "ja"}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
124 { "jisx0213.2000-2", { 0xFA49 }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
125 { "jisx0213.2004-1", { 0x20B9F }}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
126 { "viscii1.1-1", { 0x1EA0, 0x1EAE, 0x1ED2 }, "vi"}, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
127 { "tis620.2529-1", { 0x0E01 }, "th"}, |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
128 { "windows-1251", { 0x0401, 0x0490 }, "ru"}, |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
129 { "koi8-r", { 0x0401, 0x2219 }, "ru"}, |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
130 { "mulelao-1", { 0x0E81 }, "lo"}, |
95103 | 131 { NULL } |
132 }; | |
90400 | 133 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
134 extern Lisp_Object Qc, Qm, Qp, Qd; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
135 |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
136 static Lisp_Object |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
137 ftfont_pattern_entity (p, extra) |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
138 FcPattern *p; |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
139 Lisp_Object extra; |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
140 { |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
141 Lisp_Object entity; |
95103 | 142 char *file, *str; |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
143 int index; |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
144 int numeric; |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
145 double dbl; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
146 FcBool b; |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
147 |
95103 | 148 if (FcPatternGetString (p, FC_FILE, 0, (FcChar8 **) &file) != FcResultMatch) |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
149 return Qnil; |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
150 if (FcPatternGetInteger (p, FC_INDEX, 0, &index) != FcResultMatch) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
151 return Qnil; |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
152 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
153 entity = font_make_entity (); |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
154 |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
155 ASET (entity, FONT_TYPE_INDEX, Qfreetype); |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
156 ASET (entity, FONT_REGISTRY_INDEX, Qiso10646_1); |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
157 |
95103 | 158 if (FcPatternGetString (p, FC_FOUNDRY, 0, (FcChar8 **) &str) == FcResultMatch) |
95745
bea43f586395
(ftfont_pattern_entity): Adjusted for the change of font_intern_prop.
Kenichi Handa <handa@m17n.org>
parents:
95698
diff
changeset
|
159 ASET (entity, FONT_FOUNDRY_INDEX, font_intern_prop (str, strlen (str), 1)); |
95103 | 160 if (FcPatternGetString (p, FC_FAMILY, 0, (FcChar8 **) &str) == FcResultMatch) |
95745
bea43f586395
(ftfont_pattern_entity): Adjusted for the change of font_intern_prop.
Kenichi Handa <handa@m17n.org>
parents:
95698
diff
changeset
|
161 ASET (entity, FONT_FAMILY_INDEX, font_intern_prop (str, strlen (str), 1)); |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
162 if (FcPatternGetInteger (p, FC_WEIGHT, 0, &numeric) == FcResultMatch) |
90474
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
163 { |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
164 if (numeric >= FC_WEIGHT_REGULAR && numeric < FC_WEIGHT_MEDIUM) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
165 numeric = FC_WEIGHT_MEDIUM; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
166 FONT_SET_STYLE (entity, FONT_WEIGHT_INDEX, make_number (numeric)); |
90474
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
167 } |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
168 if (FcPatternGetInteger (p, FC_SLANT, 0, &numeric) == FcResultMatch) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
169 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
170 numeric += 100; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
171 FONT_SET_STYLE (entity, FONT_SLANT_INDEX, make_number (numeric)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
172 } |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
173 if (FcPatternGetInteger (p, FC_WIDTH, 0, &numeric) == FcResultMatch) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
174 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
175 FONT_SET_STYLE (entity, FONT_WIDTH_INDEX, make_number (numeric)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
176 } |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
177 if (FcPatternGetDouble (p, FC_PIXEL_SIZE, 0, &dbl) == FcResultMatch) |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
178 ASET (entity, FONT_SIZE_INDEX, make_number (dbl)); |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
179 else |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
180 ASET (entity, FONT_SIZE_INDEX, make_number (0)); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
181 if (FcPatternGetInteger (p, FC_SPACING, 0, &numeric) == FcResultMatch) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
182 ASET (entity, FONT_SPACING_INDEX, make_number (numeric)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
183 if (FcPatternGetDouble (p, FC_DPI, 0, &dbl) == FcResultMatch) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
184 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
185 int dpi = dbl; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
186 ASET (entity, FONT_DPI_INDEX, make_number (dpi)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
187 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
188 if (FcPatternGetBool (p, FC_SCALABLE, 0, &b) == FcResultMatch |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
189 && b == FcTrue) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
190 ASET (entity, FONT_AVGWIDTH_INDEX, make_number (0)); |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
191 |
96076
bd3f48456ac7
(ftfont_pattern_entity): New arg extra. Caller changed.
Kenichi Handa <handa@m17n.org>
parents:
95805
diff
changeset
|
192 ASET (entity, FONT_EXTRA_INDEX, Fcopy_sequence (extra)); |
95103 | 193 font_put_extra (entity, QCfont_entity, |
194 Fcons (make_unibyte_string ((char *) file, | |
195 strlen ((char *) file)), | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
196 make_number (index))); |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
197 return entity; |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
198 } |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
199 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
200 |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
201 static Lisp_Object ftfont_generic_family_list; |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
202 |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
203 static Lisp_Object |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
204 ftfont_resolve_generic_family (family, pattern) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
205 Lisp_Object family; |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
206 FcPattern *pattern; |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
207 { |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
208 Lisp_Object slot; |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
209 FcPattern *match; |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
210 FcResult result; |
97826 | 211 FcLangSet *langset; |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
212 |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
213 family = Fintern (Fdowncase (SYMBOL_NAME (family)), Qnil); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
214 if (EQ (family, Qmono)) |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
215 family = Qmonospace; |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
216 else if (EQ (family, Qsans) || EQ (family, Qsans__serif)) |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
217 family = Qsans_serif; |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
218 slot = assq_no_quit (family, ftfont_generic_family_list); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
219 if (! CONSP (slot)) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
220 return Qnil; |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
221 if (! EQ (XCDR (slot), Qt)) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
222 return XCDR (slot); |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
223 pattern = FcPatternDuplicate (pattern); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
224 if (! pattern) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
225 goto err; |
96592
0ef6933bf3bd
(ftfont_resolve_generic_family): Remove foundry from
Andreas Schwab <schwab@suse.de>
parents:
96568
diff
changeset
|
226 FcPatternDel (pattern, FC_FOUNDRY); |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
227 FcPatternDel (pattern, FC_FAMILY); |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
228 FcPatternAddString (pattern, FC_FAMILY, SYMBOL_FcChar8 (family)); |
97826 | 229 if (FcPatternGetLangSet (pattern, FC_LANG, 0, &langset) != FcResultMatch) |
230 { | |
231 /* This is to avoid the effect of locale. */ | |
232 langset = FcLangSetCreate (); | |
233 FcLangSetAdd (langset, "en"); | |
234 FcPatternAddLangSet (pattern, FC_LANG, langset); | |
235 FcLangSetDestroy (langset); | |
236 } | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
237 FcConfigSubstitute (NULL, pattern, FcMatchPattern); |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
238 FcDefaultSubstitute (pattern); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
239 match = FcFontMatch (NULL, pattern, &result); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
240 if (match) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
241 { |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
242 FcChar8 *fam; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
243 |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
244 if (FcPatternGetString (match, FC_FAMILY, 0, &fam) == FcResultMatch) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
245 family = intern ((char *) fam); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
246 } |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
247 else |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
248 family = Qnil; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
249 XSETCDR (slot, family); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
250 err: |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
251 if (match) FcPatternDestroy (match); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
252 if (pattern) FcPatternDestroy (pattern); |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
253 return family; |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
254 } |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
255 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
256 struct ftfont_cache_data |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
257 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
258 FT_Face ft_face; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
259 FcCharSet *fc_charset; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
260 }; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
261 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
262 static Lisp_Object |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
263 ftfont_lookup_cache (key, for_face) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
264 Lisp_Object key; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
265 int for_face; |
95103 | 266 { |
267 Lisp_Object cache, val; | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
268 struct ftfont_cache_data *cache_data; |
95103 | 269 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
270 cache = assoc_no_quit (key, ft_face_cache); |
95103 | 271 if (NILP (cache)) |
272 { | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
273 cache_data = xmalloc (sizeof (struct ftfont_cache_data)); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
274 cache_data->ft_face = NULL; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
275 cache_data->fc_charset = NULL; |
95103 | 276 val = make_save_value (NULL, 0); |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
277 XSAVE_VALUE (val)->integer = 0; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
278 XSAVE_VALUE (val)->pointer = cache_data; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
279 cache = Fcons (key, val); |
95103 | 280 ft_face_cache = Fcons (cache, ft_face_cache); |
281 } | |
282 else | |
283 { | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
284 val = XCDR (cache); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
285 cache_data = XSAVE_VALUE (val)->pointer; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
286 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
287 if (for_face ? ! cache_data->ft_face : ! cache_data->fc_charset) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
288 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
289 char *filename = (char *) SDATA (XCAR (key)); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
290 int index = XINT (XCDR (key)); |
95103 | 291 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
292 if (for_face) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
293 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
294 if (! ft_library |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
295 && FT_Init_FreeType (&ft_library) != 0) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
296 return Qnil; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
297 if (FT_New_Face (ft_library, filename, index, &cache_data->ft_face) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
298 != 0) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
299 return Qnil; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
300 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
301 else |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
302 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
303 FcPattern *pat; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
304 FcFontSet *fontset; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
305 FcObjectSet *objset; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
306 FcCharSet *charset; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
307 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
308 pat = FcPatternBuild (0, FC_FILE, FcTypeString, (FcChar8 *) filename, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
309 FC_INDEX, FcTypeInteger, index, NULL); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
310 objset = FcObjectSetBuild (FC_CHARSET, NULL); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
311 fontset = FcFontList (NULL, pat, objset); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
312 xassert (fontset && fontset->nfont > 0); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
313 if (FcPatternGetCharSet (fontset->fonts[0], FC_CHARSET, 0, &charset) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
314 == FcResultMatch) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
315 cache_data->fc_charset = FcCharSetCopy (charset); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
316 else |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
317 cache_data->fc_charset = FcCharSetCreate (); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
318 FcFontSetDestroy (fontset); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
319 FcObjectSetDestroy (objset); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
320 FcPatternDestroy (pat); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
321 } |
95103 | 322 } |
323 return cache; | |
324 } | |
325 | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
326 FcCharSet * |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
327 ftfont_get_fc_charset (entity) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
328 Lisp_Object entity; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
329 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
330 Lisp_Object val, cache; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
331 struct ftfont_cache_data *cache_data; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
332 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
333 val = assq_no_quit (QCfont_entity, AREF (entity, FONT_EXTRA_INDEX)); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
334 xassert (CONSP (val)); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
335 val = XCDR (val); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
336 cache = ftfont_lookup_cache (val, 0); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
337 val = XCDR (cache); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
338 cache_data = XSAVE_VALUE (val)->pointer; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
339 return cache_data->fc_charset; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
340 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
341 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
342 #ifdef HAVE_LIBOTF |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
343 static OTF * |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
344 ftfont_get_otf (ftfont_info) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
345 struct ftfont_info *ftfont_info; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
346 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
347 OTF *otf; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
348 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
349 if (ftfont_info->otf) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
350 return ftfont_info->otf; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
351 if (! ftfont_info->maybe_otf) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
352 return NULL; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
353 otf = OTF_open_ft_face (ftfont_info->ft_size->face); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
354 if (! otf || OTF_get_table (otf, "head") < 0) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
355 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
356 if (otf) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
357 OTF_close (otf); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
358 ftfont_info->maybe_otf = 0; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
359 return NULL; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
360 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
361 ftfont_info->otf = otf; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
362 return otf; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
363 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
364 #endif /* HAVE_LIBOTF */ |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
365 |
91249
4f21471103e6
(ftfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents:
91214
diff
changeset
|
366 static Lisp_Object ftfont_get_cache P_ ((FRAME_PTR)); |
90400 | 367 static Lisp_Object ftfont_list P_ ((Lisp_Object, Lisp_Object)); |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
368 static Lisp_Object ftfont_match P_ ((Lisp_Object, Lisp_Object)); |
90400 | 369 static Lisp_Object ftfont_list_family P_ ((Lisp_Object)); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
370 static Lisp_Object ftfont_open P_ ((FRAME_PTR, Lisp_Object, int)); |
90400 | 371 static void ftfont_close P_ ((FRAME_PTR, struct font *)); |
372 static int ftfont_has_char P_ ((Lisp_Object, int)); | |
373 static unsigned ftfont_encode_char P_ ((struct font *, int)); | |
374 static int ftfont_text_extents P_ ((struct font *, unsigned *, int, | |
375 struct font_metrics *)); | |
376 static int ftfont_get_bitmap P_ ((struct font *, unsigned, | |
377 struct font_bitmap *, int)); | |
378 static int ftfont_anchor_point P_ ((struct font *, unsigned, int, | |
379 int *, int *)); | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
380 static Lisp_Object ftfont_otf_capability P_ ((struct font *)); |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
381 static Lisp_Object ftfont_shape P_ ((Lisp_Object)); |
90400 | 382 |
383 struct font_driver ftfont_driver = | |
384 { | |
90697
444b40002533
(ftfont_driver): Initialize ftfont_driver.type by 0.
Kenichi Handa <handa@m17n.org>
parents:
90680
diff
changeset
|
385 0, /* Qfreetype */ |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
386 0, /* case insensitive */ |
90400 | 387 ftfont_get_cache, |
388 ftfont_list, | |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
389 ftfont_match, |
90400 | 390 ftfont_list_family, |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
391 NULL, |
90400 | 392 ftfont_open, |
393 ftfont_close, | |
394 /* We can't draw a text without device dependent functions. */ | |
395 NULL, | |
396 NULL, | |
397 ftfont_has_char, | |
398 ftfont_encode_char, | |
399 ftfont_text_extents, | |
400 /* We can't draw a text without device dependent functions. */ | |
401 NULL, | |
402 ftfont_get_bitmap, | |
403 NULL, | |
404 NULL, | |
405 NULL, | |
406 ftfont_anchor_point, | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
407 #ifdef HAVE_LIBOTF |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
408 ftfont_otf_capability, |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
409 #else /* not HAVE_LIBOTF */ |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
410 NULL, |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
411 #endif /* not HAVE_LIBOTF */ |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
412 NULL, |
90400 | 413 NULL, |
414 NULL, | |
91308
9b6270bcd1a7
(ftfont_driver): Set ftfont_shape in ftfont_driver only
Kenichi Handa <handa@m17n.org>
parents:
91294
diff
changeset
|
415 #if defined (HAVE_M17N_FLT) && defined (HAVE_LIBOTF) |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
416 ftfont_shape |
91308
9b6270bcd1a7
(ftfont_driver): Set ftfont_shape in ftfont_driver only
Kenichi Handa <handa@m17n.org>
parents:
91294
diff
changeset
|
417 #else /* not (HAVE_M17N_FLT && HAVE_LIBOTF) */ |
90400 | 418 NULL |
91308
9b6270bcd1a7
(ftfont_driver): Set ftfont_shape in ftfont_driver only
Kenichi Handa <handa@m17n.org>
parents:
91294
diff
changeset
|
419 #endif /* not (HAVE_M17N_FLT && HAVE_LIBOTF) */ |
90400 | 420 }; |
421 | |
422 extern Lisp_Object QCname; | |
423 | |
424 static Lisp_Object | |
91249
4f21471103e6
(ftfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents:
91214
diff
changeset
|
425 ftfont_get_cache (f) |
4f21471103e6
(ftfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents:
91214
diff
changeset
|
426 FRAME_PTR f; |
90400 | 427 { |
428 return freetype_font_cache; | |
429 } | |
430 | |
95103 | 431 static int |
432 ftfont_get_charset (registry) | |
433 Lisp_Object registry; | |
434 { | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
435 char *str = (char *) SDATA (SYMBOL_NAME (registry)); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
436 char *re = alloca (SBYTES (SYMBOL_NAME (registry)) * 2 + 1); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
437 Lisp_Object regexp; |
95103 | 438 int i, j; |
439 | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
440 for (i = j = 0; i < SBYTES (SYMBOL_NAME (registry)); i++, j++) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
441 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
442 if (str[i] == '.') |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
443 re[j++] = '\\'; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
444 else if (str[i] == '*') |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
445 re[j++] = '.'; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
446 re[j] = str[i]; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
447 if (re[j] == '?') |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
448 re[j] = '.'; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
449 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
450 re[j] = '\0'; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
451 regexp = make_unibyte_string (re, j); |
95103 | 452 for (i = 0; fc_charset_table[i].name; i++) |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
453 if (fast_c_string_match_ignore_case (regexp, fc_charset_table[i].name) >= 0) |
95103 | 454 break; |
455 if (! fc_charset_table[i].name) | |
456 return -1; | |
457 if (! fc_charset_table[i].fc_charset) | |
458 { | |
459 FcCharSet *charset = FcCharSetCreate (); | |
460 int *uniquifier = fc_charset_table[i].uniquifier; | |
461 | |
462 if (! charset) | |
463 return -1; | |
464 for (j = 0; uniquifier[j]; j++) | |
465 if (! FcCharSetAddChar (charset, uniquifier[j])) | |
466 { | |
467 FcCharSetDestroy (charset); | |
468 return -1; | |
469 } | |
95464
de4cb7ab40db
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
95433
diff
changeset
|
470 fc_charset_table[i].fc_charset = charset; |
95103 | 471 } |
472 return i; | |
473 } | |
474 | |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
475 struct OpenTypeSpec |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
476 { |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
477 Lisp_Object script; |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
478 unsigned int script_tag, langsys_tag; |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
479 int nfeatures[2]; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
480 unsigned int *features[2]; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
481 }; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
482 |
91191
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
483 #define OTF_SYM_TAG(SYM, TAG) \ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
484 do { \ |
91191
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
485 unsigned char *p = SDATA (SYMBOL_NAME (SYM)); \ |
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
486 TAG = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; \ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
487 } while (0) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
488 |
91191
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
489 #define OTF_TAG_STR(TAG, P) \ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
490 do { \ |
91191
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
491 (P)[0] = (char) (TAG >> 24); \ |
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
492 (P)[1] = (char) ((TAG >> 16) & 0xFF); \ |
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
493 (P)[2] = (char) ((TAG >> 8) & 0xFF); \ |
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
494 (P)[3] = (char) (TAG & 0xFF); \ |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
495 (P)[4] = '\0'; \ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
496 } while (0) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
497 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
498 #define OTF_TAG_SYM(SYM, TAG) \ |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
499 do { \ |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
500 char str[5]; \ |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
501 \ |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
502 OTF_TAG_STR (TAG, str); \ |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
503 (SYM) = font_intern_prop (str, 4, 1); \ |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
504 } while (0) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
505 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
506 |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
507 static struct OpenTypeSpec * |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
508 ftfont_get_open_type_spec (Lisp_Object otf_spec) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
509 { |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
510 struct OpenTypeSpec *spec = malloc (sizeof (struct OpenTypeSpec)); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
511 Lisp_Object val; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
512 int i, j, negative; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
513 |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
514 if (! spec) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
515 return NULL; |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
516 spec->script = XCAR (otf_spec); |
93588
917824e47986
(ftfont_get_open_type_spec): Check spec->script, not val.
Jason Rumney <jasonr@gnu.org>
parents:
92407
diff
changeset
|
517 if (! NILP (spec->script)) |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
518 { |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
519 OTF_SYM_TAG (spec->script, spec->script_tag); |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
520 val = assq_no_quit (spec->script, Votf_script_alist); |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
521 if (CONSP (val) && SYMBOLP (XCDR (val))) |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
522 spec->script = XCDR (val); |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
523 else |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
524 spec->script = Qnil; |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
525 } |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
526 else |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
527 spec->script_tag = 0x44464C54; /* "DFLT" */ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
528 otf_spec = XCDR (otf_spec); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
529 val = XCAR (otf_spec); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
530 if (! NILP (val)) |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
531 OTF_SYM_TAG (val, spec->langsys_tag); |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
532 else |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
533 spec->langsys_tag = 0; |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
534 spec->nfeatures[0] = spec->nfeatures[1] = 0; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
535 for (i = 0; i < 2; i++) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
536 { |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
537 Lisp_Object len; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
538 |
95464
de4cb7ab40db
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
95433
diff
changeset
|
539 otf_spec = XCDR (otf_spec); |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
540 if (NILP (otf_spec)) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
541 break; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
542 val = XCAR (otf_spec); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
543 if (NILP (val)) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
544 continue; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
545 len = Flength (val); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
546 spec->features[i] = malloc (sizeof (int) * XINT (len)); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
547 if (! spec->features[i]) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
548 { |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
549 if (i > 0 && spec->features[0]) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
550 free (spec->features[0]); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
551 free (spec); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
552 return NULL; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
553 } |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
554 for (j = 0, negative = 0; CONSP (val); val = XCDR (val)) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
555 { |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
556 if (NILP (XCAR (val))) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
557 negative = 1; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
558 else |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
559 { |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
560 unsigned int tag; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
561 |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
562 OTF_SYM_TAG (XCAR (val), tag); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
563 spec->features[i][j++] = negative ? tag & 0x80000000 : tag; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
564 } |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
565 } |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
566 spec->nfeatures[i] = j; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
567 } |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
568 return spec; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
569 } |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
570 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
571 static FcPattern *ftfont_spec_pattern P_ ((Lisp_Object, char *, |
95103 | 572 struct OpenTypeSpec **)); |
573 | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
574 static FcPattern * |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
575 ftfont_spec_pattern (spec, otlayout, otspec) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
576 Lisp_Object spec; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
577 char *otlayout; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
578 struct OpenTypeSpec **otspec; |
90400 | 579 { |
95103 | 580 Lisp_Object tmp, extra; |
90400 | 581 FcPattern *pattern = NULL; |
582 FcCharSet *charset = NULL; | |
583 FcLangSet *langset = NULL; | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
584 int n; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
585 int dpi = -1; |
90500
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
586 int scalable = -1; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
587 Lisp_Object script = Qnil; |
95103 | 588 Lisp_Object registry; |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
589 int fc_charset_idx; |
90400 | 590 |
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
591 if (! NILP (AREF (spec, FONT_ADSTYLE_INDEX)) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
592 && SBYTES (SYMBOL_NAME (AREF (spec, FONT_ADSTYLE_INDEX))) > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
593 /* Fontconfig doesn't support adstyle property. */ |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
594 return NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
595 if ((n = FONT_SLANT_NUMERIC (spec)) >= 0 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
596 && n < 100) |
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
597 /* Fontconfig doesn't support reverse-italic/obligue. */ |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
598 return NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
599 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
600 if (INTEGERP (AREF (spec, FONT_DPI_INDEX))) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
601 dpi = XINT (AREF (spec, FONT_DPI_INDEX)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
602 if (INTEGERP (AREF (spec, FONT_AVGWIDTH_INDEX)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
603 && XINT (AREF (spec, FONT_AVGWIDTH_INDEX)) == 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
604 scalable = 1; |
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
605 |
95103 | 606 registry = AREF (spec, FONT_REGISTRY_INDEX); |
607 if (NILP (registry) | |
95698
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
608 || EQ (registry, Qascii_0) |
95103 | 609 || EQ (registry, Qiso10646_1) |
610 || EQ (registry, Qunicode_bmp) | |
611 || EQ (registry, Qunicode_sip)) | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
612 fc_charset_idx = -1; |
95103 | 613 else |
90400 | 614 { |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
615 FcChar8 *lang; |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
616 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
617 fc_charset_idx = ftfont_get_charset (registry); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
618 if (fc_charset_idx < 0) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
619 return NULL; |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
620 charset = fc_charset_table[fc_charset_idx].fc_charset; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
621 lang = (FcChar8 *) fc_charset_table[fc_charset_idx].lang; |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
622 if (lang) |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
623 { |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
624 langset = FcLangSetCreate (); |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
625 if (! langset) |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
626 goto err; |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
627 FcLangSetAdd (langset, lang); |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
628 } |
90400 | 629 } |
630 | |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
631 otlayout[0] = '\0'; |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
632 for (extra = AREF (spec, FONT_EXTRA_INDEX); |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
633 CONSP (extra); extra = XCDR (extra)) |
90400 | 634 { |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
635 Lisp_Object key, val; |
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
636 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
637 key = XCAR (XCAR (extra)), val = XCDR (XCAR (extra)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
638 if (EQ (key, QCdpi)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
639 dpi = XINT (val); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
640 else if (EQ (key, QClang)) |
90400 | 641 { |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
642 if (! langset) |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
643 langset = FcLangSetCreate (); |
90400 | 644 if (! langset) |
645 goto err; | |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
646 if (SYMBOLP (val)) |
90400 | 647 { |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
648 if (! FcLangSetAdd (langset, SYMBOL_FcChar8 (val))) |
90400 | 649 goto err; |
650 } | |
651 else | |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
652 for (; CONSP (val); val = XCDR (val)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
653 if (SYMBOLP (XCAR (val)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
654 && ! FcLangSetAdd (langset, SYMBOL_FcChar8 (XCAR (val)))) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
655 goto err; |
90400 | 656 } |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
657 else if (EQ (key, QCotf)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
658 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
659 *otspec = ftfont_get_open_type_spec (val); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
660 if (! *otspec) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
661 return NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
662 strcat (otlayout, "otlayout:"); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
663 OTF_TAG_STR ((*otspec)->script_tag, otlayout + 9); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
664 script = (*otspec)->script; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
665 } |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
666 else if (EQ (key, QCscript)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
667 script = val; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
668 else if (EQ (key, QCscalable)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
669 scalable = ! NILP (val); |
90400 | 670 } |
671 | |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
672 if (! NILP (script) && ! charset) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
673 { |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
674 Lisp_Object chars = assq_no_quit (script, Vscript_representative_chars); |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
675 |
97908
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
676 if (CONSP (chars) && CONSP (CDR (chars))) |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
677 { |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
678 charset = FcCharSetCreate (); |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
679 if (! charset) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
680 goto err; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
681 for (chars = XCDR (chars); CONSP (chars); chars = XCDR (chars)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
682 if (CHARACTERP (XCAR (chars)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
683 && ! FcCharSetAddChar (charset, XUINT (XCAR (chars)))) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
684 goto err; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
685 } |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
686 } |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
687 |
96076
bd3f48456ac7
(ftfont_pattern_entity): New arg extra. Caller changed.
Kenichi Handa <handa@m17n.org>
parents:
95805
diff
changeset
|
688 pattern = FcPatternCreate (); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
689 if (! pattern) |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
690 goto err; |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
691 tmp = AREF (spec, FONT_FOUNDRY_INDEX); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
692 if (! NILP (tmp) |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
693 && ! FcPatternAddString (pattern, FC_FOUNDRY, SYMBOL_FcChar8 (tmp))) |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
694 goto err; |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
695 tmp = AREF (spec, FONT_FAMILY_INDEX); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
696 if (! NILP (tmp) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
697 && ! FcPatternAddString (pattern, FC_FAMILY, SYMBOL_FcChar8 (tmp))) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
698 goto err; |
90400 | 699 if (charset |
700 && ! FcPatternAddCharSet (pattern, FC_CHARSET, charset)) | |
701 goto err; | |
702 if (langset | |
703 && ! FcPatternAddLangSet (pattern, FC_LANG, langset)) | |
704 goto err; | |
90500
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
705 if (dpi >= 0 |
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
706 && ! FcPatternAddDouble (pattern, FC_DPI, dpi)) |
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
707 goto err; |
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
708 if (scalable >= 0 |
90522 | 709 && ! FcPatternAddBool (pattern, FC_SCALABLE, scalable ? FcTrue : FcFalse)) |
90500
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
710 goto err; |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
711 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
712 goto finish; |
90400 | 713 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
714 err: |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
715 /* We come here because of unexpected error in fontconfig API call |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
716 (usually insufficient memory). */ |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
717 if (pattern) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
718 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
719 FcPatternDestroy (pattern); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
720 pattern = NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
721 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
722 if (*otspec) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
723 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
724 if ((*otspec)->nfeatures[0] > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
725 free ((*otspec)->features[0]); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
726 if ((*otspec)->nfeatures[1] > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
727 free ((*otspec)->features[1]); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
728 free (*otspec); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
729 *otspec = NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
730 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
731 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
732 finish: |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
733 if (langset) FcLangSetDestroy (langset); |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
734 if (charset && fc_charset_idx < 0) FcCharSetDestroy (charset); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
735 return pattern; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
736 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
737 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
738 static Lisp_Object |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
739 ftfont_list (frame, spec) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
740 Lisp_Object frame, spec; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
741 { |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
742 Lisp_Object val = Qnil, family; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
743 int i; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
744 FcPattern *pattern; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
745 FcFontSet *fontset = NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
746 FcObjectSet *objset = NULL; |
97908
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
747 FcCharSet *charset; |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
748 Lisp_Object chars = Qnil; |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
749 FcResult result; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
750 char otlayout[15]; /* For "otlayout:XXXX" */ |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
751 struct OpenTypeSpec *otspec = NULL; |
95358
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
752 int spacing = -1; |
95464
de4cb7ab40db
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
95433
diff
changeset
|
753 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
754 if (! fc_initialized) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
755 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
756 FcInit (); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
757 fc_initialized = 1; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
758 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
759 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
760 pattern = ftfont_spec_pattern (spec, otlayout, &otspec); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
761 if (! pattern) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
762 return Qnil; |
97908
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
763 if (FcPatternGetCharSet (pattern, FC_CHARSET, 0, &charset) != FcResultMatch) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
764 { |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
765 val = assq_no_quit (QCscript, AREF (spec, FONT_EXTRA_INDEX)); |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
766 if (! NILP (val)) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
767 { |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
768 val = assq_no_quit (XCDR (val), Vscript_representative_chars); |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
769 if (CONSP (val) && VECTORP (XCDR (val))) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
770 chars = XCDR (val); |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
771 } |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
772 val = Qnil; |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
773 } |
95358
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
774 if (INTEGERP (AREF (spec, FONT_SPACING_INDEX))) |
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
775 spacing = XINT (AREF (spec, FONT_SPACING_INDEX)); |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
776 family = AREF (spec, FONT_FAMILY_INDEX); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
777 if (! NILP (family)) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
778 { |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
779 Lisp_Object resolved; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
780 |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
781 resolved = ftfont_resolve_generic_family (family, pattern); |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
782 if (! NILP (resolved)) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
783 { |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
784 FcPatternDel (pattern, FC_FAMILY); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
785 if (! FcPatternAddString (pattern, FC_FAMILY, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
786 SYMBOL_FcChar8 (resolved))) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
787 goto err; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
788 } |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
789 } |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
790 |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
791 objset = FcObjectSetBuild (FC_FOUNDRY, FC_FAMILY, FC_WEIGHT, FC_SLANT, |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
792 FC_WIDTH, FC_PIXEL_SIZE, FC_SPACING, FC_SCALABLE, |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
793 FC_FILE, FC_INDEX, |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
794 #ifdef FC_CAPABILITY |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
795 FC_CAPABILITY, |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
796 #endif /* FC_CAPABILITY */ |
96076
bd3f48456ac7
(ftfont_pattern_entity): New arg extra. Caller changed.
Kenichi Handa <handa@m17n.org>
parents:
95805
diff
changeset
|
797 #ifdef FC_FONTFORMAT |
bd3f48456ac7
(ftfont_pattern_entity): New arg extra. Caller changed.
Kenichi Handa <handa@m17n.org>
parents:
95805
diff
changeset
|
798 FC_FONTFORMAT, |
bd3f48456ac7
(ftfont_pattern_entity): New arg extra. Caller changed.
Kenichi Handa <handa@m17n.org>
parents:
95805
diff
changeset
|
799 #endif |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
800 NULL); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
801 if (! objset) |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
802 goto err; |
97908
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
803 if (! NILP (chars)) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
804 FcObjectSetAdd (objset, FC_CHARSET); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
805 |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
806 fontset = FcFontList (NULL, pattern, objset); |
97908
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
807 if (! fontset || fontset->nfont == 0) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
808 goto finish; |
95698
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
809 #if 0 |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
810 /* Need fix because this finds any fonts. */ |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
811 if (fontset->nfont == 0 && ! NILP (family)) |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
812 { |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
813 /* Try maching with configuration. For instance, the |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
814 configuration may specify "Nimbus Mono L" as an alias of |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
815 "Courier". */ |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
816 FcPattern *pat = FcPatternBuild (0, FC_FAMILY, FcTypeString, |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
817 SYMBOL_FcChar8 (family), NULL); |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
818 FcChar8 *fam; |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
819 |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
820 if (FcConfigSubstitute (NULL, pat, FcMatchPattern) == FcTrue) |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
821 { |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
822 for (i = 0; |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
823 FcPatternGetString (pat, FC_FAMILY, i, &fam) == FcResultMatch; |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
824 i++) |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
825 { |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
826 FcPatternDel (pattern, FC_FAMILY); |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
827 FcPatternAddString (pattern, FC_FAMILY, fam); |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
828 FcFontSetDestroy (fontset); |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
829 fontset = FcFontList (NULL, pattern, objset); |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
830 if (fontset->nfont > 0) |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
831 break; |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
832 } |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
833 } |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
834 } |
d87a51f8851f
(ftfont_spec_pattern): Accept the registry `ascii-0'.
Kenichi Handa <handa@m17n.org>
parents:
95464
diff
changeset
|
835 #endif |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
836 for (i = 0; i < fontset->nfont; i++) |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
837 { |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
838 Lisp_Object entity; |
90474
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
839 |
95358
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
840 if (spacing >= 0) |
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
841 { |
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
842 int this; |
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
843 |
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
844 if ((FcPatternGetInteger (fontset->fonts[i], FC_SPACING, 0, &this) |
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
845 == FcResultMatch) |
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
846 && spacing != this) |
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
847 continue; |
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
848 } |
9c54d4f00cf6
(ftfont_spec_pattern): Don't set FC_SPACING to pattern.
Kenichi Handa <handa@m17n.org>
parents:
95229
diff
changeset
|
849 |
90516
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
850 #ifdef FC_CAPABILITY |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
851 if (otlayout[0]) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
852 { |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
853 FcChar8 *this; |
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
854 |
97908
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
855 if (FcPatternGetString (fontset->fonts[i], FC_CAPABILITY, 0, &this) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
856 != FcResultMatch |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
857 || ! strstr ((char *) this, otlayout)) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
858 continue; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
859 } |
90516
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
860 #endif /* FC_CAPABILITY */ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
861 #ifdef HAVE_LIBOTF |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
862 if (otspec) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
863 { |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
864 FcChar8 *file; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
865 OTF *otf; |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
866 |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
867 if (FcPatternGetString (fontset->fonts[i], FC_FILE, 0, &file) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
868 != FcResultMatch) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
869 continue; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
870 otf = OTF_open ((char *) file); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
871 if (! otf) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
872 continue; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
873 if (OTF_check_features (otf, 1, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
874 otspec->script_tag, otspec->langsys_tag, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
875 otspec->features[0], |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
876 otspec->nfeatures[0]) != 1 |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
877 || OTF_check_features (otf, 0, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
878 otspec->script_tag, otspec->langsys_tag, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
879 otspec->features[1], |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
880 otspec->nfeatures[1]) != 1) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
881 continue; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
882 } |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
883 #endif /* HAVE_LIBOTF */ |
97908
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
884 if (VECTORP (chars)) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
885 { |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
886 int j; |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
887 |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
888 if (FcPatternGetCharSet (fontset->fonts[i], FC_CHARSET, 0, &charset) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
889 != FcResultMatch) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
890 continue; |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
891 for (j = 0; j < ASIZE (chars); j++) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
892 if (NATNUMP (AREF (chars, j)) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
893 && FcCharSetHasChar (charset, XFASTINT (AREF (chars, j)))) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
894 break; |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
895 if (j == ASIZE (chars)) |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
896 continue; |
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
897 } |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
898 entity = ftfont_pattern_entity (fontset->fonts[i], |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
899 AREF (spec, FONT_EXTRA_INDEX)); |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
900 if (! NILP (entity)) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
901 val = Fcons (entity, val); |
90400 | 902 } |
97908
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
903 val = Fnreverse (val); |
90400 | 904 goto finish; |
905 | |
906 err: | |
907 /* We come here because of unexpected error in fontconfig API call | |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
908 (usually insufficient memory). */ |
90400 | 909 val = Qnil; |
910 | |
911 finish: | |
97908
464a00cca3cf
(ftfont_spec_pattern): Don't create a charset of the
Kenichi Handa <handa@m17n.org>
parents:
97826
diff
changeset
|
912 font_add_log ("ftfont-list", spec, val); |
90400 | 913 if (objset) FcObjectSetDestroy (objset); |
914 if (fontset) FcFontSetDestroy (fontset); | |
915 if (pattern) FcPatternDestroy (pattern); | |
916 return val; | |
917 } | |
918 | |
919 static Lisp_Object | |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
920 ftfont_match (frame, spec) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
921 Lisp_Object frame, spec; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
922 { |
95103 | 923 Lisp_Object entity; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
924 FcPattern *pattern, *match = NULL; |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
925 FcResult result; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
926 char otlayout[15]; /* For "otlayout:XXXX" */ |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
927 struct OpenTypeSpec *otspec = NULL; |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
928 |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
929 if (! fc_initialized) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
930 { |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
931 FcInit (); |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
932 fc_initialized = 1; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
933 } |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
934 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
935 pattern = ftfont_spec_pattern (spec, otlayout, &otspec); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
936 if (! pattern) |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
937 return Qnil; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
938 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
939 if (INTEGERP (AREF (spec, FONT_SIZE_INDEX))) |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
940 { |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
941 FcValue value; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
942 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
943 value.type = FcTypeDouble; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
944 value.u.d = XINT (AREF (spec, FONT_SIZE_INDEX)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
945 FcPatternAdd (pattern, FC_PIXEL_SIZE, value, FcFalse); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
946 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
947 if (FcConfigSubstitute (NULL, pattern, FcMatchPattern) == FcTrue) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
948 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
949 FcDefaultSubstitute (pattern); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
950 match = FcFontMatch (NULL, pattern, &result); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
951 if (match) |
92301
c10a8c811515
(ftfont_match): Explicitly set pixelsize in pattern.
Kenichi Handa <handa@m17n.org>
parents:
91870
diff
changeset
|
952 { |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
953 entity = ftfont_pattern_entity (match, AREF (spec, FONT_EXTRA_INDEX)); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
954 FcPatternDestroy (match); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
955 if (! NILP (AREF (spec, FONT_FAMILY_INDEX)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
956 && NILP (assq_no_quit (AREF (spec, FONT_FAMILY_INDEX), |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
957 ftfont_generic_family_list)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
958 && NILP (Fstring_equal (AREF (spec, FONT_FAMILY_INDEX), |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
959 AREF (entity, FONT_FAMILY_INDEX)))) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
960 entity = Qnil; |
92301
c10a8c811515
(ftfont_match): Explicitly set pixelsize in pattern.
Kenichi Handa <handa@m17n.org>
parents:
91870
diff
changeset
|
961 } |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
962 } |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
963 FcPatternDestroy (pattern); |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
964 |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
965 font_add_log ("ftfont-match", spec, entity); |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
966 return entity; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
967 } |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
968 |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
969 static Lisp_Object |
90400 | 970 ftfont_list_family (frame) |
971 Lisp_Object frame; | |
972 { | |
973 Lisp_Object list; | |
974 FcPattern *pattern = NULL; | |
975 FcFontSet *fontset = NULL; | |
976 FcObjectSet *objset = NULL; | |
977 int i; | |
978 | |
979 if (! fc_initialized) | |
980 { | |
981 FcInit (); | |
982 fc_initialized = 1; | |
983 } | |
984 | |
985 pattern = FcPatternCreate (); | |
986 if (! pattern) | |
987 goto finish; | |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
988 objset = FcObjectSetBuild (FC_FAMILY, NULL); |
90400 | 989 if (! objset) |
990 goto finish; | |
991 fontset = FcFontList (NULL, pattern, objset); | |
992 if (! fontset) | |
993 goto finish; | |
994 | |
995 list = Qnil; | |
996 for (i = 0; i < fontset->nfont; i++) | |
997 { | |
998 FcPattern *pat = fontset->fonts[i]; | |
999 FcChar8 *str; | |
1000 | |
1001 if (FcPatternGetString (pat, FC_FAMILY, 0, &str) == FcResultMatch) | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1002 list = Fcons (intern ((char *) str), list); |
90400 | 1003 } |
1004 | |
1005 finish: | |
1006 if (objset) FcObjectSetDestroy (objset); | |
1007 if (fontset) FcFontSetDestroy (fontset); | |
1008 if (pattern) FcPatternDestroy (pattern); | |
1009 | |
1010 return list; | |
1011 } | |
1012 | |
1013 | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1014 static Lisp_Object |
90400 | 1015 ftfont_open (f, entity, pixel_size) |
1016 FRAME_PTR f; | |
1017 Lisp_Object entity; | |
1018 int pixel_size; | |
1019 { | |
1020 struct ftfont_info *ftfont_info; | |
1021 struct font *font; | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1022 struct ftfont_cache_data *cache_data; |
90400 | 1023 FT_Face ft_face; |
1024 FT_Size ft_size; | |
1025 FT_UInt size; | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1026 Lisp_Object val, filename, index, cache, font_object; |
95103 | 1027 int scalable; |
90400 | 1028 int spacing; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1029 char name[256]; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1030 int i, len; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1031 int upEM; |
90400 | 1032 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1033 val = assq_no_quit (QCfont_entity, AREF (entity, FONT_EXTRA_INDEX)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1034 if (! CONSP (val)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1035 return Qnil; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1036 val = XCDR (val); |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1037 cache = ftfont_lookup_cache (val, 1); |
95103 | 1038 if (NILP (cache)) |
1039 return Qnil; | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1040 filename = XCAR (val); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1041 index = XCDR (val); |
95103 | 1042 val = XCDR (cache); |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1043 cache_data = XSAVE_VALUE (XCDR (cache))->pointer; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1044 ft_face = cache_data->ft_face; |
95103 | 1045 if (XSAVE_VALUE (val)->integer > 0) |
90400 | 1046 { |
95103 | 1047 /* FT_Face in this cache is already used by the different size. */ |
90400 | 1048 if (FT_New_Size (ft_face, &ft_size) != 0) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1049 return Qnil; |
90400 | 1050 if (FT_Activate_Size (ft_size) != 0) |
1051 { | |
1052 FT_Done_Size (ft_size); | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1053 return Qnil; |
90400 | 1054 } |
95103 | 1055 } |
1056 XSAVE_VALUE (val)->integer++; | |
90400 | 1057 size = XINT (AREF (entity, FONT_SIZE_INDEX)); |
1058 if (size == 0) | |
1059 size = pixel_size; | |
1060 if (FT_Set_Pixel_Sizes (ft_face, size, size) != 0) | |
1061 { | |
1062 if (XSAVE_VALUE (val)->integer == 0) | |
1063 FT_Done_Face (ft_face); | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1064 return Qnil; |
90400 | 1065 } |
1066 | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1067 font_object = font_make_object (VECSIZE (struct ftfont_info), entity, size); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1068 ASET (font_object, FONT_TYPE_INDEX, Qfreetype); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1069 len = font_unparse_xlfd (entity, size, name, 256); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1070 if (len > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1071 ASET (font_object, FONT_NAME_INDEX, make_unibyte_string (name, len)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1072 len = font_unparse_fcname (entity, size, name, 256); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1073 if (len > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1074 ASET (font_object, FONT_FULLNAME_INDEX, make_unibyte_string (name, len)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1075 else |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1076 ASET (font_object, FONT_FULLNAME_INDEX, |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1077 AREF (font_object, FONT_NAME_INDEX)); |
95103 | 1078 ASET (font_object, FONT_FILE_INDEX, filename); |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1079 ASET (font_object, FONT_FORMAT_INDEX, ftfont_font_format (NULL, filename)); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1080 font = XFONT_OBJECT (font_object); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1081 ftfont_info = (struct ftfont_info *) font; |
95103 | 1082 ftfont_info->ft_size = ft_face->size; |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1083 ftfont_info->index = XINT (index); |
91162
2b263ef46651
(ftfont_open): Set members maybe_otf and otf of
Kenichi Handa <handa@m17n.org>
parents:
91137
diff
changeset
|
1084 #ifdef HAVE_LIBOTF |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1085 ftfont_info->maybe_otf = ft_face->face_flags & FT_FACE_FLAG_SFNT; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1086 ftfont_info->otf = NULL; |
91162
2b263ef46651
(ftfont_open): Set members maybe_otf and otf of
Kenichi Handa <handa@m17n.org>
parents:
91137
diff
changeset
|
1087 #endif /* HAVE_LIBOTF */ |
90400 | 1088 font->pixel_size = size; |
1089 font->driver = &ftfont_driver; | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1090 font->encoding_charset = font->repertory_charset = -1; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1091 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1092 upEM = ft_face->units_per_EM; |
95103 | 1093 scalable = (INTEGERP (AREF (entity, FONT_AVGWIDTH_INDEX)) |
1094 && XINT (AREF (entity, FONT_AVGWIDTH_INDEX)) == 0); | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1095 if (scalable) |
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
1096 { |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1097 font->ascent = ft_face->ascender * size / upEM; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1098 font->descent = - ft_face->descender * size / upEM; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1099 font->height = ft_face->height * size / upEM; |
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
1100 } |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1101 else |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1102 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1103 font->ascent = ft_face->size->metrics.ascender >> 6; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1104 font->descent = - ft_face->size->metrics.descender >> 6; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1105 font->height = ft_face->size->metrics.height >> 6; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1106 } |
95103 | 1107 if (INTEGERP (AREF (entity, FONT_SPACING_INDEX))) |
1108 spacing = XINT (AREF (entity, FONT_SPACING_INDEX)); | |
1109 else | |
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
1110 spacing = FC_PROPORTIONAL; |
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
1111 if (spacing != FC_PROPORTIONAL) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1112 font->min_width = font->average_width = font->space_width |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1113 = (scalable ? ft_face->max_advance_width * size / upEM |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1114 : ft_face->size->metrics.max_advance >> 6); |
90400 | 1115 else |
1116 { | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1117 int n; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1118 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1119 font->min_width = font->average_width = font->space_width = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1120 for (i = 32, n = 0; i < 127; i++) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1121 if (FT_Load_Char (ft_face, i, FT_LOAD_DEFAULT) != 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1122 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1123 int this_width = ft_face->glyph->metrics.horiAdvance >> 6; |
90400 | 1124 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1125 if (this_width > 0 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1126 && (! font->min_width || font->min_width > this_width)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1127 font->min_width = this_width; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1128 if (i == 32) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1129 font->space_width = this_width; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1130 font->average_width += this_width; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1131 n++; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1132 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1133 if (n > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1134 font->average_width /= n; |
90400 | 1135 } |
1136 | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1137 font->baseline_offset = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1138 font->relative_compose = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1139 font->default_ascent = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1140 font->vertical_centering = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1141 if (scalable) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1142 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1143 font->underline_position = -ft_face->underline_position * size / upEM; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1144 font->underline_thickness = -ft_face->underline_thickness * size / upEM; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1145 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1146 else |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1147 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1148 font->underline_position = -1; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1149 font->underline_thickness = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1150 } |
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
1151 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1152 return font_object; |
90400 | 1153 } |
1154 | |
1155 static void | |
1156 ftfont_close (f, font) | |
1157 FRAME_PTR f; | |
1158 struct font *font; | |
1159 { | |
1160 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
95103 | 1161 Lisp_Object val, cache; |
90400 | 1162 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1163 val = Fcons (font->props[FONT_FILE_INDEX], make_number (ftfont_info->index)); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1164 cache = ftfont_lookup_cache (val, 1); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1165 xassert (CONSP (cache)); |
95103 | 1166 val = XCDR (cache); |
90400 | 1167 (XSAVE_VALUE (val)->integer)--; |
1168 if (XSAVE_VALUE (val)->integer == 0) | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1169 { |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1170 struct ftfont_cache_data *cache_data = XSAVE_VALUE (val)->pointer; |
95103 | 1171 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1172 FT_Done_Face (cache_data->ft_face); |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1173 #ifdef HAVE_LIBOTF |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1174 if (ftfont_info->otf) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1175 OTF_close (ftfont_info->otf); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1176 #endif |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1177 cache_data->ft_face = NULL; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1178 } |
90400 | 1179 else |
1180 FT_Done_Size (ftfont_info->ft_size); | |
1181 } | |
1182 | |
95464
de4cb7ab40db
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
95433
diff
changeset
|
1183 static int |
90400 | 1184 ftfont_has_char (entity, c) |
1185 Lisp_Object entity; | |
1186 int c; | |
1187 { | |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1188 FcCharSet *charset = ftfont_get_fc_charset (entity); |
90400 | 1189 |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1190 return (FcCharSetHasChar (charset, c) == FcTrue); |
90400 | 1191 } |
1192 | |
1193 static unsigned | |
1194 ftfont_encode_char (font, c) | |
1195 struct font *font; | |
1196 int c; | |
1197 { | |
1198 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
1199 FT_Face ft_face = ftfont_info->ft_size->face; | |
1200 FT_ULong charcode = c; | |
1201 FT_UInt code = FT_Get_Char_Index (ft_face, charcode); | |
1202 | |
91271
fed5211f4809
(ftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents:
91249
diff
changeset
|
1203 return (code > 0 ? code : FONT_INVALID_CODE); |
90400 | 1204 } |
1205 | |
1206 static int | |
1207 ftfont_text_extents (font, code, nglyphs, metrics) | |
1208 struct font *font; | |
1209 unsigned *code; | |
1210 int nglyphs; | |
1211 struct font_metrics *metrics; | |
1212 { | |
1213 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
1214 FT_Face ft_face = ftfont_info->ft_size->face; | |
1215 int width = 0; | |
96568
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1216 int i, first; |
90400 | 1217 |
1218 if (ftfont_info->ft_size != ft_face->size) | |
1219 FT_Activate_Size (ftfont_info->ft_size); | |
1220 if (metrics) | |
1221 bzero (metrics, sizeof (struct font_metrics)); | |
96568
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1222 for (i = 0, first = 1; i < nglyphs; i++) |
90400 | 1223 { |
1224 if (FT_Load_Glyph (ft_face, code[i], FT_LOAD_DEFAULT) == 0) | |
1225 { | |
1226 FT_Glyph_Metrics *m = &ft_face->glyph->metrics; | |
1227 | |
96568
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1228 if (first) |
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1229 { |
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1230 if (metrics) |
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1231 { |
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1232 metrics->lbearing = m->horiBearingX >> 6; |
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1233 metrics->rbearing = (m->horiBearingX + m->width) >> 6; |
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1234 metrics->ascent = m->horiBearingY >> 6; |
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1235 metrics->descent = (m->horiBearingY + m->height) >> 6; |
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1236 } |
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1237 first = 0; |
ff2262b8b0f2
(ftfont_text_extents): Fix initial setting of metrics.
Kenichi Handa <handa@m17n.org>
parents:
96561
diff
changeset
|
1238 } |
90400 | 1239 if (metrics) |
1240 { | |
1241 if (metrics->lbearing > width + (m->horiBearingX >> 6)) | |
1242 metrics->lbearing = width + (m->horiBearingX >> 6); | |
1243 if (metrics->rbearing | |
1244 < width + ((m->horiBearingX + m->width) >> 6)) | |
1245 metrics->rbearing | |
1246 = width + ((m->horiBearingX + m->width) >> 6); | |
1247 if (metrics->ascent < (m->horiBearingY >> 6)) | |
1248 metrics->ascent = m->horiBearingY >> 6; | |
1249 if (metrics->descent > ((m->horiBearingY + m->height) >> 6)) | |
1250 metrics->descent = (m->horiBearingY + m->height) >> 6; | |
1251 } | |
1252 width += m->horiAdvance >> 6; | |
1253 } | |
1254 else | |
1255 { | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1256 width += font->space_width; |
90400 | 1257 } |
1258 } | |
1259 if (metrics) | |
1260 metrics->width = width; | |
1261 | |
1262 return width; | |
1263 } | |
1264 | |
1265 static int | |
1266 ftfont_get_bitmap (font, code, bitmap, bits_per_pixel) | |
1267 struct font *font; | |
1268 unsigned code; | |
1269 struct font_bitmap *bitmap; | |
1270 int bits_per_pixel; | |
1271 { | |
1272 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
1273 FT_Face ft_face = ftfont_info->ft_size->face; | |
1274 FT_Int32 load_flags = FT_LOAD_RENDER; | |
1275 | |
1276 if (ftfont_info->ft_size != ft_face->size) | |
1277 FT_Activate_Size (ftfont_info->ft_size); | |
1278 if (bits_per_pixel == 1) | |
1279 { | |
1280 #ifdef FT_LOAD_TARGET_MONO | |
1281 load_flags |= FT_LOAD_TARGET_MONO; | |
1282 #else | |
1283 load_flags |= FT_LOAD_MONOCHROME; | |
1284 #endif | |
1285 } | |
1286 else if (bits_per_pixel != 8) | |
1287 /* We don't support such a rendering. */ | |
1288 return -1; | |
1289 | |
1290 if (FT_Load_Glyph (ft_face, code, load_flags) != 0) | |
1291 return -1; | |
91108
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1292 bitmap->bits_per_pixel |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1293 = (ft_face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO ? 1 |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1294 : ft_face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY ? 8 |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1295 : ft_face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_LCD ? 8 |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1296 : ft_face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_LCD_V ? 8 |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1297 : -1); |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1298 if (bitmap->bits_per_pixel < 0) |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1299 /* We don't suport that kind of pixel mode. */ |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1300 return -1; |
90400 | 1301 bitmap->rows = ft_face->glyph->bitmap.rows; |
1302 bitmap->width = ft_face->glyph->bitmap.width; | |
1303 bitmap->pitch = ft_face->glyph->bitmap.pitch; | |
1304 bitmap->buffer = ft_face->glyph->bitmap.buffer; | |
1305 bitmap->left = ft_face->glyph->bitmap_left; | |
1306 bitmap->top = ft_face->glyph->bitmap_top; | |
1307 bitmap->advance = ft_face->glyph->metrics.horiAdvance >> 6; | |
1308 bitmap->extra = NULL; | |
1309 | |
1310 return 0; | |
1311 } | |
1312 | |
1313 static int | |
1314 ftfont_anchor_point (font, code, index, x, y) | |
1315 struct font *font; | |
1316 unsigned code; | |
1317 int index; | |
1318 int *x, *y; | |
1319 { | |
1320 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
1321 FT_Face ft_face = ftfont_info->ft_size->face; | |
1322 | |
1323 if (ftfont_info->ft_size != ft_face->size) | |
1324 FT_Activate_Size (ftfont_info->ft_size); | |
1325 if (FT_Load_Glyph (ft_face, code, FT_LOAD_DEFAULT) != 0) | |
1326 return -1; | |
1327 if (ft_face->glyph->format != FT_GLYPH_FORMAT_OUTLINE) | |
1328 return -1; | |
1329 if (index >= ft_face->glyph->outline.n_points) | |
1330 return -1; | |
1331 *x = ft_face->glyph->outline.points[index].x; | |
1332 *y = ft_face->glyph->outline.points[index].y; | |
1333 return 0; | |
1334 } | |
1335 | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1336 #ifdef HAVE_LIBOTF |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1337 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1338 static Lisp_Object |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1339 ftfont_otf_features (gsub_gpos) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1340 OTF_GSUB_GPOS *gsub_gpos; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1341 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1342 Lisp_Object scripts, langsyses, features, sym; |
98787
22ff4ff011f4
(ftfont_otf_features): Fix indexing
Kenichi Handa <handa@m17n.org>
parents:
98656
diff
changeset
|
1343 int i, j, k, l; |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1344 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1345 for (scripts = Qnil, i = gsub_gpos->ScriptList.ScriptCount - 1; i >= 0; i--) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1346 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1347 OTF_Script *otf_script = gsub_gpos->ScriptList.Script + i; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1348 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1349 for (langsyses = Qnil, j = otf_script->LangSysCount - 1; j >= -1; j--) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1350 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1351 OTF_LangSys *otf_langsys; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1352 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1353 if (j >= 0) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1354 otf_langsys = otf_script->LangSys + j; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1355 else if (otf_script->DefaultLangSysOffset) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1356 otf_langsys = &otf_script->DefaultLangSys; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1357 else |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1358 break; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1359 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1360 for (features = Qnil, k = otf_langsys->FeatureCount - 1; k >= 0; k--) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1361 { |
98787
22ff4ff011f4
(ftfont_otf_features): Fix indexing
Kenichi Handa <handa@m17n.org>
parents:
98656
diff
changeset
|
1362 l = otf_langsys->FeatureIndex[k]; |
99108
411ea0d5dade
(ftfont_otf_features): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98787
diff
changeset
|
1363 if (l >= gsub_gpos->FeatureList.FeatureCount) |
98787
22ff4ff011f4
(ftfont_otf_features): Fix indexing
Kenichi Handa <handa@m17n.org>
parents:
98656
diff
changeset
|
1364 continue; |
22ff4ff011f4
(ftfont_otf_features): Fix indexing
Kenichi Handa <handa@m17n.org>
parents:
98656
diff
changeset
|
1365 OTF_TAG_SYM (sym, gsub_gpos->FeatureList.Feature[l].FeatureTag); |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1366 features = Fcons (sym, features); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1367 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1368 if (j >= 0) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1369 OTF_TAG_SYM (sym, otf_script->LangSysRecord[j].LangSysTag); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1370 else |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1371 sym = Qnil; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1372 langsyses = Fcons (Fcons (sym, features), langsyses); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1373 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1374 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1375 OTF_TAG_SYM (sym, gsub_gpos->ScriptList.Script[i].ScriptTag); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1376 scripts = Fcons (Fcons (sym, langsyses), scripts); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1377 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1378 return scripts; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1379 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1380 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1381 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1382 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1383 static Lisp_Object |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1384 ftfont_otf_capability (font) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1385 struct font *font; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1386 { |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1387 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1388 OTF *otf = ftfont_get_otf (ftfont_info); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1389 Lisp_Object gsub_gpos; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1390 |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1391 if (! otf) |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1392 return Qnil; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1393 gsub_gpos = Fcons (Qnil, Qnil); |
99108
411ea0d5dade
(ftfont_otf_features): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98787
diff
changeset
|
1394 if (OTF_get_table (otf, "GSUB") == 0 |
411ea0d5dade
(ftfont_otf_features): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98787
diff
changeset
|
1395 && otf->gsub->FeatureList.FeatureCount > 0) |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1396 XSETCAR (gsub_gpos, ftfont_otf_features (otf->gsub)); |
99108
411ea0d5dade
(ftfont_otf_features): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98787
diff
changeset
|
1397 if (OTF_get_table (otf, "GPOS") == 0 |
411ea0d5dade
(ftfont_otf_features): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98787
diff
changeset
|
1398 && otf->gpos->FeatureList.FeatureCount > 0) |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1399 XSETCDR (gsub_gpos, ftfont_otf_features (otf->gpos)); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1400 return gsub_gpos; |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1401 } |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1402 |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1403 #ifdef HAVE_M17N_FLT |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1404 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1405 struct MFLTFontFT |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1406 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1407 MFLTFont flt_font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1408 struct font *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1409 FT_Face ft_face; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1410 OTF *otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1411 }; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1412 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1413 static int |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1414 ftfont_get_glyph_id (font, gstring, from, to) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1415 MFLTFont *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1416 MFLTGlyphString *gstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1417 int from, to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1418 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1419 struct MFLTFontFT *flt_font_ft = (struct MFLTFontFT *) font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1420 FT_Face ft_face = flt_font_ft->ft_face; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1421 MFLTGlyph *g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1422 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1423 for (g = gstring->glyphs + from; from < to; g++, from++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1424 if (! g->encoded) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1425 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1426 FT_UInt code = FT_Get_Char_Index (ft_face, g->code); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1427 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1428 g->code = code > 0 ? code : FONT_INVALID_CODE; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1429 g->encoded = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1430 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1431 return 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1432 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1433 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1434 static int |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1435 ftfont_get_metrics (font, gstring, from, to) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1436 MFLTFont *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1437 MFLTGlyphString *gstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1438 int from, to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1439 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1440 struct MFLTFontFT *flt_font_ft = (struct MFLTFontFT *) font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1441 FT_Face ft_face = flt_font_ft->ft_face; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1442 MFLTGlyph *g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1443 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1444 for (g = gstring->glyphs + from; from < to; g++, from++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1445 if (! g->measured) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1446 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1447 if (g->code != FONT_INVALID_CODE) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1448 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1449 FT_Glyph_Metrics *m; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1450 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1451 if (FT_Load_Glyph (ft_face, g->code, FT_LOAD_DEFAULT) != 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1452 abort (); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1453 m = &ft_face->glyph->metrics; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1454 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1455 g->lbearing = m->horiBearingX; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1456 g->rbearing = m->horiBearingX + m->width; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1457 g->ascent = m->horiBearingY; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1458 g->descent = m->height - m->horiBearingY; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1459 g->xadv = m->horiAdvance; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1460 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1461 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1462 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1463 g->lbearing = 0; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1464 g->rbearing = g->xadv = flt_font_ft->font->space_width << 6; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1465 g->ascent = flt_font_ft->font->ascent << 6; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1466 g->descent = flt_font_ft->font->descent << 6; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1467 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1468 g->yadv = 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1469 g->measured = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1470 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1471 return 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1472 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1473 |
95464
de4cb7ab40db
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
95433
diff
changeset
|
1474 static int |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1475 ftfont_check_otf (MFLTFont *font, MFLTOtfSpec *spec) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1476 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1477 struct MFLTFontFT *flt_font_ft = (struct MFLTFontFT *) font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1478 OTF *otf = flt_font_ft->otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1479 OTF_Tag *tags; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1480 int i, n, negative; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1481 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1482 for (i = 0; i < 2; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1483 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1484 if (! spec->features[i]) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1485 continue; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1486 for (n = 0; spec->features[i][n]; n++); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1487 tags = alloca (sizeof (OTF_Tag) * n); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1488 for (n = 0, negative = 0; spec->features[i][n]; n++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1489 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1490 if (spec->features[i][n] == 0xFFFFFFFF) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1491 negative = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1492 else if (negative) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1493 tags[n - 1] = spec->features[i][n] | 0x80000000; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1494 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1495 tags[n] = spec->features[i][n]; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1496 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1497 if (n - negative > 0 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1498 && OTF_check_features (otf, i == 0, spec->script, spec->langsys, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1499 tags, n - negative) != 1) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1500 return 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1501 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1502 return 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1503 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1504 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1505 #define DEVICE_DELTA(table, size) \ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1506 (((size) >= (table).StartSize && (size) <= (table).EndSize) \ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1507 ? (table).DeltaValue[(size) - (table).StartSize] << 6 \ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1508 : 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1509 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1510 static void |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1511 adjust_anchor (FT_Face ft_face, OTF_Anchor *anchor, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1512 unsigned code, int x_ppem, int y_ppem, int *x, int *y) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1513 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1514 if (anchor->AnchorFormat == 2) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1515 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1516 FT_Outline *outline; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1517 int ap = anchor->f.f1.AnchorPoint; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1518 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1519 FT_Load_Glyph (ft_face, (FT_UInt) code, FT_LOAD_MONOCHROME); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1520 outline = &ft_face->glyph->outline; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1521 if (ap < outline->n_points) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1522 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1523 *x = outline->points[ap].x << 6; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1524 *y = outline->points[ap].y << 6; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1525 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1526 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1527 else if (anchor->AnchorFormat == 3) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1528 { |
96840 | 1529 if (anchor->f.f2.XDeviceTable.offset |
1530 && anchor->f.f2.XDeviceTable.DeltaValue) | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1531 *x += DEVICE_DELTA (anchor->f.f2.XDeviceTable, x_ppem); |
96840 | 1532 if (anchor->f.f2.YDeviceTable.offset |
1533 && anchor->f.f2.YDeviceTable.DeltaValue) | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1534 *y += DEVICE_DELTA (anchor->f.f2.YDeviceTable, y_ppem); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1535 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1536 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1537 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1538 static OTF_GlyphString otf_gstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1539 |
95464
de4cb7ab40db
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
95433
diff
changeset
|
1540 static int |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1541 ftfont_drive_otf (font, spec, in, from, to, out, adjustment) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1542 MFLTFont *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1543 MFLTOtfSpec *spec; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1544 MFLTGlyphString *in; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1545 int from, to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1546 MFLTGlyphString *out; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1547 MFLTGlyphAdjustment *adjustment; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1548 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1549 struct MFLTFontFT *flt_font_ft = (struct MFLTFontFT *) font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1550 FT_Face ft_face = flt_font_ft->ft_face; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1551 OTF *otf = flt_font_ft->otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1552 int len = to - from; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1553 int i, j, gidx; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1554 OTF_Glyph *otfg; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1555 char script[5], *langsys = NULL; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1556 char *gsub_features = NULL, *gpos_features = NULL; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1557 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1558 if (len == 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1559 return from; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1560 OTF_tag_name (spec->script, script); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1561 if (spec->langsys) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1562 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1563 langsys = alloca (5); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1564 OTF_tag_name (spec->langsys, langsys); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1565 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1566 for (i = 0; i < 2; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1567 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1568 char *p; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1569 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1570 if (spec->features[i] && spec->features[i][1] != 0xFFFFFFFF) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1571 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1572 for (j = 0; spec->features[i][j]; j++); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1573 if (i == 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1574 p = gsub_features = alloca (6 * j); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1575 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1576 p = gpos_features = alloca (6 * j); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1577 for (j = 0; spec->features[i][j]; j++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1578 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1579 if (spec->features[i][j] == 0xFFFFFFFF) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1580 *p++ = '*', *p++ = ','; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1581 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1582 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1583 OTF_tag_name (spec->features[i][j], p); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1584 p[4] = ','; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1585 p += 5; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1586 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1587 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1588 *--p = '\0'; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1589 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1590 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1591 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1592 if (otf_gstring.size == 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1593 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1594 otf_gstring.glyphs = (OTF_Glyph *) malloc (sizeof (OTF_Glyph) * len); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1595 otf_gstring.size = len; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1596 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1597 else if (otf_gstring.size < len) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1598 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1599 otf_gstring.glyphs = (OTF_Glyph *) realloc (otf_gstring.glyphs, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1600 sizeof (OTF_Glyph) * len); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1601 otf_gstring.size = len; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1602 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1603 otf_gstring.used = len; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1604 memset (otf_gstring.glyphs, 0, sizeof (OTF_Glyph) * len); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1605 for (i = 0; i < len; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1606 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1607 otf_gstring.glyphs[i].c = in->glyphs[from + i].c; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1608 otf_gstring.glyphs[i].glyph_id = in->glyphs[from + i].code; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1609 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1610 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1611 OTF_drive_gdef (otf, &otf_gstring); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1612 gidx = out->used; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1613 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1614 if (gsub_features) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1615 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1616 if (OTF_drive_gsub (otf, &otf_gstring, script, langsys, gsub_features) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1617 < 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1618 goto simple_copy; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1619 if (out->allocated < out->used + otf_gstring.used) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1620 return -2; |
91294
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1621 for (i = 0, otfg = otf_gstring.glyphs; i < otf_gstring.used; ) |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1622 { |
91294
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1623 MFLTGlyph *g; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1624 int min_from, max_to; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1625 int j; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1626 |
91294
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1627 g = out->glyphs + out->used; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1628 *g = in->glyphs[from + otfg->f.index.from]; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1629 if (g->code != otfg->glyph_id) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1630 { |
91294
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1631 g->c = 0; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1632 g->code = otfg->glyph_id; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1633 g->measured = 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1634 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1635 out->used++; |
91294
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1636 min_from = g->from; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1637 max_to = g->to; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1638 if (otfg->f.index.from < otfg->f.index.to) |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1639 { |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1640 /* OTFG substitutes multiple glyphs in IN. */ |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1641 for (j = from + otfg->f.index.from + 1; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1642 j <= from + otfg->f.index.to; j++) |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1643 { |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1644 if (min_from > in->glyphs[j].from) |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1645 min_from = in->glyphs[j].from; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1646 if (max_to < in->glyphs[j].to) |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1647 max_to = in->glyphs[j].to; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1648 } |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1649 g->from = min_from; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1650 g->to = max_to; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1651 } |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1652 for (i++, otfg++; (i < otf_gstring.used |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1653 && otfg->f.index.from == otfg[-1].f.index.from); |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1654 i++, otfg++) |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1655 { |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1656 g = out->glyphs + out->used; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1657 *g = in->glyphs[from + otfg->f.index.to]; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1658 if (g->code != otfg->glyph_id) |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1659 { |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1660 g->c = 0; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1661 g->code = otfg->glyph_id; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1662 g->measured = 0; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1663 } |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1664 out->used++; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1665 } |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1666 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1667 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1668 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1669 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1670 if (out->allocated < out->used + len) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1671 return -2; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1672 for (i = 0; i < len; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1673 out->glyphs[out->used++] = in->glyphs[from + i]; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1674 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1675 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1676 if (gpos_features) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1677 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1678 MFLTGlyph *base = NULL, *mark = NULL, *g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1679 int x_ppem, y_ppem, x_scale, y_scale; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1680 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1681 if (OTF_drive_gpos (otf, &otf_gstring, script, langsys, gpos_features) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1682 < 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1683 return to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1684 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1685 x_ppem = ft_face->size->metrics.x_ppem; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1686 y_ppem = ft_face->size->metrics.y_ppem; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1687 x_scale = ft_face->size->metrics.x_scale; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1688 y_scale = ft_face->size->metrics.y_scale; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1689 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1690 for (i = 0, otfg = otf_gstring.glyphs, g = out->glyphs + gidx; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1691 i < otf_gstring.used; i++, otfg++, g++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1692 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1693 MFLTGlyph *prev; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1694 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1695 if (! otfg->glyph_id) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1696 continue; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1697 switch (otfg->positioning_type) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1698 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1699 case 0: |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1700 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1701 case 1: /* Single */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1702 case 2: /* Pair */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1703 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1704 int format = otfg->f.f1.format; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1705 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1706 if (format & OTF_XPlacement) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1707 adjustment[i].xoff |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1708 = otfg->f.f1.value->XPlacement * x_scale / 0x10000; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1709 if (format & OTF_XPlaDevice) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1710 adjustment[i].xoff |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1711 += DEVICE_DELTA (otfg->f.f1.value->XPlaDevice, x_ppem); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1712 if (format & OTF_YPlacement) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1713 adjustment[i].yoff |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1714 = - (otfg->f.f1.value->YPlacement * y_scale / 0x10000); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1715 if (format & OTF_YPlaDevice) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1716 adjustment[i].yoff |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1717 -= DEVICE_DELTA (otfg->f.f1.value->YPlaDevice, y_ppem); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1718 if (format & OTF_XAdvance) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1719 adjustment[i].xadv |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1720 += otfg->f.f1.value->XAdvance * x_scale / 0x10000; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1721 if (format & OTF_XAdvDevice) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1722 adjustment[i].xadv |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1723 += DEVICE_DELTA (otfg->f.f1.value->XAdvDevice, x_ppem); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1724 if (format & OTF_YAdvance) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1725 adjustment[i].yadv |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1726 += otfg->f.f1.value->YAdvance * y_scale / 0x10000; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1727 if (format & OTF_YAdvDevice) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1728 adjustment[i].yadv |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1729 += DEVICE_DELTA (otfg->f.f1.value->YAdvDevice, y_ppem); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1730 adjustment[i].set = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1731 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1732 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1733 case 3: /* Cursive */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1734 /* Not yet supported. */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1735 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1736 case 4: /* Mark-to-Base */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1737 case 5: /* Mark-to-Ligature */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1738 if (! base) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1739 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1740 prev = base; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1741 goto label_adjust_anchor; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1742 default: /* i.e. case 6 Mark-to-Mark */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1743 if (! mark) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1744 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1745 prev = mark; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1746 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1747 label_adjust_anchor: |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1748 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1749 int base_x, base_y, mark_x, mark_y; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1750 int this_from, this_to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1751 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1752 base_x = otfg->f.f4.base_anchor->XCoordinate * x_scale / 0x10000; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1753 base_y = otfg->f.f4.base_anchor->YCoordinate * y_scale / 0x10000; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1754 mark_x = otfg->f.f4.mark_anchor->XCoordinate * x_scale / 0x10000; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1755 mark_y = otfg->f.f4.mark_anchor->YCoordinate * y_scale / 0x10000;; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1756 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1757 if (otfg->f.f4.base_anchor->AnchorFormat != 1) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1758 adjust_anchor (ft_face, otfg->f.f4.base_anchor, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1759 prev->code, x_ppem, y_ppem, &base_x, &base_y); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1760 if (otfg->f.f4.mark_anchor->AnchorFormat != 1) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1761 adjust_anchor (ft_face, otfg->f.f4.mark_anchor, g->code, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1762 x_ppem, y_ppem, &mark_x, &mark_y); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1763 adjustment[i].xoff = (base_x - mark_x); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1764 adjustment[i].yoff = - (base_y - mark_y); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1765 adjustment[i].back = (g - prev); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1766 adjustment[i].xadv = 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1767 adjustment[i].advance_is_absolute = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1768 adjustment[i].set = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1769 this_from = g->from; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1770 this_to = g->to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1771 for (j = 0; prev + j < g; j++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1772 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1773 if (this_from > prev[j].from) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1774 this_from = prev[j].from; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1775 if (this_to < prev[j].to) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1776 this_to = prev[j].to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1777 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1778 for (; prev <= g; prev++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1779 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1780 prev->from = this_from; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1781 prev->to = this_to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1782 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1783 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1784 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1785 if (otfg->GlyphClass == OTF_GlyphClass0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1786 base = mark = g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1787 else if (otfg->GlyphClass == OTF_GlyphClassMark) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1788 mark = g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1789 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1790 base = g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1791 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1792 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1793 return to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1794 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1795 simple_copy: |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1796 if (out->allocated < out->used + len) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1797 return -2; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1798 font->get_metrics (font, in, from, to); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1799 memcpy (out->glyphs + out->used, in->glyphs + from, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1800 sizeof (MFLTGlyph) * len); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1801 out->used += len; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1802 return to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1803 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1804 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1805 static MFLTGlyphString gstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1806 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1807 static int m17n_flt_initialized; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1808 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1809 extern Lisp_Object QCfamily; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1810 |
98656
f2f525a089e1
* ftfont.c (ftfont_shape_by_flt): Make static.
Andreas Schwab <schwab@suse.de>
parents:
98205
diff
changeset
|
1811 static Lisp_Object |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1812 ftfont_shape_by_flt (lgstring, font, ft_face, otf) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1813 Lisp_Object lgstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1814 struct font *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1815 FT_Face ft_face; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1816 OTF *otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1817 { |
97826 | 1818 EMACS_UINT len = LGSTRING_GLYPH_LEN (lgstring); |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1819 EMACS_UINT i; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1820 struct MFLTFontFT flt_font_ft; |
98103
809fdcf44233
(ftfont_shape_by_flt): Use "combining" FLT for ASCII characters.
Kenichi Handa <handa@m17n.org>
parents:
97908
diff
changeset
|
1821 MFLT *flt = NULL; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1822 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1823 if (! m17n_flt_initialized) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1824 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1825 M17N_INIT (); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1826 m17n_flt_initialized = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1827 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1828 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1829 for (i = 0; i < len; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1830 if (NILP (LGSTRING_GLYPH (lgstring, i))) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1831 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1832 len = i; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1833 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1834 if (gstring.allocated == 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1835 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1836 gstring.allocated = len * 2; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1837 gstring.glyph_size = sizeof (MFLTGlyph); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1838 gstring.glyphs = malloc (sizeof (MFLTGlyph) * gstring.allocated); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1839 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1840 else if (gstring.allocated < len * 2) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1841 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1842 gstring.allocated = len * 2; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1843 gstring.glyphs = realloc (gstring.glyphs, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1844 sizeof (MFLTGlyph) * gstring.allocated); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1845 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1846 for (i = 0; i < len; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1847 gstring.glyphs[i].c = LGLYPH_CHAR (LGSTRING_GLYPH (lgstring, i)); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1848 gstring.used = len; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1849 gstring.r2l = 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1850 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1851 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1852 Lisp_Object family = Ffont_get (LGSTRING_FONT (lgstring), QCfamily); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1853 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1854 if (NILP (family)) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1855 flt_font_ft.flt_font.family = Mnil; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1856 else |
95103 | 1857 flt_font_ft.flt_font.family |
98205
851824a732ae
(ftfont_shape_by_flt): Downcase family name.
Kenichi Handa <handa@m17n.org>
parents:
98103
diff
changeset
|
1858 = msymbol ((char *) SDATA (Fdowncase (SYMBOL_NAME (family)))); |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1859 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1860 flt_font_ft.flt_font.x_ppem = ft_face->size->metrics.x_ppem; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1861 flt_font_ft.flt_font.y_ppem = ft_face->size->metrics.y_ppem; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1862 flt_font_ft.flt_font.get_glyph_id = ftfont_get_glyph_id; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1863 flt_font_ft.flt_font.get_metrics = ftfont_get_metrics; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1864 flt_font_ft.flt_font.check_otf = ftfont_check_otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1865 flt_font_ft.flt_font.drive_otf = ftfont_drive_otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1866 flt_font_ft.flt_font.internal = NULL; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1867 flt_font_ft.font = font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1868 flt_font_ft.ft_face = ft_face; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1869 flt_font_ft.otf = otf; |
98103
809fdcf44233
(ftfont_shape_by_flt): Use "combining" FLT for ASCII characters.
Kenichi Handa <handa@m17n.org>
parents:
97908
diff
changeset
|
1870 if (ASCII_CHAR_P (gstring.glyphs[0].c)) |
809fdcf44233
(ftfont_shape_by_flt): Use "combining" FLT for ASCII characters.
Kenichi Handa <handa@m17n.org>
parents:
97908
diff
changeset
|
1871 /* A little bit ad hoc. Perhaps, shaper must get script and |
809fdcf44233
(ftfont_shape_by_flt): Use "combining" FLT for ASCII characters.
Kenichi Handa <handa@m17n.org>
parents:
97908
diff
changeset
|
1872 language information, and select a proper flt for them |
809fdcf44233
(ftfont_shape_by_flt): Use "combining" FLT for ASCII characters.
Kenichi Handa <handa@m17n.org>
parents:
97908
diff
changeset
|
1873 here. */ |
809fdcf44233
(ftfont_shape_by_flt): Use "combining" FLT for ASCII characters.
Kenichi Handa <handa@m17n.org>
parents:
97908
diff
changeset
|
1874 flt = mflt_get (msymbol ("combining")); |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1875 for (i = 0; i < 3; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1876 { |
98103
809fdcf44233
(ftfont_shape_by_flt): Use "combining" FLT for ASCII characters.
Kenichi Handa <handa@m17n.org>
parents:
97908
diff
changeset
|
1877 int result = mflt_run (&gstring, 0, len, &flt_font_ft.flt_font, flt); |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1878 if (result != -2) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1879 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1880 gstring.allocated += gstring.allocated; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1881 gstring.glyphs = realloc (gstring.glyphs, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1882 sizeof (MFLTGlyph) * gstring.allocated); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1883 } |
97826 | 1884 if (gstring.used > LGSTRING_GLYPH_LEN (lgstring)) |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1885 return Qnil; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1886 for (i = 0; i < gstring.used; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1887 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1888 MFLTGlyph *g = gstring.glyphs + i; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1889 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1890 g->from = LGLYPH_FROM (LGSTRING_GLYPH (lgstring, g->from)); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1891 g->to = LGLYPH_TO (LGSTRING_GLYPH (lgstring, g->to)); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1892 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1893 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1894 for (i = 0; i < gstring.used; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1895 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1896 Lisp_Object lglyph = LGSTRING_GLYPH (lgstring, i); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1897 MFLTGlyph *g = gstring.glyphs + i; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1898 |
91271
fed5211f4809
(ftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents:
91249
diff
changeset
|
1899 if (NILP (lglyph)) |
fed5211f4809
(ftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents:
91249
diff
changeset
|
1900 { |
fed5211f4809
(ftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents:
91249
diff
changeset
|
1901 lglyph = Fmake_vector (make_number (LGLYPH_SIZE), Qnil); |
fed5211f4809
(ftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents:
91249
diff
changeset
|
1902 LGSTRING_SET_GLYPH (lgstring, i, lglyph); |
fed5211f4809
(ftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents:
91249
diff
changeset
|
1903 } |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1904 LGLYPH_SET_FROM (lglyph, g->from); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1905 LGLYPH_SET_TO (lglyph, g->to); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1906 LGLYPH_SET_CHAR (lglyph, g->c); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1907 LGLYPH_SET_CODE (lglyph, g->code); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1908 LGLYPH_SET_WIDTH (lglyph, g->xadv >> 6); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1909 LGLYPH_SET_LBEARING (lglyph, g->lbearing >> 6); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1910 LGLYPH_SET_RBEARING (lglyph, g->rbearing >> 6); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1911 LGLYPH_SET_ASCENT (lglyph, g->ascent >> 6); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1912 LGLYPH_SET_DESCENT (lglyph, g->descent >> 6); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1913 if (g->adjusted) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1914 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1915 Lisp_Object vec; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1916 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1917 vec = Fmake_vector (make_number (3), Qnil); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1918 ASET (vec, 0, make_number (g->xoff >> 6)); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1919 ASET (vec, 1, make_number (g->yoff >> 6)); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1920 ASET (vec, 2, make_number (g->xadv >> 6)); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1921 LGLYPH_SET_ADJUSTMENT (lglyph, vec); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1922 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1923 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1924 return make_number (i); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1925 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1926 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1927 Lisp_Object |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1928 ftfont_shape (lgstring) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1929 Lisp_Object lgstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1930 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1931 struct font *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1932 struct ftfont_info *ftfont_info; |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1933 OTF *otf; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1934 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1935 CHECK_FONT_GET_OBJECT (LGSTRING_FONT (lgstring), font); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1936 ftfont_info = (struct ftfont_info *) font; |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1937 otf = ftfont_get_otf (ftfont_info); |
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1938 if (! otf) |
91870
5348213975e3
(ftfont_shape): Return Lispy number.
Kenichi Handa <handa@m17n.org>
parents:
91604
diff
changeset
|
1939 return make_number (0); |
96561
d7b47f09b693
(struct ftfont_info): New member index, delete member
Kenichi Handa <handa@m17n.org>
parents:
96429
diff
changeset
|
1940 return ftfont_shape_by_flt (lgstring, font, ftfont_info->ft_size->face, otf); |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1941 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1942 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1943 #endif /* HAVE_M17N_FLT */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1944 #endif /* HAVE_LIBOTF */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1945 |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1946 Lisp_Object |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1947 ftfont_font_format (FcPattern *pattern, Lisp_Object filename) |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1948 { |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1949 FcChar8 *str; |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1950 |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1951 #ifdef FC_FONTFORMAT |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1952 if (pattern) |
95433
3ffecc48d809
(ftfont_font_format): Don't use strcasestr.
Kenichi Handa <handa@m17n.org>
parents:
95358
diff
changeset
|
1953 { |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1954 if (FcPatternGetString (pattern, FC_FONTFORMAT, 0, &str) != FcResultMatch) |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1955 return Qnil; |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1956 if (strcmp ((char *) str, "TrueType") == 0) |
95433
3ffecc48d809
(ftfont_font_format): Don't use strcasestr.
Kenichi Handa <handa@m17n.org>
parents:
95358
diff
changeset
|
1957 return intern ("truetype"); |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1958 if (strcmp ((char *) str, "Type 1") == 0) |
95433
3ffecc48d809
(ftfont_font_format): Don't use strcasestr.
Kenichi Handa <handa@m17n.org>
parents:
95358
diff
changeset
|
1959 return intern ("type1"); |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1960 if (strcmp ((char *) str, "PCF") == 0) |
95433
3ffecc48d809
(ftfont_font_format): Don't use strcasestr.
Kenichi Handa <handa@m17n.org>
parents:
95358
diff
changeset
|
1961 return intern ("pcf"); |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1962 if (strcmp ((char *) str, "BDF") == 0) |
95433
3ffecc48d809
(ftfont_font_format): Don't use strcasestr.
Kenichi Handa <handa@m17n.org>
parents:
95358
diff
changeset
|
1963 return intern ("bdf"); |
3ffecc48d809
(ftfont_font_format): Don't use strcasestr.
Kenichi Handa <handa@m17n.org>
parents:
95358
diff
changeset
|
1964 } |
96429
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1965 #endif /* FC_FONTFORMAT */ |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1966 if (STRINGP (filename)) |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1967 { |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1968 int len = SBYTES (filename); |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1969 |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1970 if (len >= 4) |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1971 { |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1972 str = (FcChar8 *) (SDATA (filename) + len - 4); |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1973 if (xstrcasecmp ((char *) str, ".ttf") == 0) |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1974 return intern ("truetype"); |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1975 if (xstrcasecmp ((char *) str, ".pfb") == 0) |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1976 return intern ("type1"); |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1977 if (xstrcasecmp ((char *) str, ".pcf") == 0) |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1978 return intern ("pcf"); |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1979 if (xstrcasecmp ((char *) str, ".bdf") == 0) |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1980 return intern ("bdf"); |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1981 } |
5ee216cdf0e3
(fc_charset_table): New member lang.
Kenichi Handa <handa@m17n.org>
parents:
96076
diff
changeset
|
1982 } |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1983 return intern ("unknown"); |
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1984 } |
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1985 |
90400 | 1986 |
1987 void | |
1988 syms_of_ftfont () | |
1989 { | |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1990 DEFSYM (Qfreetype, "freetype"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1991 DEFSYM (Qmonospace, "monospace"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1992 DEFSYM (Qsans_serif, "sans-serif"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1993 DEFSYM (Qserif, "serif"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1994 DEFSYM (Qmono, "mono"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1995 DEFSYM (Qsans, "sans"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1996 DEFSYM (Qsans__serif, "sans serif"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1997 |
90400 | 1998 staticpro (&freetype_font_cache); |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
1999 freetype_font_cache = Fcons (Qt, Qnil); |
90400 | 2000 |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
2001 staticpro (&ftfont_generic_family_list); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
2002 ftfont_generic_family_list |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
2003 = Fcons (Fcons (Qmonospace, Qt), |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
2004 Fcons (Fcons (Qsans_serif, Qt), |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
2005 Fcons (Fcons (Qsans, Qt), Qnil))); |
90400 | 2006 |
95103 | 2007 staticpro (&ft_face_cache); |
2008 ft_face_cache = Qnil; | |
2009 | |
90400 | 2010 ftfont_driver.type = Qfreetype; |
2011 register_font_driver (&ftfont_driver, NULL); | |
2012 } | |
90427 | 2013 |
2014 /* arch-tag: 7cfa432c-33a6-4988-83d2-a82ed8604aca | |
2015 (do not change this comment) */ |