(MRealizedFont): New member max_advance.
[m17n/m17n-lib.git] / src / font.h
1 /* font.h -- header file for the font module.
2    Copyright (C) 2003, 2004
3      National Institute of Advanced Industrial Science and Technology (AIST)
4      Registration Number H15PRO112
5
6    This file is part of the m17n library.
7
8    The m17n library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Lesser General Public License
10    as published by the Free Software Foundation; either version 2.1 of
11    the License, or (at your option) any later version.
12
13    The m17n library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Lesser General Public License for more details.
17
18    You should have received a copy of the GNU Lesser General Public
19    License along with the m17n library; if not, write to the Free
20    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21    02111-1307, USA.  */
22
23 #ifndef _M17N_FONT_H_
24 #define _M17N_FONT_H_
25
26 enum MFontProperty
27   {
28     /* The order of MFONT_FOUNDRY to MFONT_ADSTYLE must be the same as
29        enum MFaceProperty.  */
30     MFONT_FOUNDRY,
31     MFONT_FAMILY,
32     MFONT_WEIGHT,
33     MFONT_STYLE,
34     MFONT_STRETCH,
35     MFONT_ADSTYLE,
36     MFONT_REGISTRY,
37     MFONT_RESY,
38     /* The follwoings should not be used as an index to
39        MFont->propperty.  */
40     MFONT_SIZE,
41     MFONT_SPACING,
42     /* anchor */
43     MFONT_PROPERTY_MAX = MFONT_SIZE
44   };
45
46 enum MFontType
47   {
48     MFONT_TYPE_SPEC,
49     MFONT_TYPE_OBJECT,
50     MFONT_TYPE_REALIZED,
51     MFONT_TYPE_FAILURE
52   };
53
54 enum MFontSource
55   {
56     MFONT_SOURCE_UNDECIDED = 0,
57     MFONT_SOURCE_X = 1,
58     MFONT_SOURCE_FT = 2
59   };
60
61 enum MFontSpacing
62   {
63     MFONT_SPACING_UNDECIDED,
64     MFONT_SPACING_PROPORTIONAL,
65     MFONT_SPACING_MONO,
66     MFONT_SPACING_CHARCELL
67   };
68
69 typedef struct MFontEncoding MFontEncoding;
70 typedef struct MFontDriver MFontDriver;
71
72 /** Information about a font.  This structure is used in three ways:
73     FONT-OBJ, FONT-OPENED, and FONT-SPEC.  
74
75     FONT-OBJ: To store information of an existing font.  Instances
76     appear only in <font_list> of MDisplay.
77
78     FONT-OPENED: To store information of an opened font.  Instances
79     appear only in <opend_list> of MDisplay.
80
81     FONT-SPEC: To store specifications of a font.  Instances appear
82     only in <spec_list> of MFontset.  */
83
84 struct MFont
85 {
86   /** Numeric value of each font property.  Also used as an index to
87       the table @c mfont__property_table to get the actual name of the
88       property.
89
90       For FONT-OBJ, FONT-OPENED: The value is greater than zero.
91
92       For FONT-SPEC: The value is equal to or greater than zero.  Zero
93       means that the correponding property is not specified (i.e. wild
94       card).
95
96       For FONT-OBJ: If the value is 0, the font is scalable or
97       auto-scaled.
98
99       For FONT-OPENED: The actual size of opened font.
100
101       <property>[MFONT_RESY] is the designed resolution of the font in
102       DPI, or zero.  Zero means that the font is scalable.
103
104       For the time being, we mention only Y-resolution (resy) and
105       assume that resx is always equal to resy.  */
106   unsigned short property[MFONT_PROPERTY_MAX];
107   enum MFontType type : 2;
108   enum MFontSource source : 2;
109   enum MFontSpacing spacing : 2;
110   /* Pixel size of the font in 1/10 pixels.  The negative value means
111      a point size in 1/10 pt.  */
112   int size : 26;
113   MSymbol file;
114   MSymbol capability;
115   MFontEncoding *encoding;
116 };
117
118 typedef struct
119 {
120   int size, inc, used;
121   MSymbol property;
122   MSymbol *names;
123 } MFontPropertyTable;
124
125 extern MFontPropertyTable mfont__property_table[MFONT_REGISTRY + 1];
126
127 /** Return the symbol of the Nth font property of FONT.  */
128 #define FONT_PROPERTY(font, n)  \
129   (mfont__property_table[(n)].names[(font)->property[(n)]])
130
131 struct MRealizedFont
132 {
133   /* Font spec used to find the font.
134      MRealizedFont::spec.property[MFONT_TYPE] is MFONT_TYPE_REALIZED
135      so that this object can be distingushed from MFont.  */
136   MFont spec;
137
138   /* Frame on which the font is realized.  */
139   MFrame *frame;
140
141   /* The found font.  */
142   MFont *font;
143
144   MFontDriver *driver;
145
146   /* Font Layout Table for the font.  This is just a container to
147      carry the infomation.  */
148   MSymbol layouter;
149
150   /* Extra information set by MRealizedFont::driver->open.  If
151      non-NULL, it must be a pointer to a managed object.  */
152   void *info;
153
154   int ascent, descent, max_advance;
155
156   /* Pointer to the font structure.  */
157   void *fontp;
158
159   MRealizedFont *next;
160 };
161
162 typedef struct {
163   MFont *font;
164   int score;
165 } MFontScore;
166
167 /** Structure to hold a list of fonts.  */
168
169 typedef struct
170 {
171   MFont object;
172   MFontScore *fonts;
173   int nfonts;
174 } MFontList;
175
176 struct MFontDriver
177 {
178   /** Return a font best matching with FONT.  */
179   MFont *(*select) (MFrame *frame, MFont *font, int limited_size);
180
181   /** Open a font specified by RFONT.  */
182   MRealizedFont *(*open) (MFrame *frame, MFont *font, MFont *spec,
183                           MRealizedFont *rfont);
184
185   /** Set metrics of glyphs in GSTRING from FROM to TO.  */
186   void (*find_metric) (MRealizedFont *rfont, MGlyphString *gstring,
187                        int from, int to);
188
189   /** Check if the font has a glyph for CODE.  CODE is a code point of
190       a character in font->encoder->encoding_charset.  Return nonzero
191       iff the font has the glyph.  */
192   int (*has_char) (MFrame *frame, MFont *font, MFont *spec,
193                    int c, unsigned code);
194
195   /** Encode CODE into a glyph code the font.  CODE is a code point of
196       a character in rfont->encoder->encoding_charset.  If the font
197       has no glyph for CODE, return MCHAR_INVALID_CODE.  */
198   unsigned (*encode_char) (MFrame *frame, MFont *font, MFont *spec,
199                            unsigned code);
200
201   /** Draw glyphs from FROM to TO (exclusive) on window WIN of FRAME
202       at coordinate (X, Y) relative to WIN.  */
203   void (*render) (MDrawWindow win, int x, int y,
204                   MGlyphString *gstring, MGlyph *from, MGlyph *to,
205                   int reverse, MDrawRegion region);
206
207   /** Push to PLIST fonts matching with FONT.  MAXNUM if greater than
208       0 limits the number of listed fonts.  Return the number of fonts
209       listed.  */
210   int (*list) (MFrame *frame, MPlist *plist, MFont *font, int maxnum);
211 };
212
213 /** Initialize the members of FONT.  */
214
215 #define MFONT_INIT(font) memset ((font), 0, sizeof (MFont))
216
217 extern MSymbol Mlayouter;
218 extern MSymbol Miso8859_1, Miso10646_1, Municode_bmp, Municode_full;
219 extern MSymbol Mapple_roman;
220
221 extern int mfont__flt_init ();
222
223 extern void mfont__flt_fini ();
224
225 #ifdef HAVE_FREETYPE
226 #include <ft2build.h>
227 #include FT_FREETYPE_H
228
229 #ifdef HAVE_FONTCONFIG
230 #include <fontconfig/fontconfig.h>
231 #endif
232
233 #ifdef HAVE_OTF
234 #include <otf.h>
235 #else  /* not HAVE_OTF */
236 typedef unsigned OTF_Tag;
237 #endif /* not HAVE_OTF */
238
239 enum MFontOpenTypeTable
240   {
241     MFONT_OTT_GSUB,
242     MFONT_OTT_GPOS,
243     MFONT_OTT_MAX
244   };
245
246 typedef struct
247 {
248   M17NObject control;
249   MSymbol *lang;
250   MSymbol script;
251   OTF_Tag script_tag;
252 #ifdef HAVE_OTF
253   OTF_Tag langsys_tag;
254   struct {
255     char *str;
256     int nfeatures;
257     OTF_Tag *tags;
258   } features[MFONT_OTT_MAX];
259 #endif
260 } MFontCapability;
261
262 extern MFontDriver mfont__ft_driver;
263
264 extern int mfont__ft_init ();
265
266 extern void mfont__ft_fini ();
267
268 extern int mfont__ft_parse_name (const char *name, MFont *font);
269
270 extern char *mfont__ft_unparse_name (MFont *font);
271
272 #ifdef HAVE_OTF
273
274 extern int mfont__ft_drive_otf (MGlyphString *gstring, int from, int to,
275                                 MFontCapability *capability);
276
277 extern int mfont__ft_decode_otf (MGlyph *g);
278
279 #endif  /* HAVE_OTF */
280
281 #endif /* HAVE_FREETYPE */
282
283 extern void mfont__free_realized (MRealizedFont *rfont);
284
285 extern int mfont__match_p (MFont *font, MFont *spec, int prop);
286
287 extern int mfont__merge (MFont *dst, MFont *src, int error_on_conflict);
288
289 extern void mfont__set_spec_from_face (MFont *spec, MFace *face);
290
291 extern MSymbol mfont__set_spec_from_plist (MFont *spec, MPlist *plist);
292
293 extern void mfont__resize (MFont *spec, MFont *request);
294
295 extern int mfont__has_char (MFrame *frame, MFont *font, MFont *spec, int c);
296
297 extern unsigned mfont__encode_char (MFrame *frame, MFont *font, MFont *spec,
298                                     int c);
299
300 extern MFont *mfont__select (MFrame *frame, MFont *font, int max_size);
301
302 extern MFontList *mfont__list (MFrame *frame, MFont *spec, MFont *request,
303                                int limited_size);
304
305 extern MRealizedFont *mfont__open (MFrame *frame, MFont *font, MFont *spec);
306
307 extern void mfont__get_metric (MGlyphString *gstring, int from, int to);
308
309 extern void mfont__set_property (MFont *font, enum MFontProperty key,
310                                  MSymbol val);
311
312 extern int mfont__split_name (char *name, int *property_idx,
313                               unsigned short *point, unsigned short *resy);
314
315 extern int mfont__parse_name_into_font (const char *name, MSymbol format,
316                                         MFont *font);
317
318 extern MPlist *mfont__encoding_list (void);
319
320 extern MFontCapability *mfont__get_capability (MSymbol sym);
321
322 extern unsigned mfont__flt_encode_char (MSymbol layouter_name, int c);
323
324 extern int mfont__flt_run (MGlyphString *gstring, int from, int to,
325                            MRealizedFace *rface);
326
327 #endif /* _M17N_FONT_H_ */