*** empty log message ***
[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   unsigned for_full_width : 1;
111   /* Pixel size of the font in 1/10 pixels.  The negative value means
112      a point size in 1/10 pt.  */
113   int size : 25;
114   MSymbol file;
115   MSymbol capability;
116   MFontEncoding *encoding;
117 };
118
119 typedef struct
120 {
121   int size, inc, used;
122   MSymbol property;
123   MSymbol *names;
124 } MFontPropertyTable;
125
126 extern MFontPropertyTable mfont__property_table[MFONT_REGISTRY + 1];
127
128 /** Return the symbol of the Nth font property of FONT.  */
129 #define FONT_PROPERTY(font, n)  \
130   (mfont__property_table[(n)].names[(font)->property[(n)]])
131
132 struct MRealizedFont
133 {
134   /* Font spec used to find the font.
135      MRealizedFont::spec.property[MFONT_TYPE] is MFONT_TYPE_REALIZED
136      so that this object can be distingushed from MFont.  */
137   MFont spec;
138
139   /* Frame on which the font is realized.  */
140   MFrame *frame;
141
142   /* The found font.  */
143   MFont *font;
144
145   MFontDriver *driver;
146
147   /* Font Layout Table for the font.  This is just a container to
148      carry the infomation.  */
149   MSymbol layouter;
150
151   /* 1 iff the font is opend by encapsulating client-side font data.  */
152   int encapsulating;
153
154   /* Extra information set by MRealizedFont::driver->open.  If
155      non-NULL, it must be a pointer to a managed object.  */
156   void *info;
157
158   int ascent, descent, max_advance, average_width, baseline_offset;
159
160   /* Pointer to the font structure.  */
161   void *fontp;
162
163   MRealizedFont *next;
164 };
165
166 typedef struct {
167   MFont *font;
168   int score;
169 } MFontScore;
170
171 /** Structure to hold a list of fonts.  */
172
173 typedef struct
174 {
175   MFont object;
176   MFontScore *fonts;
177   int nfonts;
178 } MFontList;
179
180 struct MFontDriver
181 {
182   /** Return a font best matching with FONT.  */
183   MFont *(*select) (MFrame *frame, MFont *font, int limited_size);
184
185   /** Open a font specified by RFONT.  */
186   MRealizedFont *(*open) (MFrame *frame, MFont *font, MFont *spec,
187                           MRealizedFont *rfont);
188
189   /** Set metrics of glyphs in GSTRING from FROM to TO.  */
190   void (*find_metric) (MRealizedFont *rfont, MGlyphString *gstring,
191                        int from, int to);
192
193   /** Check if the font has a glyph for CODE.  CODE is a code point of
194       a character in font->encoder->encoding_charset.  Return nonzero
195       iff the font has the glyph.  */
196   int (*has_char) (MFrame *frame, MFont *font, MFont *spec,
197                    int c, unsigned code);
198
199   /** Encode CODE into a glyph code the font.  CODE is a code point of
200       a character in rfont->encoder->encoding_charset.  If the font
201       has no glyph for CODE, return MCHAR_INVALID_CODE.  */
202   unsigned (*encode_char) (MFrame *frame, MFont *font, MFont *spec,
203                            unsigned code);
204
205   /** Draw glyphs from FROM to TO (exclusive) on window WIN of FRAME
206       at coordinate (X, Y) relative to WIN.  */
207   void (*render) (MDrawWindow win, int x, int y,
208                   MGlyphString *gstring, MGlyph *from, MGlyph *to,
209                   int reverse, MDrawRegion region);
210
211   /** Push to PLIST fonts matching with FONT.  MAXNUM if greater than
212       0 limits the number of listed fonts.  Return the number of fonts
213       listed.  */
214   int (*list) (MFrame *frame, MPlist *plist, MFont *font, int maxnum);
215
216   /** Push to PLIST font family names (symbol) available on FRAME.  */
217   void (*list_family_names) (MFrame *frame, MPlist *plist);
218
219   /** Check if RFONT support CAPABILITY.  */
220   int (*check_capability) (MRealizedFont *rfont, MSymbol capability);
221
222   /** Open a font by encapsulating DATA.  */
223   MRealizedFont *(*encapsulate) (MFrame *frame, MSymbol source, void *data);
224
225   void (*close) (MRealizedFont *rfont);
226 };
227
228 /** Initialize the members of FONT.  */
229
230 #define MFONT_INIT(font) memset ((font), 0, sizeof (MFont))
231
232 extern MSymbol Mlayouter;
233 extern MSymbol Miso8859_1, Miso10646_1, Municode_bmp, Municode_full;
234 extern MSymbol Mapple_roman;
235
236 extern int mfont__flt_init ();
237
238 extern void mfont__flt_fini ();
239
240 #ifdef HAVE_FREETYPE
241 #include <ft2build.h>
242 #include FT_FREETYPE_H
243
244 #ifdef HAVE_FONTCONFIG
245 #include <fontconfig/fontconfig.h>
246 #endif
247
248 #ifdef HAVE_OTF
249 #include <otf.h>
250 #else  /* not HAVE_OTF */
251 typedef unsigned OTF_Tag;
252 #endif /* not HAVE_OTF */
253
254 enum MFontOpenTypeTable
255   {
256     MFONT_OTT_GSUB,
257     MFONT_OTT_GPOS,
258     MFONT_OTT_MAX
259   };
260
261 typedef struct
262 {
263   M17NObject control;
264   MSymbol language;
265   MSymbol script;
266   MSymbol otf;
267   OTF_Tag script_tag;
268   OTF_Tag langsys_tag;
269   struct {
270     char *str;
271     int nfeatures;
272     OTF_Tag *tags;
273   } features[MFONT_OTT_MAX];
274 } MFontCapability;
275
276 extern MFontDriver mfont__ft_driver;
277
278 extern int mfont__ft_init ();
279
280 extern void mfont__ft_fini ();
281
282 extern int mfont__ft_parse_name (const char *name, MFont *font);
283
284 extern char *mfont__ft_unparse_name (MFont *font);
285
286 #ifdef HAVE_OTF
287
288 extern int mfont__ft_drive_otf (MGlyphString *gstring, int from, int to,
289                                 MFontCapability *capability);
290
291 extern int mfont__ft_decode_otf (MGlyph *g);
292
293 #endif  /* HAVE_OTF */
294
295 #endif /* HAVE_FREETYPE */
296
297 extern void mfont__free_realized (MRealizedFont *rfont);
298
299 extern int mfont__match_p (MFont *font, MFont *spec, int prop);
300
301 extern int mfont__merge (MFont *dst, MFont *src, int error_on_conflict);
302
303 extern void mfont__set_spec_from_face (MFont *spec, MFace *face);
304
305 extern MSymbol mfont__set_spec_from_plist (MFont *spec, MPlist *plist);
306
307 extern int mfont__has_char (MFrame *frame, MFont *font, MFont *spec, int c);
308
309 extern unsigned mfont__encode_char (MFrame *frame, MFont *font, MFont *spec,
310                                     int c);
311
312 extern MFont *mfont__select (MFrame *frame, MFont *font, int max_size);
313
314 extern MFontList *mfont__list (MFrame *frame, MFont *spec, MFont *request,
315                                int limited_size);
316
317 extern MRealizedFont *mfont__open (MFrame *frame, MFont *font, MFont *spec);
318
319 extern void mfont__get_metric (MGlyphString *gstring, int from, int to);
320
321 extern void mfont__set_property (MFont *font, enum MFontProperty key,
322                                  MSymbol val);
323
324 extern int mfont__split_name (char *name, int *property_idx,
325                               unsigned short *point, unsigned short *resy);
326
327 extern int mfont__parse_name_into_font (const char *name, MSymbol format,
328                                         MFont *font);
329
330 extern MPlist *mfont__encoding_list (void);
331
332 extern MFontCapability *mfont__get_capability (MSymbol sym);
333
334 extern int mfont__check_capability (MRealizedFont *rfont, MSymbol capability);
335
336 extern unsigned mfont__flt_encode_char (MSymbol layouter_name, int c);
337
338 extern int mfont__flt_run (MGlyphString *gstring, int from, int to,
339                            MRealizedFace *rface);
340
341 #endif /* _M17N_FONT_H_ */