summaryrefslogtreecommitdiff
path: root/src/ftfont.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ftfont.c')
-rw-r--r--src/ftfont.c270
1 files changed, 117 insertions, 153 deletions
diff --git a/src/ftfont.c b/src/ftfont.c
index 4699c74470f..b0d10791379 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -80,27 +80,27 @@ enum ftfont_cache_for
FTFONT_CACHE_FOR_ENTITY
};
-static Lisp_Object ftfont_pattern_entity P_ ((FcPattern *, Lisp_Object));
+static Lisp_Object ftfont_pattern_entity (FcPattern *, Lisp_Object);
-static Lisp_Object ftfont_resolve_generic_family P_ ((Lisp_Object,
- FcPattern *));
-static Lisp_Object ftfont_lookup_cache P_ ((Lisp_Object,
- enum ftfont_cache_for));
+static Lisp_Object ftfont_resolve_generic_family (Lisp_Object,
+ FcPattern *);
+static Lisp_Object ftfont_lookup_cache (Lisp_Object,
+ enum ftfont_cache_for);
-static void ftfont_filter_properties P_ ((Lisp_Object font, Lisp_Object alist));
+static void ftfont_filter_properties (Lisp_Object font, Lisp_Object alist);
-Lisp_Object ftfont_font_format P_ ((FcPattern *, Lisp_Object));
+Lisp_Object ftfont_font_format (FcPattern *, Lisp_Object);
#define SYMBOL_FcChar8(SYM) (FcChar8 *) SDATA (SYMBOL_NAME (SYM))
static struct
{
/* registry name */
- char *name;
+ const char *name;
/* characters to distinguish the charset from the others */
int uniquifier[6];
/* additional constraint by language */
- char *lang;
+ const char *lang;
/* set on demand */
FcCharSet *fc_charset;
} fc_charset_table[] =
@@ -144,8 +144,6 @@ static struct
{ NULL }
};
-extern Lisp_Object Qc, Qm, Qp, Qd;
-
/* Dirty hack for handing ADSTYLE property.
Fontconfig (actually the underlying FreeType) gives such ADSTYLE
@@ -188,9 +186,7 @@ get_adstyle_property (FcPattern *p)
}
static Lisp_Object
-ftfont_pattern_entity (p, extra)
- FcPattern *p;
- Lisp_Object extra;
+ftfont_pattern_entity (FcPattern *p, Lisp_Object extra)
{
Lisp_Object key, cache, entity;
char *file, *str;
@@ -289,9 +285,7 @@ ftfont_pattern_entity (p, extra)
static Lisp_Object ftfont_generic_family_list;
static Lisp_Object
-ftfont_resolve_generic_family (family, pattern)
- Lisp_Object family;
- FcPattern *pattern;
+ftfont_resolve_generic_family (Lisp_Object family, FcPattern *pattern)
{
Lisp_Object slot;
FcPattern *match;
@@ -348,9 +342,7 @@ struct ftfont_cache_data
};
static Lisp_Object
-ftfont_lookup_cache (key, cache_for)
- Lisp_Object key;
- enum ftfont_cache_for cache_for;
+ftfont_lookup_cache (Lisp_Object key, enum ftfont_cache_for cache_for)
{
Lisp_Object cache, val, entity;
struct ftfont_cache_data *cache_data;
@@ -450,8 +442,7 @@ ftfont_lookup_cache (key, cache_for)
}
FcCharSet *
-ftfont_get_fc_charset (entity)
- Lisp_Object entity;
+ftfont_get_fc_charset (Lisp_Object entity)
{
Lisp_Object val, cache;
struct ftfont_cache_data *cache_data;
@@ -464,8 +455,7 @@ ftfont_get_fc_charset (entity)
#ifdef HAVE_LIBOTF
static OTF *
-ftfont_get_otf (ftfont_info)
- struct ftfont_info *ftfont_info;
+ftfont_get_otf (struct ftfont_info *ftfont_info)
{
OTF *otf;
@@ -486,26 +476,26 @@ ftfont_get_otf (ftfont_info)
}
#endif /* HAVE_LIBOTF */
-static Lisp_Object ftfont_get_cache P_ ((FRAME_PTR));
-static Lisp_Object ftfont_list P_ ((Lisp_Object, Lisp_Object));
-static Lisp_Object ftfont_match P_ ((Lisp_Object, Lisp_Object));
-static Lisp_Object ftfont_list_family P_ ((Lisp_Object));
-static Lisp_Object ftfont_open P_ ((FRAME_PTR, Lisp_Object, int));
-static void ftfont_close P_ ((FRAME_PTR, struct font *));
-static int ftfont_has_char P_ ((Lisp_Object, int));
-static unsigned ftfont_encode_char P_ ((struct font *, int));
-static int ftfont_text_extents P_ ((struct font *, unsigned *, int,
- struct font_metrics *));
-static int ftfont_get_bitmap P_ ((struct font *, unsigned,
- struct font_bitmap *, int));
-static int ftfont_anchor_point P_ ((struct font *, unsigned, int,
- int *, int *));
-static Lisp_Object ftfont_otf_capability P_ ((struct font *));
-static Lisp_Object ftfont_shape P_ ((Lisp_Object));
+static Lisp_Object ftfont_get_cache (FRAME_PTR);
+static Lisp_Object ftfont_list (Lisp_Object, Lisp_Object);
+static Lisp_Object ftfont_match (Lisp_Object, Lisp_Object);
+static Lisp_Object ftfont_list_family (Lisp_Object);
+static Lisp_Object ftfont_open (FRAME_PTR, Lisp_Object, int);
+static void ftfont_close (FRAME_PTR, struct font *);
+static int ftfont_has_char (Lisp_Object, int);
+static unsigned ftfont_encode_char (struct font *, int);
+static int ftfont_text_extents (struct font *, unsigned *, int,
+ struct font_metrics *);
+static int ftfont_get_bitmap (struct font *, unsigned,
+ struct font_bitmap *, int);
+static int ftfont_anchor_point (struct font *, unsigned, int,
+ int *, int *);
+static Lisp_Object ftfont_otf_capability (struct font *);
+static Lisp_Object ftfont_shape (Lisp_Object);
#ifdef HAVE_OTF_GET_VARIATION_GLYPHS
-static int ftfont_variation_glyphs P_ ((struct font *, int c,
- unsigned variations[256]));
+static int ftfont_variation_glyphs (struct font *, int c,
+ unsigned variations[256]);
#endif /* HAVE_OTF_GET_VARIATION_GLYPHS */
struct font_driver ftfont_driver =
@@ -556,18 +546,14 @@ struct font_driver ftfont_driver =
ftfont_filter_properties, /* filter_properties */
};
-extern Lisp_Object QCname;
-
static Lisp_Object
-ftfont_get_cache (f)
- FRAME_PTR f;
+ftfont_get_cache (FRAME_PTR f)
{
return freetype_font_cache;
}
static int
-ftfont_get_charset (registry)
- Lisp_Object registry;
+ftfont_get_charset (Lisp_Object registry)
{
char *str = (char *) SDATA (SYMBOL_NAME (registry));
char *re = alloca (SBYTES (SYMBOL_NAME (registry)) * 2 + 1);
@@ -705,16 +691,8 @@ ftfont_get_open_type_spec (Lisp_Object otf_spec)
return spec;
}
-static FcPattern *ftfont_spec_pattern P_ ((Lisp_Object, char *,
- struct OpenTypeSpec **,
- char **langname));
-
static FcPattern *
-ftfont_spec_pattern (spec, otlayout, otspec, langname)
- Lisp_Object spec;
- char *otlayout;
- struct OpenTypeSpec **otspec;
- char **langname;
+ftfont_spec_pattern (Lisp_Object spec, char *otlayout, struct OpenTypeSpec **otspec, const char **langname)
{
Lisp_Object tmp, extra;
FcPattern *pattern = NULL;
@@ -871,8 +849,7 @@ ftfont_spec_pattern (spec, otlayout, otspec, langname)
}
static Lisp_Object
-ftfont_list (frame, spec)
- Lisp_Object frame, spec;
+ftfont_list (Lisp_Object frame, Lisp_Object spec)
{
Lisp_Object val = Qnil, family, adstyle;
int i;
@@ -885,7 +862,7 @@ ftfont_list (frame, spec)
char otlayout[15]; /* For "otlayout:XXXX" */
struct OpenTypeSpec *otspec = NULL;
int spacing = -1;
- char *langname = NULL;
+ const char *langname = NULL;
if (! fc_initialized)
{
@@ -1069,15 +1046,14 @@ ftfont_list (frame, spec)
}
static Lisp_Object
-ftfont_match (frame, spec)
- Lisp_Object frame, spec;
+ftfont_match (Lisp_Object frame, Lisp_Object spec)
{
Lisp_Object entity = Qnil;
FcPattern *pattern, *match = NULL;
FcResult result;
char otlayout[15]; /* For "otlayout:XXXX" */
struct OpenTypeSpec *otspec = NULL;
- char *langname = NULL;
+ const char *langname = NULL;
if (! fc_initialized)
{
@@ -1120,8 +1096,7 @@ ftfont_match (frame, spec)
}
static Lisp_Object
-ftfont_list_family (frame)
- Lisp_Object frame;
+ftfont_list_family (Lisp_Object frame)
{
Lisp_Object list = Qnil;
FcPattern *pattern = NULL;
@@ -1164,10 +1139,7 @@ ftfont_list_family (frame)
static Lisp_Object
-ftfont_open (f, entity, pixel_size)
- FRAME_PTR f;
- Lisp_Object entity;
- int pixel_size;
+ftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size)
{
struct ftfont_info *ftfont_info;
struct font *font;
@@ -1307,9 +1279,7 @@ ftfont_open (f, entity, pixel_size)
}
static void
-ftfont_close (f, font)
- FRAME_PTR f;
- struct font *font;
+ftfont_close (FRAME_PTR f, struct font *font)
{
struct ftfont_info *ftfont_info = (struct ftfont_info *) font;
Lisp_Object val, cache;
@@ -1335,9 +1305,7 @@ ftfont_close (f, font)
}
static int
-ftfont_has_char (font, c)
- Lisp_Object font;
- int c;
+ftfont_has_char (Lisp_Object font, int c)
{
struct charset *cs = NULL;
@@ -1367,9 +1335,7 @@ ftfont_has_char (font, c)
}
static unsigned
-ftfont_encode_char (font, c)
- struct font *font;
- int c;
+ftfont_encode_char (struct font *font, int c)
{
struct ftfont_info *ftfont_info = (struct ftfont_info *) font;
FT_Face ft_face = ftfont_info->ft_size->face;
@@ -1380,11 +1346,7 @@ ftfont_encode_char (font, c)
}
static int
-ftfont_text_extents (font, code, nglyphs, metrics)
- struct font *font;
- unsigned *code;
- int nglyphs;
- struct font_metrics *metrics;
+ftfont_text_extents (struct font *font, unsigned int *code, int nglyphs, struct font_metrics *metrics)
{
struct ftfont_info *ftfont_info = (struct ftfont_info *) font;
FT_Face ft_face = ftfont_info->ft_size->face;
@@ -1394,7 +1356,7 @@ ftfont_text_extents (font, code, nglyphs, metrics)
if (ftfont_info->ft_size != ft_face->size)
FT_Activate_Size (ftfont_info->ft_size);
if (metrics)
- bzero (metrics, sizeof (struct font_metrics));
+ memset (metrics, 0, sizeof (struct font_metrics));
for (i = 0, first = 1; i < nglyphs; i++)
{
if (FT_Load_Glyph (ft_face, code[i], FT_LOAD_DEFAULT) == 0)
@@ -1439,11 +1401,7 @@ ftfont_text_extents (font, code, nglyphs, metrics)
}
static int
-ftfont_get_bitmap (font, code, bitmap, bits_per_pixel)
- struct font *font;
- unsigned code;
- struct font_bitmap *bitmap;
- int bits_per_pixel;
+ftfont_get_bitmap (struct font *font, unsigned int code, struct font_bitmap *bitmap, int bits_per_pixel)
{
struct ftfont_info *ftfont_info = (struct ftfont_info *) font;
FT_Face ft_face = ftfont_info->ft_size->face;
@@ -1487,11 +1445,7 @@ ftfont_get_bitmap (font, code, bitmap, bits_per_pixel)
}
static int
-ftfont_anchor_point (font, code, index, x, y)
- struct font *font;
- unsigned code;
- int index;
- int *x, *y;
+ftfont_anchor_point (struct font *font, unsigned int code, int index, int *x, int *y)
{
struct ftfont_info *ftfont_info = (struct ftfont_info *) font;
FT_Face ft_face = ftfont_info->ft_size->face;
@@ -1512,8 +1466,7 @@ ftfont_anchor_point (font, code, index, x, y)
#ifdef HAVE_LIBOTF
static Lisp_Object
-ftfont_otf_features (gsub_gpos)
- OTF_GSUB_GPOS *gsub_gpos;
+ftfont_otf_features (OTF_GSUB_GPOS *gsub_gpos)
{
Lisp_Object scripts, langsyses, features, sym;
int i, j, k, l;
@@ -1557,8 +1510,7 @@ ftfont_otf_features (gsub_gpos)
static Lisp_Object
-ftfont_otf_capability (font)
- struct font *font;
+ftfont_otf_capability (struct font *font)
{
struct ftfont_info *ftfont_info = (struct ftfont_info *) font;
OTF *otf = ftfont_get_otf (ftfont_info);
@@ -1596,10 +1548,8 @@ struct MFLTFontFT
};
static int
-ftfont_get_glyph_id (font, gstring, from, to)
- MFLTFont *font;
- MFLTGlyphString *gstring;
- int from, to;
+ftfont_get_glyph_id (MFLTFont *font, MFLTGlyphString *gstring,
+ int from, int to)
{
struct MFLTFontFT *flt_font_ft = (struct MFLTFontFT *) font;
FT_Face ft_face = flt_font_ft->ft_face;
@@ -1623,10 +1573,8 @@ ftfont_get_glyph_id (font, gstring, from, to)
#define ROUND(x) (((x)+32) & -64)
static int
-ftfont_get_metrics (font, gstring, from, to)
- MFLTFont *font;
- MFLTGlyphString *gstring;
- int from, to;
+ftfont_get_metrics (MFLTFont *font, MFLTGlyphString *gstring,
+ int from, int to)
{
struct MFLTFontFT *flt_font_ft = (struct MFLTFontFT *) font;
FT_Face ft_face = flt_font_ft->ft_face;
@@ -1684,38 +1632,70 @@ ftfont_get_metrics (font, gstring, from, to)
static int
ftfont_check_otf (MFLTFont *font, MFLTOtfSpec *spec)
{
+#define FEATURE_NONE(IDX) (! spec->features[IDX])
+
+#define FEATURE_ANY(IDX) \
+ (spec->features[IDX] \
+ && spec->features[IDX][0] == 0xFFFFFFFF && spec->features[IDX][1] == 0)
+
struct MFLTFontFT *flt_font_ft = (struct MFLTFontFT *) font;
OTF *otf = flt_font_ft->otf;
OTF_Tag *tags;
int i, n, negative;
+ if (FEATURE_ANY (0) && FEATURE_ANY (1))
+ /* Return 1 iff any of GSUB or GPOS support the script (and language). */
+ return (otf
+ && (OTF_check_features (otf, 0, spec->script, spec->langsys,
+ NULL, 0) > 0
+ || OTF_check_features (otf, 1, spec->script, spec->langsys,
+ NULL, 0) > 0));
+
for (i = 0; i < 2; i++)
- {
- if (! spec->features[i])
- continue;
- for (n = 0; spec->features[i][n]; n++);
- tags = alloca (sizeof (OTF_Tag) * n);
- for (n = 0, negative = 0; spec->features[i][n]; n++)
- {
- if (spec->features[i][n] == 0xFFFFFFFF)
- negative = 1;
- else if (negative)
- tags[n - 1] = spec->features[i][n] | 0x80000000;
- else
- tags[n] = spec->features[i][n];
- }
+ if (! FEATURE_ANY (i))
+ {
+ if (FEATURE_NONE (i))
+ {
+ if (otf
+ && OTF_check_features (otf, i == 0, spec->script, spec->langsys,
+ NULL, 0) > 0)
+ return 0;
+ continue;
+ }
+ if (spec->features[i][0] == 0xFFFFFFFF)
+ {
+ if (! otf
+ || OTF_check_features (otf, i == 0, spec->script, spec->langsys,
+ NULL, 0) <= 0)
+ continue;
+ }
+ else if (! otf)
+ return 0;
+ for (n = 1; spec->features[i][n]; n++);
+ tags = alloca (sizeof (OTF_Tag) * n);
+ for (n = 0, negative = 0; spec->features[i][n]; n++)
+ {
+ if (spec->features[i][n] == 0xFFFFFFFF)
+ negative = 1;
+ else if (negative)
+ tags[n - 1] = spec->features[i][n] | 0x80000000;
+ else
+ tags[n] = spec->features[i][n];
+ }
#ifdef M17N_FLT_USE_NEW_FEATURE
- if (OTF_check_features (otf, i == 0, spec->script, spec->langsys,
- tags, n - negative) != 1)
- return 0;
+ if (OTF_check_features (otf, i == 0, spec->script, spec->langsys,
+ tags, n - negative) != 1)
+ return 0;
#else /* not M17N_FLT_USE_NEW_FEATURE */
- if (n - negative > 0
- && OTF_check_features (otf, i == 0, spec->script, spec->langsys,
- tags, n - negative) != 1)
- return 0;
+ if (n - negative > 0
+ && OTF_check_features (otf, i == 0, spec->script, spec->langsys,
+ tags, n - negative) != 1)
+ return 0;
#endif /* not M17N_FLT_USE_NEW_FEATURE */
- }
+ }
return 1;
+#undef FEATURE_NONE
+#undef FEATURE_ANY
}
#define DEVICE_DELTA(table, size) \
@@ -2123,13 +2103,9 @@ ftfont_try_otf (MFLTFont *font, MFLTOtfSpec *spec,
#else /* not M17N_FLT_USE_NEW_FEATURE */
static int
-ftfont_drive_otf (font, spec, in, from, to, out, adjustment)
- MFLTFont *font;
- MFLTOtfSpec *spec;
- MFLTGlyphString *in;
- int from, to;
- MFLTGlyphString *out;
- MFLTGlyphAdjustment *adjustment;
+ftfont_drive_otf (MFLTFont *font, MFLTOtfSpec *spec, MFLTGlyphString *in,
+ int from, int to,
+ MFLTGlyphString *out, MFLTGlyphAdjustment *adjustment)
{
struct MFLTFontFT *flt_font_ft = (struct MFLTFontFT *) font;
FT_Face ft_face = flt_font_ft->ft_face;
@@ -2381,15 +2357,9 @@ static MFLTGlyphString gstring;
static int m17n_flt_initialized;
-extern Lisp_Object QCfamily;
-
static Lisp_Object
-ftfont_shape_by_flt (lgstring, font, ft_face, otf, matrix)
- Lisp_Object lgstring;
- struct font *font;
- FT_Face ft_face;
- OTF *otf;
- FT_Matrix *matrix;
+ftfont_shape_by_flt (Lisp_Object lgstring, struct font *font,
+ FT_Face ft_face, OTF *otf, FT_Matrix *matrix)
{
EMACS_UINT len = LGSTRING_GLYPH_LEN (lgstring);
EMACS_UINT i;
@@ -2555,8 +2525,7 @@ ftfont_shape_by_flt (lgstring, font, ft_face, otf, matrix)
}
Lisp_Object
-ftfont_shape (lgstring)
- Lisp_Object lgstring;
+ftfont_shape (Lisp_Object lgstring)
{
struct font *font;
struct ftfont_info *ftfont_info;
@@ -2576,10 +2545,7 @@ ftfont_shape (lgstring)
#ifdef HAVE_OTF_GET_VARIATION_GLYPHS
static int
-ftfont_variation_glyphs (font, c, variations)
- struct font *font;
- int c;
- unsigned variations[256];
+ftfont_variation_glyphs (struct font *font, int c, unsigned variations[256])
{
struct ftfont_info *ftfont_info = (struct ftfont_info *) font;
OTF *otf = ftfont_get_otf (ftfont_info);
@@ -2677,16 +2643,14 @@ static const char *ftfont_non_booleans [] = {
};
static void
-ftfont_filter_properties (font, alist)
- Lisp_Object font;
- Lisp_Object alist;
+ftfont_filter_properties (Lisp_Object font, Lisp_Object alist)
{
font_filter_properties (font, alist, ftfont_booleans, ftfont_non_booleans);
}
void
-syms_of_ftfont ()
+syms_of_ftfont (void)
{
DEFSYM (Qfreetype, "freetype");
DEFSYM (Qmonospace, "monospace");