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