Mercurial > emacs
annotate src/ftfont.c @ 90963:28e2fa3c7ca3
(ftfont_font_format): Typo fix.
| author | Jason Rumney <jasonr@gnu.org> |
|---|---|
| date | Thu, 21 Jun 2007 23:33:35 +0000 |
| parents | c72e129545e8 |
| children | 6da57551efb7 |
| rev | line source |
|---|---|
| 90400 | 1 /* ftfont.c -- FreeType font driver. |
| 2 Copyright (C) 2006 Free Software Foundation, Inc. | |
| 3 Copyright (C) 2006 | |
| 4 National Institute of Advanced Industrial Science and Technology (AIST) | |
| 5 Registration Number H13PRO009 | |
| 6 | |
| 7 This file is part of GNU Emacs. | |
| 8 | |
| 9 GNU Emacs is free software; you can redistribute it and/or modify | |
| 10 it under the terms of the GNU General Public License as published by | |
| 11 the Free Software Foundation; either version 2, or (at your option) | |
| 12 any later version. | |
| 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 | |
| 20 along with GNU Emacs; see the file COPYING. If not, write to | |
| 21 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
| 22 Boston, MA 02110-1301, USA. */ | |
| 23 | |
| 24 #include <config.h> | |
| 25 #include <stdio.h> | |
| 26 | |
| 27 #include <ft2build.h> | |
| 28 #include FT_FREETYPE_H | |
| 29 #include FT_SIZES_H | |
| 30 #include <fontconfig/fontconfig.h> | |
| 31 #include <fontconfig/fcfreetype.h> | |
| 32 | |
| 33 #include "lisp.h" | |
| 34 #include "dispextern.h" | |
| 35 #include "frame.h" | |
| 36 #include "blockinput.h" | |
| 37 #include "character.h" | |
| 38 #include "charset.h" | |
| 39 #include "coding.h" | |
| 40 #include "fontset.h" | |
| 41 #include "font.h" | |
| 42 | |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
43 /* Symbolic type of this font-driver. */ |
| 90400 | 44 Lisp_Object Qfreetype; |
| 45 | |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
46 /* Fontconfig's generic families and their aliases. */ |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
47 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
|
48 |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
49 /* Flag to tell if FcInit is areadly called or not. */ |
| 90400 | 50 static int fc_initialized; |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
51 |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
52 /* Handle to a FreeType library instance. */ |
| 90400 | 53 static FT_Library ft_library; |
| 54 | |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
55 /* Cache for FreeType fonts. */ |
| 90400 | 56 static Lisp_Object freetype_font_cache; |
| 57 | |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
58 /* Fontconfig's charset used for finding fonts of registry |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
59 "iso8859-1". */ |
| 90400 | 60 static FcCharSet *cs_iso8859_1; |
| 61 | |
| 62 /* The actual structure for FreeType font that can be casted to struct | |
| 63 font. */ | |
| 64 | |
| 65 struct ftfont_info | |
| 66 { | |
| 67 struct font font; | |
| 68 FT_Size ft_size; | |
| 69 }; | |
| 70 | |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
71 static int ftfont_build_basic_charsets P_ ((void)); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
72 static Lisp_Object ftfont_pattern_entity P_ ((FcPattern *, |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
73 Lisp_Object, Lisp_Object)); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
74 static Lisp_Object ftfont_list_generic_family P_ ((Lisp_Object, Lisp_Object, |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
75 Lisp_Object)); |
|
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
76 Lisp_Object ftfont_font_format P_ ((FcPattern *)); |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
77 |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
78 #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
|
79 |
| 90400 | 80 static int |
| 81 ftfont_build_basic_charsets () | |
| 82 { | |
| 83 FcChar32 c; | |
| 84 | |
| 85 cs_iso8859_1 = FcCharSetCreate (); | |
| 86 if (! cs_iso8859_1) | |
| 87 return -1; | |
| 88 for (c = ' '; c < 127; c++) | |
| 89 if (! FcCharSetAddChar (cs_iso8859_1, c)) | |
| 90 return -1; | |
| 90524 | 91 #if 0 |
| 92 /* This part is currently disabled. Should be fixed later. */ | |
| 90400 | 93 for (c = 192; c < 256; c++) |
| 94 if (! FcCharSetAddChar (cs_iso8859_1, c)) | |
| 95 return -1; | |
| 90524 | 96 #endif |
| 90400 | 97 return 0; |
| 98 } | |
| 99 | |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
100 static Lisp_Object |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
101 ftfont_pattern_entity (p, frame, registry) |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
102 FcPattern *p; |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
103 Lisp_Object frame, registry; |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
104 { |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
105 Lisp_Object entity; |
|
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
106 FcChar8 *file, *fontformat; |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
107 FcCharSet *charset; |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
108 char *str; |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
109 int numeric; |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
110 double dbl; |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
111 |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
112 if (FcPatternGetString (p, FC_FILE, 0, &file) != FcResultMatch) |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
113 return Qnil; |
|
90450
5c96354daf9e
(ftfont_pattern_entity): Fix typo.
Kenichi Handa <handa@m17n.org>
parents:
90441
diff
changeset
|
114 if (FcPatternGetCharSet (p, FC_CHARSET, 0, &charset) != FcResultMatch) |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
115 charset = NULL; |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
116 #ifdef FC_FONTFORMAT |
|
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
117 if (FcPatternGetString (p, FC_FONTFORMAT, 0, &fontformat) != FcResultMatch) |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
118 #endif /* FC_FONTFORMAT */ |
|
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
119 fontformat = NULL; |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
120 |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
121 entity = Fmake_vector (make_number (FONT_ENTITY_MAX), null_string); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
122 |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
123 ASET (entity, FONT_TYPE_INDEX, Qfreetype); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
124 ASET (entity, FONT_REGISTRY_INDEX, registry); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
125 ASET (entity, FONT_FRAME_INDEX, frame); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
126 ASET (entity, FONT_OBJLIST_INDEX, Qnil); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
127 |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
128 if (FcPatternGetString (p, FC_FOUNDRY, 0, (FcChar8 **) &str) == FcResultMatch) |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
129 ASET (entity, FONT_FOUNDRY_INDEX, intern_downcase (str, strlen (str))); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
130 if (FcPatternGetString (p, FC_FAMILY, 0, (FcChar8 **) &str) == FcResultMatch) |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
131 ASET (entity, FONT_FAMILY_INDEX, intern_downcase (str, strlen (str))); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
132 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
|
133 { |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
134 if (numeric == FC_WEIGHT_REGULAR) |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
135 numeric = 100; |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
136 ASET (entity, FONT_WEIGHT_INDEX, make_number (numeric)); |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
137 } |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
138 if (FcPatternGetInteger (p, FC_SLANT, 0, &numeric) == FcResultMatch) |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
139 ASET (entity, FONT_SLANT_INDEX, make_number (numeric + 100)); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
140 if (FcPatternGetInteger (p, FC_WIDTH, 0, &numeric) == FcResultMatch) |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
141 ASET (entity, FONT_WIDTH_INDEX, make_number (numeric)); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
142 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
|
143 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
|
144 else |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
145 ASET (entity, FONT_SIZE_INDEX, make_number (0)); |
|
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 if (FcPatternGetInteger (p, FC_SPACING, 0, &numeric) != FcResultMatch) |
|
90568
3762a2cc74de
(ftfont_pattern_entity): If the pattern doesn't contain
Kenichi Handa <handa@m17n.org>
parents:
90567
diff
changeset
|
148 numeric = -1; |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
149 file = FcStrCopy (file); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
150 if (! file) |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
151 return Qnil; |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
152 |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
153 p = FcPatternCreate (); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
154 if (! p) |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
155 return Qnil; |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
156 |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
157 if (FcPatternAddString (p, FC_FILE, file) == FcFalse |
|
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
158 || (charset |
|
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
159 && FcPatternAddCharSet (p, FC_CHARSET, charset) == FcFalse) |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
160 #ifdef FC_FONTFORMAT |
|
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
161 || (fontformat |
|
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
162 && FcPatternAddString (p, FC_FONTFORMAT, fontformat) == FcFalse) |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
163 #endif /* FC_FONTFORMAT */ |
|
90568
3762a2cc74de
(ftfont_pattern_entity): If the pattern doesn't contain
Kenichi Handa <handa@m17n.org>
parents:
90567
diff
changeset
|
164 || (numeric >= 0 |
|
3762a2cc74de
(ftfont_pattern_entity): If the pattern doesn't contain
Kenichi Handa <handa@m17n.org>
parents:
90567
diff
changeset
|
165 && FcPatternAddInteger (p, FC_SPACING, numeric) == FcFalse)) |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
166 { |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
167 FcPatternDestroy (p); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
168 return Qnil; |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
169 } |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
170 ASET (entity, FONT_EXTRA_INDEX, make_save_value (p, 0)); |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
171 return entity; |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
172 } |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
173 |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
174 static Lisp_Object ftfont_generic_family_list; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
175 |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
176 static Lisp_Object |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
177 ftfont_list_generic_family (spec, frame, registry) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
178 Lisp_Object spec, frame, registry; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
179 { |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
180 Lisp_Object family = AREF (spec, FONT_FAMILY_INDEX); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
181 Lisp_Object slot, list, val; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
182 |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
183 if (EQ (family, Qmono)) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
184 family = Qmonospace; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
185 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
|
186 family = Qsans_serif; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
187 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
|
188 if (! CONSP (slot)) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
189 return null_vector; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
190 list = XCDR (slot); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
191 if (EQ (list, Qt)) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
192 { |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
193 /* Not yet listed. */ |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
194 FcObjectSet *objset = NULL; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
195 FcPattern *pattern = NULL, *pat = NULL; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
196 FcFontSet *fontset = NULL; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
197 FcChar8 *fam; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
198 int i, j; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
199 |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
200 objset = FcObjectSetBuild (FC_FOUNDRY, FC_FAMILY, FC_WEIGHT, FC_SLANT, |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
201 FC_WIDTH, FC_PIXEL_SIZE, FC_SPACING, |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
202 FC_CHARSET, FC_FILE, |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
203 #ifdef FC_FONTFORMAT |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
204 FC_FONTFORMAT, |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
205 #endif /* FC_FONTFORMAT */ |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
206 NULL); |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
207 if (! objset) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
208 goto err; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
209 pattern = FcPatternBuild (NULL, FC_FAMILY, FcTypeString, |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
210 SYMBOL_FcChar8 (family), (char *) 0); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
211 if (! pattern) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
212 goto err; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
213 pat = FcPatternCreate (); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
214 if (! pat) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
215 goto err; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
216 FcConfigSubstitute (NULL, pattern, FcMatchPattern); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
217 for (i = 0, val = Qnil; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
218 FcPatternGetString (pattern, FC_FAMILY, i, &fam) == FcResultMatch; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
219 i++) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
220 { |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
221 if (strcmp ((char *) fam, (char *) SYMBOL_FcChar8 (family)) == 0) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
222 continue; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
223 if (! FcPatternAddString (pat, FC_FAMILY, fam)) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
224 goto err; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
225 fontset = FcFontList (NULL, pat, objset); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
226 if (! fontset) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
227 goto err; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
228 /* Here we build the list in reverse order so that the last |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
229 loop in this function build a list in the correct |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
230 order. */ |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
231 for (j = 0; j < fontset->nfont; j++) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
232 { |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
233 Lisp_Object entity; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
234 |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
235 entity = ftfont_pattern_entity (fontset->fonts[j], |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
236 frame, registry); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
237 if (! NILP (entity)) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
238 val = Fcons (entity, val); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
239 } |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
240 FcFontSetDestroy (fontset); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
241 fontset = NULL; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
242 FcPatternDel (pat, FC_FAMILY); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
243 } |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
244 list = val; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
245 XSETCDR (slot, list); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
246 err: |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
247 if (pat) FcPatternDestroy (pat); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
248 if (pattern) FcPatternDestroy (pattern); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
249 if (fontset) FcFontSetDestroy (fontset); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
250 if (objset) FcObjectSetDestroy (objset); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
251 if (EQ (list, Qt)) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
252 return Qnil; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
253 } |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
254 ASET (spec, FONT_FAMILY_INDEX, Qnil); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
255 for (val = Qnil; CONSP (list); list = XCDR (list)) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
256 if (font_match_p (spec, XCAR (list))) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
257 val = Fcons (XCAR (list), val); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
258 ASET (spec, FONT_FAMILY_INDEX, family); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
259 return Fvconcat (1, &val); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
260 } |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
261 |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
262 |
| 90400 | 263 static Lisp_Object ftfont_get_cache P_ ((Lisp_Object)); |
| 264 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
|
265 static Lisp_Object ftfont_match P_ ((Lisp_Object, Lisp_Object)); |
| 90400 | 266 static Lisp_Object ftfont_list_family P_ ((Lisp_Object)); |
| 267 static void ftfont_free_entity P_ ((Lisp_Object)); | |
| 268 static struct font *ftfont_open P_ ((FRAME_PTR, Lisp_Object, int)); | |
| 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 *)); | |
| 278 | |
| 279 struct font_driver ftfont_driver = | |
| 280 { | |
|
90697
444b40002533
(ftfont_driver): Initialize ftfont_driver.type by 0.
Kenichi Handa <handa@m17n.org>
parents:
90680
diff
changeset
|
281 0, /* Qfreetype */ |
| 90400 | 282 ftfont_get_cache, |
| 283 ftfont_list, | |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
284 ftfont_match, |
| 90400 | 285 ftfont_list_family, |
| 286 ftfont_free_entity, | |
| 287 ftfont_open, | |
| 288 ftfont_close, | |
| 289 /* We can't draw a text without device dependent functions. */ | |
| 290 NULL, | |
| 291 NULL, | |
| 292 ftfont_has_char, | |
| 293 ftfont_encode_char, | |
| 294 ftfont_text_extents, | |
| 295 /* We can't draw a text without device dependent functions. */ | |
| 296 NULL, | |
| 297 ftfont_get_bitmap, | |
| 298 NULL, | |
| 299 NULL, | |
| 300 NULL, | |
| 301 ftfont_anchor_point, | |
| 302 #ifdef HAVE_LIBOTF | |
| 303 font_otf_capability, | |
|
90819
c72e129545e8
(ftfont_driver): Delete font_otf_gsub and
Kenichi Handa <handa@m17n.org>
parents:
90697
diff
changeset
|
304 font_drive_otf, |
| 90400 | 305 #else |
| 306 NULL, | |
| 307 NULL, | |
| 308 NULL | |
| 309 #endif /* HAVE_LIBOTF */ | |
| 310 }; | |
| 311 | |
| 312 extern Lisp_Object QCname; | |
| 313 | |
| 314 static Lisp_Object | |
| 315 ftfont_get_cache (frame) | |
| 316 Lisp_Object frame; | |
| 317 { | |
| 318 return freetype_font_cache; | |
| 319 } | |
| 320 | |
| 321 static Lisp_Object | |
| 322 ftfont_list (frame, spec) | |
| 323 Lisp_Object frame, spec; | |
| 324 { | |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
325 Lisp_Object val, tmp, extra; |
| 90400 | 326 int i; |
| 327 FcPattern *pattern = NULL; | |
| 328 FcCharSet *charset = NULL; | |
| 329 FcLangSet *langset = NULL; | |
| 330 FcFontSet *fontset = NULL; | |
| 331 FcObjectSet *objset = NULL; | |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
332 Lisp_Object script; |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
333 Lisp_Object registry = Qunicode_bmp; |
|
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
334 int weight = 0; |
|
90500
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
335 double dpi = -1; |
|
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
336 int spacing = -1; |
|
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
337 int scalable = -1; |
|
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
338 char otf_script[15]; /* For "otlayout\:XXXX" */ |
| 90400 | 339 |
| 340 val = null_vector; | |
| 341 | |
| 342 if (! fc_initialized) | |
| 343 { | |
| 344 FcInit (); | |
| 345 fc_initialized = 1; | |
| 346 } | |
| 347 | |
|
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
348 if (! NILP (AREF (spec, FONT_ADSTYLE_INDEX)) |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
349 && ! EQ (AREF (spec, FONT_ADSTYLE_INDEX), null_string)) |
| 90400 | 350 return val; |
|
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
351 if (! NILP (AREF (spec, FONT_SLANT_INDEX)) |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
352 && XINT (AREF (spec, FONT_SLANT_INDEX)) < 100) |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
353 /* Fontconfig doesn't support reverse-italic/obligue. */ |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
354 return val; |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
355 |
| 90400 | 356 if (! NILP (AREF (spec, FONT_REGISTRY_INDEX))) |
| 357 { | |
| 358 registry = AREF (spec, FONT_REGISTRY_INDEX); | |
| 359 if (EQ (registry, Qiso8859_1)) | |
| 360 { | |
| 361 if (! cs_iso8859_1 | |
| 362 && ftfont_build_basic_charsets () < 0) | |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
363 return Qnil; |
| 90400 | 364 charset = cs_iso8859_1; |
| 365 } | |
|
90623
4978b2cb6a9e
(ftfont_list): Allow registry "unicode-sip".
Kenichi Handa <handa@m17n.org>
parents:
90568
diff
changeset
|
366 else if (! EQ (registry, Qiso10646_1) |
|
4978b2cb6a9e
(ftfont_list): Allow registry "unicode-sip".
Kenichi Handa <handa@m17n.org>
parents:
90568
diff
changeset
|
367 && ! EQ (registry, Qunicode_bmp) |
|
4978b2cb6a9e
(ftfont_list): Allow registry "unicode-sip".
Kenichi Handa <handa@m17n.org>
parents:
90568
diff
changeset
|
368 && ! EQ (registry, Qunicode_sip)) |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
369 return val; |
| 90400 | 370 } |
| 371 | |
|
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
372 otf_script[0] = '\0'; |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
373 script = Qnil; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
374 for (extra = AREF (spec, FONT_EXTRA_INDEX); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
375 CONSP (extra); extra = XCDR (extra)) |
| 90400 | 376 { |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
377 Lisp_Object key, val; |
|
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
378 |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
379 tmp = XCAR (extra); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
380 key = XCAR (tmp), val = XCDR (tmp); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
381 if (EQ (key, QCotf)) |
|
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
382 { |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
383 script = assq_no_quit (val, Votf_script_alist); |
|
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
384 if (CONSP (script) && SYMBOLP (XCDR (script))) |
|
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
385 script = XCDR (script); |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
386 tmp = SYMBOL_NAME (val); |
|
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
387 sprintf (otf_script, "otlayout:%s", (char *) SDATA (tmp)); |
|
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
388 } |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
389 else if (EQ (key, QClanguage)) |
| 90400 | 390 { |
| 391 langset = FcLangSetCreate (); | |
| 392 if (! langset) | |
| 393 goto err; | |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
394 if (SYMBOLP (val)) |
| 90400 | 395 { |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
396 if (! FcLangSetAdd (langset, SYMBOL_FcChar8 (val))) |
| 90400 | 397 goto err; |
| 398 } | |
| 399 else | |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
400 for (; CONSP (val); val = XCDR (val)) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
401 if (SYMBOLP (XCAR (val)) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
402 && ! FcLangSetAdd (langset, SYMBOL_FcChar8 (XCAR (val)))) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
403 goto err; |
| 90400 | 404 } |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
405 else if (EQ (key, QCscript)) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
406 script = val; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
407 else if (EQ (key, QCdpi)) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
408 dpi = XINT (val); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
409 else if (EQ (key, QCspacing)) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
410 spacing = XINT (val); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
411 else if (EQ (key, QCscalable)) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
412 scalable = ! NILP (val); |
| 90400 | 413 } |
| 414 | |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
415 if (! NILP (script) && ! charset) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
416 { |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
417 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
|
418 |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
419 if (CONSP (chars)) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
420 { |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
421 charset = FcCharSetCreate (); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
422 if (! charset) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
423 goto err; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
424 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
|
425 if (CHARACTERP (XCAR (chars)) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
426 && ! FcCharSetAddChar (charset, XUINT (XCAR (chars)))) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
427 goto err; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
428 } |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
429 } |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
430 |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
431 pattern = FcPatternCreate (); |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
432 if (! pattern) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
433 goto err; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
434 tmp = AREF (spec, FONT_FOUNDRY_INDEX); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
435 if (SYMBOLP (tmp) && ! NILP (tmp) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
436 && ! FcPatternAddString (pattern, FC_FOUNDRY, SYMBOL_FcChar8 (tmp))) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
437 goto err; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
438 tmp = AREF (spec, FONT_FAMILY_INDEX); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
439 if (SYMBOLP (tmp) && ! NILP (tmp) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
440 && ! FcPatternAddString (pattern, FC_FAMILY, SYMBOL_FcChar8 (tmp))) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
441 goto err; |
|
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
442 /* Emacs conventionally doesn't distinguish normal, regular, and |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
443 medium weight, but fontconfig does. So, we can't restrict font |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
444 listing by weight. We check it after getting a list. */ |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
445 tmp = AREF (spec, FONT_WEIGHT_INDEX); |
|
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
446 if (INTEGERP (tmp)) |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
447 weight = XINT (tmp); |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
448 tmp = AREF (spec, FONT_SLANT_INDEX); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
449 if (INTEGERP (tmp) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
450 && ! FcPatternAddInteger (pattern, FC_SLANT, XINT (tmp) - 100)) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
451 goto err; |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
452 tmp = AREF (spec, FONT_WIDTH_INDEX); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
453 if (INTEGERP (tmp) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
454 && ! FcPatternAddInteger (pattern, FC_WIDTH, XINT (tmp))) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
455 goto err; |
| 90400 | 456 |
| 457 if (charset | |
| 458 && ! FcPatternAddCharSet (pattern, FC_CHARSET, charset)) | |
| 459 goto err; | |
| 460 if (langset | |
| 461 && ! FcPatternAddLangSet (pattern, FC_LANG, langset)) | |
| 462 goto err; | |
|
90500
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
463 if (dpi >= 0 |
|
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
464 && ! FcPatternAddDouble (pattern, FC_DPI, dpi)) |
|
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
465 goto err; |
|
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
466 if (spacing >= 0 |
|
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
467 && ! FcPatternAddInteger (pattern, FC_SPACING, spacing)) |
|
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
468 goto err; |
|
60e0667ab709
(ftfont_list): Handle properties dpi, spacing, and
Kenichi Handa <handa@m17n.org>
parents:
90480
diff
changeset
|
469 if (scalable >= 0 |
| 90522 | 470 && ! 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
|
471 goto err; |
| 90400 | 472 |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
473 objset = FcObjectSetBuild (FC_FOUNDRY, FC_FAMILY, FC_WEIGHT, FC_SLANT, |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
474 FC_WIDTH, FC_PIXEL_SIZE, FC_SPACING, |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
475 FC_CHARSET, FC_FILE, |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
476 #ifdef FC_FONTFORMAT |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
477 FC_FONTFORMAT, |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
478 #endif /* FC_FONTFORMAT */ |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
479 NULL); |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
480 if (! objset) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
481 goto err; |
|
90516
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
482 if (otf_script[0]) |
|
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
483 { |
|
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
484 #ifndef FC_CAPABILITY |
|
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
485 goto finish; |
|
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
486 #else /* not FC_CAPABILITY */ |
|
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
487 if (! FcObjectSetAdd (objset, FC_CAPABILITY)) |
|
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
488 goto err; |
|
90518
64c755511769
* ftfont.c (ftfont_list): Move misplaced #endif
Jan Dj?rv <jan.h.d@swipnet.se>
parents:
90516
diff
changeset
|
489 #endif /* not FC_CAPABILITY */ |
|
90516
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
490 } |
|
90474
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
491 |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
492 fontset = FcFontList (NULL, pattern, objset); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
493 if (! fontset) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
494 goto err; |
| 90400 | 495 |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
496 if (fontset->nfont > 0) |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
497 { |
|
90474
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
498 double pixel_size; |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
499 |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
500 if (NILP (AREF (spec, FONT_SIZE_INDEX))) |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
501 pixel_size = 0; |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
502 else |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
503 pixel_size = XINT (AREF (spec, FONT_SIZE_INDEX)); |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
504 |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
505 for (i = 0, val = Qnil; i < fontset->nfont; i++) |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
506 { |
|
90474
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
507 Lisp_Object entity; |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
508 |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
509 if (pixel_size > 0) |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
510 { |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
511 double this; |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
512 |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
513 if (FcPatternGetDouble (fontset->fonts[i], FC_PIXEL_SIZE, 0, |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
514 &this) == FcResultMatch |
|
90480
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
515 && ((this < pixel_size - FONT_PIXEL_SIZE_QUANTUM) |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
516 || (this > pixel_size + FONT_PIXEL_SIZE_QUANTUM))) |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
517 continue; |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
518 } |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
519 if (weight > 0) |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
520 { |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
521 int this; |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
522 |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
523 if (FcPatternGetInteger (fontset->fonts[i], FC_WEIGHT, 0, |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
524 &this) != FcResultMatch |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
525 || (this != weight |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
526 && (weight != 100 |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
527 || this < FC_WEIGHT_REGULAR |
|
908d27653432
(ftfont_list): Use assq_no_quit, not Fassq. Don't
Kenichi Handa <handa@m17n.org>
parents:
90474
diff
changeset
|
528 || this > FC_WEIGHT_MEDIUM))) |
|
90474
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
529 continue; |
|
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
530 } |
|
90516
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
531 #ifdef FC_CAPABILITY |
|
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
532 if (otf_script[0]) |
|
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
533 { |
|
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
534 FcChar8 *this; |
|
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
535 |
|
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
536 if (FcPatternGetString (fontset->fonts[i], FC_CAPABILITY, 0, |
|
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
537 &this) != FcResultMatch |
|
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
538 || ! strstr ((char *) this, otf_script)) |
|
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
539 continue; |
|
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
540 } |
|
90516
43ea66432bf9
(ftfont_list): Pay attention to the case that
Kenichi Handa <handa@m17n.org>
parents:
90514
diff
changeset
|
541 #endif /* FC_CAPABILITY */ |
|
90474
8627c9321afb
(ftfont_pattern_entity): Use the numeric value 100 for
Kenichi Handa <handa@m17n.org>
parents:
90464
diff
changeset
|
542 entity = ftfont_pattern_entity (fontset->fonts[i], frame, registry); |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
543 if (! NILP (entity)) |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
544 val = Fcons (entity, val); |
| 90400 | 545 } |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
546 val = Fvconcat (1, &val); |
| 90400 | 547 } |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
548 else if (! NILP (AREF (spec, FONT_FAMILY_INDEX))) |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
549 val = ftfont_list_generic_family (spec, frame, registry); |
| 90400 | 550 goto finish; |
| 551 | |
| 552 err: | |
| 553 /* 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
|
554 (usually insufficient memory). */ |
| 90400 | 555 val = Qnil; |
| 556 | |
| 557 finish: | |
| 558 if (charset && charset != cs_iso8859_1) FcCharSetDestroy (charset); | |
| 559 if (objset) FcObjectSetDestroy (objset); | |
| 560 if (fontset) FcFontSetDestroy (fontset); | |
| 561 if (langset) FcLangSetDestroy (langset); | |
| 562 if (pattern) FcPatternDestroy (pattern); | |
| 563 | |
| 564 return val; | |
| 565 } | |
| 566 | |
| 567 static Lisp_Object | |
|
90565
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
568 ftfont_match (frame, spec) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
569 Lisp_Object frame, spec; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
570 { |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
571 Lisp_Object extra, val, entity; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
572 FcPattern *pattern = NULL, *match = NULL; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
573 FcResult result; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
574 |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
575 if (! fc_initialized) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
576 { |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
577 FcInit (); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
578 fc_initialized = 1; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
579 } |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
580 |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
581 extra = AREF (spec, FONT_EXTRA_INDEX); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
582 val = assq_no_quit (QCname, extra); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
583 if (! CONSP (val) || ! STRINGP (XCDR (val))) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
584 return Qnil; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
585 |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
586 entity = Qnil; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
587 pattern = FcNameParse (SDATA (XCDR (val))); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
588 if (pattern) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
589 { |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
590 if (FcConfigSubstitute (NULL, pattern, FcMatchPattern) == FcTrue) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
591 { |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
592 FcDefaultSubstitute (pattern); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
593 match = FcFontMatch (NULL, pattern, &result); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
594 if (match) |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
595 { |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
596 entity = ftfont_pattern_entity (match, frame, Qunicode_bmp); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
597 FcPatternDestroy (match); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
598 } |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
599 } |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
600 FcPatternDestroy (pattern); |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
601 } |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
602 |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
603 return entity; |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
604 } |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
605 |
|
258e759bcffa
(ftfont_driver): Set ftfont_driver.match to
Kenichi Handa <handa@m17n.org>
parents:
90555
diff
changeset
|
606 static Lisp_Object |
| 90400 | 607 ftfont_list_family (frame) |
| 608 Lisp_Object frame; | |
| 609 { | |
| 610 Lisp_Object list; | |
| 611 FcPattern *pattern = NULL; | |
| 612 FcFontSet *fontset = NULL; | |
| 613 FcObjectSet *objset = NULL; | |
| 614 int i; | |
| 615 | |
| 616 if (! fc_initialized) | |
| 617 { | |
| 618 FcInit (); | |
| 619 fc_initialized = 1; | |
| 620 } | |
| 621 | |
| 622 pattern = FcPatternCreate (); | |
| 623 if (! pattern) | |
| 624 goto finish; | |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
625 objset = FcObjectSetBuild (FC_FAMILY, NULL); |
| 90400 | 626 if (! objset) |
| 627 goto finish; | |
| 628 fontset = FcFontList (NULL, pattern, objset); | |
| 629 if (! fontset) | |
| 630 goto finish; | |
| 631 | |
| 632 list = Qnil; | |
| 633 for (i = 0; i < fontset->nfont; i++) | |
| 634 { | |
| 635 FcPattern *pat = fontset->fonts[i]; | |
| 636 FcChar8 *str; | |
| 637 | |
| 638 if (FcPatternGetString (pat, FC_FAMILY, 0, &str) == FcResultMatch) | |
| 639 list = Fcons (intern_downcase ((char *) str, strlen ((char *) str)), | |
| 640 list); | |
| 641 } | |
| 642 | |
| 643 finish: | |
| 644 if (objset) FcObjectSetDestroy (objset); | |
| 645 if (fontset) FcFontSetDestroy (fontset); | |
| 646 if (pattern) FcPatternDestroy (pattern); | |
| 647 | |
| 648 return list; | |
| 649 } | |
| 650 | |
| 651 | |
| 652 static void | |
| 653 ftfont_free_entity (entity) | |
| 654 Lisp_Object entity; | |
| 655 { | |
| 656 Lisp_Object val = AREF (entity, FONT_EXTRA_INDEX); | |
| 657 FcPattern *pattern = XSAVE_VALUE (val)->pointer; | |
| 658 | |
| 659 FcPatternDestroy (pattern); | |
| 660 } | |
| 661 | |
| 662 static struct font * | |
| 663 ftfont_open (f, entity, pixel_size) | |
| 664 FRAME_PTR f; | |
| 665 Lisp_Object entity; | |
| 666 int pixel_size; | |
| 667 { | |
| 668 struct ftfont_info *ftfont_info; | |
| 669 struct font *font; | |
| 670 FT_Face ft_face; | |
| 671 FT_Size ft_size; | |
| 672 FT_UInt size; | |
| 673 Lisp_Object val; | |
| 674 FcPattern *pattern; | |
| 675 FcChar8 *file; | |
| 676 int spacing; | |
|
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
677 char *name; |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
678 int len; |
| 90400 | 679 |
| 680 val = AREF (entity, FONT_EXTRA_INDEX); | |
| 681 if (XTYPE (val) != Lisp_Misc | |
| 682 || XMISCTYPE (val) != Lisp_Misc_Save_Value) | |
| 683 return NULL; | |
| 684 pattern = XSAVE_VALUE (val)->pointer; | |
| 685 if (XSAVE_VALUE (val)->integer == 0) | |
| 686 { | |
| 687 /* We have not yet created FT_Face for this font. */ | |
| 688 if (! ft_library | |
| 689 && FT_Init_FreeType (&ft_library) != 0) | |
| 690 return NULL; | |
| 691 if (FcPatternGetString (pattern, FC_FILE, 0, &file) != FcResultMatch) | |
| 692 return NULL; | |
| 693 if (FT_New_Face (ft_library, (char *) file, 0, &ft_face) != 0) | |
| 694 return NULL; | |
| 695 FcPatternAddFTFace (pattern, FC_FT_FACE, ft_face); | |
| 696 ft_size = ft_face->size; | |
| 697 } | |
| 698 else | |
| 699 { | |
| 700 if (FcPatternGetFTFace (pattern, FC_FT_FACE, 0, &ft_face) | |
| 701 != FcResultMatch) | |
| 702 return NULL; | |
| 703 if (FT_New_Size (ft_face, &ft_size) != 0) | |
| 704 return NULL; | |
| 705 if (FT_Activate_Size (ft_size) != 0) | |
| 706 { | |
| 707 FT_Done_Size (ft_size); | |
| 708 return NULL; | |
| 709 } | |
| 710 } | |
| 711 | |
| 712 size = XINT (AREF (entity, FONT_SIZE_INDEX)); | |
| 713 if (size == 0) | |
| 714 size = pixel_size; | |
| 715 if (FT_Set_Pixel_Sizes (ft_face, size, size) != 0) | |
| 716 { | |
| 717 if (XSAVE_VALUE (val)->integer == 0) | |
| 718 FT_Done_Face (ft_face); | |
| 719 return NULL; | |
| 720 } | |
| 721 | |
| 722 ftfont_info = malloc (sizeof (struct ftfont_info)); | |
| 723 if (! ftfont_info) | |
| 724 return NULL; | |
| 725 ftfont_info->ft_size = ft_size; | |
| 726 | |
| 727 font = (struct font *) ftfont_info; | |
|
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
728 font->format = ftfont_font_format (pattern); |
| 90400 | 729 font->entity = entity; |
| 730 font->pixel_size = size; | |
| 731 font->driver = &ftfont_driver; | |
|
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
732 len = 96; |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
733 name = malloc (len); |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
734 while (name && font_unparse_fcname (entity, pixel_size, name, len) < 0) |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
735 { |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
736 char *new = realloc (name, len += 32); |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
737 |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
738 if (! new) |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
739 free (name); |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
740 name = new; |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
741 } |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
742 font->font.full_name = font->font.name = name; |
| 90400 | 743 font->file_name = (char *) file; |
| 744 font->font.size = ft_face->size->metrics.max_advance >> 6; | |
|
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
745 if (font->font.size <= 0) |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
746 font->font.size = size; |
|
90510
69dc5ab6d693
(ftfont_list): Handle QCotf property.
Kenichi Handa <handa@m17n.org>
parents:
90500
diff
changeset
|
747 font->font.charset = font->encoding_charset = font->repertory_charset = -1; |
| 90400 | 748 font->ascent = ft_face->size->metrics.ascender >> 6; |
| 749 font->descent = - ft_face->size->metrics.descender >> 6; | |
|
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
750 font->font.height = font->ascent + font->descent; |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
751 if (FcPatternGetInteger (pattern, FC_SPACING, 0, &spacing) != FcResultMatch) |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
752 spacing = FC_PROPORTIONAL; |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
753 if (spacing != FC_PROPORTIONAL) |
| 90400 | 754 font->font.average_width = font->font.space_width = font->font.size; |
| 755 else | |
| 756 { | |
| 757 int i; | |
| 758 | |
| 759 for (i = 32; i < 127; i++) | |
| 760 { | |
| 761 if (FT_Load_Char (ft_face, i, FT_LOAD_DEFAULT) != 0) | |
| 762 break; | |
| 763 if (i == 32) | |
| 764 font->font.space_width = ft_face->glyph->metrics.horiAdvance >> 6; | |
| 765 font->font.average_width += ft_face->glyph->metrics.horiAdvance >> 6; | |
| 766 } | |
| 767 if (i == 127) | |
| 768 { | |
| 769 /* The font contains all ASCII printable characters. */ | |
| 770 font->font.average_width /= 95; | |
| 771 } | |
| 772 else | |
| 773 { | |
| 774 if (i == 32) | |
| 775 font->font.space_width = font->font.size; | |
| 776 font->font.average_width = font->font.size; | |
| 777 } | |
| 778 } | |
| 779 | |
|
90555
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
780 /* Unfortunately FreeType doesn't provide a way to get minimum char |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
781 width. So, we use space_width instead. */ |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
782 font->min_width = font->font.space_width; |
|
45553626fa76
(ftfont_open): Set font->font.full_name and
Kenichi Handa <handa@m17n.org>
parents:
90524
diff
changeset
|
783 |
| 90400 | 784 font->font.baseline_offset = 0; |
| 785 font->font.relative_compose = 0; | |
| 786 font->font.default_ascent = 0; | |
| 787 font->font.vertical_centering = 0; | |
| 788 | |
| 789 (XSAVE_VALUE (val)->integer)++; | |
| 790 | |
| 791 return font; | |
| 792 } | |
| 793 | |
| 794 static void | |
| 795 ftfont_close (f, font) | |
| 796 FRAME_PTR f; | |
| 797 struct font *font; | |
| 798 { | |
| 799 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
| 800 Lisp_Object entity = font->entity; | |
| 801 Lisp_Object val = AREF (entity, FONT_EXTRA_INDEX); | |
| 802 | |
| 803 (XSAVE_VALUE (val)->integer)--; | |
| 804 if (XSAVE_VALUE (val)->integer == 0) | |
| 805 FT_Done_Face (ftfont_info->ft_size->face); | |
| 806 else | |
| 807 FT_Done_Size (ftfont_info->ft_size); | |
| 808 | |
| 809 free (font); | |
| 810 } | |
| 811 | |
| 812 static int | |
| 813 ftfont_has_char (entity, c) | |
| 814 Lisp_Object entity; | |
| 815 int c; | |
| 816 { | |
| 817 Lisp_Object val; | |
| 818 FcPattern *pattern; | |
| 819 FcCharSet *charset; | |
| 820 | |
| 821 val = AREF (entity, FONT_EXTRA_INDEX); | |
| 822 pattern = XSAVE_VALUE (val)->pointer; | |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
823 if (FcPatternGetCharSet (pattern, FC_CHARSET, 0, &charset) != FcResultMatch) |
|
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
824 return -1; |
| 90400 | 825 return (FcCharSetHasChar (charset, (FcChar32) c) == FcTrue); |
| 826 } | |
| 827 | |
| 828 static unsigned | |
| 829 ftfont_encode_char (font, c) | |
| 830 struct font *font; | |
| 831 int c; | |
| 832 { | |
| 833 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
| 834 FT_Face ft_face = ftfont_info->ft_size->face; | |
| 835 FT_ULong charcode = c; | |
| 836 FT_UInt code = FT_Get_Char_Index (ft_face, charcode); | |
| 837 | |
| 838 return (code > 0 ? code : 0xFFFFFFFF); | |
| 839 } | |
| 840 | |
| 841 static int | |
| 842 ftfont_text_extents (font, code, nglyphs, metrics) | |
| 843 struct font *font; | |
| 844 unsigned *code; | |
| 845 int nglyphs; | |
| 846 struct font_metrics *metrics; | |
| 847 { | |
| 848 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
| 849 FT_Face ft_face = ftfont_info->ft_size->face; | |
| 850 int width = 0; | |
| 851 int i; | |
| 852 | |
| 853 if (ftfont_info->ft_size != ft_face->size) | |
| 854 FT_Activate_Size (ftfont_info->ft_size); | |
| 855 if (metrics) | |
| 856 bzero (metrics, sizeof (struct font_metrics)); | |
| 857 for (i = 0; i < nglyphs; i++) | |
| 858 { | |
| 859 if (FT_Load_Glyph (ft_face, code[i], FT_LOAD_DEFAULT) == 0) | |
| 860 { | |
| 861 FT_Glyph_Metrics *m = &ft_face->glyph->metrics; | |
| 862 | |
| 863 if (metrics) | |
| 864 { | |
| 865 if (metrics->lbearing > width + (m->horiBearingX >> 6)) | |
| 866 metrics->lbearing = width + (m->horiBearingX >> 6); | |
| 867 if (metrics->rbearing | |
| 868 < width + ((m->horiBearingX + m->width) >> 6)) | |
| 869 metrics->rbearing | |
| 870 = width + ((m->horiBearingX + m->width) >> 6); | |
| 871 if (metrics->ascent < (m->horiBearingY >> 6)) | |
| 872 metrics->ascent = m->horiBearingY >> 6; | |
| 873 if (metrics->descent > ((m->horiBearingY + m->height) >> 6)) | |
| 874 metrics->descent = (m->horiBearingY + m->height) >> 6; | |
| 875 } | |
| 876 width += m->horiAdvance >> 6; | |
| 877 } | |
| 878 else | |
| 879 { | |
| 880 width += font->font.space_width; | |
| 881 } | |
| 882 } | |
| 883 if (metrics) | |
| 884 metrics->width = width; | |
| 885 | |
| 886 return width; | |
| 887 } | |
| 888 | |
| 889 static int | |
| 890 ftfont_get_bitmap (font, code, bitmap, bits_per_pixel) | |
| 891 struct font *font; | |
| 892 unsigned code; | |
| 893 struct font_bitmap *bitmap; | |
| 894 int bits_per_pixel; | |
| 895 { | |
| 896 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
| 897 FT_Face ft_face = ftfont_info->ft_size->face; | |
| 898 FT_Int32 load_flags = FT_LOAD_RENDER; | |
| 899 | |
| 900 if (ftfont_info->ft_size != ft_face->size) | |
| 901 FT_Activate_Size (ftfont_info->ft_size); | |
| 902 if (bits_per_pixel == 1) | |
| 903 { | |
| 904 #ifdef FT_LOAD_TARGET_MONO | |
| 905 load_flags |= FT_LOAD_TARGET_MONO; | |
| 906 #else | |
| 907 load_flags |= FT_LOAD_MONOCHROME; | |
| 908 #endif | |
| 909 } | |
| 910 else if (bits_per_pixel != 8) | |
| 911 /* We don't support such a rendering. */ | |
| 912 return -1; | |
| 913 | |
| 914 if (FT_Load_Glyph (ft_face, code, load_flags) != 0) | |
| 915 return -1; | |
| 916 bitmap->rows = ft_face->glyph->bitmap.rows; | |
| 917 bitmap->width = ft_face->glyph->bitmap.width; | |
| 918 bitmap->pitch = ft_face->glyph->bitmap.pitch; | |
| 919 bitmap->buffer = ft_face->glyph->bitmap.buffer; | |
| 920 bitmap->left = ft_face->glyph->bitmap_left; | |
| 921 bitmap->top = ft_face->glyph->bitmap_top; | |
| 922 bitmap->advance = ft_face->glyph->metrics.horiAdvance >> 6; | |
| 923 bitmap->extra = NULL; | |
| 924 | |
| 925 return 0; | |
| 926 } | |
| 927 | |
| 928 static int | |
| 929 ftfont_anchor_point (font, code, index, x, y) | |
| 930 struct font *font; | |
| 931 unsigned code; | |
| 932 int index; | |
| 933 int *x, *y; | |
| 934 { | |
| 935 struct ftfont_info *ftfont_info = (struct ftfont_info *) font; | |
| 936 FT_Face ft_face = ftfont_info->ft_size->face; | |
| 937 | |
| 938 if (ftfont_info->ft_size != ft_face->size) | |
| 939 FT_Activate_Size (ftfont_info->ft_size); | |
| 940 if (FT_Load_Glyph (ft_face, code, FT_LOAD_DEFAULT) != 0) | |
| 941 return -1; | |
| 942 if (ft_face->glyph->format != FT_GLYPH_FORMAT_OUTLINE) | |
| 943 return -1; | |
| 944 if (index >= ft_face->glyph->outline.n_points) | |
| 945 return -1; | |
| 946 *x = ft_face->glyph->outline.points[index].x; | |
| 947 *y = ft_face->glyph->outline.points[index].y; | |
| 948 return 0; | |
| 949 } | |
| 950 | |
|
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
951 Lisp_Object |
|
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
952 ftfont_font_format (FcPattern *pattern) |
|
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
953 { |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
954 FcChar8 *str; |
|
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
955 |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
956 #ifdef FC_FONTFORMAT |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
957 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
|
958 return Qnil; |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
959 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
|
960 return intern ("truetype"); |
|
90963
28e2fa3c7ca3
(ftfont_font_format): Typo fix.
Jason Rumney <jasonr@gnu.org>
parents:
90819
diff
changeset
|
961 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
|
962 return intern ("type1"); |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
963 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
|
964 return intern ("pcf"); |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
965 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
|
966 return intern ("bdf"); |
|
90680
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
967 #else /* not FC_FONTFORMAT */ |
|
90697
444b40002533
(ftfont_driver): Initialize ftfont_driver.type by 0.
Kenichi Handa <handa@m17n.org>
parents:
90680
diff
changeset
|
968 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
|
969 return Qnil; |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
970 if (strcasestr ((char *) str, ".ttf") == 0) |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
971 return intern ("truetype"); |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
972 if (strcasestr ((char *) str, "pfb") == 0) |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
973 return intern ("type1"); |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
974 if (strcasestr ((char *) str, "pcf") == 0) |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
975 return intern ("pcf"); |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
976 if (strcasestr ((char *) str, "bdf") == 0) |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
977 return intern ("bdf"); |
|
254cfd053f9c
(ftfont_pattern_entity): Check if FC_FONTFORMAT is
Kenichi Handa <handa@m17n.org>
parents:
90676
diff
changeset
|
978 #endif /* not FC_FONTFORMAT */ |
|
90676
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
979 return intern ("unknown"); |
|
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
980 } |
|
c43c3837f597
(ftfont_pattern_entity): Add fontformat in a pattern.
Kenichi Handa <handa@m17n.org>
parents:
90623
diff
changeset
|
981 |
| 90400 | 982 |
| 983 void | |
| 984 syms_of_ftfont () | |
| 985 { | |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
986 DEFSYM (Qfreetype, "freetype"); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
987 DEFSYM (Qmonospace, "monospace"); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
988 DEFSYM (Qsans_serif, "sans-serif"); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
989 DEFSYM (Qserif, "serif"); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
990 DEFSYM (Qmono, "mono"); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
991 DEFSYM (Qsans, "sans"); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
992 DEFSYM (Qsans__serif, "sans serif"); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
993 |
| 90400 | 994 staticpro (&freetype_font_cache); |
|
90441
d63258b13d84
(Qiso8859_1, Qiso10646_1, Qunicode_bmp): Moved to
Kenichi Handa <handa@m17n.org>
parents:
90427
diff
changeset
|
995 freetype_font_cache = Fcons (Qt, Qnil); |
| 90400 | 996 |
|
90464
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
997 staticpro (&ftfont_generic_family_list); |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
998 ftfont_generic_family_list |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
999 = Fcons (Fcons (Qmonospace, Qt), |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1000 Fcons (Fcons (Qsans_serif, Qt), |
|
4702b592db4c
(Qmonospace, Qsans_serif, Qserif, Qmono, Qsans)
Kenichi Handa <handa@m17n.org>
parents:
90450
diff
changeset
|
1001 Fcons (Fcons (Qsans, Qt), Qnil))); |
| 90400 | 1002 |
| 1003 ftfont_driver.type = Qfreetype; | |
| 1004 register_font_driver (&ftfont_driver, NULL); | |
| 1005 } | |
| 90427 | 1006 |
| 1007 /* arch-tag: 7cfa432c-33a6-4988-83d2-a82ed8604aca | |
| 1008 (do not change this comment) */ |
