Mercurial > emacs
annotate src/ftfont.c @ 95237:5cc8ce4fcafc
Spelling fix.
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Fri, 23 May 2008 04:40:19 +0000 |
parents | 38cbd89dd626 |
children | 9c54d4f00cf6 |
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" | |
35 #include "fontset.h" | |
36 #include "font.h" | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
37 #include "ftfont.h" |
90400 | 38 |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
39 /* Symbolic type of this font-driver. */ |
90400 | 40 Lisp_Object Qfreetype; |
41 | |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
42 /* Fontconfig's generic families and their aliases. */ |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
43 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
|
44 |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
45 /* Flag to tell if FcInit is areadly called or not. */ |
90400 | 46 static int fc_initialized; |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
47 |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
48 /* Handle to a FreeType library instance. */ |
90400 | 49 static FT_Library ft_library; |
50 | |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
51 /* Cache for FreeType fonts. */ |
90400 | 52 static Lisp_Object freetype_font_cache; |
53 | |
95103 | 54 /* Cache for FT_Face */ |
55 static Lisp_Object ft_face_cache; | |
90400 | 56 |
57 /* The actual structure for FreeType font that can be casted to struct | |
58 font. */ | |
59 | |
60 struct ftfont_info | |
61 { | |
62 struct font font; | |
63 FT_Size ft_size; | |
95103 | 64 int fc_charset_idx; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
65 #ifdef HAVE_LIBOTF |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
66 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
|
67 OTF *otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
68 #endif /* HAVE_LIBOTF */ |
90400 | 69 }; |
70 | |
95103 | 71 static Lisp_Object ftfont_pattern_entity P_ ((FcPattern *, Lisp_Object, int)); |
72 | |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
73 static Lisp_Object ftfont_resolve_generic_family P_ ((Lisp_Object)); |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
74 Lisp_Object ftfont_font_format P_ ((FcPattern *)); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
75 |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
76 #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
|
77 |
95103 | 78 static struct |
90400 | 79 { |
95103 | 80 /* charset name */ |
81 char *name; | |
82 /* characters to distinguish the charset from the others */ | |
83 int uniquifier[6]; | |
84 /* set in syms_of_ftfont */ | |
85 int charset_id; | |
86 /* set on demand */ | |
87 FcCharSet *fc_charset; | |
88 } fc_charset_table[] = | |
89 { { "iso-8859-1", { 0x00A0, 0x00A1, 0x00B4, 0x00BC, 0x00D0 }, -1 }, | |
90 { "iso-8859-2", { 0x00A0, 0x010E }}, | |
91 { "iso-8859-3", { 0x00A0, 0x0108 }}, | |
92 { "iso-8859-4", { 0x00A0, 0x00AF, 0x0128, 0x0156, 0x02C7 }}, | |
93 { "iso-8859-5", { 0x00A0, 0x0401 }}, | |
94 { "iso-8859-6", { 0x00A0, 0x060C }}, | |
95 { "iso-8859-7", { 0x00A0, 0x0384 }}, | |
96 { "iso-8859-8", { 0x00A0, 0x05D0 }}, | |
97 { "iso-8859-9", { 0x00A0, 0x00A1, 0x00BC, 0x011E }}, | |
98 { "iso-8859-10", { 0x00A0, 0x00D0, 0x0128, 0x2015 }}, | |
99 { "iso-8859-11", { 0x00A0, 0x0E01 }}, | |
100 { "iso-8859-13", { 0x00A0, 0x201C }}, | |
101 { "iso-8859-14", { 0x00A0, 0x0174 }}, | |
102 { "iso-8859-15", { 0x00A0, 0x00A1, 0x00D0, 0x0152 }}, | |
103 { "iso-8859-16", { 0x00A0, 0x0218}}, | |
104 { "chinese-gb2312", { 0x4E13 }}, | |
105 { "big5", { 0xF6B1 }}, | |
106 { "japanese-jisx0208", { 0x4E55 }}, | |
107 { "korean-ksc5601", { 0xAC00 }}, | |
108 { "chinese-cns11643-1", { 0xFE32 }}, | |
109 { "chinese-cns11643-2", { 0x4E33, 0x7934 }}, | |
110 { "chinese-cns11643-3", { 0x201A9 }}, | |
111 { "chinese-cns11643-4", { 0x20057 }}, | |
112 { "chinese-cns11643-5", { 0x20000 }}, | |
113 { "chinese-cns11643-6", { 0x20003 }}, | |
114 { "chinese-cns11643-7", { 0x20055 }}, | |
115 { "chinese-gbk", { 0x4E06 }}, | |
116 { "japanese-jisx0212", { 0x4E44 }}, | |
117 { "japanese-jisx0213-1", { 0xFA10 }}, | |
118 { "japanese-jisx0213-2", { 0xFA49 }}, | |
119 { "japanese-jisx0213.2004-1", { 0x20B9F }}, | |
120 { "viscii", { 0x1EA0, 0x1EAE, 0x1ED2 }}, | |
121 { "tis620", { 0x0E01 }}, | |
122 { "windows-1251", { 0x0401, 0x0490 }}, | |
123 { "koi8-r", { 0x0401, 0x2219 }}, | |
124 { "mule-lao", { 0x0E81 }}, | |
125 { NULL } | |
126 }; | |
90400 | 127 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
128 extern Lisp_Object Qc, Qm, Qp, Qd; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
129 |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
130 static Lisp_Object |
95103 | 131 ftfont_pattern_entity (p, registry, fc_charset_idx) |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
132 FcPattern *p; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
133 Lisp_Object registry; |
95103 | 134 int fc_charset_idx; |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
135 { |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
136 Lisp_Object entity; |
95103 | 137 char *file, *str; |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
138 int numeric; |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
139 double dbl; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
140 FcBool b; |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
141 |
95103 | 142 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
|
143 return Qnil; |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
144 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
145 entity = font_make_entity (); |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
146 |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
147 ASET (entity, FONT_TYPE_INDEX, Qfreetype); |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
148 ASET (entity, FONT_REGISTRY_INDEX, registry); |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
149 |
95103 | 150 if (FcPatternGetString (p, FC_FOUNDRY, 0, (FcChar8 **) &str) == FcResultMatch) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
151 ASET (entity, FONT_FOUNDRY_INDEX, font_intern_prop (str, strlen (str))); |
95103 | 152 if (FcPatternGetString (p, FC_FAMILY, 0, (FcChar8 **) &str) == FcResultMatch) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
153 ASET (entity, FONT_FAMILY_INDEX, font_intern_prop (str, strlen (str))); |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
154 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
|
155 { |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
156 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
|
157 numeric = FC_WEIGHT_MEDIUM; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
158 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
|
159 } |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
160 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
|
161 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
162 numeric += 100; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
163 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
|
164 } |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
165 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
|
166 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
167 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
|
168 } |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
169 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
|
170 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
|
171 else |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
172 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
|
173 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
|
174 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
|
175 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
|
176 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
177 int dpi = dbl; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
178 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
|
179 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
180 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
|
181 && b == FcTrue) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
182 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
|
183 |
95103 | 184 font_put_extra (entity, QCfont_entity, |
185 Fcons (make_unibyte_string ((char *) file, | |
186 strlen ((char *) file)), | |
187 make_number (fc_charset_idx))); | |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
188 return entity; |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
189 } |
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
190 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
191 |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
192 static Lisp_Object ftfont_generic_family_list; |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
193 |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
194 static Lisp_Object |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
195 ftfont_resolve_generic_family (family) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
196 Lisp_Object family; |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
197 { |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
198 Lisp_Object slot; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
199 FcPattern *pattern = NULL, *match; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
200 FcResult result; |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
201 |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
202 family = Fintern (Fdowncase (SYMBOL_NAME (family)), Qnil); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
203 if (EQ (family, Qmono)) |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
204 family = Qmonospace; |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
205 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
|
206 family = Qsans_serif; |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
207 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
|
208 if (! CONSP (slot)) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
209 return Qnil; |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
210 if (! EQ (XCDR (slot), Qt)) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
211 return XCDR (slot); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
212 pattern = FcPatternBuild (NULL, FC_FAMILY, FcTypeString, |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
213 SYMBOL_FcChar8 (family), (char *) 0); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
214 if (! pattern) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
215 goto err; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
216 FcConfigSubstitute (NULL, pattern, FcMatchPattern); |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
217 FcDefaultSubstitute (pattern); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
218 match = FcFontMatch (NULL, pattern, &result); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
219 if (match) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
220 { |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
221 FcChar8 *fam; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
222 |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
223 if (FcPatternGetString (match, FC_FAMILY, 0, &fam) == FcResultMatch) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
224 family = intern ((char *) fam); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
225 } |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
226 else |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
227 family = Qnil; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
228 XSETCDR (slot, family); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
229 err: |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
230 if (match) FcPatternDestroy (match); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
231 if (pattern) FcPatternDestroy (pattern); |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
232 return family; |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
233 } |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
234 |
95103 | 235 Lisp_Object |
236 ftfont_lookup_cache (filename) | |
237 Lisp_Object filename; | |
238 { | |
239 Lisp_Object cache, val; | |
240 | |
241 cache = assoc_no_quit (filename, ft_face_cache); | |
242 if (NILP (cache)) | |
243 { | |
244 val = make_save_value (NULL, 0); | |
245 cache = Fcons (filename, val); | |
246 ft_face_cache = Fcons (cache, ft_face_cache); | |
247 } | |
248 else | |
249 val = XCDR (cache); | |
250 if (! XSAVE_VALUE (val)->pointer) | |
251 { | |
252 FT_Face ft_face; | |
253 | |
254 if (! ft_library | |
255 && FT_Init_FreeType (&ft_library) != 0) | |
256 return Qnil; | |
257 if (FT_New_Face (ft_library, (char *) SDATA (filename), 0, &ft_face) != 0) | |
258 return Qnil; | |
259 XSAVE_VALUE (val)->pointer = ft_face; | |
260 } | |
261 return cache; | |
262 } | |
263 | |
91249
4f21471103e6
(ftfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents:
91214
diff
changeset
|
264 static Lisp_Object ftfont_get_cache P_ ((FRAME_PTR)); |
90400 | 265 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
|
266 static Lisp_Object ftfont_match P_ ((Lisp_Object, Lisp_Object)); |
90400 | 267 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
|
268 static Lisp_Object ftfont_open P_ ((FRAME_PTR, Lisp_Object, int)); |
90400 | 269 static void ftfont_close P_ ((FRAME_PTR, struct font *)); |
270 static int ftfont_has_char P_ ((Lisp_Object, int)); | |
271 static unsigned ftfont_encode_char P_ ((struct font *, int)); | |
272 static int ftfont_text_extents P_ ((struct font *, unsigned *, int, | |
273 struct font_metrics *)); | |
274 static int ftfont_get_bitmap P_ ((struct font *, unsigned, | |
275 struct font_bitmap *, int)); | |
276 static int ftfont_anchor_point P_ ((struct font *, unsigned, int, | |
277 int *, int *)); | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
278 static Lisp_Object ftfont_shape P_ ((Lisp_Object)); |
90400 | 279 |
280 struct font_driver ftfont_driver = | |
281 { | |
90697
444b40002533
(ftfont_driver): Initialize ftfont_driver.type by 0.
Kenichi Handa <handa@m17n.org>
parents:
90680
diff
changeset
|
282 0, /* Qfreetype */ |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
283 0, /* case insensitive */ |
90400 | 284 ftfont_get_cache, |
285 ftfont_list, | |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
286 ftfont_match, |
90400 | 287 ftfont_list_family, |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
288 NULL, |
90400 | 289 ftfont_open, |
290 ftfont_close, | |
291 /* We can't draw a text without device dependent functions. */ | |
292 NULL, | |
293 NULL, | |
294 ftfont_has_char, | |
295 ftfont_encode_char, | |
296 ftfont_text_extents, | |
297 /* We can't draw a text without device dependent functions. */ | |
298 NULL, | |
299 ftfont_get_bitmap, | |
300 NULL, | |
301 NULL, | |
302 NULL, | |
303 ftfont_anchor_point, | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
304 NULL, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
305 NULL, |
90400 | 306 NULL, |
307 NULL, | |
91308
9b6270bcd1a7
(ftfont_driver): Set ftfont_shape in ftfont_driver only
Kenichi Handa <handa@m17n.org>
parents:
91294
diff
changeset
|
308 #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
|
309 ftfont_shape |
91308
9b6270bcd1a7
(ftfont_driver): Set ftfont_shape in ftfont_driver only
Kenichi Handa <handa@m17n.org>
parents:
91294
diff
changeset
|
310 #else /* not (HAVE_M17N_FLT && HAVE_LIBOTF) */ |
90400 | 311 NULL |
91308
9b6270bcd1a7
(ftfont_driver): Set ftfont_shape in ftfont_driver only
Kenichi Handa <handa@m17n.org>
parents:
91294
diff
changeset
|
312 #endif /* not (HAVE_M17N_FLT && HAVE_LIBOTF) */ |
90400 | 313 }; |
314 | |
315 extern Lisp_Object QCname; | |
316 | |
317 static Lisp_Object | |
91249
4f21471103e6
(ftfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents:
91214
diff
changeset
|
318 ftfont_get_cache (f) |
4f21471103e6
(ftfont_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents:
91214
diff
changeset
|
319 FRAME_PTR f; |
90400 | 320 { |
321 return freetype_font_cache; | |
322 } | |
323 | |
95103 | 324 static int |
325 ftfont_get_charset (registry) | |
326 Lisp_Object registry; | |
327 { | |
328 struct charset *encoding; | |
329 int i, j; | |
330 | |
331 if (font_registry_charsets (registry, &encoding, NULL) < 0) | |
332 return -1; | |
333 if (fc_charset_table[0].charset_id < 0) | |
334 /* Setup charset_id field of all elements. */ | |
335 for (i = 0; fc_charset_table[i].name; i++) | |
336 { | |
337 Lisp_Object sym = intern (fc_charset_table[i].name); | |
338 | |
339 if (CHARSETP (sym)) | |
340 fc_charset_table[i].charset_id = XINT (CHARSET_SYMBOL_ID (sym)); | |
341 else | |
342 fc_charset_table[i].charset_id = -1; | |
343 } | |
344 | |
345 for (i = 0; fc_charset_table[i].name; i++) | |
346 if (encoding->id == fc_charset_table[i].charset_id) | |
347 break; | |
348 if (! fc_charset_table[i].name) | |
349 return -1; | |
350 if (! fc_charset_table[i].fc_charset) | |
351 { | |
352 FcCharSet *charset = FcCharSetCreate (); | |
353 int *uniquifier = fc_charset_table[i].uniquifier; | |
354 | |
355 if (! charset) | |
356 return -1; | |
357 for (j = 0; uniquifier[j]; j++) | |
358 if (! FcCharSetAddChar (charset, uniquifier[j])) | |
359 { | |
360 FcCharSetDestroy (charset); | |
361 return -1; | |
362 } | |
363 fc_charset_table[i].fc_charset = charset; | |
364 } | |
365 return i; | |
366 } | |
367 | |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
368 struct OpenTypeSpec |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
369 { |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
370 Lisp_Object script; |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
371 unsigned int script_tag, langsys_tag; |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
372 int nfeatures[2]; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
373 unsigned int *features[2]; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
374 }; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
375 |
91191
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
376 #define OTF_SYM_TAG(SYM, TAG) \ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
377 do { \ |
91191
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
378 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
|
379 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
|
380 } while (0) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
381 |
91191
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
382 #define OTF_TAG_STR(TAG, P) \ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
383 do { \ |
91191
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
384 (P)[0] = (char) (TAG >> 24); \ |
5bce041b93dc
(OTF_SYM_TAG, OTF_TAG_STR): Fix argument names.
Kenichi Handa <handa@m17n.org>
parents:
91189
diff
changeset
|
385 (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
|
386 (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
|
387 (P)[3] = (char) (TAG & 0xFF); \ |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
388 (P)[4] = '\0'; \ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
389 } while (0) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
390 |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
391 static struct OpenTypeSpec * |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
392 ftfont_get_open_type_spec (Lisp_Object otf_spec) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
393 { |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
394 struct OpenTypeSpec *spec = malloc (sizeof (struct OpenTypeSpec)); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
395 Lisp_Object val; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
396 int i, j, negative; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
397 |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
398 if (! spec) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
399 return NULL; |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
400 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
|
401 if (! NILP (spec->script)) |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
402 { |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
403 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
|
404 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
|
405 if (CONSP (val) && SYMBOLP (XCDR (val))) |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
406 spec->script = XCDR (val); |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
407 else |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
408 spec->script = Qnil; |
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
409 } |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
410 else |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
411 spec->script_tag = 0x44464C54; /* "DFLT" */ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
412 otf_spec = XCDR (otf_spec); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
413 val = XCAR (otf_spec); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
414 if (! NILP (val)) |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
415 OTF_SYM_TAG (val, spec->langsys_tag); |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
416 else |
91214
998b9da240f0
(struct OpenTypeSpec): Members script_tag renamed to
Kenichi Handa <handa@m17n.org>
parents:
91191
diff
changeset
|
417 spec->langsys_tag = 0; |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
418 spec->nfeatures[0] = spec->nfeatures[1] = 0; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
419 for (i = 0; i < 2; i++) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
420 { |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
421 Lisp_Object len; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
422 |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
423 otf_spec = XCDR (otf_spec); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
424 if (NILP (otf_spec)) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
425 break; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
426 val = XCAR (otf_spec); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
427 if (NILP (val)) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
428 continue; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
429 len = Flength (val); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
430 spec->features[i] = malloc (sizeof (int) * XINT (len)); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
431 if (! spec->features[i]) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
432 { |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
433 if (i > 0 && spec->features[0]) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
434 free (spec->features[0]); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
435 free (spec); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
436 return NULL; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
437 } |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
438 for (j = 0, negative = 0; CONSP (val); val = XCDR (val)) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
439 { |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
440 if (NILP (XCAR (val))) |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
441 negative = 1; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
442 else |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
443 { |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
444 unsigned int tag; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
445 |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
446 OTF_SYM_TAG (XCAR (val), tag); |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
447 spec->features[i][j++] = negative ? tag & 0x80000000 : tag; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
448 } |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
449 } |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
450 spec->nfeatures[i] = j; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
451 } |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
452 return spec; |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
453 } |
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
454 |
95103 | 455 static FcPattern *ftfont_spec_pattern P_ ((Lisp_Object, int *, char *, |
456 struct OpenTypeSpec **)); | |
457 | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
458 static FcPattern * |
95103 | 459 ftfont_spec_pattern (spec, fc_charset_idx, otlayout, otspec) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
460 Lisp_Object spec; |
95103 | 461 int *fc_charset_idx; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
462 char *otlayout; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
463 struct OpenTypeSpec **otspec; |
90400 | 464 { |
95103 | 465 Lisp_Object tmp, extra; |
90400 | 466 FcPattern *pattern = NULL; |
467 FcCharSet *charset = NULL; | |
468 FcLangSet *langset = NULL; | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
469 int n; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
470 int dpi = -1; |
90500
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
471 int spacing = -1; |
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
472 int scalable = -1; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
473 Lisp_Object name = Qnil; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
474 Lisp_Object script = Qnil; |
95103 | 475 Lisp_Object registry; |
90400 | 476 |
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
477 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
|
478 && 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
|
479 /* Fontconfig doesn't support adstyle property. */ |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
480 return NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
481 if ((n = FONT_SLANT_NUMERIC (spec)) >= 0 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
482 && n < 100) |
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
483 /* 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
|
484 return NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
485 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
486 if (INTEGERP (AREF (spec, FONT_DPI_INDEX))) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
487 dpi = XINT (AREF (spec, FONT_DPI_INDEX)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
488 if (INTEGERP (AREF (spec, FONT_SPACING_INDEX))) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
489 spacing = XINT (AREF (spec, FONT_SPACING_INDEX)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
490 if (INTEGERP (AREF (spec, FONT_AVGWIDTH_INDEX)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
491 && XINT (AREF (spec, FONT_AVGWIDTH_INDEX)) == 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
492 scalable = 1; |
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
493 |
95103 | 494 registry = AREF (spec, FONT_REGISTRY_INDEX); |
495 if (NILP (registry) | |
496 || EQ (registry, Qiso10646_1) | |
497 || EQ (registry, Qunicode_bmp) | |
498 || EQ (registry, Qunicode_sip)) | |
499 *fc_charset_idx = -1; | |
500 else | |
90400 | 501 { |
95103 | 502 *fc_charset_idx = ftfont_get_charset (registry); |
503 if (*fc_charset_idx < 0) | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
504 return NULL; |
95103 | 505 charset = fc_charset_table[*fc_charset_idx].fc_charset; |
90400 | 506 } |
507 | |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
508 otlayout[0] = '\0'; |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
509 for (extra = AREF (spec, FONT_EXTRA_INDEX); |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
510 CONSP (extra); extra = XCDR (extra)) |
90400 | 511 { |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
512 Lisp_Object key, val; |
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
513 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
514 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
|
515 if (EQ (key, QCdpi)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
516 dpi = XINT (val); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
517 else if (EQ (key, QCfc_unknown_spec)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
518 name = val; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
519 else if (EQ (key, QClang)) |
90400 | 520 { |
521 langset = FcLangSetCreate (); | |
522 if (! langset) | |
523 goto err; | |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
524 if (SYMBOLP (val)) |
90400 | 525 { |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
526 if (! FcLangSetAdd (langset, SYMBOL_FcChar8 (val))) |
90400 | 527 goto err; |
528 } | |
529 else | |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
530 for (; CONSP (val); val = XCDR (val)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
531 if (SYMBOLP (XCAR (val)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
532 && ! FcLangSetAdd (langset, SYMBOL_FcChar8 (XCAR (val)))) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
533 goto err; |
90400 | 534 } |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
535 else if (EQ (key, QCname)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
536 name = val; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
537 else if (EQ (key, QCotf)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
538 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
539 *otspec = ftfont_get_open_type_spec (val); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
540 if (! *otspec) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
541 return NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
542 strcat (otlayout, "otlayout:"); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
543 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
|
544 script = (*otspec)->script; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
545 } |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
546 else if (EQ (key, QCscript)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
547 script = val; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
548 else if (EQ (key, QCscalable)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
549 scalable = ! NILP (val); |
90400 | 550 } |
551 | |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
552 if (! NILP (script) && ! charset) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
553 { |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
554 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
|
555 |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
556 if (CONSP (chars)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
557 { |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
558 charset = FcCharSetCreate (); |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
559 if (! charset) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
560 goto err; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
561 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
|
562 if (CHARACTERP (XCAR (chars)) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
563 && ! FcCharSetAddChar (charset, XUINT (XCAR (chars)))) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
564 goto err; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
565 } |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
566 } |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
567 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
568 pattern = NILP (name) ? FcPatternCreate () : FcNameParse (SDATA (name)); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
569 if (! pattern) |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
570 goto err; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
571 FcPatternDel (pattern, FC_SIZE); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
572 FcPatternDel (pattern, FC_PIXEL_SIZE); |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
573 FcPatternDel (pattern, FC_FOUNDRY); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
574 FcPatternDel (pattern, FC_FAMILY); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
575 tmp = AREF (spec, FONT_FOUNDRY_INDEX); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
576 if (! NILP (tmp) |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
577 && ! FcPatternAddString (pattern, FC_FOUNDRY, SYMBOL_FcChar8 (tmp))) |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
578 goto err; |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
579 tmp = AREF (spec, FONT_FAMILY_INDEX); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
580 if (! NILP (tmp) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
581 && ! FcPatternAddString (pattern, FC_FAMILY, SYMBOL_FcChar8 (tmp))) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
582 goto err; |
90400 | 583 if (charset |
584 && ! FcPatternAddCharSet (pattern, FC_CHARSET, charset)) | |
585 goto err; | |
586 if (langset | |
587 && ! FcPatternAddLangSet (pattern, FC_LANG, langset)) | |
588 goto err; | |
90500
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
589 if (dpi >= 0 |
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
590 && ! FcPatternAddDouble (pattern, FC_DPI, dpi)) |
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
591 goto err; |
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
592 if (spacing >= 0 |
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
593 && ! FcPatternAddInteger (pattern, FC_SPACING, spacing)) |
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
594 goto err; |
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
595 if (scalable >= 0 |
90522 | 596 && ! 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
|
597 goto err; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
598 goto finish; |
90400 | 599 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
600 err: |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
601 /* 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
|
602 (usually insufficient memory). */ |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
603 if (pattern) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
604 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
605 FcPatternDestroy (pattern); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
606 pattern = NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
607 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
608 if (*otspec) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
609 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
610 if ((*otspec)->nfeatures[0] > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
611 free ((*otspec)->features[0]); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
612 if ((*otspec)->nfeatures[1] > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
613 free ((*otspec)->features[1]); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
614 free (*otspec); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
615 *otspec = NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
616 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
617 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
618 finish: |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
619 if (langset) FcLangSetDestroy (langset); |
95229
38cbd89dd626
(ftfont_spec_pattern): Free charset if necessary.
Kenichi Handa <handa@m17n.org>
parents:
95182
diff
changeset
|
620 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
|
621 return pattern; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
622 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
623 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
624 static Lisp_Object |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
625 ftfont_list (frame, spec) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
626 Lisp_Object frame, spec; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
627 { |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
628 Lisp_Object val = Qnil, registry, family; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
629 int i; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
630 FcPattern *pattern; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
631 FcFontSet *fontset = NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
632 FcObjectSet *objset = NULL; |
95103 | 633 int fc_charset_idx; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
634 char otlayout[15]; /* For "otlayout:XXXX" */ |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
635 struct OpenTypeSpec *otspec = NULL; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
636 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
637 if (! fc_initialized) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
638 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
639 FcInit (); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
640 fc_initialized = 1; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
641 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
642 |
95103 | 643 pattern = ftfont_spec_pattern (spec, &fc_charset_idx, otlayout, &otspec); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
644 if (! pattern) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
645 return Qnil; |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
646 registry = AREF (spec, FONT_REGISTRY_INDEX); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
647 family = AREF (spec, FONT_FAMILY_INDEX); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
648 if (! NILP (family)) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
649 { |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
650 Lisp_Object resolved; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
651 |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
652 resolved = ftfont_resolve_generic_family (family); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
653 if (! NILP (resolved)) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
654 { |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
655 FcPatternDel (pattern, FC_FAMILY); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
656 if (! FcPatternAddString (pattern, FC_FAMILY, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
657 SYMBOL_FcChar8 (resolved))) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
658 goto err; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
659 } |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
660 } |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
661 |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
662 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
|
663 FC_WIDTH, FC_PIXEL_SIZE, FC_SPACING, FC_SCALABLE, |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
664 FC_CHARSET, FC_FILE, |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
665 #ifdef FC_CAPABILITY |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
666 FC_CAPABILITY, |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
667 #endif /* FC_CAPABILITY */ |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
668 NULL); |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
669 if (! objset) |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
670 goto err; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
671 |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
672 fontset = FcFontList (NULL, pattern, objset); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
673 if (! fontset) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
674 goto err; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
675 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
|
676 { |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
677 Lisp_Object entity; |
90474
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
678 |
90516
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
679 #ifdef FC_CAPABILITY |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
680 if (otlayout[0]) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
681 { |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
682 FcChar8 *this; |
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
683 |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
684 if (FcPatternGetString (fontset->fonts[i], FC_CAPABILITY, 0, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
685 &this) != FcResultMatch |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
686 || ! strstr ((char *) this, otlayout)) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
687 continue; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
688 } |
90516
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
689 #endif /* FC_CAPABILITY */ |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
690 #ifdef HAVE_LIBOTF |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
691 if (otspec) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
692 { |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
693 FcChar8 *file; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
694 OTF *otf; |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
695 |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
696 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
|
697 != FcResultMatch) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
698 continue; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
699 otf = OTF_open ((char *) file); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
700 if (! otf) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
701 continue; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
702 if (OTF_check_features (otf, 1, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
703 otspec->script_tag, otspec->langsys_tag, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
704 otspec->features[0], |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
705 otspec->nfeatures[0]) != 1 |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
706 || OTF_check_features (otf, 0, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
707 otspec->script_tag, otspec->langsys_tag, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
708 otspec->features[1], |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
709 otspec->nfeatures[1]) != 1) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
710 continue; |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
711 } |
91187
96e18e1645a1
(struct OpenTypeSpec): New struct.
Kenichi Handa <handa@m17n.org>
parents:
91162
diff
changeset
|
712 #endif /* HAVE_LIBOTF */ |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
713 entity = ftfont_pattern_entity (fontset->fonts[i], registry, |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
714 fc_charset_idx); |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
715 if (! NILP (entity)) |
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
716 val = Fcons (entity, val); |
90400 | 717 } |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
718 font_add_log ("ftfont-list", spec, val); |
90400 | 719 goto finish; |
720 | |
721 err: | |
722 /* 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
|
723 (usually insufficient memory). */ |
90400 | 724 val = Qnil; |
725 | |
726 finish: | |
727 if (objset) FcObjectSetDestroy (objset); | |
728 if (fontset) FcFontSetDestroy (fontset); | |
729 if (pattern) FcPatternDestroy (pattern); | |
730 return val; | |
731 } | |
732 | |
733 static Lisp_Object | |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
734 ftfont_match (frame, spec) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
735 Lisp_Object frame, spec; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
736 { |
95103 | 737 Lisp_Object entity; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
738 FcPattern *pattern, *match = NULL; |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
739 FcResult result; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
740 char otlayout[15]; /* For "otlayout:XXXX" */ |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
741 struct OpenTypeSpec *otspec = NULL; |
95103 | 742 int fc_charset_idx; |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
743 |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
744 if (! fc_initialized) |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
745 { |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
746 FcInit (); |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
747 fc_initialized = 1; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
748 } |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
749 |
95103 | 750 pattern = ftfont_spec_pattern (spec, &fc_charset_idx, otlayout, &otspec); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
751 if (! pattern) |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
752 return Qnil; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
753 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
754 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
|
755 { |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
756 FcValue value; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
757 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
758 value.type = FcTypeDouble; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
759 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
|
760 FcPatternAdd (pattern, FC_PIXEL_SIZE, value, FcFalse); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
761 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
762 if (FcConfigSubstitute (NULL, pattern, FcMatchPattern) == FcTrue) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
763 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
764 FcDefaultSubstitute (pattern); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
765 match = FcFontMatch (NULL, pattern, &result); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
766 if (match) |
92301
c10a8c811515
(ftfont_match): Explicitly set pixelsize in pattern.
Kenichi Handa <handa@m17n.org>
parents:
91870
diff
changeset
|
767 { |
95103 | 768 entity = ftfont_pattern_entity (match, Qunicode_bmp, fc_charset_idx); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
769 FcPatternDestroy (match); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
770 if (! NILP (AREF (spec, FONT_FAMILY_INDEX)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
771 && 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
|
772 ftfont_generic_family_list)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
773 && 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
|
774 AREF (entity, FONT_FAMILY_INDEX)))) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
775 entity = Qnil; |
92301
c10a8c811515
(ftfont_match): Explicitly set pixelsize in pattern.
Kenichi Handa <handa@m17n.org>
parents:
91870
diff
changeset
|
776 } |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
777 } |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
778 FcPatternDestroy (pattern); |
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
779 |
95182
06ff64b07841
(ftfont_resolve_generic_family): Renamed from
Kenichi Handa <handa@m17n.org>
parents:
95103
diff
changeset
|
780 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
|
781 return entity; |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
782 } |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
783 |
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
784 static Lisp_Object |
90400 | 785 ftfont_list_family (frame) |
786 Lisp_Object frame; | |
787 { | |
788 Lisp_Object list; | |
789 FcPattern *pattern = NULL; | |
790 FcFontSet *fontset = NULL; | |
791 FcObjectSet *objset = NULL; | |
792 int i; | |
793 | |
794 if (! fc_initialized) | |
795 { | |
796 FcInit (); | |
797 fc_initialized = 1; | |
798 } | |
799 | |
800 pattern = FcPatternCreate (); | |
801 if (! pattern) | |
802 goto finish; | |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
803 objset = FcObjectSetBuild (FC_FAMILY, NULL); |
90400 | 804 if (! objset) |
805 goto finish; | |
806 fontset = FcFontList (NULL, pattern, objset); | |
807 if (! fontset) | |
808 goto finish; | |
809 | |
810 list = Qnil; | |
811 for (i = 0; i < fontset->nfont; i++) | |
812 { | |
813 FcPattern *pat = fontset->fonts[i]; | |
814 FcChar8 *str; | |
815 | |
816 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
|
817 list = Fcons (intern ((char *) str), list); |
90400 | 818 } |
819 | |
820 finish: | |
821 if (objset) FcObjectSetDestroy (objset); | |
822 if (fontset) FcFontSetDestroy (fontset); | |
823 if (pattern) FcPatternDestroy (pattern); | |
824 | |
825 return list; | |
826 } | |
827 | |
828 | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
829 static Lisp_Object |
90400 | 830 ftfont_open (f, entity, pixel_size) |
831 FRAME_PTR f; | |
832 Lisp_Object entity; | |
833 int pixel_size; | |
834 { | |
835 struct ftfont_info *ftfont_info; | |
836 struct font *font; | |
837 FT_Face ft_face; | |
838 FT_Size ft_size; | |
839 FT_UInt size; | |
95103 | 840 Lisp_Object val, filename, cache, font_object; |
841 int fc_charset_idx; | |
90400 | 842 FcPattern *pattern; |
95103 | 843 int scalable; |
90400 | 844 int spacing; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
845 char name[256]; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
846 int i, len; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
847 int upEM; |
90400 | 848 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
849 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
|
850 if (! CONSP (val)) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
851 return Qnil; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
852 val = XCDR (val); |
95103 | 853 filename = XCAR (val); |
854 fc_charset_idx = XINT (XCDR (val)); | |
855 cache = ftfont_lookup_cache (filename); | |
856 if (NILP (cache)) | |
857 return Qnil; | |
858 filename = XCAR (cache); | |
859 val = XCDR (cache); | |
860 ft_face = XSAVE_VALUE (val)->pointer; | |
861 if (XSAVE_VALUE (val)->integer > 0) | |
90400 | 862 { |
95103 | 863 /* FT_Face in this cache is already used by the different size. */ |
90400 | 864 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
|
865 return Qnil; |
90400 | 866 if (FT_Activate_Size (ft_size) != 0) |
867 { | |
868 FT_Done_Size (ft_size); | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
869 return Qnil; |
90400 | 870 } |
95103 | 871 } |
872 XSAVE_VALUE (val)->integer++; | |
90400 | 873 size = XINT (AREF (entity, FONT_SIZE_INDEX)); |
874 if (size == 0) | |
875 size = pixel_size; | |
876 if (FT_Set_Pixel_Sizes (ft_face, size, size) != 0) | |
877 { | |
878 if (XSAVE_VALUE (val)->integer == 0) | |
879 FT_Done_Face (ft_face); | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
880 return Qnil; |
90400 | 881 } |
882 | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
883 font_object = font_make_object (VECSIZE (struct ftfont_info)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
884 ASET (font_object, FONT_TYPE_INDEX, Qfreetype); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
885 for (i = 1;i < FONT_ENTITY_MAX; i++) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
886 ASET (font_object, i, AREF (entity, i)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
887 ASET (font_object, FONT_SIZE_INDEX, make_number (size)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
888 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
|
889 if (len > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
890 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
|
891 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
|
892 if (len > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
893 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
|
894 else |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
895 ASET (font_object, FONT_FULLNAME_INDEX, |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
896 AREF (font_object, FONT_NAME_INDEX)); |
95103 | 897 ASET (font_object, FONT_FILE_INDEX, filename); |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
898 ASET (font_object, FONT_FORMAT_INDEX, ftfont_font_format (pattern)); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
899 font = XFONT_OBJECT (font_object); |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
900 ftfont_info = (struct ftfont_info *) font; |
95103 | 901 ftfont_info->ft_size = ft_face->size; |
902 ftfont_info->fc_charset_idx = fc_charset_idx; | |
91162
2b263ef46651
(ftfont_open): Set members maybe_otf and otf of
Kenichi Handa <handa@m17n.org>
parents:
91137
diff
changeset
|
903 #ifdef HAVE_LIBOTF |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
904 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
|
905 ftfont_info->otf = NULL; |
91162
2b263ef46651
(ftfont_open): Set members maybe_otf and otf of
Kenichi Handa <handa@m17n.org>
parents:
91137
diff
changeset
|
906 #endif /* HAVE_LIBOTF */ |
90400 | 907 font->pixel_size = size; |
908 font->driver = &ftfont_driver; | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
909 font->encoding_charset = font->repertory_charset = -1; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
910 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
911 upEM = ft_face->units_per_EM; |
95103 | 912 scalable = (INTEGERP (AREF (entity, FONT_AVGWIDTH_INDEX)) |
913 && 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
|
914 if (scalable) |
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
915 { |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
916 font->ascent = ft_face->ascender * size / upEM; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
917 font->descent = - ft_face->descender * size / upEM; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
918 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
|
919 } |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
920 else |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
921 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
922 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
|
923 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
|
924 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
|
925 } |
95103 | 926 if (INTEGERP (AREF (entity, FONT_SPACING_INDEX))) |
927 spacing = XINT (AREF (entity, FONT_SPACING_INDEX)); | |
928 else | |
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
929 spacing = FC_PROPORTIONAL; |
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
930 if (spacing != FC_PROPORTIONAL) |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
931 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
|
932 = (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
|
933 : ft_face->size->metrics.max_advance >> 6); |
90400 | 934 else |
935 { | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
936 int n; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
937 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
938 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
|
939 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
|
940 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
|
941 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
942 int this_width = ft_face->glyph->metrics.horiAdvance >> 6; |
90400 | 943 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
944 if (this_width > 0 |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
945 && (! 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
|
946 font->min_width = this_width; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
947 if (i == 32) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
948 font->space_width = this_width; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
949 font->average_width += this_width; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
950 n++; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
951 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
952 if (n > 0) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
953 font->average_width /= n; |
90400 | 954 } |
955 | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
956 font->baseline_offset = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
957 font->relative_compose = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
958 font->default_ascent = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
959 font->vertical_centering = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
960 if (scalable) |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
961 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
962 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
|
963 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
|
964 } |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
965 else |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
966 { |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
967 font->underline_position = -1; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
968 font->underline_thickness = 0; |
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
969 } |
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
970 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
971 return font_object; |
90400 | 972 } |
973 | |
974 static void | |
975 ftfont_close (f, font) | |
976 FRAME_PTR f; | |
977 struct font *font; | |
978 { | |
979 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
95103 | 980 Lisp_Object val, cache; |
90400 | 981 |
95103 | 982 cache = ftfont_lookup_cache (font->props[FONT_FILE_INDEX]); |
983 val = XCDR (cache); | |
90400 | 984 (XSAVE_VALUE (val)->integer)--; |
985 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
|
986 { |
95103 | 987 FT_Face ft_face = XSAVE_VALUE (val)->pointer; |
988 | |
989 FT_Done_Face (ft_face); | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
990 #ifdef HAVE_LIBOTF |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
991 if (ftfont_info->otf) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
992 OTF_close (ftfont_info->otf); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
993 #endif |
95103 | 994 XSAVE_VALUE (val)->pointer = NULL; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
995 } |
90400 | 996 else |
997 FT_Done_Size (ftfont_info->ft_size); | |
998 } | |
999 | |
1000 static int | |
1001 ftfont_has_char (entity, c) | |
1002 Lisp_Object entity; | |
1003 int c; | |
1004 { | |
1005 Lisp_Object val; | |
95103 | 1006 int fc_charset_idx; |
1007 struct charset *charset; | |
90400 | 1008 |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1009 val = assq_no_quit (QCfont_entity, AREF (entity, FONT_EXTRA_INDEX)); |
95103 | 1010 fc_charset_idx = XINT (XCDR (XCDR (val))); |
1011 if (fc_charset_idx < 0) | |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
1012 return -1; |
95103 | 1013 charset = CHARSET_FROM_ID (fc_charset_table[fc_charset_idx].charset_id); |
1014 return (ENCODE_CHAR (charset, c) != CHARSET_INVALID_CODE (charset)); | |
90400 | 1015 } |
1016 | |
1017 static unsigned | |
1018 ftfont_encode_char (font, c) | |
1019 struct font *font; | |
1020 int c; | |
1021 { | |
1022 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
1023 FT_Face ft_face = ftfont_info->ft_size->face; | |
1024 FT_ULong charcode = c; | |
1025 FT_UInt code = FT_Get_Char_Index (ft_face, charcode); | |
1026 | |
91271
fed5211f4809
(ftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents:
91249
diff
changeset
|
1027 return (code > 0 ? code : FONT_INVALID_CODE); |
90400 | 1028 } |
1029 | |
1030 static int | |
1031 ftfont_text_extents (font, code, nglyphs, metrics) | |
1032 struct font *font; | |
1033 unsigned *code; | |
1034 int nglyphs; | |
1035 struct font_metrics *metrics; | |
1036 { | |
1037 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
1038 FT_Face ft_face = ftfont_info->ft_size->face; | |
1039 int width = 0; | |
1040 int i; | |
1041 | |
1042 if (ftfont_info->ft_size != ft_face->size) | |
1043 FT_Activate_Size (ftfont_info->ft_size); | |
1044 if (metrics) | |
1045 bzero (metrics, sizeof (struct font_metrics)); | |
1046 for (i = 0; i < nglyphs; i++) | |
1047 { | |
1048 if (FT_Load_Glyph (ft_face, code[i], FT_LOAD_DEFAULT) == 0) | |
1049 { | |
1050 FT_Glyph_Metrics *m = &ft_face->glyph->metrics; | |
1051 | |
1052 if (metrics) | |
1053 { | |
1054 if (metrics->lbearing > width + (m->horiBearingX >> 6)) | |
1055 metrics->lbearing = width + (m->horiBearingX >> 6); | |
1056 if (metrics->rbearing | |
1057 < width + ((m->horiBearingX + m->width) >> 6)) | |
1058 metrics->rbearing | |
1059 = width + ((m->horiBearingX + m->width) >> 6); | |
1060 if (metrics->ascent < (m->horiBearingY >> 6)) | |
1061 metrics->ascent = m->horiBearingY >> 6; | |
1062 if (metrics->descent > ((m->horiBearingY + m->height) >> 6)) | |
1063 metrics->descent = (m->horiBearingY + m->height) >> 6; | |
1064 } | |
1065 width += m->horiAdvance >> 6; | |
1066 } | |
1067 else | |
1068 { | |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1069 width += font->space_width; |
90400 | 1070 } |
1071 } | |
1072 if (metrics) | |
1073 metrics->width = width; | |
1074 | |
1075 return width; | |
1076 } | |
1077 | |
1078 static int | |
1079 ftfont_get_bitmap (font, code, bitmap, bits_per_pixel) | |
1080 struct font *font; | |
1081 unsigned code; | |
1082 struct font_bitmap *bitmap; | |
1083 int bits_per_pixel; | |
1084 { | |
1085 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
1086 FT_Face ft_face = ftfont_info->ft_size->face; | |
1087 FT_Int32 load_flags = FT_LOAD_RENDER; | |
1088 | |
1089 if (ftfont_info->ft_size != ft_face->size) | |
1090 FT_Activate_Size (ftfont_info->ft_size); | |
1091 if (bits_per_pixel == 1) | |
1092 { | |
1093 #ifdef FT_LOAD_TARGET_MONO | |
1094 load_flags |= FT_LOAD_TARGET_MONO; | |
1095 #else | |
1096 load_flags |= FT_LOAD_MONOCHROME; | |
1097 #endif | |
1098 } | |
1099 else if (bits_per_pixel != 8) | |
1100 /* We don't support such a rendering. */ | |
1101 return -1; | |
1102 | |
1103 if (FT_Load_Glyph (ft_face, code, load_flags) != 0) | |
1104 return -1; | |
91108
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1105 bitmap->bits_per_pixel |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1106 = (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
|
1107 : 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
|
1108 : 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
|
1109 : 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
|
1110 : -1); |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1111 if (bitmap->bits_per_pixel < 0) |
6da57551efb7
(ftfont_get_bitmap): Set bitmap->bits_per_pixel.
Kenichi Handa <handa@m17n.org>
parents:
90963
diff
changeset
|
1112 /* 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
|
1113 return -1; |
90400 | 1114 bitmap->rows = ft_face->glyph->bitmap.rows; |
1115 bitmap->width = ft_face->glyph->bitmap.width; | |
1116 bitmap->pitch = ft_face->glyph->bitmap.pitch; | |
1117 bitmap->buffer = ft_face->glyph->bitmap.buffer; | |
1118 bitmap->left = ft_face->glyph->bitmap_left; | |
1119 bitmap->top = ft_face->glyph->bitmap_top; | |
1120 bitmap->advance = ft_face->glyph->metrics.horiAdvance >> 6; | |
1121 bitmap->extra = NULL; | |
1122 | |
1123 return 0; | |
1124 } | |
1125 | |
1126 static int | |
1127 ftfont_anchor_point (font, code, index, x, y) | |
1128 struct font *font; | |
1129 unsigned code; | |
1130 int index; | |
1131 int *x, *y; | |
1132 { | |
1133 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
1134 FT_Face ft_face = ftfont_info->ft_size->face; | |
1135 | |
1136 if (ftfont_info->ft_size != ft_face->size) | |
1137 FT_Activate_Size (ftfont_info->ft_size); | |
1138 if (FT_Load_Glyph (ft_face, code, FT_LOAD_DEFAULT) != 0) | |
1139 return -1; | |
1140 if (ft_face->glyph->format != FT_GLYPH_FORMAT_OUTLINE) | |
1141 return -1; | |
1142 if (index >= ft_face->glyph->outline.n_points) | |
1143 return -1; | |
1144 *x = ft_face->glyph->outline.points[index].x; | |
1145 *y = ft_face->glyph->outline.points[index].y; | |
1146 return 0; | |
1147 } | |
1148 | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1149 #ifdef HAVE_LIBOTF |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1150 #ifdef HAVE_M17N_FLT |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1151 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1152 struct MFLTFontFT |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1153 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1154 MFLTFont flt_font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1155 struct font *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1156 FT_Face ft_face; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1157 OTF *otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1158 }; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1159 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1160 static int |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1161 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
|
1162 MFLTFont *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1163 MFLTGlyphString *gstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1164 int from, to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1165 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1166 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
|
1167 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
|
1168 MFLTGlyph *g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1169 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1170 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
|
1171 if (! g->encoded) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1172 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1173 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
|
1174 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1175 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
|
1176 g->encoded = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1177 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1178 return 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1179 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1180 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1181 static int |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1182 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
|
1183 MFLTFont *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1184 MFLTGlyphString *gstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1185 int from, to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1186 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1187 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
|
1188 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
|
1189 MFLTGlyph *g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1190 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1191 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
|
1192 if (! g->measured) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1193 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1194 if (g->code != FONT_INVALID_CODE) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1195 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1196 FT_Glyph_Metrics *m; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1197 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1198 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
|
1199 abort (); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1200 m = &ft_face->glyph->metrics; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1201 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1202 g->lbearing = m->horiBearingX; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1203 g->rbearing = m->horiBearingX + m->width; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1204 g->ascent = m->horiBearingY; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1205 g->descent = m->height - m->horiBearingY; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1206 g->xadv = m->horiAdvance; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1207 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1208 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1209 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1210 g->lbearing = 0; |
94931
37f386db63ed
(ftfont_pattern_entity): Argument FRAME removed. Make
Kenichi Handa <handa@m17n.org>
parents:
93588
diff
changeset
|
1211 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
|
1212 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
|
1213 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
|
1214 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1215 g->yadv = 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1216 g->measured = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1217 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1218 return 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1219 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1220 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1221 static int |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1222 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
|
1223 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1224 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
|
1225 OTF *otf = flt_font_ft->otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1226 OTF_Tag *tags; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1227 int i, n, negative; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1228 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1229 for (i = 0; i < 2; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1230 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1231 if (! spec->features[i]) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1232 continue; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1233 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
|
1234 tags = alloca (sizeof (OTF_Tag) * n); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1235 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
|
1236 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1237 if (spec->features[i][n] == 0xFFFFFFFF) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1238 negative = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1239 else if (negative) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1240 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
|
1241 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1242 tags[n] = spec->features[i][n]; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1243 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1244 if (n - negative > 0 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1245 && 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
|
1246 tags, n - negative) != 1) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1247 return 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1248 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1249 return 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1250 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1251 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1252 #define DEVICE_DELTA(table, size) \ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1253 (((size) >= (table).StartSize && (size) <= (table).EndSize) \ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1254 ? (table).DeltaValue[(size) - (table).StartSize] << 6 \ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1255 : 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1256 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1257 static void |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1258 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
|
1259 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
|
1260 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1261 if (anchor->AnchorFormat == 2) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1262 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1263 FT_Outline *outline; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1264 int ap = anchor->f.f1.AnchorPoint; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1265 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1266 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
|
1267 outline = &ft_face->glyph->outline; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1268 if (ap < outline->n_points) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1269 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1270 *x = outline->points[ap].x << 6; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1271 *y = outline->points[ap].y << 6; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1272 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1273 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1274 else if (anchor->AnchorFormat == 3) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1275 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1276 if (anchor->f.f2.XDeviceTable.offset) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1277 *x += DEVICE_DELTA (anchor->f.f2.XDeviceTable, x_ppem); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1278 if (anchor->f.f2.YDeviceTable.offset) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1279 *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
|
1280 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1281 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1282 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1283 static OTF_GlyphString otf_gstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1284 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1285 static int |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1286 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
|
1287 MFLTFont *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1288 MFLTOtfSpec *spec; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1289 MFLTGlyphString *in; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1290 int from, to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1291 MFLTGlyphString *out; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1292 MFLTGlyphAdjustment *adjustment; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1293 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1294 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
|
1295 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
|
1296 OTF *otf = flt_font_ft->otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1297 int len = to - from; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1298 int i, j, gidx; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1299 OTF_Glyph *otfg; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1300 char script[5], *langsys = NULL; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1301 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
|
1302 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1303 if (len == 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1304 return from; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1305 OTF_tag_name (spec->script, script); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1306 if (spec->langsys) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1307 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1308 langsys = alloca (5); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1309 OTF_tag_name (spec->langsys, langsys); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1310 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1311 for (i = 0; i < 2; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1312 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1313 char *p; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1314 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1315 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
|
1316 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1317 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
|
1318 if (i == 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1319 p = gsub_features = alloca (6 * j); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1320 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1321 p = gpos_features = alloca (6 * j); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1322 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
|
1323 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1324 if (spec->features[i][j] == 0xFFFFFFFF) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1325 *p++ = '*', *p++ = ','; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1326 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1327 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1328 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
|
1329 p[4] = ','; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1330 p += 5; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1331 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1332 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1333 *--p = '\0'; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1334 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1335 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1336 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1337 if (otf_gstring.size == 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1338 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1339 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
|
1340 otf_gstring.size = len; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1341 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1342 else if (otf_gstring.size < len) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1343 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1344 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
|
1345 sizeof (OTF_Glyph) * len); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1346 otf_gstring.size = len; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1347 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1348 otf_gstring.used = len; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1349 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
|
1350 for (i = 0; i < len; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1351 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1352 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
|
1353 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
|
1354 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1355 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1356 OTF_drive_gdef (otf, &otf_gstring); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1357 gidx = out->used; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1358 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1359 if (gsub_features) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1360 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1361 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
|
1362 < 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1363 goto simple_copy; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1364 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
|
1365 return -2; |
91294
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1366 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
|
1367 { |
91294
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1368 MFLTGlyph *g; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1369 int min_from, max_to; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1370 int j; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1371 |
91294
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1372 g = out->glyphs + out->used; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1373 *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
|
1374 if (g->code != otfg->glyph_id) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1375 { |
91294
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1376 g->c = 0; |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1377 g->code = otfg->glyph_id; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1378 g->measured = 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1379 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1380 out->used++; |
91294
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1381 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
|
1382 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
|
1383 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
|
1384 { |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1385 /* 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
|
1386 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
|
1387 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
|
1388 { |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1389 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
|
1390 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
|
1391 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
|
1392 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
|
1393 } |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1394 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
|
1395 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
|
1396 } |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1397 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
|
1398 && 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
|
1399 i++, otfg++) |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1400 { |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1401 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
|
1402 *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
|
1403 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
|
1404 { |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1405 g->c = 0; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1406 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
|
1407 g->measured = 0; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1408 } |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1409 out->used++; |
299c64a7a9fb
(ftfont_drive_otf): Fix setting of FROM and TO slots of
Kenichi Handa <handa@m17n.org>
parents:
91271
diff
changeset
|
1410 } |
91137
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 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1414 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1415 if (out->allocated < out->used + len) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1416 return -2; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1417 for (i = 0; i < len; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1418 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
|
1419 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1420 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1421 if (gpos_features) |
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 MFLTGlyph *base = NULL, *mark = NULL, *g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1424 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
|
1425 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1426 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
|
1427 < 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1428 return to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1429 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1430 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
|
1431 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
|
1432 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
|
1433 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
|
1434 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1435 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
|
1436 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
|
1437 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1438 MFLTGlyph *prev; |
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 if (! otfg->glyph_id) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1441 continue; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1442 switch (otfg->positioning_type) |
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 case 0: |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1445 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1446 case 1: /* Single */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1447 case 2: /* Pair */ |
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 int format = otfg->f.f1.format; |
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 (format & OTF_XPlacement) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1452 adjustment[i].xoff |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1453 = 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
|
1454 if (format & OTF_XPlaDevice) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1455 adjustment[i].xoff |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1456 += 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
|
1457 if (format & OTF_YPlacement) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1458 adjustment[i].yoff |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1459 = - (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
|
1460 if (format & OTF_YPlaDevice) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1461 adjustment[i].yoff |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1462 -= 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
|
1463 if (format & OTF_XAdvance) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1464 adjustment[i].xadv |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1465 += 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
|
1466 if (format & OTF_XAdvDevice) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1467 adjustment[i].xadv |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1468 += 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
|
1469 if (format & OTF_YAdvance) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1470 adjustment[i].yadv |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1471 += 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
|
1472 if (format & OTF_YAdvDevice) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1473 adjustment[i].yadv |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1474 += 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
|
1475 adjustment[i].set = 1; |
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 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1478 case 3: /* Cursive */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1479 /* Not yet supported. */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1480 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1481 case 4: /* Mark-to-Base */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1482 case 5: /* Mark-to-Ligature */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1483 if (! base) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1484 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1485 prev = base; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1486 goto label_adjust_anchor; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1487 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
|
1488 if (! mark) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1489 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1490 prev = mark; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1491 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1492 label_adjust_anchor: |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1493 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1494 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
|
1495 int this_from, this_to; |
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 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
|
1498 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
|
1499 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
|
1500 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
|
1501 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1502 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
|
1503 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
|
1504 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
|
1505 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
|
1506 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
|
1507 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
|
1508 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
|
1509 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
|
1510 adjustment[i].back = (g - prev); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1511 adjustment[i].xadv = 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1512 adjustment[i].advance_is_absolute = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1513 adjustment[i].set = 1; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1514 this_from = g->from; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1515 this_to = g->to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1516 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
|
1517 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1518 if (this_from > prev[j].from) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1519 this_from = prev[j].from; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1520 if (this_to < prev[j].to) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1521 this_to = prev[j].to; |
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 for (; prev <= g; prev++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1524 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1525 prev->from = this_from; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1526 prev->to = this_to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1527 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1528 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1529 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1530 if (otfg->GlyphClass == OTF_GlyphClass0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1531 base = mark = g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1532 else if (otfg->GlyphClass == OTF_GlyphClassMark) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1533 mark = g; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1534 else |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1535 base = g; |
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 return to; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1539 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1540 simple_copy: |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1541 if (out->allocated < out->used + len) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1542 return -2; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1543 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
|
1544 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
|
1545 sizeof (MFLTGlyph) * len); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1546 out->used += len; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1547 return to; |
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 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1550 static MFLTGlyphString gstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1551 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1552 static int m17n_flt_initialized; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1553 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1554 extern Lisp_Object QCfamily; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1555 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1556 Lisp_Object |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1557 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
|
1558 Lisp_Object lgstring; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1559 struct font *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1560 FT_Face ft_face; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1561 OTF *otf; |
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 EMACS_UINT len = LGSTRING_LENGTH (lgstring); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1564 EMACS_UINT i; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1565 struct MFLTFontFT flt_font_ft; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1566 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1567 if (! m17n_flt_initialized) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1568 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1569 M17N_INIT (); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1570 m17n_flt_initialized = 1; |
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 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1573 for (i = 0; i < len; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1574 if (NILP (LGSTRING_GLYPH (lgstring, i))) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1575 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1576 len = i; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1577 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1578 if (gstring.allocated == 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1579 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1580 gstring.allocated = len * 2; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1581 gstring.glyph_size = sizeof (MFLTGlyph); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1582 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
|
1583 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1584 else if (gstring.allocated < len * 2) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1585 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1586 gstring.allocated = len * 2; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1587 gstring.glyphs = realloc (gstring.glyphs, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1588 sizeof (MFLTGlyph) * gstring.allocated); |
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 for (i = 0; i < len; i++) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1591 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
|
1592 gstring.used = len; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1593 gstring.r2l = 0; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1594 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1595 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1596 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
|
1597 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1598 if (NILP (family)) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1599 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
|
1600 else |
95103 | 1601 flt_font_ft.flt_font.family |
1602 = msymbol ((char *) SDATA (SYMBOL_NAME (family))); | |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1603 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1604 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
|
1605 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
|
1606 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
|
1607 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
|
1608 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
|
1609 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
|
1610 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
|
1611 flt_font_ft.font = font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1612 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
|
1613 flt_font_ft.otf = otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1614 for (i = 0; i < 3; i++) |
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 int result = mflt_run (&gstring, 0, len, &flt_font_ft.flt_font, NULL); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1617 if (result != -2) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1618 break; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1619 gstring.allocated += gstring.allocated; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1620 gstring.glyphs = realloc (gstring.glyphs, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1621 sizeof (MFLTGlyph) * gstring.allocated); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1622 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1623 if (gstring.used > LGSTRING_LENGTH (lgstring)) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1624 return Qnil; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1625 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
|
1626 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1627 MFLTGlyph *g = gstring.glyphs + i; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1628 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1629 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
|
1630 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
|
1631 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1632 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1633 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
|
1634 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1635 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
|
1636 MFLTGlyph *g = gstring.glyphs + i; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1637 |
91271
fed5211f4809
(ftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents:
91249
diff
changeset
|
1638 if (NILP (lglyph)) |
fed5211f4809
(ftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents:
91249
diff
changeset
|
1639 { |
fed5211f4809
(ftfont_encode_char): Use the macro FONT_INVALID_CODE.
Kenichi Handa <handa@m17n.org>
parents:
91249
diff
changeset
|
1640 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
|
1641 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
|
1642 } |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1643 LGLYPH_SET_FROM (lglyph, g->from); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1644 LGLYPH_SET_TO (lglyph, g->to); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1645 LGLYPH_SET_CHAR (lglyph, g->c); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1646 LGLYPH_SET_CODE (lglyph, g->code); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1647 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
|
1648 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
|
1649 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
|
1650 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
|
1651 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
|
1652 if (g->adjusted) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1653 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1654 Lisp_Object vec; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1655 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1656 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
|
1657 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
|
1658 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
|
1659 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
|
1660 LGLYPH_SET_ADJUSTMENT (lglyph, vec); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1661 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1662 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1663 return make_number (i); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1664 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1665 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1666 Lisp_Object |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1667 ftfont_shape (lgstring) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1668 Lisp_Object lgstring; |
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 struct font *font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1671 struct ftfont_info *ftfont_info; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1672 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1673 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
|
1674 ftfont_info = (struct ftfont_info *) font; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1675 if (! ftfont_info->maybe_otf) |
91870
5348213975e3
(ftfont_shape): Return Lispy number.
Kenichi Handa <handa@m17n.org>
parents:
91604
diff
changeset
|
1676 return make_number (0); |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1677 if (! ftfont_info->otf) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1678 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1679 OTF *otf = OTF_open_ft_face (ftfont_info->ft_size->face); |
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 || OTF_get_table (otf, "head") < 0) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1682 { |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1683 if (otf) |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1684 OTF_close (otf); |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1685 ftfont_info->maybe_otf = 0; |
91870
5348213975e3
(ftfont_shape): Return Lispy number.
Kenichi Handa <handa@m17n.org>
parents:
91604
diff
changeset
|
1686 return make_number (0); |
91137
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1687 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1688 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1689 ftfont_info->otf = otf; |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1690 } |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1691 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1692 return ftfont_shape_by_flt (lgstring, font, ftfont_info->ft_size->face, |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1693 ftfont_info->otf); |
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 |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1696 #endif /* HAVE_M17N_FLT */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1697 #endif /* HAVE_LIBOTF */ |
00323e98bffb
Don't include Freetype headers. Include "ftfont.h".
Kenichi Handa <handa@m17n.org>
parents:
91108
diff
changeset
|
1698 |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1699 Lisp_Object |
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1700 ftfont_font_format (FcPattern *pattern) |
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1701 { |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1702 FcChar8 *str; |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1703 |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1704 #ifdef FC_FONTFORMAT |
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1705 if (FcPatternGetString (pattern, FC_FONTFORMAT, 0, &str) != FcResultMatch) |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1706 return Qnil; |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1707 if (strcmp ((char *) str, "TrueType") == 0) |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1708 return intern ("truetype"); |
90963
28e2fa3c7ca3
(ftfont_font_format): Typo fix.
Jason Rumney <jasonr@gnu.org>
parents:
90819
diff
changeset
|
1709 if (strcmp ((char *) str, "Type 1") == 0) |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1710 return intern ("type1"); |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1711 if (strcmp ((char *) str, "PCF") == 0) |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1712 return intern ("pcf"); |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1713 if (strcmp ((char *) str, "BDF") == 0) |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1714 return intern ("bdf"); |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1715 #else /* not FC_FONTFORMAT */ |
90697
444b40002533
(ftfont_driver): Initialize ftfont_driver.type by 0.
Kenichi Handa <handa@m17n.org>
parents:
90680
diff
changeset
|
1716 if (FcPatternGetString (pattern, FC_FILE, 0, &str) != FcResultMatch) |
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1717 return Qnil; |
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1718 if (strcasestr ((char *) str, ".ttf") == 0) |
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1719 return intern ("truetype"); |
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1720 if (strcasestr ((char *) str, "pfb") == 0) |
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1721 return intern ("type1"); |
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1722 if (strcasestr ((char *) str, "pcf") == 0) |
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1723 return intern ("pcf"); |
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1724 if (strcasestr ((char *) str, "bdf") == 0) |
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1725 return intern ("bdf"); |
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
1726 #endif /* not FC_FONTFORMAT */ |
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1727 return intern ("unknown"); |
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1728 } |
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
1729 |
90400 | 1730 |
1731 void | |
1732 syms_of_ftfont () | |
1733 { | |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1734 DEFSYM (Qfreetype, "freetype"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1735 DEFSYM (Qmonospace, "monospace"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1736 DEFSYM (Qsans_serif, "sans-serif"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1737 DEFSYM (Qserif, "serif"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1738 DEFSYM (Qmono, "mono"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1739 DEFSYM (Qsans, "sans"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1740 DEFSYM (Qsans__serif, "sans serif"); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1741 |
90400 | 1742 staticpro (&freetype_font_cache); |
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
1743 freetype_font_cache = Fcons (Qt, Qnil); |
90400 | 1744 |
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1745 staticpro (&ftfont_generic_family_list); |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1746 ftfont_generic_family_list |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1747 = Fcons (Fcons (Qmonospace, Qt), |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1748 Fcons (Fcons (Qsans_serif, Qt), |
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1749 Fcons (Fcons (Qsans, Qt), Qnil))); |
90400 | 1750 |
95103 | 1751 staticpro (&ft_face_cache); |
1752 ft_face_cache = Qnil; | |
1753 | |
90400 | 1754 ftfont_driver.type = Qfreetype; |
1755 register_font_driver (&ftfont_driver, NULL); | |
1756 } | |
90427 | 1757 |
1758 /* arch-tag: 7cfa432c-33a6-4988-83d2-a82ed8604aca | |
1759 (do not change this comment) */ |